diff options
| author | mjacob <mjacob@NetBSD.org> | 2001-10-06 20:34:49 +0000 |
|---|---|---|
| committer | mjacob <mjacob@NetBSD.org> | 2001-10-06 20:34:49 +0000 |
| commit | 6349e2e63a480dfc2ec2aa7dc7ea1d098eba4ec4 (patch) | |
| tree | 02d000b6ee41b872e7ca25223556470b9b75ff14 /sys | |
| parent | daf0329c3c97f41ef2ebe8ae1cb0085ec11d206a (diff) | |
Fix various 2300 GB issues related to chip errata and documentation
misunderstandings. We also now can report our connection rate.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/ic/isp.c | 61 | ||||
| -rw-r--r-- | sys/dev/ic/ispmbox.h | 72 | ||||
| -rw-r--r-- | sys/dev/ic/ispvar.h | 6 |
3 files changed, 88 insertions, 51 deletions
diff --git a/sys/dev/ic/isp.c b/sys/dev/ic/isp.c index 6a110c3faad..0885f6f5a51 100644 --- a/sys/dev/ic/isp.c +++ b/sys/dev/ic/isp.c @@ -1,4 +1,4 @@ -/* $NetBSD: isp.c,v 1.80 2001/09/05 23:05:20 mjacob Exp $ */ +/* $NetBSD: isp.c,v 1.81 2001/10/06 20:34:49 mjacob Exp $ */ /* * This driver, which is contained in NetBSD in the files: * @@ -576,15 +576,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; + } } } @@ -1234,23 +1241,29 @@ isp_fibre_init(struct ispsoftc *isp) */ switch(isp->isp_confopts & ISP_CFG_PORT_PREF) { case ISP_CFG_NPORT: - icbp->icb_xfwoptions = ICBXOPT_PTP_2_LOOP; + icbp->icb_xfwoptions |= ICBXOPT_PTP_2_LOOP; break; case ISP_CFG_NPORT_ONLY: - icbp->icb_xfwoptions = ICBXOPT_PTP_ONLY; + icbp->icb_xfwoptions |= ICBXOPT_PTP_ONLY; break; case ISP_CFG_LPORT_ONLY: - icbp->icb_xfwoptions = ICBXOPT_LOOP_ONLY; + icbp->icb_xfwoptions |= ICBXOPT_LOOP_ONLY; break; default: - icbp->icb_xfwoptions = ICBXOPT_LOOP_2_PTP; + icbp->icb_xfwoptions |= ICBXOPT_LOOP_2_PTP; break; } if (IS_2300(isp)) { if (isp->isp_revision < 2) { icbp->icb_fwoptions &= ~ICBOPT_FAST_POST; } - icbp->icb_xfwoptions |= ICBXOPT_RATE_AUTO; + if (isp->isp_confopts & ISP_CFG_ONEGB) { + icbp->icb_zfwoptions |= ICBZOPT_RATE_ONEGB; + } else if (isp->isp_confopts & ISP_CFG_TWOGB) { + icbp->icb_zfwoptions |= ICBZOPT_RATE_TWOGB; + } else { + icbp->icb_zfwoptions |= ICBZOPT_RATE_AUTO; + } } } @@ -1611,6 +1624,20 @@ not_on_fabric: fcp->portdb[FL_PORT_ID].valid = 0; } + fcp->isp_gbspeed = 1; + if (IS_2300(isp)) { + mbs.param[0] = MBOX_GET_SET_DATA_RATE; + mbs.param[1] = MBGSD_GET_RATE; + /* mbs.param[2] undefined if we're just getting rate */ + isp_mboxcmd(isp, &mbs, MBLOGALL); + if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { + if (mbs.param[1] == MBGSD_TWOGB) { + isp_prt(isp, ISP_LOGINFO, "2Gb link speed/s"); + fcp->isp_gbspeed = 2; + } + } + } + isp_prt(isp, ISP_LOGINFO, topology, fcp->isp_loopid, fcp->isp_alpa, fcp->isp_portid, fcp->isp_loopstate, toponames[fcp->isp_topo]); @@ -4271,7 +4298,7 @@ static u_int16_t mbpfc[] = { ISPOPMAP(0x00, 0x00), /* 0x25: */ ISPOPMAP(0x00, 0x00), /* 0x26: */ ISPOPMAP(0x00, 0x00), /* 0x27: */ - ISPOPMAP(0x01, 0x3), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ + ISPOPMAP(0x01, 0x03), /* 0x28: MBOX_GET_FIRMWARE_OPTIONS */ ISPOPMAP(0x03, 0x07), /* 0x29: MBOX_GET_PORT_QUEUE_PARAMS */ ISPOPMAP(0x00, 0x00), /* 0x2a: */ ISPOPMAP(0x00, 0x00), /* 0x2b: */ @@ -4324,7 +4351,7 @@ static u_int16_t mbpfc[] = { ISPOPMAP(0x00, 0x00), /* 0x5a: */ ISPOPMAP(0x00, 0x00), /* 0x5b: */ ISPOPMAP(0x00, 0x00), /* 0x5c: */ - ISPOPMAP(0x00, 0x00), /* 0x5d: */ + ISPOPMAP(0x07, 0x03), /* 0x5d: MBOX_GET_SET_DATA_RATE */ ISPOPMAP(0x00, 0x00), /* 0x5e: */ ISPOPMAP(0x00, 0x00), /* 0x5f: */ ISPOPMAP(0xfd, 0x31), /* 0x60: MBOX_INIT_FIRMWARE */ @@ -4455,7 +4482,7 @@ static char *fc_mbcmd_names[] = { NULL, NULL, NULL, - NULL, + "GET/SET DATA RATE", NULL, NULL, "INIT FIRMWARE", diff --git a/sys/dev/ic/ispmbox.h b/sys/dev/ic/ispmbox.h index 5f6ef72c720..eaa07a3b913 100644 --- a/sys/dev/ic/ispmbox.h +++ b/sys/dev/ic/ispmbox.h @@ -1,4 +1,4 @@ -/* $NetBSD: ispmbox.h,v 1.34 2001/09/01 07:12:24 mjacob Exp $ */ +/* $NetBSD: ispmbox.h,v 1.35 2001/10/06 20:34:51 mjacob Exp $ */ /* * This driver, which is contained in NetBSD in the files: * @@ -138,37 +138,45 @@ #define FW_FEATURE_LVD_NOTIFY 0x2 #define FW_FEATURE_FAST_POST 0x1 -#define MBOX_ENABLE_TARGET_MODE 0x55 +#define MBOX_ENABLE_TARGET_MODE 0x0055 #define ENABLE_TARGET_FLAG 0x8000 #define ENABLE_TQING_FLAG 0x0004 #define ENABLE_MANDATORY_DISC 0x0002 -#define MBOX_GET_TARGET_STATUS 0x56 - -/* These are for the ISP2100 FC cards */ -#define MBOX_GET_LOOP_ID 0x20 -#define MBOX_GET_FIRMWARE_OPTIONS 0x28 -#define MBOX_SET_FIRMWARE_OPTIONS 0x38 -#define MBOX_GET_RESOURCE_COUNT 0x42 -#define MBOX_ENHANCED_GET_PDB 0x47 -#define MBOX_EXEC_COMMAND_IOCB_A64 0x54 -#define MBOX_INIT_FIRMWARE 0x60 -#define MBOX_GET_INIT_CONTROL_BLOCK 0x61 -#define MBOX_INIT_LIP 0x62 -#define MBOX_GET_FC_AL_POSITION_MAP 0x63 -#define MBOX_GET_PORT_DB 0x64 -#define MBOX_CLEAR_ACA 0x65 -#define MBOX_TARGET_RESET 0x66 -#define MBOX_CLEAR_TASK_SET 0x67 -#define MBOX_ABORT_TASK_SET 0x68 -#define MBOX_GET_FW_STATE 0x69 -#define MBOX_GET_PORT_NAME 0x6a -#define MBOX_GET_LINK_STATUS 0x6b -#define MBOX_INIT_LIP_RESET 0x6c -#define MBOX_SEND_SNS 0x6e -#define MBOX_FABRIC_LOGIN 0x6f -#define MBOX_SEND_CHANGE_REQUEST 0x70 -#define MBOX_FABRIC_LOGOUT 0x71 -#define MBOX_INIT_LIP_LOGIN 0x72 +#define MBOX_GET_TARGET_STATUS 0x0056 + +/* These are for the ISP2X00 FC cards */ +#define MBOX_GET_LOOP_ID 0x0020 +#define MBOX_GET_FIRMWARE_OPTIONS 0x0028 +#define MBOX_SET_FIRMWARE_OPTIONS 0x0038 +#define MBOX_GET_RESOURCE_COUNT 0x0042 +#define MBOX_ENHANCED_GET_PDB 0x0047 +#define MBOX_EXEC_COMMAND_IOCB_A64 0x0054 +#define MBOX_INIT_FIRMWARE 0x0060 +#define MBOX_GET_INIT_CONTROL_BLOCK 0x0061 +#define MBOX_INIT_LIP 0x0062 +#define MBOX_GET_FC_AL_POSITION_MAP 0x0063 +#define MBOX_GET_PORT_DB 0x0064 +#define MBOX_CLEAR_ACA 0x0065 +#define MBOX_TARGET_RESET 0x0066 +#define MBOX_CLEAR_TASK_SET 0x0067 +#define MBOX_ABORT_TASK_SET 0x0068 +#define MBOX_GET_FW_STATE 0x0069 +#define MBOX_GET_PORT_NAME 0x006A +#define MBOX_GET_LINK_STATUS 0x006B +#define MBOX_INIT_LIP_RESET 0x006C +#define MBOX_SEND_SNS 0x006E +#define MBOX_FABRIC_LOGIN 0x006F +#define MBOX_SEND_CHANGE_REQUEST 0x0070 +#define MBOX_FABRIC_LOGOUT 0x0071 +#define MBOX_INIT_LIP_LOGIN 0x0072 + +#define MBOX_GET_SET_DATA_RATE 0x005D /* 23XX only */ +#define MBGSD_GET_RATE 0 +#define MBGSD_SET_RATE 1 +#define MBGSD_ONEGB 0 +#define MBGSD_TWOGB 1 +#define MBGSD_AUTO 2 + #define ISP2100_SET_PCI_PARAM 0x00ff @@ -685,9 +693,9 @@ typedef struct isp_icb { #define ICBXOPT_RIO_32BIT_DELAY 4 /* These 3 only apply to the 2300 */ -#define ICBXOPT_RATE_ONEGB (0 << 14) -#define ICBXOPT_RATE_TWOGB (1 << 14) -#define ICBXOPT_RATE_AUTO (2 << 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 diff --git a/sys/dev/ic/ispvar.h b/sys/dev/ic/ispvar.h index ef531715097..8e1fb40adca 100644 --- a/sys/dev/ic/ispvar.h +++ b/sys/dev/ic/ispvar.h @@ -1,4 +1,4 @@ -/* $NetBSD: ispvar.h,v 1.49 2001/09/05 22:33:05 mjacob Exp $ */ +/* $NetBSD: ispvar.h,v 1.50 2001/10/06 20:34:51 mjacob Exp $ */ /* * This driver, which is contained in NetBSD in the files: * @@ -274,7 +274,7 @@ typedef struct { typedef struct { u_int32_t isp_fwoptions : 16, - : 2, + isp_gbspeed : 2, isp_iid_set : 1, loop_seen_once : 1, isp_loopstate : 4, /* Current Loop State */ @@ -449,6 +449,8 @@ typedef struct ispsoftc { */ #define ISP_CFG_NORELOAD 0x80 /* don't download f/w */ #define ISP_CFG_NONVRAM 0x40 /* ignore NVRAM */ +#define ISP_CFG_TWOGB 0x20 /* force 2GB connection (23XX only) */ +#define ISP_CFG_ONEGB 0x10 /* force 1GB connection (23XX only) */ #define ISP_CFG_FULL_DUPLEX 0x01 /* Full Duplex (Fibre Channel only) */ #define ISP_CFG_OWNWWN 0x02 /* override NVRAM wwn */ #define ISP_CFG_PORT_PREF 0x0C /* Mask for Port Prefs (2200 only) */ |
