qla2xxx: Fix virtual port configuration, when switch port is disabled/enabled.
On some vendor switches, when switch port is toggled (down /up), then in some condition driver tries to configure virtual port, before FW is actually in ready state to process any commands on wire. At this time, configuring virtual port can fail. Add fix in driver to make driver wait, for FW to be ready state before Signed-off-by: Sawan Chandak <sawan.chandak@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
Родитель
e8fb1250ba
Коммит
ded6411fd8
|
@ -3590,6 +3590,7 @@ typedef struct scsi_qla_host {
|
|||
#define VP_BIND_NEEDED 2
|
||||
#define VP_DELETE_NEEDED 3
|
||||
#define VP_SCR_NEEDED 4 /* State Change Request registration */
|
||||
#define VP_CONFIG_OK 5 /* Flag to cfg VP, if FW is ready */
|
||||
atomic_t vp_state;
|
||||
#define VP_OFFLINE 0
|
||||
#define VP_ACTIVE 1
|
||||
|
|
|
@ -763,6 +763,7 @@ skip_rio:
|
|||
memcpy(vha->port_name, wwpn, WWN_SIZE);
|
||||
}
|
||||
|
||||
clear_bit(VP_CONFIG_OK, &vha->vp_flags);
|
||||
vha->device_flags |= DFLG_NO_CABLE;
|
||||
qla2x00_mark_all_devices_lost(vha, 1);
|
||||
}
|
||||
|
@ -947,6 +948,7 @@ skip_rio:
|
|||
|
||||
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
||||
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
||||
set_bit(VP_CONFIG_OK, &vha->vp_flags);
|
||||
|
||||
qlt_async_event(mb[0], vha, mb);
|
||||
break;
|
||||
|
|
|
@ -306,19 +306,25 @@ qla2x00_vp_abort_isp(scsi_qla_host_t *vha)
|
|||
static int
|
||||
qla2x00_do_dpc_vp(scsi_qla_host_t *vha)
|
||||
{
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
|
||||
|
||||
ql_dbg(ql_dbg_dpc + ql_dbg_verbose, vha, 0x4012,
|
||||
"Entering %s vp_flags: 0x%lx.\n", __func__, vha->vp_flags);
|
||||
|
||||
qla2x00_do_work(vha);
|
||||
|
||||
if (test_and_clear_bit(VP_IDX_ACQUIRED, &vha->vp_flags)) {
|
||||
/* VP acquired. complete port configuration */
|
||||
ql_dbg(ql_dbg_dpc, vha, 0x4014,
|
||||
"Configure VP scheduled.\n");
|
||||
qla24xx_configure_vp(vha);
|
||||
ql_dbg(ql_dbg_dpc, vha, 0x4015,
|
||||
"Configure VP end.\n");
|
||||
return 0;
|
||||
/* Check if Fw is ready to configure VP first */
|
||||
if (test_bit(VP_CONFIG_OK, &base_vha->vp_flags)) {
|
||||
if (test_and_clear_bit(VP_IDX_ACQUIRED, &vha->vp_flags)) {
|
||||
/* VP acquired. complete port configuration */
|
||||
ql_dbg(ql_dbg_dpc, vha, 0x4014,
|
||||
"Configure VP scheduled.\n");
|
||||
qla24xx_configure_vp(vha);
|
||||
ql_dbg(ql_dbg_dpc, vha, 0x4015,
|
||||
"Configure VP end.\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче