Deleted Added
full compact
isp.c (56008) isp.c (57146)
1/* $FreeBSD: head/sys/dev/isp/isp.c 56008 2000-01-15 01:52:01Z mjacob $ */
1/* $FreeBSD: head/sys/dev/isp/isp.c 57146 2000-02-11 19:31:32Z mjacob $ */
2/*
3 * Machine and OS Independent (well, as best as possible)
4 * code for the Qlogic ISP SCSI adapters.
5 *
6 * Copyright (c) 1997, 1998, 1999 by Matthew Jacob
7 * NASA/Ames Research Center
8 * All rights reserved.
9 *

--- 80 unchanged lines hidden (view full) ---

90static void isp_dumpregs __P((struct ispsoftc *, const char *));
91static void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *));
92
93static void isp_update __P((struct ispsoftc *));
94static void isp_update_bus __P((struct ispsoftc *, int));
95static void isp_setdfltparm __P((struct ispsoftc *, int));
96static int isp_read_nvram __P((struct ispsoftc *));
97static void isp_rdnvram_word __P((struct ispsoftc *, int, u_int16_t *));
2/*
3 * Machine and OS Independent (well, as best as possible)
4 * code for the Qlogic ISP SCSI adapters.
5 *
6 * Copyright (c) 1997, 1998, 1999 by Matthew Jacob
7 * NASA/Ames Research Center
8 * All rights reserved.
9 *

--- 80 unchanged lines hidden (view full) ---

90static void isp_dumpregs __P((struct ispsoftc *, const char *));
91static void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *));
92
93static void isp_update __P((struct ispsoftc *));
94static void isp_update_bus __P((struct ispsoftc *, int));
95static void isp_setdfltparm __P((struct ispsoftc *, int));
96static int isp_read_nvram __P((struct ispsoftc *));
97static void isp_rdnvram_word __P((struct ispsoftc *, int, u_int16_t *));
98static void isp_parse_nvram_1020 __P((struct ispsoftc *, u_int8_t *));
99static void isp_parse_nvram_1080 __P((struct ispsoftc *, int, u_int8_t *));
100static void isp_parse_nvram_12160 __P((struct ispsoftc *, int, u_int8_t *));
101static void isp_parse_nvram_2100 __P((struct ispsoftc *, u_int8_t *));
98
102
103
99/*
100 * Reset Hardware.
101 *
102 * Hit the chip over the head, download new f/w if available and set it running.
103 *
104 * Locking done elsewhere.
105 */
106void

--- 76 unchanged lines hidden (view full) ---

