diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index 2d76c4c41404..66518e2bddc3 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -548,15 +548,22 @@ again: ISP_RESET1(isp); /* - * Wait for everything to finish firing up... + * Wait for everything to finish firing up. + * + * Avoid doing this on the 2312 because you can generate a PCI + * parity error (chip breakage). */ - loops = MBOX_DELAY_COUNT; - while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) { - USEC_DELAY(100); - if (--loops < 0) { - isp_prt(isp, ISP_LOGERR, - "MBOX_BUSY never cleared on reset"); - return; + if (IS_2300(isp)) { + USEC_DELAY(5); + } else { + loops = MBOX_DELAY_COUNT; + while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) { + USEC_DELAY(100); + if (--loops < 0) { + isp_prt(isp, ISP_LOGERR, + "MBOX_BUSY never cleared on reset"); + return; + } } } @@ -1223,11 +1230,11 @@ isp_fibre_init(struct ispsoftc *isp) icbp->icb_fwoptions &= ~ICBOPT_FAST_POST; } if (isp->isp_confopts & ISP_CFG_ONEGB) { - icbp->icb_xfwoptions |= ICBXOPT_RATE_ONEGB; + icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB; } else if (isp->isp_confopts & ISP_CFG_TWOGB) { - icbp->icb_xfwoptions |= ICBXOPT_RATE_TWOGB; + icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB; } else { - icbp->icb_xfwoptions |= ICBXOPT_RATE_AUTO; + icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO; } } } diff --git a/sys/dev/isp/ispmbox.h b/sys/dev/isp/ispmbox.h index ec724b99db18..78ef00d11be5 100644 --- a/sys/dev/isp/ispmbox.h +++ b/sys/dev/isp/ispmbox.h @@ -662,9 +662,9 @@ typedef struct isp_icb { #define ICBXOPT_RIO_32BIT_DELAY 4 /* These 3 only apply to the 2300 */ -#define ICBXOPT_RATE_ONEGB (MBGSD_ONEGB << 14) -#define ICBXOPT_RATE_TWOGB (MBGSD_TWOGB << 14) -#define ICBXOPT_RATE_AUTO (MBGSD_AUTO << 14) +#define ICBZOPT_RATE_ONEGB (MBGSD_ONEGB << 14) +#define ICBZOPT_RATE_TWOGB (MBGSD_TWOGB << 14) +#define ICBZOPT_RATE_AUTO (MBGSD_AUTO << 14) #define ICB_MIN_FRMLEN 256