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:
Alexander Motin 2015-11-18 12:39:20 +00:00
parent c5fd36edc7
commit c61fdcb93c

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 @@ abort:
/*
* 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 @@ abort:
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 @@ abort:
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 @@ abort:
* 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) {