183 */
184 } else if (IS_ULTRA2(isp)) {
185 static char *m = "%s: bus %d is in %s Mode\n";
186 u_int16_t l;
187 sdparam *sdp = isp->isp_param;
188
189 isp->isp_clock = 100;
190
104/*
105 * Reset Hardware.
106 *
107 * Hit the chip over the head, download new f/w if available and set it running.
108 *
109 * Locking done elsewhere.
110 */
111void

--- 76 unchanged lines hidden (view full) ---

188 */
189 } else if (IS_ULTRA2(isp)) {
190 static char *m = "%s: bus %d is in %s Mode\n";
191 u_int16_t l;
192 sdparam *sdp = isp->isp_param;
193
194 isp->isp_clock = 100;
195
191 revname = "1080";
196 if (IS_1280(isp))
197 revname = "1280";
198 else if (IS_1080(isp))
199 revname = "1080";
200 else if (IS_12160(isp))
201 revname = "12160";
202 else
203 revname = "<UNKLVD>";
204
192 l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
193 switch (l) {
194 case ISP1080_LVD_MODE:
195 sdp->isp_lvdmode = 1;
196 CFGPRINTF(m, isp->isp_name, 0, "LVD");
197 break;
198 case ISP1080_HVD_MODE:
199 sdp->isp_diffmode = 1;

--- 4 unchanged lines hidden (view full) ---

204 CFGPRINTF(m, isp->isp_name, 0, "Single-Ended");
205 break;
206 default:
207 CFGPRINTF("%s: unknown mode on bus %d (0x%x)\n",
208 isp->isp_name, 0, l);
209 break;
210 }
211
205 l = ISP_READ(isp, SXP_PINS_DIFF) & ISP1080_MODE_MASK;
206 switch (l) {
207 case ISP1080_LVD_MODE:
208 sdp->isp_lvdmode = 1;
209 CFGPRINTF(m, isp->isp_name, 0, "LVD");
210 break;
211 case ISP1080_HVD_MODE:
212 sdp->isp_diffmode = 1;

--- 4 unchanged lines hidden (view full) ---

217 CFGPRINTF(m, isp->isp_name, 0, "Single-Ended");
218 break;
219 default:
220 CFGPRINTF("%s: unknown mode on bus %d (0x%x)\n",
221 isp->isp_name, 0, l);
222 break;
223 }
224
212 if (IS_1280(isp)) {
225 if (IS_DUALBUS(isp)) {
213 sdp++;
226 sdp++;
214 revname[1] = '2';
215 l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
216 l &= ISP1080_MODE_MASK;
217 switch(l) {
218 case ISP1080_LVD_MODE:
219 sdp->isp_lvdmode = 1;
220 CFGPRINTF(m, isp->isp_name, 1, "LVD");
221 break;
222 case ISP1080_HVD_MODE:

--- 574 unchanged lines hidden (view full) ---

797 * do not, and only guess that 4.55.0 <= x < 5.0.0 (initiator
798 * only) and x >= 7.55 (initiator/target) has fast posting.
799 */
800
801 mbs.param[0] = MBOX_SET_FW_FEATURES;
802 mbs.param[1] = 0;
803 if (IS_ULTRA2(isp))
804 mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
227 l = ISP_READ(isp, SXP_PINS_DIFF|SXP_BANK1_SELECT);
228 l &= ISP1080_MODE_MASK;
229 switch(l) {
230 case ISP1080_LVD_MODE:
231 sdp->isp_lvdmode = 1;
232 CFGPRINTF(m, isp->isp_name, 1, "LVD");
233 break;
234 case ISP1080_HVD_MODE:

--- 574 unchanged lines hidden (view full) ---

809 * do not, and only guess that 4.55.0 <= x < 5.0.0 (initiator
810 * only) and x >= 7.55 (initiator/target) has fast posting.
811 */
812
813 mbs.param[0] = MBOX_SET_FW_FEATURES;
814 mbs.param[1] = 0;
815 if (IS_ULTRA2(isp))
816 mbs.param[1] |= FW_FEATURE_LVD_NOTIFY;
817 if (IS_ULTRA2(isp) || IS_1240(isp))
818 mbs.param[1] |= FW_FEATURE_FAST_POST;
805#ifndef ISP_NO_FASTPOST_SCSI
819#ifndef ISP_NO_FASTPOST_SCSI
806 if ((ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(4, 55, 0) &&
820 else if ((ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(4, 55, 0) &&
807 (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(5, 0, 0))) ||
808 (ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(7, 55, 0))) {
809 mbs.param[1] |= FW_FEATURE_FAST_POST;
810 }
811#endif
812 if (mbs.param[1] != 0) {
813 u_int16_t sfeat = mbs.param[1];
814 isp_mboxcmd(isp, &mbs);

--- 238 unchanged lines hidden (view full) ---

1053 if (icbp->icb_execthrottle < 1) {
1054 PRINTF("%s: bad execution throttle of %d- using 16\n",
1055 isp->isp_name, fcp->isp_execthrottle);
1056 icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
1057 }
1058 icbp->icb_retry_delay = fcp->isp_retry_delay;
1059 icbp->icb_retry_count = fcp->isp_retry_count;
1060 icbp->icb_hardaddr = loopid;
821 (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(5, 0, 0))) ||
822 (ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(7, 55, 0))) {
823 mbs.param[1] |= FW_FEATURE_FAST_POST;
824 }
825#endif
826 if (mbs.param[1] != 0) {
827 u_int16_t sfeat = mbs.param[1];
828 isp_mboxcmd(isp, &mbs);

--- 238 unchanged lines hidden (view full) ---

1067 if (icbp->icb_execthrottle < 1) {
1068 PRINTF("%s: bad execution throttle of %d- using 16\n",
1069 isp->isp_name, fcp->isp_execthrottle);
1070 icbp->icb_execthrottle = ICB_DFLT_THROTTLE;
1071 }
1072 icbp->icb_retry_delay = fcp->isp_retry_delay;
1073 icbp->icb_retry_count = fcp->isp_retry_count;
1074 icbp->icb_hardaddr = loopid;
1075#ifdef PRET_A_PORTE
1076 if (IS_2200(isp)) {
1077 icbp->icb_fwoptions |= ICBOPT_EXTENDED;
1078 /*
1079 * Prefer or force Point-To-Point instead Loop?
1080 */
1081 if (isp->isp_confopts & ISP_CFG_NPORT)
1082 icbp->icb_xfwoptions = ICBXOPT_PTP_2_LOOP;
1083 else
1084 icbp->icb_xfwoptions = ICBXOPT_LOOP_2_PTP;
1085 }
1086#endif
1061 icbp->icb_logintime = 60; /* 60 second login timeout */
1062
1063 if (fcp->isp_nodewwn) {
1064 u_int64_t pn;
1065 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_nodewwn);
1066 if (fcp->isp_portwwn) {
1067 pn = fcp->isp_portwwn;
1068 } else {

--- 163 unchanged lines hidden (view full) ---

1232 int waitdelay;
1233{
1234 static char *toponames[] = {
1235 "Private Loop",
1236 "FL Port",
1237 "N-Port to N-Port",
1238 "F Port"
1239 };
1087 icbp->icb_logintime = 60; /* 60 second login timeout */
1088
1089 if (fcp->isp_nodewwn) {
1090 u_int64_t pn;
1091 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_nodewwn);
1092 if (fcp->isp_portwwn) {
1093 pn = fcp->isp_portwwn;
1094 } else {

--- 163 unchanged lines hidden (view full) ---

1258 int waitdelay;
1259{
1260 static char *toponames[] = {
1261 "Private Loop",
1262 "FL Port",
1263 "N-Port to N-Port",
1264 "F Port"
1265 };
1240 char *tname;
1241 mbreg_t mbs;
1242 int count, topo = -1;
1243 u_int8_t lwfs;
1244 fcparam *fcp;
1245#if defined(ISP2100_FABRIC)
1246 isp_pdb_t pdb;
1247#endif
1248 fcp = isp->isp_param;

--- 28 unchanged lines hidden (view full) ---

1277 */
1278 mbs.param[0] = MBOX_GET_LOOP_ID;
1279 isp_mboxcmd(isp, &mbs);
1280 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1281 PRINTF("%s: GET LOOP ID failed\n", isp->isp_name);
1282 return (-1);
1283 }
1284 fcp->isp_loopid = mbs.param[1];
1266 mbreg_t mbs;
1267 int count, topo = -1;
1268 u_int8_t lwfs;
1269 fcparam *fcp;
1270#if defined(ISP2100_FABRIC)
1271 isp_pdb_t pdb;
1272#endif
1273 fcp = isp->isp_param;

--- 28 unchanged lines hidden (view full) ---

1302 */
1303 mbs.param[0] = MBOX_GET_LOOP_ID;
1304 isp_mboxcmd(isp, &mbs);
1305 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
1306 PRINTF("%s: GET LOOP ID failed\n", isp->isp_name);
1307 return (-1);
1308 }
1309 fcp->isp_loopid = mbs.param[1];
1285 if (isp->isp_type == ISP_HA_FC_2200) {
1286 if (ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(2, 0, 14)) {
1287 topo = (int) mbs.param[6];
1288 }
1289 } else if (isp->isp_type == ISP_HA_FC_2100) {
1290 if (ISP_FW_REVX(isp->isp_fwrev) >= ISP_FW_REV(1, 17, 26)) {
1291 topo = (int) mbs.param[6];
1292 }
1310 if (IS_2200(isp)) {
1311 topo = (int) mbs.param[6];
1312 if (topo < 0 || topo > 3)
1313 topo = 0;
1314 } else {
1315 topo = 0;
1293 }
1316 }
1294 if (topo < 0 || topo > 3)
1295 tname = "unknown";
1296 else
1297 tname = toponames[topo];
1298
1299 /*
1300 * If we're not on a fabric, the low 8 bits will be our AL_PA.
1301 * If we're on a fabric, the low 8 bits will still be our AL_PA.
1302 */
1303 fcp->isp_alpa = mbs.param[2];
1304#if defined(ISP2100_FABRIC)
1305 fcp->isp_onfabric = 0;
1306 if (isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) {
1317
1318 /*
1319 * If we're not on a fabric, the low 8 bits will be our AL_PA.
1320 * If we're on a fabric, the low 8 bits will still be our AL_PA.
1321 */
1322 fcp->isp_alpa = mbs.param[2];
1323#if defined(ISP2100_FABRIC)
1324 fcp->isp_onfabric = 0;
1325 if (isp_getpdb(isp, FL_PORT_ID, &pdb) == 0) {
1326
1327 if (IS_2100(isp))
1328 topo = 1;
1329
1307 fcp->isp_portid = mbs.param[2] | (((int)mbs.param[3]) << 16);
1308 fcp->isp_onfabric = 1;
1309 CFGPRINTF("%s: Loop ID %d, AL_PA 0x%x, Port ID 0x%x Loop State "
1330 fcp->isp_portid = mbs.param[2] | (((int)mbs.param[3]) << 16);
1331 fcp->isp_onfabric = 1;
1332 CFGPRINTF("%s: Loop ID %d, AL_PA 0x%x, Port ID 0x%x Loop State "
1310 "0x%x topology %s\n", isp->isp_name, fcp->isp_loopid,
1311 fcp->isp_alpa, fcp->isp_portid, fcp->isp_loopstate, tname);
1333 "0x%x topology '%s'\n", isp->isp_name, fcp->isp_loopid,
1334 fcp->isp_alpa, fcp->isp_portid, fcp->isp_loopstate,
1335 toponames[topo]);
1312
1313 /*
1314 * Make sure we're logged out of all fabric devices.
1315 */
1316 for (count = FC_SNS_ID+1; count < MAX_FC_TARG; count++) {
1317 struct lportdb *lp = &fcp->portdb[count];
1318 if (lp->valid == 0 || lp->fabdev == 0)
1319 continue;
1320 PRINTF("%s: logging out target %d at Loop ID %d "
1321 "(port id 0x%x)\n", isp->isp_name, count,
1322 lp->loopid, lp->portid);
1323 mbs.param[0] = MBOX_FABRIC_LOGOUT;
1324 mbs.param[1] = lp->loopid << 8;
1325 mbs.param[2] = 0;
1326 mbs.param[3] = 0;
1327 isp_mboxcmd(isp, &mbs);
1328 }
1329 } else
1330#endif
1336
1337 /*
1338 * Make sure we're logged out of all fabric devices.
1339 */
1340 for (count = FC_SNS_ID+1; count < MAX_FC_TARG; count++) {
1341 struct lportdb *lp = &fcp->portdb[count];
1342 if (lp->valid == 0 || lp->fabdev == 0)
1343 continue;
1344 PRINTF("%s: logging out target %d at Loop ID %d "
1345 "(port id 0x%x)\n", isp->isp_name, count,
1346 lp->loopid, lp->portid);
1347 mbs.param[0] = MBOX_FABRIC_LOGOUT;
1348 mbs.param[1] = lp->loopid << 8;
1349 mbs.param[2] = 0;
1350 mbs.param[3] = 0;
1351 isp_mboxcmd(isp, &mbs);
1352 }
1353 } else
1354#endif
1331 CFGPRINTF("%s: Loop ID %d, ALPA 0x%x Loop State 0x%x topology %s\n",
1355 CFGPRINTF("%s: Loop ID %d, ALPA 0x%x Loop State 0x%x topology '%s'\n",
1332 isp->isp_name, fcp->isp_loopid, fcp->isp_alpa, fcp->isp_loopstate,
1356 isp->isp_name, fcp->isp_loopid, fcp->isp_alpa, fcp->isp_loopstate,
1333 tname);
1357 toponames[topo]);
1334 return (0);
1335}
1336
1337/*
1338 * Compare two local port db entities and return 1 if they're the same, else 0.
1339 */
1340
1341static int

--- 1364 unchanged lines hidden (view full) ---

2706 isp_mark_getpdb_all(isp);
2707 /*
2708 * Not correct, but it will force us to rescan the loop.
2709 */
2710 ((fcparam *) isp->isp_param)->isp_loopstate = LOOP_PDB_RCVD;
2711 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, NULL);
2712 break;
2713
1358 return (0);
1359}
1360
1361/*
1362 * Compare two local port db entities and return 1 if they're the same, else 0.
1363 */
1364
1365static int

--- 1364 unchanged lines hidden (view full) ---

2730 isp_mark_getpdb_all(isp);
2731 /*
2732 * Not correct, but it will force us to rescan the loop.
2733 */
2734 ((fcparam *) isp->isp_param)->isp_loopstate = LOOP_PDB_RCVD;
2735 isp_async(isp, ISPASYNC_CHANGE_NOTIFY, NULL);
2736 break;
2737
2738 case ASYNC_PTPMODE:
2739 PRINTF("%s: Point-to-Point mode\n", isp->isp_name);
2740 break;
2741
2742 case ASYNC_CONNMODE:
2743 mbox = ISP_READ(isp, OUTMAILBOX1);
2744 switch (mbox) {
2745 case ISP_CONN_LOOP:
2746 PRINTF("%s: Point-to-Point -> Loop mode\n",
2747 isp->isp_name);
2748 break;
2749 case ISP_CONN_PTP:
2750 PRINTF("%s: Loop -> Point-to-Point mode\n",
2751 isp->isp_name);
2752 break;
2753 case ISP_CONN_BADLIP:
2754 PRINTF("%s: Point-to-Point -> Loop mode (1)\n",
2755 isp->isp_name);
2756 break;
2757 case ISP_CONN_FATAL:
2758 PRINTF("%s: FATAL CONNECTION ERROR\n", isp->isp_name);
2759 isp_restart(isp);
2760 /* no point continuing after this */
2761 return (-1);
2762
2763 case ISP_CONN_LOOPBACK:
2764 PRINTF("%s: Looped Back in Point-to-Point mode\n",
2765 isp->isp_name);
2766 }
2767 break;
2768
2714 default:
2715 PRINTF("%s: unknown async code 0x%x\n", isp->isp_name, mbox);
2716 break;
2717 }
2718 return (fast_post_handle);
2719}
2720
2721/*

--- 716 unchanged lines hidden (view full) ---

3438 case MBOX_GET_ASYNC_DATA_SETUP_TIME:
3439 case MBOX_GET_RESET_DELAY_PARAMS:
3440 case MBOX_SET_RESET_DELAY_PARAMS:
3441 mbp->param[2] = ISP_READ(isp, OUTMAILBOX2);
3442 break;
3443 }
3444 }
3445
2769 default:
2770 PRINTF("%s: unknown async code 0x%x\n", isp->isp_name, mbox);
2771 break;
2772 }
2773 return (fast_post_handle);
2774}
2775
2776/*

--- 716 unchanged lines hidden (view full) ---

3493 case MBOX_GET_ASYNC_DATA_SETUP_TIME:
3494 case MBOX_GET_RESET_DELAY_PARAMS:
3495 case MBOX_SET_RESET_DELAY_PARAMS:
3496 mbp->param[2] = ISP_READ(isp, OUTMAILBOX2);
3497 break;
3498 }
3499 }
3500
3501 if (IS_2200(isp)) {
3502 if (opcode == MBOX_GET_LOOP_ID) {
3503 mbp->param[6] = ISP_READ(isp, OUTMAILBOX6);
3504 }
3505 }
3506
3446 switch (outparam) {
3447 case 8: mbp->param[7] = ISP_READ(isp, OUTMAILBOX7);
3448 case 7: mbp->param[6] = ISP_READ(isp, OUTMAILBOX6);
3449 case 6: mbp->param[5] = ISP_READ(isp, OUTMAILBOX5);
3450 case 5: mbp->param[4] = ISP_READ(isp, OUTMAILBOX4);
3451 case 4: mbp->param[3] = ISP_READ(isp, OUTMAILBOX3);
3452 case 3: mbp->param[2] = ISP_READ(isp, OUTMAILBOX2);
3453 case 2: mbp->param[1] = ISP_READ(isp, OUTMAILBOX1);

--- 559 unchanged lines hidden (view full) ---

4013 XS_SETERR(xs, HBA_BUSRESET);
4014 XS_CMD_DONE(xs);
4015 }
4016}
4017
4018/*
4019 * NVRAM Routines
4020 */
3507 switch (outparam) {
3508 case 8: mbp->param[7] = ISP_READ(isp, OUTMAILBOX7);
3509 case 7: mbp->param[6] = ISP_READ(isp, OUTMAILBOX6);
3510 case 6: mbp->param[5] = ISP_READ(isp, OUTMAILBOX5);
3511 case 5: mbp->param[4] = ISP_READ(isp, OUTMAILBOX4);
3512 case 4: mbp->param[3] = ISP_READ(isp, OUTMAILBOX3);
3513 case 3: mbp->param[2] = ISP_READ(isp, OUTMAILBOX2);
3514 case 2: mbp->param[1] = ISP_READ(isp, OUTMAILBOX1);

--- 559 unchanged lines hidden (view full) ---

4074 XS_SETERR(xs, HBA_BUSRESET);
4075 XS_CMD_DONE(xs);
4076 }
4077}
4078
4079/*
4080 * NVRAM Routines
4081 */
4021
4022static int
4023isp_read_nvram(isp)
4024 struct ispsoftc *isp;
4025{
4082static int
4083isp_read_nvram(isp)
4084 struct ispsoftc *isp;
4085{
4026 static char *tru = "true";
4027 static char *not = "false";
4028 int i, amt;
4029 u_int8_t csum, minversion;
4030 union {
4031 u_int8_t _x[ISP2100_NVRAM_SIZE];
4032 u_int16_t _s[ISP2100_NVRAM_SIZE>>1];
4033 } _n;
4034#define nvram_data _n._x
4035#define nvram_words _n._s

--- 36 unchanged lines hidden (view full) ---

4072 return (-1);
4073 }
4074 if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
4075 PRINTF("%s: version %d NVRAM not understood\n", isp->isp_name,
4076 ISP_NVRAM_VERSION(nvram_data));
4077 return (-1);
4078 }
4079
4086 int i, amt;
4087 u_int8_t csum, minversion;
4088 union {
4089 u_int8_t _x[ISP2100_NVRAM_SIZE];
4090 u_int16_t _s[ISP2100_NVRAM_SIZE>>1];
4091 } _n;
4092#define nvram_data _n._x
4093#define nvram_words _n._s

--- 36 unchanged lines hidden (view full) ---

4130 return (-1);
4131 }
4132 if (ISP_NVRAM_VERSION(nvram_data) < minversion) {
4133 PRINTF("%s: version %d NVRAM not understood\n", isp->isp_name,
4134 ISP_NVRAM_VERSION(nvram_data));
4135 return (-1);
4136 }
4137
4080 if (IS_ULTRA2(isp)) {
4081 int bus;
4082 sdparam *sdp = (sdparam *) isp->isp_param;
4083 for (bus = 0; bus < (IS_DUALBUS(isp)? 2 : 1); bus++, sdp++) {
4084 sdp->isp_fifo_threshold =
4085 ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
4086
4087 sdp->isp_initiator_id =
4088 ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
4089
4090 sdp->isp_bus_reset_delay =
4091 ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
4092
4093 sdp->isp_retry_count =
4094 ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
4095
4096 sdp->isp_retry_delay =
4097 ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
4098
4099 sdp->isp_async_data_setup =
4100 ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data,
4101 bus);
4102
4103 sdp->isp_req_ack_active_neg =
4104 ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data,
4105 bus);
4106
4107 sdp->isp_data_line_active_neg =
4108 ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data,
4109 bus);
4110
4111 sdp->isp_data_dma_burst_enabl =
4112 ISP1080_NVRAM_BURST_ENABLE(nvram_data);
4113
4114 sdp->isp_cmd_dma_burst_enable =
4115 ISP1080_NVRAM_BURST_ENABLE(nvram_data);
4116
4117 sdp->isp_selection_timeout =
4118 ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
4119
4120 sdp->isp_max_queue_depth =
4121 ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
4122
4123 if (isp->isp_dblev >= 3) {
4124 PRINTF("%s: ISP1080 bus %d NVRAM values:\n",
4125 isp->isp_name, bus);
4126 PRINTF(" Initiator ID = %d\n",
4127 sdp->isp_initiator_id);
4128 PRINTF(" Fifo Threshold = 0x%x\n",
4129 sdp->isp_fifo_threshold);
4130 PRINTF(" Bus Reset Delay = %d\n",
4131 sdp->isp_bus_reset_delay);
4132 PRINTF(" Retry Count = %d\n",
4133 sdp->isp_retry_count);
4134 PRINTF(" Retry Delay = %d\n",
4135 sdp->isp_retry_delay);
4136 PRINTF(" Tag Age Limit = %d\n",
4137 sdp->isp_tag_aging);
4138 PRINTF(" Selection Timeout = %d\n",
4139 sdp->isp_selection_timeout);
4140 PRINTF(" Max Queue Depth = %d\n",
4141 sdp->isp_max_queue_depth);
4142 PRINTF(" Async Data Setup = 0x%x\n",
4143 sdp->isp_async_data_setup);
4144 PRINTF(" REQ/ACK Active Negation = %s\n",
4145 sdp->isp_req_ack_active_neg? tru : not);
4146 PRINTF(" Data Line Active Negation = %s\n",
4147 sdp->isp_data_line_active_neg? tru : not);
4148 PRINTF(" Cmd DMA Burst Enable = %s\n",
4149 sdp->isp_cmd_dma_burst_enable? tru : not);
4150 }
4151 for (i = 0; i < MAX_TARGETS; i++) {
4152 sdp->isp_devparam[i].dev_enable =
4153 ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i, bus);
4154 sdp->isp_devparam[i].exc_throttle =
4155 ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i, bus);
4156 sdp->isp_devparam[i].sync_offset =
4157 ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, i, bus);
4158 sdp->isp_devparam[i].sync_period =
4159 ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, i, bus);
4160 sdp->isp_devparam[i].dev_flags = 0;
4161 if (ISP1080_NVRAM_TGT_RENEG(nvram_data, i, bus))
4162 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG;
4163 if (ISP1080_NVRAM_TGT_QFRZ(nvram_data, i, bus)) {
4164 PRINTF("%s: not supporting QFRZ option "
4165 "for target %d bus %d\n",
4166 isp->isp_name, i, bus);
4167 }
4168 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ;
4169 if (ISP1080_NVRAM_TGT_ARQ(nvram_data, i, bus) == 0) {
4170 PRINTF("%s: not disabling ARQ option "
4171 "for target %d bus %d\n",
4172 isp->isp_name, i, bus);
4173 }
4174 if (ISP1080_NVRAM_TGT_TQING(nvram_data, i, bus))
4175 sdp->isp_devparam[i].dev_flags |= DPARM_TQING;
4176 if (ISP1080_NVRAM_TGT_SYNC(nvram_data, i, bus))
4177 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC;
4178 if (ISP1080_NVRAM_TGT_WIDE(nvram_data, i, bus))
4179 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE;
4180 if (ISP1080_NVRAM_TGT_PARITY(nvram_data, i, bus))
4181 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY;
4182 if (ISP1080_NVRAM_TGT_DISC(nvram_data, i, bus))
4183 sdp->isp_devparam[i].dev_flags |= DPARM_DISC;
4184 sdp->isp_devparam[i].cur_dflags = 0;
4185 if (isp->isp_dblev >= 3) {
4186 PRINTF(" Target %d: Ena %d Throttle "
4187 "%d Offset %d Period %d Flags "
4188 "0x%x\n", i,
4189 sdp->isp_devparam[i].dev_enable,
4190 sdp->isp_devparam[i].exc_throttle,
4191 sdp->isp_devparam[i].sync_offset,
4192 sdp->isp_devparam[i].sync_period,
4193 sdp->isp_devparam[i].dev_flags);
4194 }
4195 }
4196 }
4138 if (IS_ULTRA3(isp)) {
4139 isp_parse_nvram_12160(isp, 0, nvram_data);
4140 isp_parse_nvram_12160(isp, 1, nvram_data);
4141 } else if (IS_1080(isp)) {
4142 isp_parse_nvram_1080(isp, 0, nvram_data);
4143 } else if (IS_1280(isp) || IS_1240(isp)) {
4144 isp_parse_nvram_1080(isp, 0, nvram_data);
4145 isp_parse_nvram_1080(isp, 1, nvram_data);
4197 } else if (IS_SCSI(isp)) {
4146 } else if (IS_SCSI(isp)) {
4198 sdparam *sdp = (sdparam *) isp->isp_param;
4199
4200 sdp->isp_fifo_threshold =
4201 ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
4202 (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
4203
4204 sdp->isp_initiator_id =
4205 ISP_NVRAM_INITIATOR_ID(nvram_data);
4206
4207 sdp->isp_bus_reset_delay =
4208 ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
4209
4210 sdp->isp_retry_count =
4211 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
4212
4213 sdp->isp_retry_delay =
4214 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
4215
4216 sdp->isp_async_data_setup =
4217 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
4218
4219 if (isp->isp_type >= ISP_HA_SCSI_1040) {
4220 if (sdp->isp_async_data_setup < 9) {
4221 sdp->isp_async_data_setup = 9;
4222 }
4223 } else {
4224 if (sdp->isp_async_data_setup != 6) {
4225 sdp->isp_async_data_setup = 6;
4226 }
4227 }
4228
4229 sdp->isp_req_ack_active_neg =
4230 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
4231
4232 sdp->isp_data_line_active_neg =
4233 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
4234
4235 sdp->isp_data_dma_burst_enabl =
4236 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
4237
4238 sdp->isp_cmd_dma_burst_enable =
4239 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
4240
4241 sdp->isp_tag_aging =
4242 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
4243
4244 sdp->isp_selection_timeout =
4245 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
4246
4247 sdp->isp_max_queue_depth =
4248 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
4249
4250 isp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
4251 if (isp->isp_dblev > 2) {
4252 PRINTF("%s: NVRAM values:\n", isp->isp_name);
4253 PRINTF(" Fifo Threshold = 0x%x\n",
4254 sdp->isp_fifo_threshold);
4255 PRINTF(" Bus Reset Delay = %d\n",
4256 sdp->isp_bus_reset_delay);
4257 PRINTF(" Retry Count = %d\n",
4258 sdp->isp_retry_count);
4259 PRINTF(" Retry Delay = %d\n",
4260 sdp->isp_retry_delay);
4261 PRINTF(" Tag Age Limit = %d\n",
4262 sdp->isp_tag_aging);
4263 PRINTF(" Selection Timeout = %d\n",
4264 sdp->isp_selection_timeout);
4265 PRINTF(" Max Queue Depth = %d\n",
4266 sdp->isp_max_queue_depth);
4267 PRINTF(" Async Data Setup = 0x%x\n",
4268 sdp->isp_async_data_setup);
4269 PRINTF(" REQ/ACK Active Negation = %s\n",
4270 sdp->isp_req_ack_active_neg? tru : not);
4271 PRINTF(" Data Line Active Negation = %s\n",
4272 sdp->isp_data_line_active_neg? tru : not);
4273 PRINTF(" Data DMA Burst Enable = %s\n",
4274 sdp->isp_data_dma_burst_enabl? tru : not);
4275 PRINTF(" Cmd DMA Burst Enable = %s\n",
4276 sdp->isp_cmd_dma_burst_enable? tru : not);
4277 PRINTF(" Fast MTTR = %s\n",
4278 isp->isp_fast_mttr? tru : not);
4279 }
4280 for (i = 0; i < MAX_TARGETS; i++) {
4281 sdp->isp_devparam[i].dev_enable =
4282 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i);
4283 sdp->isp_devparam[i].exc_throttle =
4284 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i);
4285 sdp->isp_devparam[i].sync_offset =
4286 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, i);
4287 sdp->isp_devparam[i].sync_period =
4288 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, i);
4289
4290 if (isp->isp_type < ISP_HA_SCSI_1040) {
4291 /*
4292 * If we're not ultra, we can't possibly
4293 * be a shorter period than this.
4294 */
4295 if (sdp->isp_devparam[i].sync_period < 0x19) {
4296 sdp->isp_devparam[i].sync_period =
4297 0x19;
4298 }
4299 if (sdp->isp_devparam[i].sync_offset > 0xc) {
4300 sdp->isp_devparam[i].sync_offset =
4301 0x0c;
4302 }
4303 } else {
4304 if (sdp->isp_devparam[i].sync_offset > 0x8) {
4305 sdp->isp_devparam[i].sync_offset = 0x8;
4306 }
4307 }
4308 sdp->isp_devparam[i].dev_flags = 0;
4309 if (ISP_NVRAM_TGT_RENEG(nvram_data, i))
4310 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG;
4311 if (ISP_NVRAM_TGT_QFRZ(nvram_data, i)) {
4312 PRINTF("%s: not supporting QFRZ option for "
4313 "target %d\n", isp->isp_name, i);
4314 }
4315 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ;
4316 if (ISP_NVRAM_TGT_ARQ(nvram_data, i) == 0) {
4317 PRINTF("%s: not disabling ARQ option for "
4318 "target %d\n", isp->isp_name, i);
4319 }
4320 if (ISP_NVRAM_TGT_TQING(nvram_data, i))
4321 sdp->isp_devparam[i].dev_flags |= DPARM_TQING;
4322 if (ISP_NVRAM_TGT_SYNC(nvram_data, i))
4323 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC;
4324 if (ISP_NVRAM_TGT_WIDE(nvram_data, i))
4325 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE;
4326 if (ISP_NVRAM_TGT_PARITY(nvram_data, i))
4327 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY;
4328 if (ISP_NVRAM_TGT_DISC(nvram_data, i))
4329 sdp->isp_devparam[i].dev_flags |= DPARM_DISC;
4330 sdp->isp_devparam[i].cur_dflags = 0; /* we don't know */
4331 if (isp->isp_dblev > 2) {
4332 PRINTF(" Target %d: Enabled %d Throttle %d "
4333 "Offset %d Period %d Flags 0x%x\n", i,
4334 sdp->isp_devparam[i].dev_enable,
4335 sdp->isp_devparam[i].exc_throttle,
4336 sdp->isp_devparam[i].sync_offset,
4337 sdp->isp_devparam[i].sync_period,
4338 sdp->isp_devparam[i].dev_flags);
4339 }
4340 }
4147 isp_parse_nvram_1020(isp, nvram_data);
4341 } else {
4148 } else {
4342 fcparam *fcp = (fcparam *) isp->isp_param;
4343 union {
4344 struct {
4345#if BYTE_ORDER == BIG_ENDIAN
4346 u_int32_t hi32;
4347 u_int32_t lo32;
4348#else
4349 u_int32_t lo32;
4350 u_int32_t hi32;
4351#endif
4352 } wd;
4353 u_int64_t full64;
4354 } wwnstore;
4355
4356 wwnstore.full64 = ISP2100_NVRAM_NODE_NAME(nvram_data);
4357 /*
4358 * Broken PTI cards with nothing in the top nibble. Pah.
4359 */
4360 if ((wwnstore.wd.hi32 >> 28) == 0) {
4361 wwnstore.wd.hi32 |= (2 << 28);
4362 CFGPRINTF("%s: (corrected) Adapter WWN 0x%08x%08x\n",
4363 isp->isp_name, wwnstore.wd.hi32, wwnstore.wd.lo32);
4364 } else {
4365 CFGPRINTF("%s: Adapter WWN 0x%08x%08x\n", isp->isp_name,
4366 wwnstore.wd.hi32, wwnstore.wd.lo32);
4367 }
4368 fcp->isp_nodewwn = wwnstore.full64;
4369
4370 /*
4371 * If the Node WWN has 2 in the top nibble, we can
4372 * authoritatively construct a Port WWN by adding
4373 * our unit number (plus one to make it nonzero) and
4374 * putting it into bits 59..56. If the top nibble isn't
4375 * 2, then we just set them identically.
4376 */
4377 if ((fcp->isp_nodewwn >> 60) == 2) {
4378 fcp->isp_portwwn = fcp->isp_nodewwn |
4379 (((u_int64_t)(isp->isp_unit+1)) << 56);
4380 } else {
4381 fcp->isp_portwwn = fcp->isp_nodewwn;
4382 }
4383 wwnstore.full64 = ISP2100_NVRAM_BOOT_NODE_NAME(nvram_data);
4384 if (wwnstore.full64 != 0) {
4385 PRINTF("%s: BOOT DEVICE WWN 0x%08x%08x\n",
4386 isp->isp_name, wwnstore.wd.hi32, wwnstore.wd.lo32);
4387 }
4388 fcp->isp_maxalloc =
4389 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
4390 fcp->isp_maxfrmlen =
4391 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
4392 fcp->isp_retry_delay =
4393 ISP2100_NVRAM_RETRY_DELAY(nvram_data);
4394 fcp->isp_retry_count =
4395 ISP2100_NVRAM_RETRY_COUNT(nvram_data);
4396 fcp->isp_loopid =
4397 ISP2100_NVRAM_HARDLOOPID(nvram_data);
4398 fcp->isp_execthrottle =
4399 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
4400 fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
4401 if (isp->isp_dblev > 2) {
4402 PRINTF("%s: NVRAM values:\n", isp->isp_name);
4403 PRINTF(" Max IOCB Allocation = %d\n",
4404 fcp->isp_maxalloc);
4405 PRINTF(" Max Frame Length = %d\n",
4406 fcp->isp_maxfrmlen);
4407 PRINTF(" Execution Throttle = %d\n",
4408 fcp->isp_execthrottle);
4409 PRINTF(" Retry Count = %d\n",
4410 fcp->isp_retry_count);
4411 PRINTF(" Retry Delay = %d\n",
4412 fcp->isp_retry_delay);
4413 PRINTF(" Hard Loop ID = %d\n",
4414 fcp->isp_loopid);
4415 PRINTF(" Options = 0x%x\n",
4416 fcp->isp_fwoptions);
4417 PRINTF(" HBA Options = 0x%x\n",
4418 ISP2100_NVRAM_HBA_OPTIONS(nvram_data));
4419 }
4149 isp_parse_nvram_2100(isp, nvram_data);
4420 }
4421 IDPRINTF(3, ("%s: NVRAM is valid\n", isp->isp_name));
4422 return (0);
4150 }
4151 IDPRINTF(3, ("%s: NVRAM is valid\n", isp->isp_name));
4152 return (0);
4153#undef nvram_data
4154#undef nvram_words
4423}
4424
4425static void
4426isp_rdnvram_word(isp, wo, rp)
4427 struct ispsoftc *isp;
4428 int wo;
4429 u_int16_t *rp;
4430{

--- 53 unchanged lines hidden (view full) ---

4484 SYS_DELAY(2);
4485 }
4486 ISP_WRITE(isp, BIU_NVRAM, 0);
4487 SYS_DELAY(2);
4488#if BYTE_ORDER == BIG_ENDIAN
4489 *rp = ((*rp >> 8) | ((*rp & 0xff) << 8));
4490#endif
4491}
4155}
4156
4157static void
4158isp_rdnvram_word(isp, wo, rp)
4159 struct ispsoftc *isp;
4160 int wo;
4161 u_int16_t *rp;
4162{

--- 53 unchanged lines hidden (view full) ---

4216 SYS_DELAY(2);
4217 }
4218 ISP_WRITE(isp, BIU_NVRAM, 0);
4219 SYS_DELAY(2);
4220#if BYTE_ORDER == BIG_ENDIAN
4221 *rp = ((*rp >> 8) | ((*rp & 0xff) << 8));
4222#endif
4223}
4224
4225static void
4226isp_parse_nvram_1020(isp, nvram_data)
4227 struct ispsoftc *isp;
4228 u_int8_t *nvram_data;
4229{
4230 int i;
4231 static char *tru = "true";
4232 static char *not = "false";
4233 sdparam *sdp = (sdparam *) isp->isp_param;
4234
4235 sdp->isp_fifo_threshold =
4236 ISP_NVRAM_FIFO_THRESHOLD(nvram_data) |
4237 (ISP_NVRAM_FIFO_THRESHOLD_128(nvram_data) << 2);
4238
4239 sdp->isp_initiator_id =
4240 ISP_NVRAM_INITIATOR_ID(nvram_data);
4241
4242 sdp->isp_bus_reset_delay =
4243 ISP_NVRAM_BUS_RESET_DELAY(nvram_data);
4244
4245 sdp->isp_retry_count =
4246 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data);
4247
4248 sdp->isp_retry_delay =
4249 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data);
4250
4251 sdp->isp_async_data_setup =
4252 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data);
4253
4254 if (isp->isp_type >= ISP_HA_SCSI_1040) {
4255 if (sdp->isp_async_data_setup < 9) {
4256 sdp->isp_async_data_setup = 9;
4257 }
4258 } else {
4259 if (sdp->isp_async_data_setup != 6) {
4260 sdp->isp_async_data_setup = 6;
4261 }
4262 }
4263
4264 sdp->isp_req_ack_active_neg =
4265 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data);
4266
4267 sdp->isp_data_line_active_neg =
4268 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data);
4269
4270 sdp->isp_data_dma_burst_enabl =
4271 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data);
4272
4273 sdp->isp_cmd_dma_burst_enable =
4274 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data);
4275
4276 sdp->isp_tag_aging =
4277 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data);
4278
4279 sdp->isp_selection_timeout =
4280 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data);
4281
4282 sdp->isp_max_queue_depth =
4283 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data);
4284
4285 isp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data);
4286 if (isp->isp_dblev > 2) {
4287 PRINTF("%s: NVRAM values:\n", isp->isp_name);
4288 PRINTF(" Fifo Threshold = 0x%x\n",
4289 sdp->isp_fifo_threshold);
4290 PRINTF(" Bus Reset Delay = %d\n",
4291 sdp->isp_bus_reset_delay);
4292 PRINTF(" Retry Count = %d\n",
4293 sdp->isp_retry_count);
4294 PRINTF(" Retry Delay = %d\n",
4295 sdp->isp_retry_delay);
4296 PRINTF(" Tag Age Limit = %d\n",
4297 sdp->isp_tag_aging);
4298 PRINTF(" Selection Timeout = %d\n",
4299 sdp->isp_selection_timeout);
4300 PRINTF(" Max Queue Depth = %d\n",
4301 sdp->isp_max_queue_depth);
4302 PRINTF(" Async Data Setup = 0x%x\n",
4303 sdp->isp_async_data_setup);
4304 PRINTF(" REQ/ACK Active Negation = %s\n",
4305 sdp->isp_req_ack_active_neg? tru : not);
4306 PRINTF(" Data Line Active Negation = %s\n",
4307 sdp->isp_data_line_active_neg? tru : not);
4308 PRINTF(" Data DMA Burst Enable = %s\n",
4309 sdp->isp_data_dma_burst_enabl? tru : not);
4310 PRINTF(" Cmd DMA Burst Enable = %s\n",
4311 sdp->isp_cmd_dma_burst_enable? tru : not);
4312 PRINTF(" Fast MTTR = %s\n",
4313 isp->isp_fast_mttr? tru : not);
4314 }
4315 for (i = 0; i < MAX_TARGETS; i++) {
4316 sdp->isp_devparam[i].dev_enable =
4317 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i);
4318 sdp->isp_devparam[i].exc_throttle =
4319 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i);
4320 sdp->isp_devparam[i].sync_offset =
4321 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, i);
4322 sdp->isp_devparam[i].sync_period =
4323 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, i);
4324
4325 if (isp->isp_type < ISP_HA_SCSI_1040) {
4326 /*
4327 * If we're not ultra, we can't possibly
4328 * be a shorter period than this.
4329 */
4330 if (sdp->isp_devparam[i].sync_period < 0x19) {
4331 sdp->isp_devparam[i].sync_period =
4332 0x19;
4333 }
4334 if (sdp->isp_devparam[i].sync_offset > 0xc) {
4335 sdp->isp_devparam[i].sync_offset =
4336 0x0c;
4337 }
4338 } else {
4339 if (sdp->isp_devparam[i].sync_offset > 0x8) {
4340 sdp->isp_devparam[i].sync_offset = 0x8;
4341 }
4342 }
4343 sdp->isp_devparam[i].dev_flags = 0;
4344 if (ISP_NVRAM_TGT_RENEG(nvram_data, i))
4345 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG;
4346 if (ISP_NVRAM_TGT_QFRZ(nvram_data, i)) {
4347 PRINTF("%s: not supporting QFRZ option for "
4348 "target %d\n", isp->isp_name, i);
4349 }
4350 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ;
4351 if (ISP_NVRAM_TGT_ARQ(nvram_data, i) == 0) {
4352 PRINTF("%s: not disabling ARQ option for "
4353 "target %d\n", isp->isp_name, i);
4354 }
4355 if (ISP_NVRAM_TGT_TQING(nvram_data, i))
4356 sdp->isp_devparam[i].dev_flags |= DPARM_TQING;
4357 if (ISP_NVRAM_TGT_SYNC(nvram_data, i))
4358 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC;
4359 if (ISP_NVRAM_TGT_WIDE(nvram_data, i))
4360 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE;
4361 if (ISP_NVRAM_TGT_PARITY(nvram_data, i))
4362 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY;
4363 if (ISP_NVRAM_TGT_DISC(nvram_data, i))
4364 sdp->isp_devparam[i].dev_flags |= DPARM_DISC;
4365 sdp->isp_devparam[i].cur_dflags = 0; /* we don't know */
4366 if (isp->isp_dblev > 2) {
4367 PRINTF(" Target %d: Enabled %d Throttle %d "
4368 "Offset %d Period %d Flags 0x%x\n", i,
4369 sdp->isp_devparam[i].dev_enable,
4370 sdp->isp_devparam[i].exc_throttle,
4371 sdp->isp_devparam[i].sync_offset,
4372 sdp->isp_devparam[i].sync_period,
4373 sdp->isp_devparam[i].dev_flags);
4374 }
4375 }
4376}
4377
4378static void
4379isp_parse_nvram_1080(isp, bus, nvram_data)
4380 struct ispsoftc *isp;
4381 int bus;
4382 u_int8_t *nvram_data;
4383{
4384 static char *tru = "true";
4385 static char *not = "false";
4386 int i;
4387 sdparam *sdp = (sdparam *) isp->isp_param;
4388 sdp += bus;
4389
4390 sdp->isp_fifo_threshold =
4391 ISP1080_NVRAM_FIFO_THRESHOLD(nvram_data);
4392
4393 sdp->isp_initiator_id =
4394 ISP1080_NVRAM_INITIATOR_ID(nvram_data, bus);
4395
4396 sdp->isp_bus_reset_delay =
4397 ISP1080_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
4398
4399 sdp->isp_retry_count =
4400 ISP1080_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
4401
4402 sdp->isp_retry_delay =
4403 ISP1080_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
4404
4405 sdp->isp_async_data_setup =
4406 ISP1080_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data,
4407 bus);
4408
4409 sdp->isp_req_ack_active_neg =
4410 ISP1080_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data,
4411 bus);
4412
4413 sdp->isp_data_line_active_neg =
4414 ISP1080_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data,
4415 bus);
4416
4417 sdp->isp_data_dma_burst_enabl =
4418 ISP1080_NVRAM_BURST_ENABLE(nvram_data);
4419
4420 sdp->isp_cmd_dma_burst_enable =
4421 ISP1080_NVRAM_BURST_ENABLE(nvram_data);
4422
4423 sdp->isp_selection_timeout =
4424 ISP1080_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
4425
4426 sdp->isp_max_queue_depth =
4427 ISP1080_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
4428
4429 if (isp->isp_dblev >= 3) {
4430 PRINTF("%s: ISP1080 bus %d NVRAM values:\n",
4431 isp->isp_name, bus);
4432 PRINTF(" Initiator ID = %d\n",
4433 sdp->isp_initiator_id);
4434 PRINTF(" Fifo Threshold = 0x%x\n",
4435 sdp->isp_fifo_threshold);
4436 PRINTF(" Bus Reset Delay = %d\n",
4437 sdp->isp_bus_reset_delay);
4438 PRINTF(" Retry Count = %d\n",
4439 sdp->isp_retry_count);
4440 PRINTF(" Retry Delay = %d\n",
4441 sdp->isp_retry_delay);
4442 PRINTF(" Tag Age Limit = %d\n",
4443 sdp->isp_tag_aging);
4444 PRINTF(" Selection Timeout = %d\n",
4445 sdp->isp_selection_timeout);
4446 PRINTF(" Max Queue Depth = %d\n",
4447 sdp->isp_max_queue_depth);
4448 PRINTF(" Async Data Setup = 0x%x\n",
4449 sdp->isp_async_data_setup);
4450 PRINTF(" REQ/ACK Active Negation = %s\n",
4451 sdp->isp_req_ack_active_neg? tru : not);
4452 PRINTF(" Data Line Active Negation = %s\n",
4453 sdp->isp_data_line_active_neg? tru : not);
4454 PRINTF(" Cmd DMA Burst Enable = %s\n",
4455 sdp->isp_cmd_dma_burst_enable? tru : not);
4456 }
4457 for (i = 0; i < MAX_TARGETS; i++) {
4458 sdp->isp_devparam[i].dev_enable =
4459 ISP1080_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i, bus);
4460 sdp->isp_devparam[i].exc_throttle =
4461 ISP1080_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i, bus);
4462 sdp->isp_devparam[i].sync_offset =
4463 ISP1080_NVRAM_TGT_SYNC_OFFSET(nvram_data, i, bus);
4464 sdp->isp_devparam[i].sync_period =
4465 ISP1080_NVRAM_TGT_SYNC_PERIOD(nvram_data, i, bus);
4466 sdp->isp_devparam[i].dev_flags = 0;
4467 if (ISP1080_NVRAM_TGT_RENEG(nvram_data, i, bus))
4468 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG;
4469 if (ISP1080_NVRAM_TGT_QFRZ(nvram_data, i, bus)) {
4470 PRINTF("%s: not supporting QFRZ option "
4471 "for target %d bus %d\n",
4472 isp->isp_name, i, bus);
4473 }
4474 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ;
4475 if (ISP1080_NVRAM_TGT_ARQ(nvram_data, i, bus) == 0) {
4476 PRINTF("%s: not disabling ARQ option "
4477 "for target %d bus %d\n",
4478 isp->isp_name, i, bus);
4479 }
4480 if (ISP1080_NVRAM_TGT_TQING(nvram_data, i, bus))
4481 sdp->isp_devparam[i].dev_flags |= DPARM_TQING;
4482 if (ISP1080_NVRAM_TGT_SYNC(nvram_data, i, bus))
4483 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC;
4484 if (ISP1080_NVRAM_TGT_WIDE(nvram_data, i, bus))
4485 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE;
4486 if (ISP1080_NVRAM_TGT_PARITY(nvram_data, i, bus))
4487 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY;
4488 if (ISP1080_NVRAM_TGT_DISC(nvram_data, i, bus))
4489 sdp->isp_devparam[i].dev_flags |= DPARM_DISC;
4490 sdp->isp_devparam[i].cur_dflags = 0;
4491 if (isp->isp_dblev >= 3) {
4492 PRINTF(" Target %d: Ena %d Throttle "
4493 "%d Offset %d Period %d Flags "
4494 "0x%x\n", i,
4495 sdp->isp_devparam[i].dev_enable,
4496 sdp->isp_devparam[i].exc_throttle,
4497 sdp->isp_devparam[i].sync_offset,
4498 sdp->isp_devparam[i].sync_period,
4499 sdp->isp_devparam[i].dev_flags);
4500 }
4501 }
4502}
4503
4504static void
4505isp_parse_nvram_12160(isp, bus, nvram_data)
4506 struct ispsoftc *isp;
4507 int bus;
4508 u_int8_t *nvram_data;
4509{
4510 static char *tru = "true";
4511 static char *not = "false";
4512 sdparam *sdp = (sdparam *) isp->isp_param;
4513 int i;
4514
4515 sdp += bus;
4516
4517 sdp->isp_fifo_threshold =
4518 ISP12160_NVRAM_FIFO_THRESHOLD(nvram_data);
4519
4520 sdp->isp_initiator_id =
4521 ISP12160_NVRAM_INITIATOR_ID(nvram_data, bus);
4522
4523 sdp->isp_bus_reset_delay =
4524 ISP12160_NVRAM_BUS_RESET_DELAY(nvram_data, bus);
4525
4526 sdp->isp_retry_count =
4527 ISP12160_NVRAM_BUS_RETRY_COUNT(nvram_data, bus);
4528
4529 sdp->isp_retry_delay =
4530 ISP12160_NVRAM_BUS_RETRY_DELAY(nvram_data, bus);
4531
4532 sdp->isp_async_data_setup =
4533 ISP12160_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data,
4534 bus);
4535
4536 sdp->isp_req_ack_active_neg =
4537 ISP12160_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data,
4538 bus);
4539
4540 sdp->isp_data_line_active_neg =
4541 ISP12160_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data,
4542 bus);
4543
4544 sdp->isp_data_dma_burst_enabl =
4545 ISP12160_NVRAM_BURST_ENABLE(nvram_data);
4546
4547 sdp->isp_cmd_dma_burst_enable =
4548 ISP12160_NVRAM_BURST_ENABLE(nvram_data);
4549
4550 sdp->isp_selection_timeout =
4551 ISP12160_NVRAM_SELECTION_TIMEOUT(nvram_data, bus);
4552
4553 sdp->isp_max_queue_depth =
4554 ISP12160_NVRAM_MAX_QUEUE_DEPTH(nvram_data, bus);
4555
4556 if (isp->isp_dblev >= 3) {
4557 PRINTF("%s: ISP12160 bus %d NVRAM values:\n",
4558 isp->isp_name, bus);
4559 PRINTF(" Initiator ID = %d\n",
4560 sdp->isp_initiator_id);
4561 PRINTF(" Fifo Threshold = 0x%x\n",
4562 sdp->isp_fifo_threshold);
4563 PRINTF(" Bus Reset Delay = %d\n",
4564 sdp->isp_bus_reset_delay);
4565 PRINTF(" Retry Count = %d\n",
4566 sdp->isp_retry_count);
4567 PRINTF(" Retry Delay = %d\n",
4568 sdp->isp_retry_delay);
4569 PRINTF(" Tag Age Limit = %d\n",
4570 sdp->isp_tag_aging);
4571 PRINTF(" Selection Timeout = %d\n",
4572 sdp->isp_selection_timeout);
4573 PRINTF(" Max Queue Depth = %d\n",
4574 sdp->isp_max_queue_depth);
4575 PRINTF(" Async Data Setup = 0x%x\n",
4576 sdp->isp_async_data_setup);
4577 PRINTF(" REQ/ACK Active Negation = %s\n",
4578 sdp->isp_req_ack_active_neg? tru : not);
4579 PRINTF(" Data Line Active Negation = %s\n",
4580 sdp->isp_data_line_active_neg? tru : not);
4581 PRINTF(" Cmd DMA Burst Enable = %s\n",
4582 sdp->isp_cmd_dma_burst_enable? tru : not);
4583 }
4584
4585 for (i = 0; i < MAX_TARGETS; i++) {
4586 sdp->isp_devparam[i].dev_enable =
4587 ISP12160_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i, bus);
4588 sdp->isp_devparam[i].exc_throttle =
4589 ISP12160_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i, bus);
4590 sdp->isp_devparam[i].sync_offset =
4591 ISP12160_NVRAM_TGT_SYNC_OFFSET(nvram_data, i, bus);
4592 sdp->isp_devparam[i].sync_period =
4593 ISP12160_NVRAM_TGT_SYNC_PERIOD(nvram_data, i, bus);
4594 sdp->isp_devparam[i].dev_flags = 0;
4595 if (ISP12160_NVRAM_TGT_RENEG(nvram_data, i, bus))
4596 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG;
4597 if (ISP12160_NVRAM_TGT_QFRZ(nvram_data, i, bus)) {
4598 PRINTF("%s: not supporting QFRZ option "
4599 "for target %d bus %d\n", isp->isp_name, i, bus);
4600 }
4601 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ;
4602 if (ISP12160_NVRAM_TGT_ARQ(nvram_data, i, bus) == 0) {
4603 PRINTF("%s: not disabling ARQ option "
4604 "for target %d bus %d\n", isp->isp_name, i, bus);
4605 }
4606 if (ISP12160_NVRAM_TGT_TQING(nvram_data, i, bus))
4607 sdp->isp_devparam[i].dev_flags |= DPARM_TQING;
4608 if (ISP12160_NVRAM_TGT_SYNC(nvram_data, i, bus))
4609 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC;
4610 if (ISP12160_NVRAM_TGT_WIDE(nvram_data, i, bus))
4611 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE;
4612 if (ISP12160_NVRAM_TGT_PARITY(nvram_data, i, bus))
4613 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY;
4614 if (ISP12160_NVRAM_TGT_DISC(nvram_data, i, bus))
4615 sdp->isp_devparam[i].dev_flags |= DPARM_DISC;
4616 sdp->isp_devparam[i].cur_dflags = 0;
4617 if (isp->isp_dblev >= 3) {
4618 PRINTF(" Target %d: Ena %d Throttle %d Offset %d "
4619 "Period %d Flags 0x%x\n", i,
4620 sdp->isp_devparam[i].dev_enable,
4621 sdp->isp_devparam[i].exc_throttle,
4622 sdp->isp_devparam[i].sync_offset,
4623 sdp->isp_devparam[i].sync_period,
4624 sdp->isp_devparam[i].dev_flags);
4625 }
4626 }
4627}
4628
4629static void
4630isp_parse_nvram_2100(isp, nvram_data)
4631 struct ispsoftc *isp;
4632 u_int8_t *nvram_data;
4633{
4634 fcparam *fcp = (fcparam *) isp->isp_param;
4635 union {
4636 struct {
4637#if BYTE_ORDER == BIG_ENDIAN
4638 u_int32_t hi32;
4639 u_int32_t lo32;
4640#else
4641 u_int32_t lo32;
4642 u_int32_t hi32;
4643#endif
4644 } wd;
4645 u_int64_t full64;
4646 } wwnstore;
4647
4648 wwnstore.full64 = ISP2100_NVRAM_NODE_NAME(nvram_data);
4649
4650 /*
4651 * Broken PTI cards with nothing in the top nibble. Pah.
4652 */
4653 if ((wwnstore.wd.hi32 >> 28) == 0) {
4654 wwnstore.wd.hi32 |= (2 << 28);
4655 CFGPRINTF("%s: (corrected) Adapter WWN 0x%08x%08x\n",
4656 isp->isp_name, wwnstore.wd.hi32, wwnstore.wd.lo32);
4657 } else {
4658 CFGPRINTF("%s: Adapter WWN 0x%08x%08x\n", isp->isp_name,
4659 wwnstore.wd.hi32, wwnstore.wd.lo32);
4660 }
4661 fcp->isp_nodewwn = wwnstore.full64;
4662
4663 /*
4664 * If the Node WWN has 2 in the top nibble, we can
4665 * authoritatively construct a Port WWN by adding
4666 * our unit number (plus one to make it nonzero) and
4667 * putting it into bits 59..56. If the top nibble isn't
4668 * 2, then we just set them identically.
4669 */
4670 if ((fcp->isp_nodewwn >> 60) == 2) {
4671 fcp->isp_portwwn = fcp->isp_nodewwn |
4672 (((u_int64_t)(isp->isp_unit+1)) << 56);
4673 } else {
4674 fcp->isp_portwwn = fcp->isp_nodewwn;
4675 }
4676 wwnstore.full64 = ISP2100_NVRAM_BOOT_NODE_NAME(nvram_data);
4677 if (wwnstore.full64 != 0) {
4678 PRINTF("%s: BOOT DEVICE WWN 0x%08x%08x\n",
4679 isp->isp_name, wwnstore.wd.hi32, wwnstore.wd.lo32);
4680 }
4681 fcp->isp_maxalloc =
4682 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data);
4683 fcp->isp_maxfrmlen =
4684 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data);
4685 fcp->isp_retry_delay =
4686 ISP2100_NVRAM_RETRY_DELAY(nvram_data);
4687 fcp->isp_retry_count =
4688 ISP2100_NVRAM_RETRY_COUNT(nvram_data);
4689 fcp->isp_loopid =
4690 ISP2100_NVRAM_HARDLOOPID(nvram_data);
4691 fcp->isp_execthrottle =
4692 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data);
4693 fcp->isp_fwoptions = ISP2100_NVRAM_OPTIONS(nvram_data);
4694 if (isp->isp_dblev > 2) {
4695 PRINTF("%s: NVRAM values:\n", isp->isp_name);
4696 PRINTF(" Max IOCB Allocation = %d\n",
4697 fcp->isp_maxalloc);
4698 PRINTF(" Max Frame Length = %d\n",
4699 fcp->isp_maxfrmlen);
4700 PRINTF(" Execution Throttle = %d\n",
4701 fcp->isp_execthrottle);
4702 PRINTF(" Retry Count = %d\n",
4703 fcp->isp_retry_count);
4704 PRINTF(" Retry Delay = %d\n",
4705 fcp->isp_retry_delay);
4706 PRINTF(" Hard Loop ID = %d\n",
4707 fcp->isp_loopid);
4708 PRINTF(" Options = 0x%x\n",
4709 fcp->isp_fwoptions);
4710 PRINTF(" HBA Options = 0x%x\n",
4711 ISP2100_NVRAM_HBA_OPTIONS(nvram_data));
4712 }
4713}