[SCSI] qla2xxx: Do link initialization on get loop id failure.
To avoid continually doing ISP resets when get loop id fails to obtain the adapter loop id, first try to do a link initialization. Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com> Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Родитель
e9454a883b
Коммит
61e1b269be
|
@ -12,7 +12,7 @@
|
||||||
* | Level | Last Value Used | Holes |
|
* | Level | Last Value Used | Holes |
|
||||||
* ----------------------------------------------------------------------
|
* ----------------------------------------------------------------------
|
||||||
* | Module Init and Probe | 0x0126 | 0x4b,0xba,0xfa |
|
* | Module Init and Probe | 0x0126 | 0x4b,0xba,0xfa |
|
||||||
* | Mailbox commands | 0x1150 | 0x111a-0x111b |
|
* | Mailbox commands | 0x1154 | 0x111a-0x111b |
|
||||||
* | | | 0x112c-0x112e |
|
* | | | 0x112c-0x112e |
|
||||||
* | | | 0x113a |
|
* | | | 0x113a |
|
||||||
* | Device Discovery | 0x2087 | 0x2020-0x2022, |
|
* | Device Discovery | 0x2087 | 0x2020-0x2022, |
|
||||||
|
|
|
@ -814,6 +814,7 @@ typedef struct {
|
||||||
#define MBC_HOST_MEMORY_COPY 0x53 /* Host Memory Copy. */
|
#define MBC_HOST_MEMORY_COPY 0x53 /* Host Memory Copy. */
|
||||||
#define MBC_SEND_RNFT_ELS 0x5e /* Send RNFT ELS request */
|
#define MBC_SEND_RNFT_ELS 0x5e /* Send RNFT ELS request */
|
||||||
#define MBC_GET_LINK_PRIV_STATS 0x6d /* Get link & private data. */
|
#define MBC_GET_LINK_PRIV_STATS 0x6d /* Get link & private data. */
|
||||||
|
#define MBC_LINK_INITIALIZATION 0x72 /* Do link initialization. */
|
||||||
#define MBC_SET_VENDOR_ID 0x76 /* Set Vendor ID. */
|
#define MBC_SET_VENDOR_ID 0x76 /* Set Vendor ID. */
|
||||||
#define MBC_PORT_RESET 0x120 /* Port Reset */
|
#define MBC_PORT_RESET 0x120 /* Port Reset */
|
||||||
#define MBC_SET_PORT_CONFIG 0x122 /* Set port configuration */
|
#define MBC_SET_PORT_CONFIG 0x122 /* Set port configuration */
|
||||||
|
|
|
@ -281,6 +281,9 @@ qla2x00_get_firmware_state(scsi_qla_host_t *, uint16_t *);
|
||||||
extern int
|
extern int
|
||||||
qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t);
|
qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t);
|
||||||
|
|
||||||
|
extern int
|
||||||
|
qla24xx_link_initialize(scsi_qla_host_t *);
|
||||||
|
|
||||||
extern int
|
extern int
|
||||||
qla2x00_lip_reset(scsi_qla_host_t *);
|
qla2x00_lip_reset(scsi_qla_host_t *);
|
||||||
|
|
||||||
|
|
|
@ -2207,6 +2207,7 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
|
||||||
char connect_type[22];
|
char connect_type[22];
|
||||||
struct qla_hw_data *ha = vha->hw;
|
struct qla_hw_data *ha = vha->hw;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
|
||||||
|
|
||||||
/* Get host addresses. */
|
/* Get host addresses. */
|
||||||
rval = qla2x00_get_adapter_id(vha,
|
rval = qla2x00_get_adapter_id(vha,
|
||||||
|
@ -2220,6 +2221,13 @@ qla2x00_configure_hba(scsi_qla_host_t *vha)
|
||||||
} else {
|
} else {
|
||||||
ql_log(ql_log_warn, vha, 0x2009,
|
ql_log(ql_log_warn, vha, 0x2009,
|
||||||
"Unable to get host loop ID.\n");
|
"Unable to get host loop ID.\n");
|
||||||
|
if (IS_FWI2_CAPABLE(ha) && (vha == base_vha) &&
|
||||||
|
(rval == QLA_COMMAND_ERROR && loop_id == 0x1b)) {
|
||||||
|
ql_log(ql_log_warn, vha, 0x1151,
|
||||||
|
"Doing link init.\n");
|
||||||
|
if (qla24xx_link_initialize(vha) == QLA_SUCCESS)
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
|
||||||
}
|
}
|
||||||
return (rval);
|
return (rval);
|
||||||
|
|
|
@ -1632,6 +1632,54 @@ qla2x00_get_port_name(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t *name,
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* qla24xx_link_initialization
|
||||||
|
* Issue link initialization mailbox command.
|
||||||
|
*
|
||||||
|
* Input:
|
||||||
|
* ha = adapter block pointer.
|
||||||
|
* TARGET_QUEUE_LOCK must be released.
|
||||||
|
* ADAPTER_STATE_LOCK must be released.
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* qla2x00 local function return status code.
|
||||||
|
*
|
||||||
|
* Context:
|
||||||
|
* Kernel context.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
qla24xx_link_initialize(scsi_qla_host_t *vha)
|
||||||
|
{
|
||||||
|
int rval;
|
||||||
|
mbx_cmd_t mc;
|
||||||
|
mbx_cmd_t *mcp = &mc;
|
||||||
|
|
||||||
|
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1152,
|
||||||
|
"Entered %s.\n", __func__);
|
||||||
|
|
||||||
|
if (!IS_FWI2_CAPABLE(vha->hw) || IS_CNA_CAPABLE(vha->hw))
|
||||||
|
return QLA_FUNCTION_FAILED;
|
||||||
|
|
||||||
|
mcp->mb[0] = MBC_LINK_INITIALIZATION;
|
||||||
|
mcp->mb[1] = BIT_6|BIT_4;
|
||||||
|
mcp->mb[2] = 0;
|
||||||
|
mcp->mb[3] = 0;
|
||||||
|
mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0;
|
||||||
|
mcp->in_mb = MBX_0;
|
||||||
|
mcp->tov = MBX_TOV_SECONDS;
|
||||||
|
mcp->flags = 0;
|
||||||
|
rval = qla2x00_mailbox_command(vha, mcp);
|
||||||
|
|
||||||
|
if (rval != QLA_SUCCESS) {
|
||||||
|
ql_dbg(ql_dbg_mbx, vha, 0x1153, "Failed=%x.\n", rval);
|
||||||
|
} else {
|
||||||
|
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1154,
|
||||||
|
"Done %s.\n", __func__);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* qla2x00_lip_reset
|
* qla2x00_lip_reset
|
||||||
* Issue LIP reset mailbox command.
|
* Issue LIP reset mailbox command.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче