Simplify fabric tasting code.

Except cosmetic changes this removes fabric ports from our port database.
It is always firmware duty to manage them, so driver don't need to worry.
This commit is contained in:
mav 2015-11-18 12:39:20 +00:00
parent 1aa7b8ca20
commit a765e77195

View File

@ -2766,10 +2766,9 @@ static int
isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
{
mbreg_t mbs;
int check_for_fabric, r;
int r;
uint16_t nphdl;
fcparam *fcp;
fcportdb_t *lp;
isp_pdb_t pdb;
NANOTIME_T hra, hrb;
@ -2826,7 +2825,14 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
}
if (IS_2100(isp)) {
fcp->isp_topo = TOPO_NL_PORT;
/*
* Don't bother with fabric if we are using really old
* 2100 firmware. It's just not worth it.
*/
if (ISP_FW_NEWER_THAN(isp, 1, 15, 37))
fcp->isp_topo = TOPO_FL_PORT;
else
fcp->isp_topo = TOPO_NL_PORT;
} else {
int topo = (int) mbs.param[6];
if (topo < TOPO_NL_PORT || topo > TOPO_PTP_STUB) {
@ -2836,22 +2842,6 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
}
fcp->isp_portid = mbs.param[2] | (mbs.param[3] << 16);
if (IS_2100(isp)) {
/*
* Don't bother with fabric if we are using really old
* 2100 firmware. It's just not worth it.
*/
if (ISP_FW_NEWER_THAN(isp, 1, 15, 37)) {
check_for_fabric = 1;
} else {
check_for_fabric = 0;
}
} else if (fcp->isp_topo == TOPO_FL_PORT || fcp->isp_topo == TOPO_F_PORT) {
check_for_fabric = 1;
} else {
check_for_fabric = 0;
}
/*
* Check to make sure we got a valid loopid
* The 24XX seems to mess this up for multiple channels.
@ -2878,54 +2868,22 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
}
}
if (IS_24XX(isp)) { /* XXX SHOULDN'T THIS BE FOR 2K F/W? XXX */
nphdl = NPH_FL_ID;
} else {
nphdl = FL_ID;
}
if (check_for_fabric) {
if (fcp->isp_topo == TOPO_F_PORT || fcp->isp_topo == TOPO_FL_PORT) {
nphdl = IS_24XX(isp) ? NPH_FL_ID : FL_ID;
r = isp_getpdb(isp, chan, nphdl, &pdb, 1);
if (r && (fcp->isp_topo == TOPO_F_PORT || fcp->isp_topo == TOPO_FL_PORT)) {
isp_prt(isp, ISP_LOGWARN, "fabric topology but cannot get info about fabric controller (0x%x)", r);
fcp->isp_topo = TOPO_PTP_STUB;
}
} else {
r = -1;
}
if (r == 0) {
if (IS_2100(isp)) {
fcp->isp_topo = TOPO_FL_PORT;
}
if (pdb.portid == 0) {
/*
* Crock.
*/
fcp->isp_topo = TOPO_NL_PORT;
if (r != 0 || pdb.portid == 0) {
if (IS_2100(isp)) {
fcp->isp_topo = TOPO_NL_PORT;
} else {
isp_prt(isp, ISP_LOGWARN,
"fabric topology, but cannot get info about fabric controller (0x%x)", r);
fcp->isp_topo = TOPO_PTP_STUB;
}
goto not_on_fabric;
}
/*
* Save the Fabric controller's port database entry.
*/
lp = &fcp->portdb[FL_ID];
lp->state = FC_PORTDB_STATE_PENDING_VALID;
MAKE_WWN_FROM_NODE_NAME(lp->node_wwn, pdb.nodename);
MAKE_WWN_FROM_NODE_NAME(lp->port_wwn, pdb.portname);
lp->prli_word3 = pdb.prli_word3;
lp->portid = pdb.portid;
lp->handle = pdb.handle;
lp->new_portid = lp->portid;
lp->new_prli_word3 = lp->prli_word3;
if (IS_24XX(isp)) {
if (check_for_fabric) {
/*
* The mbs is still hanging out from the MBOX_GET_LOOP_ID above.
*/
fcp->isp_fabric_params = mbs.param[7];
} else {
fcp->isp_fabric_params = 0;
}
fcp->isp_fabric_params = mbs.param[7];
fcp->isp_sns_hdl = NPH_SNS_ID;
r = isp_register_fc4_type_24xx(isp, chan);
if (r == 0)
@ -2938,11 +2896,9 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
isp_prt(isp, ISP_LOGWARN|ISP_LOG_SANCFG, "%s: register fc4 type failed", __func__);
return (-1);
}
} else {
not_on_fabric:
fcp->portdb[FL_ID].state = FC_PORTDB_STATE_NIL;
}
not_on_fabric:
fcp->isp_gbspeed = 1;
if (IS_23XX(isp) || IS_24XX(isp)) {
MBSINIT(&mbs, MBOX_GET_SET_DATA_RATE, MBLOGALL, 3000000);
@ -3054,10 +3010,6 @@ isp_pdb_sync(ispsoftc_t *isp, int chan)
lp->prli_word3 = lp->new_prli_word3;
lp->state = FC_PORTDB_STATE_VALID;
isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
if (dbidx != FL_ID) {
lp->new_prli_word3 = 0;
lp->new_portid = 0;
}
break;
case FC_PORTDB_STATE_ZOMBIE:
break;
@ -3532,11 +3484,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
/*
* Make sure we still are logged into the fabric controller.
*/
if (IS_24XX(isp)) { /* XXX SHOULDN'T THIS BE TRUE FOR 2K F/W? XXX */
nphdl = NPH_FL_ID;
} else {
nphdl = FL_ID;
}
nphdl = IS_24XX(isp) ? NPH_FL_ID : FL_ID;
r = isp_getpdb(isp, chan, nphdl, &pdb, 0);
if ((r & 0xffff) == MBOX_NOT_LOGGED_IN) {
isp_dump_chip_portdb(isp, chan, 0);
@ -3590,12 +3538,6 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
return (0);
}
/*
* If we get this far, we certainly still have the fabric controller.
*/
fcp->portdb[FL_ID].state = FC_PORTDB_STATE_PENDING_VALID;
/*
* Go through the list and remove duplicate port ids.
*/
@ -3840,10 +3782,6 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
dbidx = MAX_FC_TARG;
for (lp = fcp->portdb; lp < &fcp->portdb[MAX_FC_TARG]; lp++) {
if (lp >= &fcp->portdb[FL_ID] &&
lp <= &fcp->portdb[SNS_ID]) {
continue;
}
if (lp->state == FC_PORTDB_STATE_NIL) {
if (dbidx == MAX_FC_TARG) {
dbidx = lp - fcp->portdb;
@ -3909,9 +3847,6 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
* WWNN/WWPN duple
*/
for (dbidx = 0; dbidx < MAX_FC_TARG; dbidx++) {
if (dbidx >= FL_ID && dbidx <= SNS_ID) {
continue;
}
if ((fcp->portdb[dbidx].node_wwn == wwnn ||
fcp->portdb[dbidx].node_wwn == 0) &&
fcp->portdb[dbidx].port_wwn == wwpn) {