MFC r297915: Filter Port Database Changed notifications.
For some reason firmware sends Port Database Changed notifications in case of explicit login requests from the driver when target port is unavailabe. Those notifications don't give driver any new information, but only cause infinite scan loop.
This commit is contained in:
parent
ff8ad51170
commit
25b28f1fd9
@ -2630,6 +2630,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags
|
||||
isp_put_plogx(isp, &pl, (isp_plogx_t *)reqp);
|
||||
if (isp->isp_dblev & ISP_LOGDEBUG1)
|
||||
isp_print_bytes(isp, "IOCB LOGX", QENTRY_LEN, reqp);
|
||||
FCPARAM(isp, chan)->isp_login_hdl = handle;
|
||||
ISP_SYNC_REQUEST(isp);
|
||||
if (msleep(resp, &isp->isp_lock, 0, "PLOGX", 3 * ICB_LOGIN_TOV * hz)
|
||||
== EWOULDBLOCK) {
|
||||
@ -2638,6 +2639,7 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags
|
||||
isp_destroy_handle(isp, pl.plogx_handle);
|
||||
return (-1);
|
||||
}
|
||||
FCPARAM(isp, chan)->isp_login_hdl = NIL_HANDLE;
|
||||
if (isp->isp_dblev & ISP_LOGDEBUG1)
|
||||
isp_print_bytes(isp, "IOCB LOGX response", QENTRY_LEN, resp);
|
||||
isp_get_plogx(isp, (isp_plogx_t *)resp, &pl);
|
||||
@ -6000,9 +6002,13 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
|
||||
fcp = FCPARAM(isp, chan);
|
||||
if (fcp->role == ISP_ROLE_NONE)
|
||||
continue;
|
||||
if (fcp->isp_loopstate > LOOP_LTEST_DONE)
|
||||
if (fcp->isp_loopstate > LOOP_LTEST_DONE) {
|
||||
if (nphdl != NIL_HANDLE &&
|
||||
nphdl == fcp->isp_login_hdl &&
|
||||
reason == PDB24XX_AE_OPN_2)
|
||||
continue;
|
||||
fcp->isp_loopstate = LOOP_LTEST_DONE;
|
||||
else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
|
||||
} else if (fcp->isp_loopstate < LOOP_HAVE_LINK)
|
||||
fcp->isp_loopstate = LOOP_HAVE_LINK;
|
||||
isp_async(isp, ISPASYNC_CHANGE_NOTIFY, chan,
|
||||
ISPASYNC_CHANGE_PDB, nphdl, nlstate, reason);
|
||||
@ -7818,6 +7824,7 @@ isp_setdfltfcparm(ispsoftc_t *isp, int chan)
|
||||
fcp->isp_xfwoptions = 0;
|
||||
fcp->isp_zfwoptions = 0;
|
||||
fcp->isp_lasthdl = NIL_HANDLE;
|
||||
fcp->isp_login_hdl = NIL_HANDLE;
|
||||
|
||||
if (IS_24XX(isp)) {
|
||||
fcp->isp_fwoptions |= ICB2400_OPT1_FAIRNESS;
|
||||
|
@ -449,6 +449,7 @@ typedef struct {
|
||||
uint16_t isp_lasthdl; /* only valid for channel 0 */
|
||||
uint16_t isp_maxalloc;
|
||||
uint16_t isp_fabric_params;
|
||||
uint16_t isp_login_hdl; /* Logging in handle */
|
||||
uint8_t isp_retry_delay;
|
||||
uint8_t isp_retry_count;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user