[SCSI] qla2xxx: Additional NPIV corrections.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Thu, 24 Jul 2008 15:31:49 +0000 (08:31 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Sat, 26 Jul 2008 19:31:30 +0000 (15:31 -0400)
Minor fixes addressing:
- rport managements during vport deletion.
- acquire proper physical-ha during qla24xx_abort_command() and
  qla24xx_queuecommand()
- do not needlessly acquire the pha for non-NPIV capable ISPs.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_iocb.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_mid.c
drivers/scsi/qla2xxx/qla_os.c

index fcec43a32be3899c80c05bd9b02ffff59daee454..7a4409ab30eaaab0b751226f4e0713b5469166d5 100644 (file)
@@ -1177,6 +1177,11 @@ static int
 qla24xx_vport_delete(struct fc_vport *fc_vport)
 {
        scsi_qla_host_t *vha = fc_vport->dd_data;
+       scsi_qla_host_t *pha = to_qla_parent(vha);
+
+       while (test_bit(LOOP_RESYNC_ACTIVE, &vha->dpc_flags) ||
+           test_bit(FCPORT_UPDATE_NEEDED, &pha->dpc_flags))
+               msleep(1000);
 
        qla24xx_disable_vp(vha);
        qla24xx_deallocate_vp_id(vha);
index 597ac201969cae91c48c09c12380a8e4ecd3aecf..601a6b29750c5beec1d52cc1b5638b396073f7f2 100644 (file)
@@ -3231,7 +3231,8 @@ qla2x00_update_fcports(scsi_qla_host_t *ha)
 
        /* Go with deferred removal of rport references. */
        list_for_each_entry(fcport, &ha->fcports, list)
-               if (fcport->drport)
+               if (fcport->drport &&
+                   atomic_read(&fcport->state) != FCS_UNCONFIGURED)
                        qla2x00_rport_del(fcport);
 }
 
index 6e14c8eaca82061a1acb391fa0e06dab90471f14..d57669aa4615d33d80fe87cfe1f9550555466518 100644 (file)
@@ -269,7 +269,7 @@ qla2x00_start_scsi(srb_t *sp)
 {
        int             ret, nseg;
        unsigned long   flags;
-       scsi_qla_host_t *ha, *pha;
+       scsi_qla_host_t *ha;
        struct scsi_cmnd *cmd;
        uint32_t        *clr_ptr;
        uint32_t        index;
@@ -283,7 +283,6 @@ qla2x00_start_scsi(srb_t *sp)
        /* Setup device pointers. */
        ret = 0;
        ha = sp->ha;
-       pha = to_qla_parent(ha);
        reg = &ha->iobase->isp;
        cmd = sp->cmd;
        /* So we know we haven't pci_map'ed anything yet */
@@ -298,7 +297,7 @@ qla2x00_start_scsi(srb_t *sp)
        }
 
        /* Acquire ring specific lock */
-       spin_lock_irqsave(&pha->hardware_lock, flags);
+       spin_lock_irqsave(&ha->hardware_lock, flags);
 
        /* Check for room in outstanding command list. */
        handle = ha->current_outstanding_cmd;
@@ -387,14 +386,14 @@ qla2x00_start_scsi(srb_t *sp)
            ha->response_ring_ptr->signature != RESPONSE_PROCESSED)
                qla2x00_process_response_queue(ha);
 
-       spin_unlock_irqrestore(&pha->hardware_lock, flags);
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
        return (QLA_SUCCESS);
 
 queuing_error:
        if (tot_dsds)
                scsi_dma_unmap(cmd);
 
-       spin_unlock_irqrestore(&pha->hardware_lock, flags);
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
        return (QLA_FUNCTION_FAILED);
 }
index 7d7de592f720deb35848c40de540e39294484b7d..bc90d6b8d0a0d940bf1114c79c818cebc7ee81c5 100644 (file)
@@ -749,18 +749,17 @@ qla2x00_abort_command(scsi_qla_host_t *ha, srb_t *sp)
        uint32_t        handle;
        mbx_cmd_t       mc;
        mbx_cmd_t       *mcp = &mc;
-       scsi_qla_host_t *pha = to_qla_parent(ha);
 
        DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", ha->host_no));
 
        fcport = sp->fcport;
 
-       spin_lock_irqsave(&pha->hardware_lock, flags);
+       spin_lock_irqsave(&ha->hardware_lock, flags);
        for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
                if (ha->outstanding_cmds[handle] == sp)
                        break;
        }
-       spin_unlock_irqrestore(&pha->hardware_lock, flags);
+       spin_unlock_irqrestore(&ha->hardware_lock, flags);
 
        if (handle == MAX_OUTSTANDING_COMMANDS) {
                /* command not found */
@@ -2172,7 +2171,7 @@ qla24xx_abort_command(scsi_qla_host_t *ha, srb_t *sp)
 
        spin_lock_irqsave(&pha->hardware_lock, flags);
        for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) {
-               if (ha->outstanding_cmds[handle] == sp)
+               if (pha->outstanding_cmds[handle] == sp)
                        break;
        }
        spin_unlock_irqrestore(&pha->hardware_lock, flags);
index 9a850a24b38a9b2189a5918e5aa33c2bc156cac1..50baf6a1d67cbc732eac8ec5578d36ea20b59fba 100644 (file)
@@ -106,6 +106,7 @@ qla2x00_mark_vp_devices_dead(scsi_qla_host_t *vha)
                    vha->host_no, fcport->loop_id, fcport->vp_idx));
 
                qla2x00_mark_device_lost(vha, fcport, 0, 0);
+               atomic_set(&fcport->state, FCS_UNCONFIGURED);
        }
 }
 
index 8fc712bbf34476a6463615edffc46a38a8934c06..7c8af7ed2a5dc0d841fa797050d82fd5baefdfb1 100644 (file)
@@ -449,7 +449,7 @@ qla24xx_queuecommand(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *))
        int rval;
        scsi_qla_host_t *pha = to_qla_parent(ha);
 
-       if (unlikely(pci_channel_offline(ha->pdev))) {
+       if (unlikely(pci_channel_offline(pha->pdev))) {
                cmd->result = DID_REQUEUE << 16;
                goto qc24_fail_command;
        }
@@ -2335,8 +2335,10 @@ qla2x00_do_dpc(void *data)
                            ha->host_no));
                }
 
-               if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags))
+               if (test_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags)) {
                        qla2x00_update_fcports(ha);
+                       clear_bit(FCPORT_UPDATE_NEEDED, &ha->dpc_flags);
+               }
 
                if (test_and_clear_bit(RESET_MARKER_NEEDED, &ha->dpc_flags) &&
                    (!(test_and_set_bit(RESET_ACTIVE, &ha->dpc_flags)))) {