]> Pileus Git - ~andy/linux/commitdiff
[SCSI] qla2xxx: Detect GPSC capabilities within a fabric.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Thu, 14 Dec 2006 03:20:28 +0000 (19:20 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Wed, 3 Jan 2007 22:57:54 +0000 (16:57 -0600)
Disable subsequent GPSC queries if Fabric Management services do
not support the operation.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_isr.c

index c4fc40f8e8caee98555358c2a2d1d0a9d01f4138..2c10130d9e03fe2a037f361ed80ef80963aa8f8b 100644 (file)
@@ -1602,6 +1602,7 @@ typedef struct fc_port {
 
 #define CT_REJECT_RESPONSE     0x8001
 #define CT_ACCEPT_RESPONSE     0x8002
+#define CT_REASON_INVALID_COMMAND_CODE 0x01
 #define CT_REASON_CANNOT_PERFORM       0x09
 #define CT_EXPL_ALREADY_REGISTERED     0x10
 
@@ -2079,6 +2080,7 @@ typedef struct scsi_qla_host {
                uint32_t        msi_enabled             :1;
                uint32_t        msix_enabled            :1;
                uint32_t        disable_serdes          :1;
+               uint32_t        gpsc_supported          :1;
        } flags;
 
        atomic_t        loop_state;
index 220ec41b27fc36b21a7d338adaff7191ff66e437..ec5b2dd90d6a6c27445765c8ebbc70c99dcdf012 100644 (file)
@@ -143,6 +143,7 @@ qla2x00_chk_ms_status(scsi_qla_host_t *ha, ms_iocb_entry_t *ms_pkt,
                                DEBUG2_3(qla2x00_dump_buffer(
                                    (uint8_t *)&ct_rsp->header,
                                    sizeof(struct ct_rsp_hdr)));
+                               rval = QLA_INVALID_COMMAND;
                        } else
                                rval = QLA_SUCCESS;
                        break;
@@ -1784,6 +1785,8 @@ qla2x00_gpsc(scsi_qla_host_t *ha, sw_info_t *list)
 
        if (!IS_QLA24XX(ha) && !IS_QLA54XX(ha))
                return QLA_FUNCTION_FAILED;
+       if (!ha->flags.gpsc_supported)
+               return QLA_FUNCTION_FAILED;
 
        rval = qla2x00_mgmt_svr_login(ha);
        if (rval)
@@ -1813,8 +1816,19 @@ qla2x00_gpsc(scsi_qla_host_t *ha, sw_info_t *list)
                        /*EMPTY*/
                        DEBUG2_3(printk("scsi(%ld): GPSC issue IOCB "
                            "failed (%d).\n", ha->host_no, rval));
-               } else if (qla2x00_chk_ms_status(ha, ms_pkt, ct_rsp,
-                   "GPSC") != QLA_SUCCESS) {
+               } else if ((rval = qla2x00_chk_ms_status(ha, ms_pkt, ct_rsp,
+                   "GPSC")) != QLA_SUCCESS) {
+                       /* FM command unsupported? */
+                       if (rval == QLA_INVALID_COMMAND &&
+                           ct_rsp->header.reason_code ==
+                           CT_REASON_INVALID_COMMAND_CODE) {
+                               DEBUG2(printk("scsi(%ld): GPSC command "
+                                   "unsupported, disabling query...\n",
+                                   ha->host_no));
+                               ha->flags.gpsc_supported = 0;
+                               rval = QLA_FUNCTION_FAILED;
+                               break;
+                       }
                        rval = QLA_FUNCTION_FAILED;
                } else {
                        /* Save portname */
index d3b6df4d55c890990f75d0239a62fd65b22213a9..79115c1f249489d9865f497e056163c80236a06b 100644 (file)
@@ -475,6 +475,8 @@ qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb)
                        set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags);
                }
                set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags);
+
+               ha->flags.gpsc_supported = 1;
                break;
 
        case MBA_CHG_IN_CONNECTION:     /* Change in connection mode */