]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/scsi/zfcp_dbf.c
[SCSI] zfcp: zfcp_fsf cleanup.
[linux-2.6-omap-h63xx.git] / drivers / s390 / scsi / zfcp_dbf.c
index 7e85e87b0ededb820591009e958dee00b0215691..36169c6944fd1d78b06161e66488b355d0d98ba3 100644 (file)
@@ -1,22 +1,9 @@
 /*
- * This file is part of the zfcp device driver for
- * FCP adapters for IBM System z9 and zSeries.
+ * zfcp device driver
  *
- * (C) Copyright IBM Corp. 2002, 2006
+ * Debug traces for zfcp.
  *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Copyright IBM Corporation 2002, 2008
  */
 
 #include <linux/ctype.h>
@@ -29,8 +16,6 @@ module_param(dbfsize, uint, 0400);
 MODULE_PARM_DESC(dbfsize,
                 "number of pages for each debug feature area (default 4)");
 
-#define ZFCP_LOG_AREA                  ZFCP_LOG_AREA_OTHER
-
 static void zfcp_dbf_hexdump(debug_info_t *dbf, void *to, int to_len,
                             int level, char *from, int from_len)
 {
@@ -131,6 +116,10 @@ static int zfcp_dbf_view_header(debug_info_t *id, struct debug_view *view,
        return p - out_buf;
 }
 
+/**
+ * zfcp_hba_dbf_event_fsf_response - trace event for request completion
+ * @fsf_req: request that has been completed
+ */
 void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_adapter *adapter = fsf_req->adapter;
@@ -182,8 +171,8 @@ void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
               fsf_status_qual, FSF_STATUS_QUALIFIER_SIZE);
        response->fsf_req_status = fsf_req->status;
        response->sbal_first = fsf_req->sbal_first;
-       response->sbal_curr = fsf_req->sbal_curr;
        response->sbal_last = fsf_req->sbal_last;
+       response->sbal_response = fsf_req->sbal_response;
        response->pool = fsf_req->pool != NULL;
        response->erp_action = (unsigned long)fsf_req->erp_action;
 
@@ -247,6 +236,12 @@ void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
        spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
 }
 
