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 <h...@suse.com>
---
 drivers/ata/libata-trace.c    | 43 +++++++++++++++++++++++++++++++++++++++++++
 include/linux/ata.h           | 17 +++++++++++++++++
 include/trace/events/libata.h |  8 +++++++-
 3 files changed, 67 insertions(+), 1 deletion(-)

diff --git a/drivers/ata/libata-trace.c b/drivers/ata/libata-trace.c
index fd30b8c..99ec1e8 100644
--- a/drivers/ata/libata-trace.c
+++ b/drivers/ata/libata-trace.c
@@ -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;
+}
diff --git a/include/linux/ata.h b/include/linux/ata.h
index b5be5e8..032bb22 100644
--- a/include/linux/ata.h
+++ b/include/linux/ata.h
@@ -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,
diff --git a/include/trace/events/libata.h b/include/trace/events/libata.h
index 0168603..318c04b 100644
--- a/include/trace/events/libata.h
+++ b/include/trace/events/libata.h
@@ -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,13 @@ 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,
-- 
1.8.5.6

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to