libata-trace: decode subcommands
authorHannes Reinecke <hare@suse.de>
Mon, 25 Apr 2016 10:45:49 +0000 (12:45 +0200)
committerTejun Heo <tj@kernel.org>
Mon, 9 May 2016 16:36:45 +0000 (12:36 -0400)
Some commands like FPDMA RECEIVE or NCQ NON DATA can encapsulate
other commands to NCQ transport. So decode the subcmds, too.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
drivers/ata/libata-trace.c
include/linux/ata.h
include/trace/events/libata.h

index fd30b8c..99ec1e8 100644 (file)
@@ -149,3 +149,46 @@ libata_trace_parse_qc_flags(struct trace_seq *p, unsigned int qc_flags)
 
        return ret;
 }
+
+const char *
+libata_trace_parse_subcmd(struct trace_seq *p, unsigned char cmd,
+                         unsigned char feature, unsigned char hob_nsect)
+{
+       const char *ret = trace_seq_buffer_ptr(p);
+
+       switch (cmd) {
+       case ATA_CMD_FPDMA_RECV:
+               switch (hob_nsect & 0x5f) {
+               case ATA_SUBCMD_FPDMA_RECV_RD_LOG_DMA_EXT:
+                       trace_seq_printf(p, " READ_LOG_DMA_EXT");
+                       break;
+               }
+               break;
+       case ATA_CMD_FPDMA_SEND:
+               switch (hob_nsect & 0x5f) {
+               case ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT:
+                       trace_seq_printf(p, " WRITE_LOG_DMA_EXT");
+                       break;
+               case ATA_SUBCMD_FPDMA_SEND_DSM:
+                       trace_seq_printf(p, " DATASET_MANAGEMENT");
+                       break;
+               }
+               break;
+       case ATA_CMD_NCQ_NON_DATA:
+               switch (feature) {
+               case ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE:
+                       trace_seq_printf(p, " ABORT_QUEUE");
+                       break;
+               case ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES:
+                       trace_seq_printf(p, " SET_FEATURES");
+                       break;
+               case ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT:
+                       trace_seq_printf(p, " ZERO_EXT");
+                       break;
+               }
+               break;
+       }
+       trace_seq_putc(p, 0);
+
+       return ret;
+}
index b5be5e8..032bb22 100644 (file)
@@ -313,6 +313,11 @@ enum {
        ATA_SUBCMD_FPDMA_SEND_DSM            = 0x00,
        ATA_SUBCMD_FPDMA_SEND_WR_LOG_DMA_EXT = 0x02,
 
+       /* Subcmds for ATA_CMD_NCQ_NON_DATA */
+       ATA_SUBCMD_NCQ_NON_DATA_ABORT_QUEUE  = 0x00,
+       ATA_SUBCMD_NCQ_NON_DATA_SET_FEATURES = 0x05,
+       ATA_SUBCMD_NCQ_NON_DATA_ZERO_EXT     = 0x06,
+
        /* READ_LOG_EXT pages */
        ATA_LOG_DIRECTORY       = 0x0,
        ATA_LOG_SATA_NCQ        = 0x10,
@@ -338,6 +343,18 @@ enum {
        ATA_LOG_NCQ_SEND_RECV_WR_LOG_SUPPORTED  = (1 << 0),
        ATA_LOG_NCQ_SEND_RECV_SIZE              = 0x10,
 
+       /* NCQ Non-Data log */
+       ATA_LOG_NCQ_NON_DATA_SUBCMDS_OFFSET     = 0x00,
+       ATA_LOG_NCQ_NON_DATA_ABORT_OFFSET       = 0x00,
+       ATA_LOG_NCQ_NON_DATA_ABORT_NCQ          = (1 << 0),
+       ATA_LOG_NCQ_NON_DATA_ABORT_ALL          = (1 << 1),
+       ATA_LOG_NCQ_NON_DATA_ABORT_STREAMING    = (1 << 2),
+       ATA_LOG_NCQ_NON_DATA_ABORT_NON_STREAMING = (1 << 3),
+       ATA_LOG_NCQ_NON_DATA_ABORT_SELECTED     = (1 << 4),
+       ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OFFSET    = 0x1C,
+       ATA_LOG_NCQ_NON_DATA_ZAC_MGMT_OUT       = (1 << 0),
+       ATA_LOG_NCQ_NON_DATA_SIZE               = 0x40,
+
        /* READ/WRITE LONG (obsolete) */
        ATA_CMD_READ_LONG       = 0x22,
        ATA_CMD_READ_LONG_ONCE  = 0x23,
index 0168603..8e77572 100644 (file)
@@ -140,6 +140,10 @@ const char *libata_trace_parse_eh_err_mask(struct trace_seq *, unsigned int);
 const char *libata_trace_parse_qc_flags(struct trace_seq *, unsigned int);
 #define __parse_qc_flags(f) libata_trace_parse_qc_flags(p, f)
 
+const char *libata_trace_parse_subcmd(struct trace_seq *, unsigned char,
+                                     unsigned char, unsigned char);
+#define __parse_subcmd(c,f,h) libata_trace_parse_subcmd(p, c, f, h)
+
 TRACE_EVENT(ata_qc_issue,
 
        TP_PROTO(struct ata_queued_cmd *qc),
@@ -186,11 +190,12 @@ TRACE_EVENT(ata_qc_issue,
                __entry->hob_nsect      = qc->tf.hob_nsect;
        ),
 
-       TP_printk("ata_port=%u ata_dev=%u tag=%d proto=%s cmd=%s " \
+       TP_printk("ata_port=%u ata_dev=%u tag=%d proto=%s cmd=%s%s " \
                  " tf=(%02x/%02x:%02x:%02x:%02x:%02x/%02x:%02x:%02x:%02x:%02x/%02x)",
                  __entry->ata_port, __entry->ata_dev, __entry->tag,
                  show_protocol_name(__entry->proto),
                  show_opcode_name(__entry->cmd),
+                 __parse_subcmd(__entry->cmd, __entry->feature, __entry->hob_nsect),
                  __entry->cmd, __entry->feature, __entry->nsect,
                  __entry->lbal, __entry->lbam, __entry->lbah,
                  __entry->hob_feature, __entry->hob_nsect,