mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-16 05:50:19 +00:00
[SCSI] qla2xxx: Additional NPIV corrections.
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>
This commit is contained in:
parent
bf6583b583
commit
c9c5ced90a
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)))) {
|
||||
|
Loading…
Reference in New Issue
Block a user