summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/isp.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2016-05-03 08:03:51 +0000
committermav <mav@FreeBSD.org>2016-05-03 08:03:51 +0000
commitff8ad51170fa62937c0a19cd90bbd284343dcaed (patch)
treea2de78d2165a771022df62e37f072b87ac08df3b /sys/dev/isp/isp.c
parent6befb93a07992d74dd1c45349ffdb49f146eeec7 (diff)
downloadFreeBSD-src-ff8ad51170fa62937c0a19cd90bbd284343dcaed.zip
FreeBSD-src-ff8ad51170fa62937c0a19cd90bbd284343dcaed.tar.gz
MFC r297912: Respect NVRAM topology settings on 24xx and above chips.
Diffstat (limited to 'sys/dev/isp/isp.c')
-rw-r--r--sys/dev/isp/isp.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 2664d13..567b0a5 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -1822,22 +1822,24 @@ isp_fibre_init(ispsoftc_t *isp)
* Prefer or force Point-To-Point instead Loop?
*/
switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
- case ISP_CFG_NPORT:
+ case ISP_CFG_LPORT_ONLY:
icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
- icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
+ icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
break;
case ISP_CFG_NPORT_ONLY:
icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY;
break;
- case ISP_CFG_LPORT_ONLY:
+ case ISP_CFG_LPORT:
icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
- icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY;
+ icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP;
+ break;
+ case ISP_CFG_NPORT:
+ icbp->icb_xfwoptions &= ~ICBXOPT_TOPO_MASK;
+ icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP;
break;
default:
- /*
- * Let NVRAM settings define it if they are sane
- */
+ /* Let NVRAM settings define it if they are sane */
switch (icbp->icb_xfwoptions & ICBXOPT_TOPO_MASK) {
case ICBXOPT_PTP_2_LOOP:
case ICBXOPT_PTP_ONLY:
@@ -2109,19 +2111,32 @@ isp_fibre_init_2400(ispsoftc_t *isp)
}
switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
- case ISP_CFG_NPORT_ONLY:
- icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
- icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY;
- break;
case ISP_CFG_LPORT_ONLY:
icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_ONLY;
break;
- default:
+ case ISP_CFG_NPORT_ONLY:
+ icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
+ icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY;
+ break;
+ case ISP_CFG_NPORT:
/* ISP_CFG_PTP_2_LOOP not available in 24XX/25XX */
+ case ISP_CFG_LPORT:
icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP;
break;
+ default:
+ /* Let NVRAM settings define it if they are sane */
+ switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TOPO_MASK) {
+ case ICB2400_OPT2_LOOP_ONLY:
+ case ICB2400_OPT2_PTP_ONLY:
+ case ICB2400_OPT2_LOOP_2_PTP:
+ break;
+ default:
+ icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
+ icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP;
+ }
+ break;
}
switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK) {
@@ -7807,23 +7822,23 @@ isp_setdfltfcparm(ispsoftc_t *isp, int chan)
if (IS_24XX(isp)) {
fcp->isp_fwoptions |= ICB2400_OPT1_FAIRNESS;
fcp->isp_fwoptions |= ICB2400_OPT1_HARD_ADDRESS;
- if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) {
+ if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
fcp->isp_fwoptions |= ICB2400_OPT1_FULL_DUPLEX;
- }
fcp->isp_fwoptions |= ICB2400_OPT1_BOTH_WWNS;
+ fcp->isp_xfwoptions |= ICB2400_OPT2_LOOP_2_PTP;
fcp->isp_zfwoptions |= ICB2400_OPT3_RATE_AUTO;
} else {
fcp->isp_fwoptions |= ICBOPT_FAIRNESS;
fcp->isp_fwoptions |= ICBOPT_PDBCHANGE_AE;
fcp->isp_fwoptions |= ICBOPT_HARD_ADDRESS;
- if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) {
+ if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX)
fcp->isp_fwoptions |= ICBOPT_FULL_DUPLEX;
- }
/*
* Make sure this is turned off now until we get
* extended options from NVRAM
*/
fcp->isp_fwoptions &= ~ICBOPT_EXTENDED;
+ fcp->isp_xfwoptions |= ICBXOPT_LOOP_2_PTP;
fcp->isp_zfwoptions |= ICBZOPT_RATE_AUTO;
}
OpenPOWER on IntegriCloud