+/**
+ * zfcp_hba_dbf_event_fsf_unsol - trace event for an unsolicited status buffer
+ * @tag: tag indicating which kind of unsolicited status has been received
+ * @adapter: adapter that has issued the unsolicited status buffer
+ * @status_buffer: buffer containing payload of unsolicited status
+ */
 void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
                                  struct fsf_status_read_buffer *status_buffer)
 {
@@ -258,7 +253,7 @@ void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
        strncpy(rec->tag, "stat", ZFCP_DBF_TAG_SIZE);
        strncpy(rec->tag2, tag, ZFCP_DBF_TAG_SIZE);
 
-       rec->u.status.failed = adapter->status_read_failed;
+       rec->u.status.failed = atomic_read(&adapter->stat_miss);
        if (status_buffer != NULL) {
                rec->u.status.status_type = status_buffer->status_type;
                rec->u.status.status_subtype = status_buffer->status_subtype;
@@ -299,6 +294,15 @@ void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
        spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
 }
 
+/**
+ * zfcp_hba_dbf_event_qdio - trace event for QDIO related failure
+ * @adapter: adapter affected by this QDIO related event
+ * @status: as passed by qdio module
+ * @qdio_error: as passed by qdio module
+ * @siga_error: as passed by qdio module
+ * @sbal_index: first buffer with error condition, as passed by qdio module
+ * @sbal_count: number of buffers affected, as passed by qdio module
+ */
 void zfcp_hba_dbf_event_qdio(struct zfcp_adapter *adapter, unsigned int status,
                             unsigned int qdio_error, unsigned int siga_error,
                             int sbal_index, int sbal_count)
@@ -336,8 +340,8 @@ static void zfcp_hba_dbf_view_response(char **p,
                      FSF_STATUS_QUALIFIER_SIZE, 0, FSF_STATUS_QUALIFIER_SIZE);
        zfcp_dbf_out(p, "fsf_req_status", "0x%08x", r->fsf_req_status);
        zfcp_dbf_out(p, "sbal_first", "0x%02x", r->sbal_first);
-       zfcp_dbf_out(p, "sbal_curr", "0x%02x", r->sbal_curr);
        zfcp_dbf_out(p, "sbal_last", "0x%02x", r->sbal_last);
+       zfcp_dbf_out(p, "sbal_response", "0x%02x", r->sbal_response);
        zfcp_dbf_out(p, "pool", "0x%02x", r->pool);
 
        switch (r->fsf_command) {
@@ -496,13 +500,13 @@ static const char *zfcp_rec_dbf_ids[] = {
        [52]    = "port boxed close unit",
        [53]    = "port boxed fcp",
        [54]    = "unit boxed fcp",
-       [55]    = "port access denied ct",
-       [56]    = "port access denied els",
-       [57]    = "port access denied open port",
-       [58]    = "port access denied close physical",
-       [59]    = "unit access denied open unit",
+       [55]    = "port access denied",
+       [56]    = "",
+       [57]    = "",
+       [58]    = "",
+       [59]    = "unit access denied",
        [60]    = "shared unit access denied open unit",
-       [61]    = "unit access denied fcp",
+       [61]    = "",
        [62]    = "request timeout",
        [63]    = "adisc link test reject or timeout",
        [64]    = "adisc link test d_id changed",
@@ -527,8 +531,8 @@ static const char *zfcp_rec_dbf_ids[] = {
        [80]    = "exclusive read-only unit access unsupported",
        [81]    = "shared read-write unit access unsupported",
        [82]    = "incoming rscn",
-       [83]    = "incoming plogi",
-       [84]    = "incoming logo",
+       [83]    = "incoming wwpn",
+       [84]    = "",
        [85]    = "online",
        [86]    = "offline",
        [87]    = "ccw device gone",
@@ -567,8 +571,8 @@ static const char *zfcp_rec_dbf_ids[] = {
        [120]   = "unknown fsf command",
        [121]   = "no recommendation for status qualifier",
        [122]   = "status read physical port closed in error",
-       [123]   = "fc service class not supported ct",
-       [124]   = "fc service class not supported els",
+       [123]   = "fc service class not supported",
+       [124]   = "",
        [125]   = "need newer zfcp",
        [126]   = "need newer microcode",
        [127]   = "arbitrated loop not supported",
@@ -576,7 +580,7 @@ static const char *zfcp_rec_dbf_ids[] = {
        [129]   = "qtcb size mismatch",
        [130]   = "unknown fsf status ecd",
        [131]   = "fcp request too big",
-       [132]   = "fc service class not supported fcp",
+       [132]   = "",
        [133]   = "data direction not valid fcp",
        [134]   = "command length not valid fcp",
        [135]   = "status read act update",
@@ -584,13 +588,18 @@ static const char *zfcp_rec_dbf_ids[] = {
        [137]   = "hbaapi port open",
        [138]   = "hbaapi unit open",
        [139]   = "hbaapi unit shutdown",
-       [140]   = "qdio error",
+       [140]   = "qdio error outbound",
        [141]   = "scsi host reset",
        [142]   = "dismissing fsf request for recovery action",
        [143]   = "recovery action timed out",
        [144]   = "recovery action gone",
        [145]   = "recovery action being processed",
        [146]   = "recovery action ready for next step",
+       [147]   = "qdio error inbound",
+       [148]   = "nameserver needed for port scan",
+       [149]   = "port scan",
+       [150]   = "ptp attach",
+       [151]   = "port validation failed",
 };
 
 static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view,
@@ -604,7 +613,6 @@ static int zfcp_rec_dbf_view_format(debug_info_t *id, struct debug_view *view,
        zfcp_dbf_out(&p, "id", "%d", r->id2);
        switch (r->id) {
        case ZFCP_REC_DBF_ID_THREAD:
-               zfcp_dbf_out(&p, "sema", "%d", r->u.thread.sema);
                zfcp_dbf_out(&p, "total", "%d", r->u.thread.total);
                zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready);
                zfcp_dbf_out(&p, "running", "%d", r->u.thread.running);
@@ -652,38 +660,48 @@ static struct debug_view zfcp_rec_dbf_view = {
  * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation
  * @id2: identifier for event
  * @adapter: adapter
- * @lock: non-zero value indicates that erp_lock has not yet been acquired
+ * This function assumes that the caller is holding erp_lock.
  */
-void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter, int lock)
+void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter)
 {
        struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
        unsigned long flags = 0;
        struct list_head *entry;
        unsigned ready = 0, running = 0, total;
 
-       if (lock)
-               read_lock_irqsave(&adapter->erp_lock, flags);
        list_for_each(entry, &adapter->erp_ready_head)
                ready++;
        list_for_each(entry, &adapter->erp_running_head)
                running++;
        total = adapter->erp_total_count;
-       if (lock)
-               read_unlock_irqrestore(&adapter->erp_lock, flags);
 
        spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
        memset(r, 0, sizeof(*r));
        r->id = ZFCP_REC_DBF_ID_THREAD;
        r->id2 = id2;
-       r->u.thread.sema = atomic_read(&adapter->erp_ready_sem.count);
        r->u.thread.total = total;
        r->u.thread.ready = ready;
        r->u.thread.running = running;
-       debug_event(adapter->rec_dbf, 5, r, sizeof(*r));
+       debug_event(adapter->rec_dbf, 6, r, sizeof(*r));
        spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
 }
 
-static void zfcp_rec_dbf_event_target(u8 id2, u64 ref,
+/**
+ * zfcp_rec_dbf_event_thread - trace event related to recovery thread operation
+ * @id2: identifier for event
+ * @adapter: adapter
+ * This function assumes that the caller does not hold erp_lock.
+ */
+void zfcp_rec_dbf_event_thread_lock(u8 id2, struct zfcp_adapter *adapter)
+{
+       unsigned long flags;
+
+       read_lock_irqsave(&adapter->erp_lock, flags);
+       zfcp_rec_dbf_event_thread(id2, adapter);
+       read_unlock_irqrestore(&adapter->erp_lock, flags);
+}
+
+static void zfcp_rec_dbf_event_target(u8 id2, void *ref,
                                      struct zfcp_adapter *adapter,
                                      atomic_t *status, atomic_t *erp_count,
                                      u64 wwpn, u32 d_id, u64 fcp_lun)
@@ -695,7 +713,7 @@ static void zfcp_rec_dbf_event_target(u8 id2, u64 ref,
        memset(r, 0, sizeof(*r));
        r->id = ZFCP_REC_DBF_ID_TARGET;
        r->id2 = id2;
-       r->u.target.ref = ref;
+       r->u.target.ref = (unsigned long)ref;
        r->u.target.status = atomic_read(status);
        r->u.target.wwpn = wwpn;
        r->u.target.d_id = d_id;
@@ -711,7 +729,7 @@ static void zfcp_rec_dbf_event_target(u8 id2, u64 ref,
  * @ref: additional reference (e.g. request)
  * @adapter: adapter
  */
-void zfcp_rec_dbf_event_adapter(u8 id, u64 ref, struct zfcp_adapter *adapter)
+void zfcp_rec_dbf_event_adapter(u8 id, void *ref, struct zfcp_adapter *adapter)
 {
        zfcp_rec_dbf_event_target(id, ref, adapter, &adapter->status,
                                  &adapter->erp_counter, 0, 0, 0);
@@ -723,7 +741,7 @@ void zfcp_rec_dbf_event_adapter(u8 id, u64 ref, struct zfcp_adapter *adapter)
  * @ref: additional reference (e.g. request)
  * @port: port
  */
-void zfcp_rec_dbf_event_port(u8 id, u64 ref, struct zfcp_port *port)
+void zfcp_rec_dbf_event_port(u8 id, void *ref, struct zfcp_port *port)
 {
        struct zfcp_adapter *adapter = port->adapter;
 
@@ -738,7 +756,7 @@ void zfcp_rec_dbf_event_port(u8 id, u64 ref, struct zfcp_port *port)
  * @ref: additional reference (e.g. request)
  * @unit: unit
  */
-void zfcp_rec_dbf_event_unit(u8 id, u64 ref, struct zfcp_unit *unit)
+void zfcp_rec_dbf_event_unit(u8 id, void *ref, struct zfcp_unit *unit)
 {
        struct zfcp_port *port = unit->port;
        struct zfcp_adapter *adapter = port->adapter;
@@ -759,8 +777,8 @@ void zfcp_rec_dbf_event_unit(u8 id, u64 ref, struct zfcp_unit *unit)
  * @port: port
  * @unit: unit
  */
-void zfcp_rec_dbf_event_trigger(u8 id2, u64 ref, u8 want, u8 need, u64 action,
-                               struct zfcp_adapter *adapter,
+void zfcp_rec_dbf_event_trigger(u8 id2, void *ref, u8 want, u8 need,
+                               void *action, struct zfcp_adapter *adapter,
                                struct zfcp_port *port, struct zfcp_unit *unit)
 {
        struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
@@ -770,10 +788,10 @@ void zfcp_rec_dbf_event_trigger(u8 id2, u64 ref, u8 want, u8 need, u64 action,
        memset(r, 0, sizeof(*r));
        r->id = ZFCP_REC_DBF_ID_TRIGGER;
        r->id2 = id2;
-       r->u.trigger.ref = ref;
+       r->u.trigger.ref = (unsigned long)ref;
        r->u.trigger.want = want;
        r->u.trigger.need = need;
-       r->u.trigger.action = action;
+       r->u.trigger.action = (unsigned long)action;
        r->u.trigger.as = atomic_read(&adapter->status);
        if (port) {
                r->u.trigger.ps = atomic_read(&port->status);
@@ -802,14 +820,18 @@ void zfcp_rec_dbf_event_action(u8 id2, struct zfcp_erp_action *erp_action)
        memset(r, 0, sizeof(*r));
        r->id = ZFCP_REC_DBF_ID_ACTION;
        r->id2 = id2;
-       r->u.action.action = (u64)erp_action;
+       r->u.action.action = (unsigned long)erp_action;
        r->u.action.status = erp_action->status;
        r->u.action.step = erp_action->step;
-       r->u.action.fsf_req = (u64)erp_action->fsf_req;
-       debug_event(adapter->rec_dbf, 4, r, sizeof(*r));
+       r->u.action.fsf_req = (unsigned long)erp_action->fsf_req;
+       debug_event(adapter->rec_dbf, 5, r, sizeof(*r));
        spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
 }
 
+/**
+ * zfcp_san_dbf_event_ct_request - trace event for issued CT request
+ * @fsf_req: request containing issued CT data
+ */
 void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
@@ -840,6 +862,10 @@ void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req)
        spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
 }
 
+/**
+ * zfcp_san_dbf_event_ct_response - trace event for completion of CT request
+ * @fsf_req: request containing CT response
+ */
 void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
@@ -892,6 +918,10 @@ static void zfcp_san_dbf_event_els(const char *tag, int level,
        spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
 }
 
+/**
+ * zfcp_san_dbf_event_els_request - trace event for issued ELS
+ * @fsf_req: request containing issued ELS
+ */
 void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data;
@@ -902,6 +932,10 @@ void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *fsf_req)
                               zfcp_sg_to_address(els->req), els->req->length);
 }
 
+/**
+ * zfcp_san_dbf_event_els_response - trace event for completed ELS
+ * @fsf_req: request containing ELS response
+ */
 void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data;
@@ -913,6 +947,10 @@ void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *fsf_req)
                               els->resp->length);
 }
 
+/**
+ * zfcp_san_dbf_event_incoming_els - trace event for incomig ELS
+ * @fsf_req: request containing unsolicited status buffer with incoming ELS
+ */
 void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *fsf_req)
 {
        struct zfcp_adapter *adapter = fsf_req->adapter;
@@ -923,7 +961,7 @@ void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *fsf_req)
 
        zfcp_san_dbf_event_els("iels", 1, fsf_req, buf->d_id,
                               fc_host_port_id(adapter->scsi_host),
-                              *(u8 *)buf->payload, (void *)buf->payload,
+                              buf->payload.data[0], (void *)buf->payload.data,
                               length);
 }
 
@@ -1018,7 +1056,7 @@ static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
                                rec->scsi_result = scsi_cmnd->result;
                                rec->scsi_cmnd = (unsigned long)scsi_cmnd;
                                rec->scsi_serial = scsi_cmnd->serial_number;
-                               memcpy(rec->scsi_opcode, &scsi_cmnd->cmnd,
+                               memcpy(rec->scsi_opcode, scsi_cmnd->cmnd,
                                        min((int)scsi_cmnd->cmd_len,
                                                ZFCP_DBF_SCSI_OPCODE));
                                rec->scsi_retries = scsi_cmnd->retries;
@@ -1027,8 +1065,7 @@ static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
                        if (fsf_req != NULL) {
                                fcp_rsp = (struct fcp_rsp_iu *)
                                    &(fsf_req->qtcb->bottom.io.fcp_rsp);
-                               fcp_rsp_info =
-                                   zfcp_get_fcp_rsp_info_ptr(fcp_rsp);
+                               fcp_rsp_info = (unsigned char *) &fcp_rsp[1];
                                fcp_sns_info =
                                    zfcp_get_fcp_sns_info_ptr(fcp_rsp);
 
@@ -1069,6 +1106,14 @@ static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
        spin_unlock_irqrestore(&adapter->scsi_dbf_lock, flags);
 }
 
+/**
+ * zfcp_scsi_dbf_event_result - trace event for SCSI command completion
+ * @tag: tag indicating success or failure of SCSI command
+ * @level: trace level applicable for this event
+ * @adapter: adapter that has been used to issue the SCSI command
+ * @scsi_cmnd: SCSI command pointer
+ * @fsf_req: request used to issue SCSI command (might be NULL)
+ */
 void zfcp_scsi_dbf_event_result(const char *tag, int level,
                                struct zfcp_adapter *adapter,
                                struct scsi_cmnd *scsi_cmnd,
@@ -1077,6 +1122,14 @@ void zfcp_scsi_dbf_event_result(const char *tag, int level,
        zfcp_scsi_dbf_event("rslt", tag, level, adapter, scsi_cmnd, fsf_req, 0);
 }
 
+/**
+ * zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
+ * @tag: tag indicating success or failure of abort operation
+ * @adapter: adapter thas has been used to issue SCSI command to be aborted
+ * @scsi_cmnd: SCSI command to be aborted
+ * @new_fsf_req: request containing abort (might be NULL)
+ * @old_req_id: identifier of request containg SCSI command to be aborted
+ */
 void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
                               struct scsi_cmnd *scsi_cmnd,
                               struct zfcp_fsf_req *new_fsf_req,
@@ -1086,6 +1139,13 @@ void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
                            old_req_id);
 }
 
+/**
+ * zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
+ * @tag: tag indicating success or failure of reset operation
+ * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
+ * @unit: unit that needs reset
+ * @scsi_cmnd: SCSI command which caused this error recovery
+ */
 void zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag,
                                  struct zfcp_unit *unit,
                                  struct scsi_cmnd *scsi_cmnd)
@@ -1219,5 +1279,3 @@ void zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter)
        adapter->hba_dbf = NULL;
        adapter->rec_dbf = NULL;
 }
-
-#undef ZFCP_LOG_AREA