isp.c (35388) | isp.c (39235) |
---|---|
1/* $Id: isp.c,v 1.6 1998/04/14 17:43:45 mjacob Exp $ */ | 1/* $Id: isp.c,v 1.19 1998/09/14 23:23:47 mjacob Exp $ */ |
2/* | 2/* |
3 * Machine Independent (well, as best as possible) | 3 * Machine and OS Independent (well, as best as possible) |
4 * code for the Qlogic ISP SCSI adapters. 5 * 6 *--------------------------------------- 7 * Copyright (c) 1997, 1998 by Matthew Jacob 8 * NASA/Ames Research Center 9 * All rights reserved. 10 *--------------------------------------- 11 * --- 44 unchanged lines hidden (view full) --- 56 57/* 58 * General defines 59 */ 60 61#define MBOX_DELAY_COUNT 1000000 / 100 62 63/* | 4 * code for the Qlogic ISP SCSI adapters. 5 * 6 *--------------------------------------- 7 * Copyright (c) 1997, 1998 by Matthew Jacob 8 * NASA/Ames Research Center 9 * All rights reserved. 10 *--------------------------------------- 11 * --- 44 unchanged lines hidden (view full) --- 56 57/* 58 * General defines 59 */ 60 61#define MBOX_DELAY_COUNT 1000000 / 100 62 63/* |
64 * Function prototypes. | 64 * Local static data |
65 */ | 65 */ |
66static int isp_poll __P((struct ispsoftc *, ISP_SCSI_XFER_T *, int)); | 66static const char tgtiqd[36] = { 67 0x03, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 68 0x51, 0x4C, 0x4F, 0x47, 0x49, 0x43, 0x20, 0x20, 69#ifdef __NetBSD__ 70 0x4E, 0x45, 0x54, 0x42, 0x53, 0x44, 0x20, 0x20, 71#else 72# ifdef __FreeBSD__ 73 0x46, 0x52, 0x45, 0x45, 0x42, 0x52, 0x44, 0x20, 74# else 75# ifdef linux 76 0x4C, 0x49, 0x4E, 0x55, 0x58, 0x20, 0x20, 0x20, 77# else 78# endif 79# endif 80#endif 81 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x20, 0x20, 82 0x20, 0x20, 0x20, 0x31 83}; 84 85 86/* 87 * Local function prototypes. 88 */ 89static int isp_parse_async __P((struct ispsoftc *, u_int16_t)); 90static int isp_handle_other_response 91__P((struct ispsoftc *, ispstatusreq_t *, u_int8_t *)); 92#if defined(ISP2100_TARGET_MODE) || defined(ISP_TARGET_MODE) 93static int isp_modify_lun __P((struct ispsoftc *, int, int, int)); 94#endif |
67static void isp_parse_status 68__P((struct ispsoftc *, ispstatusreq_t *, ISP_SCSI_XFER_T *)); | 95static void isp_parse_status 96__P((struct ispsoftc *, ispstatusreq_t *, ISP_SCSI_XFER_T *)); |
69static void isp_lostcmd 70__P((struct ispsoftc *, ISP_SCSI_XFER_T *, ispreq_t *)); | |
71static void isp_fibre_init __P((struct ispsoftc *)); 72static void isp_fw_state __P((struct ispsoftc *)); 73static void isp_dumpregs __P((struct ispsoftc *, const char *)); | 97static void isp_fibre_init __P((struct ispsoftc *)); 98static void isp_fw_state __P((struct ispsoftc *)); 99static void isp_dumpregs __P((struct ispsoftc *, const char *)); |
74static void isp_setdparm __P((struct ispsoftc *)); | 100static void isp_dumpxflist __P((struct ispsoftc *)); |
75static void isp_prtstst __P((ispstatusreq_t *)); 76static void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *)); 77 | 101static void isp_prtstst __P((ispstatusreq_t *)); 102static void isp_mboxcmd __P((struct ispsoftc *, mbreg_t *)); 103 |
104static void isp_update __P((struct ispsoftc *)); 105static void isp_setdfltparm __P((struct ispsoftc *)); 106static int isp_read_nvram __P((struct ispsoftc *)); 107static void isp_rdnvram_word __P((struct ispsoftc *, int, u_int16_t *)); 108 |
|
78/* 79 * Reset Hardware. | 109/* 110 * Reset Hardware. |
111 * 112 * Hit the chip over the head, download new f/w. 113 * 114 * Locking done elsewhere. |
|
80 */ 81void 82isp_reset(isp) 83 struct ispsoftc *isp; 84{ | 115 */ 116void 117isp_reset(isp) 118 struct ispsoftc *isp; 119{ |
120 static char once = 1; |
|
85 mbreg_t mbs; 86 int loops, i, dodnld = 1; 87 char *revname; | 121 mbreg_t mbs; 122 int loops, i, dodnld = 1; 123 char *revname; |
88 ISP_LOCKVAL_DECL; | |
89 | 124 |
90 revname = "(unknown)"; 91 | |
92 isp->isp_state = ISP_NILSTATE; 93 94 /* | 125 isp->isp_state = ISP_NILSTATE; 126 127 /* |
95 * Basic types have been set in the MD code. 96 * See if we can't figure out more here. | 128 * Basic types (SCSI, FibreChannel and PCI or SBus) 129 * have been set in the MD code. We figure out more 130 * here. |
97 */ 98 isp->isp_dblev = DFLT_DBLEVEL; 99 if (isp->isp_type & ISP_HA_FC) { 100 revname = "2100"; 101 } else { | 131 */ 132 isp->isp_dblev = DFLT_DBLEVEL; 133 if (isp->isp_type & ISP_HA_FC) { 134 revname = "2100"; 135 } else { |
102 i = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK; 103 switch (i) { | 136 sdparam *sdp = isp->isp_param; 137 138 int rev = ISP_READ(isp, BIU_CONF0) & BIU_CONF0_HW_MASK; 139 switch (rev) { |
104 default: | 140 default: |
105 PRINTF("%s: unknown ISP type %x- assuming 1020\n", 106 isp->isp_name, i); | 141 PRINTF("%s: unknown chip rev. 0x%x- assuming a 1020\n", 142 isp->isp_name, rev); 143 /* FALLTHROUGH */ 144 case 1: 145 revname = "1020"; |
107 isp->isp_type = ISP_HA_SCSI_1020; | 146 isp->isp_type = ISP_HA_SCSI_1020; |
147 sdp->isp_clock = 40; |
|
108 break; | 148 break; |
109 case 1: | |
110 case 2: | 149 case 2: |
111 revname = "1020"; 112 isp->isp_type = ISP_HA_SCSI_1020; | 150 /* 151 * Some 1020A chips are Ultra Capable, but don't 152 * run the clock rate up for that unless told to 153 * do so by the Ultra Capable bits being set. 154 */ 155 revname = "1020A"; 156 isp->isp_type = ISP_HA_SCSI_1020A; 157 sdp->isp_clock = 40; |
113 break; 114 case 3: | 158 break; 159 case 3: |
160 revname = "1040"; 161 isp->isp_type = ISP_HA_SCSI_1040; 162 sdp->isp_clock = 60; 163 break; 164 case 4: |
|
115 revname = "1040A"; 116 isp->isp_type = ISP_HA_SCSI_1040A; | 165 revname = "1040A"; 166 isp->isp_type = ISP_HA_SCSI_1040A; |
167 sdp->isp_clock = 60; |
|
117 break; 118 case 5: 119 revname = "1040B"; 120 isp->isp_type = ISP_HA_SCSI_1040B; | 168 break; 169 case 5: 170 revname = "1040B"; 171 isp->isp_type = ISP_HA_SCSI_1040B; |
172 sdp->isp_clock = 60; |
|
121 break; 122 } | 173 break; 174 } |
175 /* 176 * Try and figure out if we're connected to a differential bus. 177 * You have to pause the RISC processor to read SXP registers. 178 */ 179 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 180 i = 100; 181 while ((ISP_READ(isp, HCCR) & HCCR_PAUSE) == 0) { 182 SYS_DELAY(20); 183 if (--i == 0) { 184 PRINTF("%s: unable to pause RISC processor\n", 185 isp->isp_name); 186 i = -1; 187 break; 188 } 189 } 190 if (i > 0) { 191 if (isp->isp_bustype != ISP_BT_SBUS) { 192 ISP_SETBITS(isp, BIU_CONF1, BIU_PCI_CONF1_SXP); 193 } 194 if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_MODE) { 195 IDPRINTF(2, ("%s: Differential Mode Set\n", 196 isp->isp_name)); 197 sdp->isp_diffmode = 1; 198 } else { 199 sdp->isp_diffmode = 0; 200 } 201 202 if (isp->isp_bustype != ISP_BT_SBUS) { 203 ISP_CLRBITS(isp, BIU_CONF1, BIU_PCI_CONF1_SXP); 204 } 205 206 /* 207 * Figure out whether we're ultra capable. 208 */ 209 i = ISP_READ(isp, RISC_PSR); 210 if (isp->isp_bustype != ISP_BT_SBUS) { 211 i &= RISC_PSR_PCI_ULTRA; 212 } else { 213 i &= RISC_PSR_SBUS_ULTRA; 214 } 215 if (i) { 216 IDPRINTF(2, ("%s: Ultra Mode Capable\n", 217 isp->isp_name)); 218 sdp->isp_clock = 60; 219 } else { 220 sdp->isp_clock = 40; 221 } 222 /* 223 * Restart processor 224 */ 225 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 226 } 227 /* 228 * Machine dependent clock (if set) overrides 229 * our generic determinations. 230 */ 231 if (isp->isp_mdvec->dv_clock) { 232 if (isp->isp_mdvec->dv_clock < sdp->isp_clock) { 233 sdp->isp_clock = isp->isp_mdvec->dv_clock; 234 } 235 } |
|
123 } 124 125 /* 126 * Do MD specific pre initialization 127 */ | 236 } 237 238 /* 239 * Do MD specific pre initialization 240 */ |
128 ISP_LOCK; | |
129 ISP_RESET0(isp); | 241 ISP_RESET0(isp); |
130 isp_setdparm(isp); | |
131 | 242 |
243 if (once == 1) { 244 once = 0; 245 /* 246 * Get the current running firmware revision out of the 247 * chip before we hit it over the head (if this is our 248 * first time through). Note that we store this as the 249 * 'ROM' firmware revision- which it may not be. In any 250 * case, we don't really use this yet, but we may in 251 * the future. 252 */ 253 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 254 isp_mboxcmd(isp, &mbs); 255 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 256 IDPRINTF(3, ("%s: initial ABOUT FIRMWARE command " 257 "failed\n", isp->isp_name)); 258 } else { 259 isp->isp_romfw_rev = 260 (((u_int16_t) mbs.param[1]) << 10) + mbs.param[2]; 261 } 262 } 263 |
|
132 /* 133 * Hit the chip over the head with hammer, 134 * and give the ISP a chance to recover. 135 */ 136 137 if (isp->isp_type & ISP_HA_SCSI) { 138 ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET); 139 /* --- 32 unchanged lines hidden (view full) --- 172 break; 173 } else { 174 if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET)) 175 break; 176 } 177 SYS_DELAY(100); 178 if (--loops < 0) { 179 isp_dumpregs(isp, "chip reset timed out"); | 264 /* 265 * Hit the chip over the head with hammer, 266 * and give the ISP a chance to recover. 267 */ 268 269 if (isp->isp_type & ISP_HA_SCSI) { 270 ISP_WRITE(isp, BIU_ICR, BIU_ICR_SOFT_RESET); 271 /* --- 32 unchanged lines hidden (view full) --- 304 break; 305 } else { 306 if (!(ISP_READ(isp, BIU2100_CSR) & BIU2100_SOFT_RESET)) 307 break; 308 } 309 SYS_DELAY(100); 310 if (--loops < 0) { 311 isp_dumpregs(isp, "chip reset timed out"); |
180 ISP_UNLOCK; | |
181 return; 182 } 183 } 184 /* 185 * More initialization 186 */ 187 if (isp->isp_type & ISP_HA_SCSI) { 188 ISP_WRITE(isp, BIU_CONF1, 0); 189 } else { 190 ISP_WRITE(isp, BIU2100_CSR, 0); | 312 return; 313 } 314 } 315 /* 316 * More initialization 317 */ 318 if (isp->isp_type & ISP_HA_SCSI) { 319 ISP_WRITE(isp, BIU_CONF1, 0); 320 } else { 321 ISP_WRITE(isp, BIU2100_CSR, 0); |
191 ISP_WRITE(isp, RISC_MTR2100, 0x1212); /* FM */ | 322 /* 323 * All 2100's are 60Mhz with fast rams onboard. 324 */ 325 ISP_WRITE(isp, RISC_MTR2100, 0x1212); |
192 } 193 194 ISP_WRITE(isp, HCCR, HCCR_CMD_RESET); 195 SYS_DELAY(100); 196 197 if (isp->isp_type & ISP_HA_SCSI) { 198 ISP_SETBITS(isp, BIU_CONF1, isp->isp_mdvec->dv_conf1); 199 if (isp->isp_mdvec->dv_conf1 & BIU_BURST_ENABLE) { --- 15 unchanged lines hidden (view full) --- 215 216 /* 217 * Do some sanity checking. 218 */ 219 mbs.param[0] = MBOX_NO_OP; 220 isp_mboxcmd(isp, &mbs); 221 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 222 isp_dumpregs(isp, "NOP test failed"); | 326 } 327 328 ISP_WRITE(isp, HCCR, HCCR_CMD_RESET); 329 SYS_DELAY(100); 330 331 if (isp->isp_type & ISP_HA_SCSI) { 332 ISP_SETBITS(isp, BIU_CONF1, isp->isp_mdvec->dv_conf1); 333 if (isp->isp_mdvec->dv_conf1 & BIU_BURST_ENABLE) { --- 15 unchanged lines hidden (view full) --- 349 350 /* 351 * Do some sanity checking. 352 */ 353 mbs.param[0] = MBOX_NO_OP; 354 isp_mboxcmd(isp, &mbs); 355 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 356 isp_dumpregs(isp, "NOP test failed"); |
223 ISP_UNLOCK; | |
224 return; 225 } 226 227 if (isp->isp_type & ISP_HA_SCSI) { 228 mbs.param[0] = MBOX_MAILBOX_REG_TEST; 229 mbs.param[1] = 0xdead; 230 mbs.param[2] = 0xbeef; 231 mbs.param[3] = 0xffff; 232 mbs.param[4] = 0x1111; 233 mbs.param[5] = 0xa5a5; 234 isp_mboxcmd(isp, &mbs); 235 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 236 isp_dumpregs(isp, 237 "Mailbox Register test didn't complete"); | 357 return; 358 } 359 360 if (isp->isp_type & ISP_HA_SCSI) { 361 mbs.param[0] = MBOX_MAILBOX_REG_TEST; 362 mbs.param[1] = 0xdead; 363 mbs.param[2] = 0xbeef; 364 mbs.param[3] = 0xffff; 365 mbs.param[4] = 0x1111; 366 mbs.param[5] = 0xa5a5; 367 isp_mboxcmd(isp, &mbs); 368 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 369 isp_dumpregs(isp, 370 "Mailbox Register test didn't complete"); |
238 ISP_UNLOCK; | |
239 return; 240 } 241 if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef || 242 mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 || 243 mbs.param[5] != 0xa5a5) { 244 isp_dumpregs(isp, "Register Test Failed"); | 371 return; 372 } 373 if (mbs.param[1] != 0xdead || mbs.param[2] != 0xbeef || 374 mbs.param[3] != 0xffff || mbs.param[4] != 0x1111 || 375 mbs.param[5] != 0xa5a5) { 376 isp_dumpregs(isp, "Register Test Failed"); |
245 ISP_UNLOCK; | |
246 return; 247 } 248 249 } 250 251 /* 252 * Download new Firmware, unless requested not to do so. 253 * This is made slightly trickier in some cases where the --- 11 unchanged lines hidden (view full) --- 265 if (dodnld) { 266 for (i = 0; i < isp->isp_mdvec->dv_fwlen; i++) { 267 mbs.param[0] = MBOX_WRITE_RAM_WORD; 268 mbs.param[1] = isp->isp_mdvec->dv_codeorg + i; 269 mbs.param[2] = isp->isp_mdvec->dv_ispfw[i]; 270 isp_mboxcmd(isp, &mbs); 271 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 272 isp_dumpregs(isp, "f/w download failed"); | 377 return; 378 } 379 380 } 381 382 /* 383 * Download new Firmware, unless requested not to do so. 384 * This is made slightly trickier in some cases where the --- 11 unchanged lines hidden (view full) --- 396 if (dodnld) { 397 for (i = 0; i < isp->isp_mdvec->dv_fwlen; i++) { 398 mbs.param[0] = MBOX_WRITE_RAM_WORD; 399 mbs.param[1] = isp->isp_mdvec->dv_codeorg + i; 400 mbs.param[2] = isp->isp_mdvec->dv_ispfw[i]; 401 isp_mboxcmd(isp, &mbs); 402 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 403 isp_dumpregs(isp, "f/w download failed"); |
273 274 ISP_UNLOCK; | |
275 return; 276 } 277 } 278 279 if (isp->isp_mdvec->dv_fwlen) { 280 /* 281 * Verify that it downloaded correctly. 282 */ 283 mbs.param[0] = MBOX_VERIFY_CHECKSUM; 284 mbs.param[1] = isp->isp_mdvec->dv_codeorg; 285 isp_mboxcmd(isp, &mbs); 286 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 287 isp_dumpregs(isp, "ram checksum failure"); | 404 return; 405 } 406 } 407 408 if (isp->isp_mdvec->dv_fwlen) { 409 /* 410 * Verify that it downloaded correctly. 411 */ 412 mbs.param[0] = MBOX_VERIFY_CHECKSUM; 413 mbs.param[1] = isp->isp_mdvec->dv_codeorg; 414 isp_mboxcmd(isp, &mbs); 415 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 416 isp_dumpregs(isp, "ram checksum failure"); |
288 ISP_UNLOCK; | |
289 return; 290 } 291 } 292 } else { 293 IDPRINTF(3, ("%s: skipping f/w download\n", isp->isp_name)); 294 } 295 296 /* 297 * Now start it rolling. 298 * 299 * If we didn't actually download f/w, 300 * we still need to (re)start it. 301 */ 302 303 mbs.param[0] = MBOX_EXEC_FIRMWARE; 304 mbs.param[1] = isp->isp_mdvec->dv_codeorg; 305 isp_mboxcmd(isp, &mbs); 306 307 if (isp->isp_type & ISP_HA_SCSI) { | 417 return; 418 } 419 } 420 } else { 421 IDPRINTF(3, ("%s: skipping f/w download\n", isp->isp_name)); 422 } 423 424 /* 425 * Now start it rolling. 426 * 427 * If we didn't actually download f/w, 428 * we still need to (re)start it. 429 */ 430 431 mbs.param[0] = MBOX_EXEC_FIRMWARE; 432 mbs.param[1] = isp->isp_mdvec->dv_codeorg; 433 isp_mboxcmd(isp, &mbs); 434 435 if (isp->isp_type & ISP_HA_SCSI) { |
436 sdparam *sdp = isp->isp_param; |
|
308 /* | 437 /* |
309 * Set CLOCK RATE | 438 * Set CLOCK RATE, but only if asked to. |
310 */ | 439 */ |
311 if (((sdparam *)isp->isp_param)->isp_clock) { | 440 if (sdp->isp_clock) { |
312 mbs.param[0] = MBOX_SET_CLOCK_RATE; | 441 mbs.param[0] = MBOX_SET_CLOCK_RATE; |
313 mbs.param[1] = ((sdparam *)isp->isp_param)->isp_clock; | 442 mbs.param[1] = sdp->isp_clock; |
314 isp_mboxcmd(isp, &mbs); 315 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 316 isp_dumpregs(isp, "failed to set CLOCKRATE"); | 443 isp_mboxcmd(isp, &mbs); 444 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 445 isp_dumpregs(isp, "failed to set CLOCKRATE"); |
317 ISP_UNLOCK; 318 return; | 446 /* but continue */ 447 } else { 448 IDPRINTF(3, ("%s: setting input clock to %d\n", 449 isp->isp_name, sdp->isp_clock)); |
319 } 320 } 321 } 322 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 323 isp_mboxcmd(isp, &mbs); 324 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 325 isp_dumpregs(isp, "ABOUT FIRMWARE command failed"); | 450 } 451 } 452 } 453 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 454 isp_mboxcmd(isp, &mbs); 455 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 456 isp_dumpregs(isp, "ABOUT FIRMWARE command failed"); |
326 ISP_UNLOCK; | |
327 return; 328 } 329 PRINTF("%s: Board Revision %s, %s F/W Revision %d.%d\n", | 457 return; 458 } 459 PRINTF("%s: Board Revision %s, %s F/W Revision %d.%d\n", |
330 isp->isp_name, revname, dodnld? "loaded" : "ROM", | 460 isp->isp_name, revname, dodnld? "loaded" : "resident", |
331 mbs.param[1], mbs.param[2]); | 461 mbs.param[1], mbs.param[2]); |
462 isp->isp_fwrev = (((u_int16_t) mbs.param[1]) << 10) + mbs.param[2]; 463 if (isp->isp_romfw_rev && dodnld) { 464 PRINTF("%s: Last F/W revision was %d.%d\n", isp->isp_name, 465 isp->isp_romfw_rev >> 10, isp->isp_romfw_rev & 0x3ff); 466 } |
|
332 isp_fw_state(isp); 333 isp->isp_state = ISP_RESETSTATE; | 467 isp_fw_state(isp); 468 isp->isp_state = ISP_RESETSTATE; |
334 ISP_UNLOCK; | |
335} 336 337/* | 469} 470 471/* |
338 * Abort an executing command. 339 * Locks (ints blocked) assumed held. 340 */ 341 342int 343isp_abortcmd(isp, xidx) 344 struct ispsoftc *isp; 345 int xidx; 346{ 347 mbreg_t mbs; 348 ISP_SCSI_XFER_T *xs; 349 350 xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[xidx]; 351 if (xs == NULL) { 352 PRINTF("%s: isp_abortcmd - NULL xs\n", isp->isp_name); 353 return (0); 354 } 355 mbs.param[0] = MBOX_ABORT; 356 mbs.param[1] = XS_TGT(xs) | XS_LUN(xs); 357 mbs.param[2] = (xidx+1) >> 16; 358 mbs.param[3] = (xidx+1) & 0xffff; 359 isp_mboxcmd(isp, &mbs); 360 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 361 PRINTF("%s: isp_abort failure (code %x)\n", 362 isp->isp_name, mbs.param[0]); 363 return (0); 364 } else { 365 return (1); 366 } 367} 368 369/* | |
370 * Initialize Hardware to known state | 472 * Initialize Hardware to known state |
473 * 474 * Locks are held before coming here. |
|
371 */ | 475 */ |
476 |
|
372void 373isp_init(isp) 374 struct ispsoftc *isp; 375{ 376 sdparam *sdp; 377 mbreg_t mbs; | 477void 478isp_init(isp) 479 struct ispsoftc *isp; 480{ 481 sdparam *sdp; 482 mbreg_t mbs; |
378 int i, l; 379 ISP_LOCKVAL_DECL; | 483 int tgt; |
380 | 484 |
485 /* 486 * Must do first. 487 */ 488 isp_setdfltparm(isp); 489 490 /* 491 * If we're fibre, we have a completely different 492 * initialization method. 493 */ 494 |
|
381 if (isp->isp_type & ISP_HA_FC) { 382 isp_fibre_init(isp); 383 return; 384 } | 495 if (isp->isp_type & ISP_HA_FC) { 496 isp_fibre_init(isp); 497 return; 498 } |
385 | |
386 sdp = isp->isp_param; 387 388 /* | 499 sdp = isp->isp_param; 500 501 /* |
389 * Try and figure out if we're connected to a differential bus. 390 * You have to pause the RISC processor to read SXP registers. 391 * 392 * This, by the way, is likely broken in that it should be 393 * getting this info from NVRAM settings too. | 502 * Set (possibly new) Initiator ID. |
394 */ | 503 */ |
395 ISP_LOCK; 396 ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE); 397 if (ISP_READ(isp, SXP_PINS_DIFF) & SXP_PINS_DIFF_SENSE) { 398 sdp->isp_diffmode = 1; 399 PRINTF("%s: Differential Mode\n", isp->isp_name); 400 } else { 401 /* 402 * Force pullups on. 403 */ 404 sdp->isp_req_ack_active_neg = 1; 405 sdp->isp_data_line_active_neg = 1; 406 sdp->isp_diffmode = 0; 407 } 408 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); /* release paused processor */ 409 410 mbs.param[0] = MBOX_GET_INIT_SCSI_ID; | 504 mbs.param[0] = MBOX_SET_INIT_SCSI_ID; 505 mbs.param[1] = sdp->isp_initiator_id; |
411 isp_mboxcmd(isp, &mbs); 412 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 506 isp_mboxcmd(isp, &mbs); 507 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
413 ISP_UNLOCK; 414 isp_dumpregs(isp, "failed to get initiator id"); | 508 isp_dumpregs(isp, "failed to set initiator id"); |
415 return; 416 } | 509 return; 510 } |
417 if (mbs.param[1] != sdp->isp_initiator_id) { 418 PRINTF("%s: setting Initiator ID to %d\n", isp->isp_name, 419 sdp->isp_initiator_id); 420 mbs.param[0] = MBOX_SET_INIT_SCSI_ID; 421 mbs.param[1] = sdp->isp_initiator_id; 422 isp_mboxcmd(isp, &mbs); 423 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 424 ISP_UNLOCK; 425 isp_dumpregs(isp, "failed to set initiator id"); 426 return; 427 } 428 } else { 429 IDPRINTF(3, ("%s: leaving Initiator ID at %d\n", isp->isp_name, 430 sdp->isp_initiator_id)); 431 } | |
432 | 511 |
512 /* 513 * Set Retry Delay and Count 514 */ |
|
433 mbs.param[0] = MBOX_SET_RETRY_COUNT; 434 mbs.param[1] = sdp->isp_retry_count; 435 mbs.param[2] = sdp->isp_retry_delay; 436 isp_mboxcmd(isp, &mbs); 437 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 515 mbs.param[0] = MBOX_SET_RETRY_COUNT; 516 mbs.param[1] = sdp->isp_retry_count; 517 mbs.param[2] = sdp->isp_retry_delay; 518 isp_mboxcmd(isp, &mbs); 519 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
438 ISP_UNLOCK; | |
439 isp_dumpregs(isp, "failed to set retry count and delay"); 440 return; 441 } 442 | 520 isp_dumpregs(isp, "failed to set retry count and delay"); 521 return; 522 } 523 |
524 /* 525 * Set ASYNC DATA SETUP time. This is very important. 526 */ |
|
443 mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME; 444 mbs.param[1] = sdp->isp_async_data_setup; 445 isp_mboxcmd(isp, &mbs); 446 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 527 mbs.param[0] = MBOX_SET_ASYNC_DATA_SETUP_TIME; 528 mbs.param[1] = sdp->isp_async_data_setup; 529 isp_mboxcmd(isp, &mbs); 530 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
447 ISP_UNLOCK; | |
448 isp_dumpregs(isp, "failed to set async data setup time"); 449 return; 450 } 451 | 531 isp_dumpregs(isp, "failed to set async data setup time"); 532 return; 533 } 534 |
535 /* 536 * Set ACTIVE Negation State. 537 */ |
|
452 mbs.param[0] = MBOX_SET_ACTIVE_NEG_STATE; | 538 mbs.param[0] = MBOX_SET_ACTIVE_NEG_STATE; |
453 mbs.param[1] = (sdp->isp_req_ack_active_neg << 4) | 454 (sdp->isp_data_line_active_neg << 5); | 539 mbs.param[1] = 540 (sdp->isp_req_ack_active_neg << 4) | 541 (sdp->isp_data_line_active_neg << 5); |
455 isp_mboxcmd(isp, &mbs); 456 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 542 isp_mboxcmd(isp, &mbs); 543 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
457 ISP_UNLOCK; | |
458 isp_dumpregs(isp, "failed to set active neg state"); 459 return; 460 } 461 | 544 isp_dumpregs(isp, "failed to set active neg state"); 545 return; 546 } 547 |
548 /* 549 * Set the Tag Aging limit 550 */ 551 |
|
462 mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT; 463 mbs.param[1] = sdp->isp_tag_aging; 464 isp_mboxcmd(isp, &mbs); 465 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 552 mbs.param[0] = MBOX_SET_TAG_AGE_LIMIT; 553 mbs.param[1] = sdp->isp_tag_aging; 554 isp_mboxcmd(isp, &mbs); 555 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
466 ISP_UNLOCK; | |
467 isp_dumpregs(isp, "failed to set tag age limit"); 468 return; 469 } 470 | 556 isp_dumpregs(isp, "failed to set tag age limit"); 557 return; 558 } 559 |
560 /* 561 * Set selection timeout. 562 */ 563 |
|
471 mbs.param[0] = MBOX_SET_SELECT_TIMEOUT; 472 mbs.param[1] = sdp->isp_selection_timeout; 473 isp_mboxcmd(isp, &mbs); 474 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 564 mbs.param[0] = MBOX_SET_SELECT_TIMEOUT; 565 mbs.param[1] = sdp->isp_selection_timeout; 566 isp_mboxcmd(isp, &mbs); 567 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
475 ISP_UNLOCK; | |
476 isp_dumpregs(isp, "failed to set selection timeout"); 477 return; 478 } 479 | 568 isp_dumpregs(isp, "failed to set selection timeout"); 569 return; 570 } 571 |
480 IDPRINTF(2, ("%s: devparm, W=wide, S=sync, T=Tag\n", isp->isp_name)); 481 for (i = 0; i < MAX_TARGETS; i++) { 482 char bz[9]; 483 u_int16_t cj = sdp->isp_devparam[i].sync_period; | 572 /* 573 * Set per-target parameters to a safe minimum. 574 */ |
484 | 575 |
485 if (sdp->isp_devparam[i].dev_flags & DPARM_SYNC) { 486 u_int16_t x; 487 if (cj == (ISP_20M_SYNCPARMS & 0xff)) { 488 x = 20; 489 } else if (cj == (ISP_10M_SYNCPARMS & 0xff)) { 490 x = 10; 491 } else if (cj == (ISP_08M_SYNCPARMS & 0xff)) { 492 x = 8; 493 } else if (cj == (ISP_05M_SYNCPARMS & 0xff)) { 494 x = 5; 495 } else if (cj == (ISP_04M_SYNCPARMS & 0xff)) { 496 x = 4; 497 } else { 498 x = 0; 499 } 500 if (x) 501 sprintf(bz, "%02dMHz:", x); 502 else 503 sprintf(bz, "?%04x:", cj); 504 } else { 505 sprintf(bz, "Async:"); 506 } 507 if (sdp->isp_devparam[i].dev_flags & DPARM_WIDE) 508 bz[6] = 'W'; 509 else 510 bz[6] = ' '; 511 if (sdp->isp_devparam[i].dev_flags & DPARM_TQING) 512 bz[7] = 'T'; 513 else 514 bz[7] = ' '; 515 bz[8] = 0; 516 IDPRINTF(2, (" id%x:%s", i, bz)); 517 if (((i+1) & 0x3) == 0) 518 IDPRINTF(2, ("\n")); 519 if (sdp->isp_devparam[i].dev_enable == 0) | 576 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 577 int maxlun, lun; 578 579 if (sdp->isp_devparam[tgt].dev_enable == 0) |
520 continue; 521 | 580 continue; 581 |
582 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 583 mbs.param[1] = tgt << 8; 584 mbs.param[2] = DPARM_SAFE_DFLT; 585 mbs.param[3] = 0; |
|
522 /* | 586 /* |
523 * It is not safe to run the 1020 in ultra mode. | 587 * It is not quite clear when this changed over so that 588 * we could force narrow and async, so assume >= 7.55. 589 * 590 * Otherwise, a SCSI bus reset issued below will force 591 * the back to the narrow, async state (but see note 592 * below also). Technically we should also do without 593 * Parity. |
524 */ | 594 */ |
525 if (isp->isp_type == ISP_HA_SCSI_1020 && 526 cj == (ISP_20M_SYNCPARMS & 0xff)) { 527 PRINTF("%s: an ISP1020 set to Ultra Speed- derating.\n", 528 isp->isp_name); 529 sdp->isp_devparam[i].sync_offset = 530 ISP_10M_SYNCPARMS >> 8; 531 sdp->isp_devparam[i].sync_period = 532 ISP_10M_SYNCPARMS & 0xff; | 595 if (isp->isp_fwrev >= ISP_FW_REV(7, 55)) { 596 mbs.param[2] |= DPARM_NARROW | DPARM_ASYNC; |
533 } | 597 } |
534 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 535 mbs.param[1] = i << 8; 536 mbs.param[2] = sdp->isp_devparam[i].dev_flags << 8; 537 mbs.param[3] = 538 (sdp->isp_devparam[i].sync_offset << 8) | 539 (sdp->isp_devparam[i].sync_period); | 598 sdp->isp_devparam[tgt].cur_dflags = mbs.param[2] >> 8; |
540 | 599 |
541 IDPRINTF(3, ("\n%s: target %d flags %x offset %x period %x\n", 542 isp->isp_name, i, sdp->isp_devparam[i].dev_flags, 543 sdp->isp_devparam[i].sync_offset, 544 sdp->isp_devparam[i].sync_period)); | 600 IDPRINTF(3, ("\n%s: tgt %d cflags %x offset %x period %x\n", 601 isp->isp_name, tgt, mbs.param[2], mbs.param[3] >> 8, 602 mbs.param[3] & 0xff)); |
545 isp_mboxcmd(isp, &mbs); 546 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 603 isp_mboxcmd(isp, &mbs); 604 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
547 PRINTF("%s: failed to set parameters for target %d\n", 548 isp->isp_name, i); | 605 606 PRINTF("%s: failed to set parameters for tgt %d\n", 607 isp->isp_name, tgt); 608 |
549 PRINTF("%s: flags %x offset %x period %x\n", | 609 PRINTF("%s: flags %x offset %x period %x\n", |
550 isp->isp_name, sdp->isp_devparam[i].dev_flags, 551 sdp->isp_devparam[i].sync_offset, 552 sdp->isp_devparam[i].sync_period); | 610 isp->isp_name, sdp->isp_devparam[tgt].dev_flags, 611 sdp->isp_devparam[tgt].sync_offset, 612 sdp->isp_devparam[tgt].sync_period); 613 |
553 mbs.param[0] = MBOX_SET_TARGET_PARAMS; | 614 mbs.param[0] = MBOX_SET_TARGET_PARAMS; |
554 mbs.param[1] = i << 8; 555 mbs.param[2] = DPARM_DEFAULT << 8; 556 mbs.param[3] = ISP_10M_SYNCPARMS; | 615 mbs.param[1] = tgt << 8; 616 mbs.param[2] = DPARM_SAFE_DFLT; 617 mbs.param[3] = 0; |
557 isp_mboxcmd(isp, &mbs); 558 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 618 isp_mboxcmd(isp, &mbs); 619 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
559 ISP_UNLOCK; 560 PRINTF("%s: failed even to set defaults\n", 561 isp->isp_name); 562 return; | 620 PRINTF("%s: failed even to set defaults for " 621 "target %d\n", isp->isp_name, tgt); 622 continue; |
563 } 564 } | 623 } 624 } |
565 for (l = 0; l < MAX_LUNS; l++) { | 625 626 maxlun = (isp->isp_fwrev >= ISP_FW_REV(7, 55))? 32 : 8; 627 for (lun = 0; lun < maxlun; lun++) { |
566 mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS; | 628 mbs.param[0] = MBOX_SET_DEV_QUEUE_PARAMS; |
567 mbs.param[1] = (i << 8) | l; | 629 mbs.param[1] = (tgt << 8) | lun; |
568 mbs.param[2] = sdp->isp_max_queue_depth; | 630 mbs.param[2] = sdp->isp_max_queue_depth; |
569 mbs.param[3] = sdp->isp_devparam[i].exc_throttle; | 631 mbs.param[3] = sdp->isp_devparam[tgt].exc_throttle; |
570 isp_mboxcmd(isp, &mbs); 571 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 632 isp_mboxcmd(isp, &mbs); 633 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
572 ISP_UNLOCK; 573 isp_dumpregs(isp, "failed to set device queue " 574 "parameters"); 575 return; | 634 PRINTF("%s: failed to set device queue " 635 "parameters for target %d, lun %d\n", 636 isp->isp_name, tgt, lun); 637 break; |
576 } 577 } 578 } 579 580 /* 581 * Set up DMA for the request and result mailboxes. 582 */ 583 if (ISP_MBOXDMASETUP(isp)) { | 638 } 639 } 640 } 641 642 /* 643 * Set up DMA for the request and result mailboxes. 644 */ 645 if (ISP_MBOXDMASETUP(isp)) { |
584 ISP_UNLOCK; | |
585 PRINTF("%s: can't setup dma mailboxes\n", isp->isp_name); 586 return; 587 } 588 589 mbs.param[0] = MBOX_INIT_RES_QUEUE; | 646 PRINTF("%s: can't setup dma mailboxes\n", isp->isp_name); 647 return; 648 } 649 650 mbs.param[0] = MBOX_INIT_RES_QUEUE; |
590 mbs.param[1] = RESULT_QUEUE_LEN(isp); | 651 mbs.param[1] = RESULT_QUEUE_LEN; |
591 mbs.param[2] = (u_int16_t) (isp->isp_result_dma >> 16); 592 mbs.param[3] = (u_int16_t) (isp->isp_result_dma & 0xffff); 593 mbs.param[4] = 0; 594 mbs.param[5] = 0; 595 isp_mboxcmd(isp, &mbs); 596 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 652 mbs.param[2] = (u_int16_t) (isp->isp_result_dma >> 16); 653 mbs.param[3] = (u_int16_t) (isp->isp_result_dma & 0xffff); 654 mbs.param[4] = 0; 655 mbs.param[5] = 0; 656 isp_mboxcmd(isp, &mbs); 657 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
597 ISP_UNLOCK; | |
598 isp_dumpregs(isp, "set of response queue failed"); 599 return; 600 } 601 isp->isp_residx = 0; 602 603 mbs.param[0] = MBOX_INIT_REQ_QUEUE; | 658 isp_dumpregs(isp, "set of response queue failed"); 659 return; 660 } 661 isp->isp_residx = 0; 662 663 mbs.param[0] = MBOX_INIT_REQ_QUEUE; |
604 mbs.param[1] = RQUEST_QUEUE_LEN(isp); | 664 mbs.param[1] = RQUEST_QUEUE_LEN; |
605 mbs.param[2] = (u_int16_t) (isp->isp_rquest_dma >> 16); 606 mbs.param[3] = (u_int16_t) (isp->isp_rquest_dma & 0xffff); 607 mbs.param[4] = 0; 608 mbs.param[5] = 0; 609 isp_mboxcmd(isp, &mbs); 610 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 665 mbs.param[2] = (u_int16_t) (isp->isp_rquest_dma >> 16); 666 mbs.param[3] = (u_int16_t) (isp->isp_rquest_dma & 0xffff); 667 mbs.param[4] = 0; 668 mbs.param[5] = 0; 669 isp_mboxcmd(isp, &mbs); 670 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
611 ISP_UNLOCK; | |
612 isp_dumpregs(isp, "set of request queue failed"); 613 return; 614 } | 671 isp_dumpregs(isp, "set of request queue failed"); 672 return; 673 } |
615 isp->isp_reqidx = 0; | 674 isp->isp_reqidx = isp->isp_reqodx = 0; |
616 617 /* | 675 676 /* |
618 * Unfortunately, this is the only way right now for 619 * forcing a sync renegotiation. If we boot off of 620 * an Alpha, it's put the chip in SYNC mode, but we 621 * haven't necessarily set up the parameters the 622 * same, so we'll have to yank the reset line to 623 * get everyone to renegotiate. | 677 * XXX: See whether or not for 7.55 F/W or later we 678 * XXX: can do without this, and see whether we should 679 * XXX: honor the NVRAM SCSI_RESET_DISABLE token. |
624 */ | 680 */ |
625 | |
626 mbs.param[0] = MBOX_BUS_RESET; | 681 mbs.param[0] = MBOX_BUS_RESET; |
627 mbs.param[1] = 2; | 682 mbs.param[1] = 3; |
628 isp_mboxcmd(isp, &mbs); 629 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 683 isp_mboxcmd(isp, &mbs); 684 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
630 ISP_UNLOCK; | |
631 isp_dumpregs(isp, "SCSI bus reset failed"); 632 } 633 /* 634 * This is really important to have set after a bus reset. 635 */ 636 isp->isp_sendmarker = 1; | 685 isp_dumpregs(isp, "SCSI bus reset failed"); 686 } 687 /* 688 * This is really important to have set after a bus reset. 689 */ 690 isp->isp_sendmarker = 1; |
637 ISP_UNLOCK; | |
638 isp->isp_state = ISP_INITSTATE; 639} 640 | 691 isp->isp_state = ISP_INITSTATE; 692} 693 |
694/* 695 * Fibre Channel specific initialization. 696 * 697 * Locks are held before coming here. 698 */ |
|
641static void 642isp_fibre_init(isp) 643 struct ispsoftc *isp; 644{ 645 fcparam *fcp; 646 isp_icb_t *icbp; 647 mbreg_t mbs; 648 int count; 649 u_int8_t lwfs; | 699static void 700isp_fibre_init(isp) 701 struct ispsoftc *isp; 702{ 703 fcparam *fcp; 704 isp_icb_t *icbp; 705 mbreg_t mbs; 706 int count; 707 u_int8_t lwfs; |
650 ISP_LOCKVAL_DECL; | |
651 652 fcp = isp->isp_param; 653 | 708 709 fcp = isp->isp_param; 710 |
654 fcp->isp_retry_count = 0; 655 fcp->isp_retry_delay = 1; 656 657 ISP_LOCK; 658 mbs.param[0] = MBOX_SET_RETRY_COUNT; 659 mbs.param[1] = fcp->isp_retry_count; 660 mbs.param[2] = fcp->isp_retry_delay; 661 isp_mboxcmd(isp, &mbs); 662 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 663 ISP_UNLOCK; 664 isp_dumpregs(isp, "failed to set retry count and delay"); 665 return; 666 } 667 | |
668 if (ISP_MBOXDMASETUP(isp)) { | 711 if (ISP_MBOXDMASETUP(isp)) { |
669 ISP_UNLOCK; | |
670 PRINTF("%s: can't setup DMA for mailboxes\n", isp->isp_name); 671 return; 672 } 673 674 icbp = (isp_icb_t *) fcp->isp_scratch; 675 bzero(icbp, sizeof (*icbp)); | 712 PRINTF("%s: can't setup DMA for mailboxes\n", isp->isp_name); 713 return; 714 } 715 716 icbp = (isp_icb_t *) fcp->isp_scratch; 717 bzero(icbp, sizeof (*icbp)); |
676#if 0 677 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN; 678 MAKE_NODE_NAME(isp, icbp); 679 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp); 680 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp); 681 icbp->icb_rqstaddr[0] = (u_int16_t) (isp->isp_rquest_dma & 0xffff); 682 icbp->icb_rqstaddr[1] = (u_int16_t) (isp->isp_rquest_dma >> 16); 683 icbp->icb_respaddr[0] = (u_int16_t) (isp->isp_result_dma & 0xffff); 684 icbp->icb_respaddr[1] = (u_int16_t) (isp->isp_result_dma >> 16); | 718 719 icbp->icb_version = ICB_VERSION1; 720 721 fcp->isp_fwoptions = 0; 722#ifdef ISP2100_TARGET_MODE 723 fcp->isp_fwoptions |= ICBOPT_TGT_ENABLE | ICBOPT_INI_TGTTYPE; 724 icbp->icb_iqdevtype = 0x23; /* DPQ_SUPPORTED/PROCESSOR */ |
685#endif | 725#endif |
686 icbp->icb_version = 1; 687 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN; 688 icbp->icb_maxalloc = 256; 689 icbp->icb_execthrottle = 16; 690 icbp->icb_retry_delay = 5; 691 icbp->icb_retry_count = 0; 692 MAKE_NODE_NAME(isp, icbp); 693 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp); 694 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp); 695 icbp->icb_rqstaddr[0] = (u_int16_t) (isp->isp_rquest_dma & 0xffff); 696 icbp->icb_rqstaddr[1] = (u_int16_t) (isp->isp_rquest_dma >> 16); 697 icbp->icb_respaddr[0] = (u_int16_t) (isp->isp_result_dma & 0xffff); 698 icbp->icb_respaddr[1] = (u_int16_t) (isp->isp_result_dma >> 16); | 726 icbp->icb_fwoptions = fcp->isp_fwoptions; 727 icbp->icb_maxfrmlen = fcp->isp_maxfrmlen; 728 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || 729 icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) { 730 PRINTF("%s: bad frame length (%d) from NVRAM- using %d\n", 731 isp->isp_name, fcp->isp_maxfrmlen, ICB_DFLT_FRMLEN); 732 } 733 icbp->icb_maxalloc = fcp->isp_maxalloc; 734 icbp->icb_execthrottle = fcp->isp_execthrottle; 735 icbp->icb_retry_delay = fcp->isp_retry_delay; 736 icbp->icb_retry_count = fcp->isp_retry_count; |
699 | 737 |
700 mbs.param[0] = MBOX_INIT_FIRMWARE; 701 mbs.param[1] = 0; 702 mbs.param[2] = (u_int16_t) (fcp->isp_scdma >> 16); 703 mbs.param[3] = (u_int16_t) (fcp->isp_scdma & 0xffff); 704 mbs.param[4] = 0; 705 mbs.param[5] = 0; 706 mbs.param[6] = 0; 707 mbs.param[7] = 0; 708 isp_mboxcmd(isp, &mbs); 709 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 710 ISP_UNLOCK; 711 isp_dumpregs(isp, "INIT FIRMWARE failed"); 712 return; | 738 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwn); 739 740 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN; 741 icbp->icb_rsltqlen = RESULT_QUEUE_LEN; 742 icbp->icb_rqstaddr[RQRSP_ADDR0015] = 743 (u_int16_t) (isp->isp_rquest_dma & 0xffff); 744 icbp->icb_rqstaddr[RQRSP_ADDR1631] = 745 (u_int16_t) (isp->isp_rquest_dma >> 16); 746 icbp->icb_respaddr[RQRSP_ADDR0015] = 747 (u_int16_t) (isp->isp_result_dma & 0xffff); 748 icbp->icb_respaddr[RQRSP_ADDR1631] = 749 (u_int16_t) (isp->isp_result_dma >> 16); 750 751 for (count = 0; count < 10; count++) { 752 mbs.param[0] = MBOX_INIT_FIRMWARE; 753 mbs.param[1] = 0; 754 mbs.param[2] = (u_int16_t) (fcp->isp_scdma >> 16); 755 mbs.param[3] = (u_int16_t) (fcp->isp_scdma & 0xffff); 756 mbs.param[4] = 0; 757 mbs.param[5] = 0; 758 mbs.param[6] = 0; 759 mbs.param[7] = 0; 760 761 isp_mboxcmd(isp, &mbs); 762 763 switch (mbs.param[0]) { 764 case MBOX_COMMAND_COMPLETE: 765 count = 10; 766 break; 767 case ASYNC_LIP_OCCURRED: 768 case ASYNC_LOOP_UP: 769 case ASYNC_LOOP_DOWN: 770 case ASYNC_LOOP_RESET: 771 case ASYNC_PDB_CHANGED: 772 case ASYNC_CHANGE_NOTIFY: 773 if (count > 9) { 774 PRINTF("%s: too many retries to get going- " 775 "giving up\n", isp->isp_name); 776 return; 777 } 778 break; 779 default: 780 isp_dumpregs(isp, "INIT FIRMWARE failed"); 781 return; 782 } |
713 } | 783 } |
714 isp->isp_reqidx = 0; | 784 isp->isp_reqidx = isp->isp_reqodx = 0; |
715 isp->isp_residx = 0; 716 717 /* | 785 isp->isp_residx = 0; 786 787 /* |
718 * Wait up to 3 seconds for FW to go to READY state. | 788 * Wait up to 12 seconds for FW to go to READY state. 789 * This used to be 3 seconds, but that lost. |
719 * 720 * This is all very much not right. The problem here 721 * is that the cable may not be plugged in, or there 722 * may be many many members of the loop that haven't 723 * been logged into. 724 * 725 * This model of doing things doesn't support dynamic 726 * attachment, so we just plain lose (for now). 727 */ 728 lwfs = FW_CONFIG_WAIT; | 790 * 791 * This is all very much not right. The problem here 792 * is that the cable may not be plugged in, or there 793 * may be many many members of the loop that haven't 794 * been logged into. 795 * 796 * This model of doing things doesn't support dynamic 797 * attachment, so we just plain lose (for now). 798 */ 799 lwfs = FW_CONFIG_WAIT; |
729 for (count = 0; count < 3000; count++) { | 800 for (count = 0; count < 12000; count++) { |
730 isp_fw_state(isp); 731 if (lwfs != fcp->isp_fwstate) { 732 PRINTF("%s: Firmware State %s -> %s\n", isp->isp_name, 733 fw_statename(lwfs), fw_statename(fcp->isp_fwstate)); 734 lwfs = fcp->isp_fwstate; 735 } 736 if (fcp->isp_fwstate == FW_READY) { 737 break; --- 6 unchanged lines hidden (view full) --- 744 * Get our Loop ID 745 * (if possible) 746 */ 747 if (fcp->isp_fwstate == FW_READY) { 748 mbs.param[0] = MBOX_GET_LOOP_ID; 749 isp_mboxcmd(isp, &mbs); 750 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 751 isp_dumpregs(isp, "GET LOOP ID failed"); | 801 isp_fw_state(isp); 802 if (lwfs != fcp->isp_fwstate) { 803 PRINTF("%s: Firmware State %s -> %s\n", isp->isp_name, 804 fw_statename(lwfs), fw_statename(fcp->isp_fwstate)); 805 lwfs = fcp->isp_fwstate; 806 } 807 if (fcp->isp_fwstate == FW_READY) { 808 break; --- 6 unchanged lines hidden (view full) --- 815 * Get our Loop ID 816 * (if possible) 817 */ 818 if (fcp->isp_fwstate == FW_READY) { 819 mbs.param[0] = MBOX_GET_LOOP_ID; 820 isp_mboxcmd(isp, &mbs); 821 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 822 isp_dumpregs(isp, "GET LOOP ID failed"); |
752 ISP_UNLOCK; | |
753 return; 754 } 755 fcp->isp_loopid = mbs.param[1]; | 823 return; 824 } 825 fcp->isp_loopid = mbs.param[1]; |
756 if (fcp->isp_loopid) { 757 PRINTF("%s: Loop ID 0x%x\n", isp->isp_name, 758 fcp->isp_loopid); 759 } | 826 fcp->isp_alpa = mbs.param[2]; 827 PRINTF("%s: Loop ID 0x%x, ALPA 0x%x\n", isp->isp_name, 828 fcp->isp_loopid, fcp->isp_alpa); |
760 isp->isp_state = ISP_INITSTATE; | 829 isp->isp_state = ISP_INITSTATE; |
830 DISABLE_INTS(isp); 831 if (isp->isp_fwrev >= ISP_FW_REV(1, 13)) { 832#if defined(ISP2100_TARGET_MODE) || defined(ISP_TARGET_MODE) 833 if (isp_modify_lun(isp, 0, 1, 1)) { 834 PRINTF("%s: failed to establish target mode\n", 835 isp->isp_name); 836 } 837#endif 838 } 839 ENABLE_INTS(isp); 840 } else { 841 PRINTF("%s: failed to go to FW READY state- will not attach\n", 842 isp->isp_name); |
|
761 } | 843 } |
762 ISP_UNLOCK; | |
763} 764 765/* | 844} 845 846/* |
766 * Free any associated resources prior to decommissioning. | 847 * Free any associated resources prior to decommissioning and 848 * set the card to a known state (so it doesn't wake up and kick 849 * us when we aren't expecting it to). 850 * 851 * Locks are held before coming here. |
767 */ 768void 769isp_uninit(isp) 770 struct ispsoftc *isp; 771{ | 852 */ 853void 854isp_uninit(isp) 855 struct ispsoftc *isp; 856{ |
857 /* 858 * Leave with interrupts disabled. 859 */ 860 DISABLE_INTS(isp); 861 862 /* 863 * Stop the watchdog timer (if started). 864 */ |
|
772 STOP_WATCHDOG(isp_watch, isp); 773} 774 775 776/* | 865 STOP_WATCHDOG(isp_watch, isp); 866} 867 868 869/* |
777 * start an xfer | 870 * Start a command. Locking is assumed done in the caller. |
778 */ | 871 */ |
872 |
|
779int32_t 780ispscsicmd(xs) 781 ISP_SCSI_XFER_T *xs; 782{ 783 struct ispsoftc *isp; 784 u_int8_t iptr, optr; 785 union { 786 ispreq_t *_reqp; 787 ispreqt2_t *_t2reqp; 788 } _u; 789#define reqp _u._reqp 790#define t2reqp _u._t2reqp 791#define UZSIZE max(sizeof (ispreq_t), sizeof (ispreqt2_t)) 792 int i; | 873int32_t 874ispscsicmd(xs) 875 ISP_SCSI_XFER_T *xs; 876{ 877 struct ispsoftc *isp; 878 u_int8_t iptr, optr; 879 union { 880 ispreq_t *_reqp; 881 ispreqt2_t *_t2reqp; 882 } _u; 883#define reqp _u._reqp 884#define t2reqp _u._t2reqp 885#define UZSIZE max(sizeof (ispreq_t), sizeof (ispreqt2_t)) 886 int i; |
793 ISP_LOCKVAL_DECL; | |
794 795 XS_INITERR(xs); 796 isp = XS_ISP(xs); 797 | 887 888 XS_INITERR(xs); 889 isp = XS_ISP(xs); 890 |
798 if (isp->isp_type & ISP_HA_FC) { 799 if (XS_CDBLEN(xs) > 12) { 800 PRINTF("%s: unsupported cdb length for fibre (%d)\n", 801 isp->isp_name, XS_CDBLEN(xs)); 802 XS_SETERR(xs, HBA_BOTCH); 803 return (CMD_COMPLETE); 804 } | 891 if (isp->isp_state != ISP_RUNSTATE) { 892 PRINTF("%s: adapter not ready\n", isp->isp_name); 893 XS_SETERR(xs, HBA_BOTCH); 894 return (CMD_COMPLETE); |
805 } | 895 } |
806 optr = ISP_READ(isp, OUTMAILBOX4); | 896 897 /* 898 * We *could* do the different sequence type that has clos 899 * to the whole Queue Entry for the command,. 900 */ 901 if (XS_CDBLEN(xs) > ((isp->isp_type & ISP_HA_FC)? 16 : 12)) { 902 PRINTF("%s: unsupported cdb length (%d)\n", 903 isp->isp_name, XS_CDBLEN(xs)); 904 XS_SETERR(xs, HBA_BOTCH); 905 return (CMD_COMPLETE); 906 } 907 908 /* 909 * First check to see if any HBA or Device 910 * parameters need to be updated. 911 */ 912 if (isp->isp_update) { 913 isp_update(isp); 914 } 915 916 optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4); |
807 iptr = isp->isp_reqidx; 808 809 reqp = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr); | 917 iptr = isp->isp_reqidx; 918 919 reqp = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr); |
810 iptr = (iptr + 1) & (RQUEST_QUEUE_LEN(isp) - 1); | 920 iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN); |
811 if (iptr == optr) { 812 PRINTF("%s: Request Queue Overflow\n", isp->isp_name); 813 XS_SETERR(xs, HBA_BOTCH); 814 return (CMD_EAGAIN); 815 } | 921 if (iptr == optr) { 922 PRINTF("%s: Request Queue Overflow\n", isp->isp_name); 923 XS_SETERR(xs, HBA_BOTCH); 924 return (CMD_EAGAIN); 925 } |
816 817 ISP_LOCK; 818 if (isp->isp_type & ISP_HA_FC) | 926 if (isp->isp_type & ISP_HA_FC) { |
819 DISABLE_INTS(isp); | 927 DISABLE_INTS(isp); |
928 } |
|
820 821 if (isp->isp_sendmarker) { | 929 930 if (isp->isp_sendmarker) { |
931 u_int8_t niptr; |
|
822 ispmarkreq_t *marker = (ispmarkreq_t *) reqp; 823 824 bzero((void *) marker, sizeof (*marker)); 825 marker->req_header.rqs_entry_count = 1; 826 marker->req_header.rqs_entry_type = RQSTYPE_MARKER; 827 marker->req_modifier = SYNC_ALL; 828 829 isp->isp_sendmarker = 0; 830 | 932 ispmarkreq_t *marker = (ispmarkreq_t *) reqp; 933 934 bzero((void *) marker, sizeof (*marker)); 935 marker->req_header.rqs_entry_count = 1; 936 marker->req_header.rqs_entry_type = RQSTYPE_MARKER; 937 marker->req_modifier = SYNC_ALL; 938 939 isp->isp_sendmarker = 0; 940 |
831 if (((iptr + 1) & (RQUEST_QUEUE_LEN(isp) - 1)) == optr) { | 941 niptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN); 942 if (niptr == optr) { |
832 ISP_WRITE(isp, INMAILBOX4, iptr); 833 isp->isp_reqidx = iptr; | 943 ISP_WRITE(isp, INMAILBOX4, iptr); 944 isp->isp_reqidx = iptr; |
834 835 if (isp->isp_type & ISP_HA_FC) | 945 if (isp->isp_type & ISP_HA_FC) { |
836 ENABLE_INTS(isp); | 946 ENABLE_INTS(isp); |
837 ISP_UNLOCK; | 947 } |
838 PRINTF("%s: Request Queue Overflow+\n", isp->isp_name); 839 XS_SETERR(xs, HBA_BOTCH); 840 return (CMD_EAGAIN); 841 } 842 reqp = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr); | 948 PRINTF("%s: Request Queue Overflow+\n", isp->isp_name); 949 XS_SETERR(xs, HBA_BOTCH); 950 return (CMD_EAGAIN); 951 } 952 reqp = (ispreq_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr); |
843 iptr = (iptr + 1) & (RQUEST_QUEUE_LEN(isp) - 1); | 953 iptr = niptr; |
844 } 845 846 bzero((void *) reqp, UZSIZE); 847 reqp->req_header.rqs_entry_count = 1; 848 if (isp->isp_type & ISP_HA_FC) { 849 reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS; 850 } else { 851 reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST; 852 } 853 reqp->req_header.rqs_flags = 0; 854 reqp->req_header.rqs_seqno = isp->isp_seqno++; 855 | 954 } 955 956 bzero((void *) reqp, UZSIZE); 957 reqp->req_header.rqs_entry_count = 1; 958 if (isp->isp_type & ISP_HA_FC) { 959 reqp->req_header.rqs_entry_type = RQSTYPE_T2RQS; 960 } else { 961 reqp->req_header.rqs_entry_type = RQSTYPE_REQUEST; 962 } 963 reqp->req_header.rqs_flags = 0; 964 reqp->req_header.rqs_seqno = isp->isp_seqno++; 965 |
856 for (i = 0; i < RQUEST_QUEUE_LEN(isp); i++) { | 966 for (i = 0; i < RQUEST_QUEUE_LEN; i++) { |
857 if (isp->isp_xflist[i] == NULL) 858 break; 859 } | 967 if (isp->isp_xflist[i] == NULL) 968 break; 969 } |
860 if (i == RQUEST_QUEUE_LEN(isp)) { | 970 if (i == RQUEST_QUEUE_LEN) { |
861 if (isp->isp_type & ISP_HA_FC) 862 ENABLE_INTS(isp); | 971 if (isp->isp_type & ISP_HA_FC) 972 ENABLE_INTS(isp); |
863 ISP_UNLOCK; | |
864 PRINTF("%s: ran out of xflist pointers?????\n", isp->isp_name); 865 XS_SETERR(xs, HBA_BOTCH); 866 return (CMD_EAGAIN); 867 } else { 868 /* 869 * Never have a handle that is zero, so 870 * set req_handle off by one. 871 */ 872 isp->isp_xflist[i] = xs; 873 reqp->req_handle = i+1; 874 } 875 876 if (isp->isp_type & ISP_HA_FC) { 877 /* 878 * See comment in isp_intr 879 */ 880 XS_RESID(xs) = 0; 881 /* 882 * Fibre Channel always requires some kind of tag. | 973 PRINTF("%s: ran out of xflist pointers?????\n", isp->isp_name); 974 XS_SETERR(xs, HBA_BOTCH); 975 return (CMD_EAGAIN); 976 } else { 977 /* 978 * Never have a handle that is zero, so 979 * set req_handle off by one. 980 */ 981 isp->isp_xflist[i] = xs; 982 reqp->req_handle = i+1; 983 } 984 985 if (isp->isp_type & ISP_HA_FC) { 986 /* 987 * See comment in isp_intr 988 */ 989 XS_RESID(xs) = 0; 990 /* 991 * Fibre Channel always requires some kind of tag. |
992 * If we're marked as "Can't Tag", just do simple 993 * instead of ordered tags. It's pretty clear to me 994 * that we shouldn't do head of queue tagging in 995 * this case. |
|
883 */ | 996 */ |
884 if (XS_POLLDCMD(xs)) { 885 t2reqp->req_flags = REQFLAG_STAG; | 997 if (XS_CANTAG(xs)) { 998 t2reqp->req_flags = XS_KINDOF_TAG(xs); |
886 } else { | 999 } else { |
887 t2reqp->req_flags = REQFLAG_OTAG; | 1000 t2reqp->req_flags = REQFLAG_STAG; |
888 } 889 } else { 890 sdparam *sdp = (sdparam *)isp->isp_param; | 1001 } 1002 } else { 1003 sdparam *sdp = (sdparam *)isp->isp_param; |
891 if ((sdp->isp_devparam[XS_TGT(xs)].dev_flags & DPARM_TQING) && 892 (XS_POLLDCMD(xs) == 0)) { 893 reqp->req_flags = REQFLAG_OTAG; | 1004 if ((sdp->isp_devparam[XS_TGT(xs)].cur_dflags & DPARM_TQING) && 1005 XS_CANTAG(xs)) { 1006 reqp->req_flags = XS_KINDOF_TAG(xs); |
894 } else { 895 reqp->req_flags = 0; 896 } 897 } 898 reqp->req_lun_trn = XS_LUN(xs); 899 reqp->req_target = XS_TGT(xs); 900 if (isp->isp_type & ISP_HA_SCSI) { 901 reqp->req_cdblen = XS_CDBLEN(xs); 902 } 903 bcopy((void *)XS_CDBP(xs), reqp->req_cdb, XS_CDBLEN(xs)); 904 | 1007 } else { 1008 reqp->req_flags = 0; 1009 } 1010 } 1011 reqp->req_lun_trn = XS_LUN(xs); 1012 reqp->req_target = XS_TGT(xs); 1013 if (isp->isp_type & ISP_HA_SCSI) { 1014 reqp->req_cdblen = XS_CDBLEN(xs); 1015 } 1016 bcopy((void *)XS_CDBP(xs), reqp->req_cdb, XS_CDBLEN(xs)); 1017 |
905 IDPRINTF(6, ("%s(%d.%d): START%d cmd 0x%x datalen %d\n", isp->isp_name, | 1018 IDPRINTF(5, ("%s(%d.%d): START%d cmd 0x%x datalen %d\n", isp->isp_name, |
906 XS_TGT(xs), XS_LUN(xs), reqp->req_header.rqs_seqno, | 1019 XS_TGT(xs), XS_LUN(xs), reqp->req_header.rqs_seqno, |
907 *(u_char *) XS_CDBP(xs), XS_XFRLEN(xs))); | 1020 reqp->req_cdb[0], XS_XFRLEN(xs))); |
908 909 reqp->req_time = XS_TIME(xs) / 1000; 910 if (reqp->req_time == 0 && XS_TIME(xs)) 911 reqp->req_time = 1; 912 if (ISP_DMASETUP(isp, xs, reqp, &iptr, optr)) { 913 if (isp->isp_type & ISP_HA_FC) 914 ENABLE_INTS(isp); | 1021 1022 reqp->req_time = XS_TIME(xs) / 1000; 1023 if (reqp->req_time == 0 && XS_TIME(xs)) 1024 reqp->req_time = 1; 1025 if (ISP_DMASETUP(isp, xs, reqp, &iptr, optr)) { 1026 if (isp->isp_type & ISP_HA_FC) 1027 ENABLE_INTS(isp); |
915 ISP_UNLOCK; 916 XS_SETERR(xs, HBA_BOTCH); | 1028 /* dmasetup sets actual error */ |
917 return (CMD_COMPLETE); 918 } 919 XS_SETERR(xs, HBA_NOERROR); 920 ISP_WRITE(isp, INMAILBOX4, iptr); 921 isp->isp_reqidx = iptr; | 1029 return (CMD_COMPLETE); 1030 } 1031 XS_SETERR(xs, HBA_NOERROR); 1032 ISP_WRITE(isp, INMAILBOX4, iptr); 1033 isp->isp_reqidx = iptr; |
922 if (isp->isp_type & ISP_HA_FC) | 1034 if (isp->isp_type & ISP_HA_FC) { |
923 ENABLE_INTS(isp); | 1035 ENABLE_INTS(isp); |
924 isp->isp_nactive++; 925 if (XS_POLLDCMD(xs) == 0) { 926 ISP_UNLOCK; 927 return (CMD_QUEUED); | |
928 } | 1036 } |
929 930 /* 931 * If we can't use interrupts, poll on completion. 932 */ 933 if (isp_poll(isp, xs, XS_TIME(xs))) { 934 /* 935 * If no other error occurred but we didn't finish, 936 * something bad happened. 937 */ 938 if (XS_IS_CMD_DONE(xs) == 0) { 939 isp->isp_nactive--; 940 if (isp->isp_nactive < 0) 941 isp->isp_nactive = 0; 942 if (XS_NOERR(xs)) { 943 isp_lostcmd(isp, xs, reqp); 944 XS_SETERR(xs, HBA_BOTCH); 945 } 946 } 947 } 948 ISP_UNLOCK; 949 return (CMD_COMPLETE); | 1037 isp->isp_nactive++; 1038 return (CMD_QUEUED); |
950#undef reqp 951#undef t2reqp 952} 953 954/* | 1039#undef reqp 1040#undef t2reqp 1041} 1042 1043/* |
955 * Interrupt Service Routine(s) | 1044 * isp control 1045 * Locks (ints blocked) assumed held. |
956 */ 957 958int | 1046 */ 1047 1048int |
959isp_poll(isp, xs, mswait) | 1049isp_control(isp, ctl, arg) |
960 struct ispsoftc *isp; | 1050 struct ispsoftc *isp; |
961 ISP_SCSI_XFER_T *xs; 962 int mswait; | 1051 ispctl_t ctl; 1052 void *arg; |
963{ | 1053{ |
1054 ISP_SCSI_XFER_T *xs; 1055 mbreg_t mbs; 1056 int i; |
|
964 | 1057 |
965 while (mswait) { 966 /* Try the interrupt handling routine */ 967 (void)isp_intr((void *)isp); | 1058 switch (ctl) { 1059 default: 1060 PRINTF("%s: isp_control unknown control op %x\n", 1061 isp->isp_name, ctl); 1062 break; |
968 | 1063 |
969 /* See if the xs is now done */ 970 if (XS_IS_CMD_DONE(xs)) 971 return (0); 972 SYS_DELAY(1000); /* wait one millisecond */ 973 mswait--; | 1064 case ISPCTL_RESET_BUS: 1065 mbs.param[0] = MBOX_BUS_RESET; 1066 mbs.param[1] = (isp->isp_type & ISP_HA_FC)? 5: 2; 1067 isp_mboxcmd(isp, &mbs); 1068 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1069 isp_dumpregs(isp, "isp_control SCSI bus reset failed"); 1070 break; 1071 } 1072 /* 1073 * This is really important to have set after a bus reset. 1074 */ 1075 isp->isp_sendmarker = 1; 1076 PRINTF("%s: driver initiated bus reset\n", isp->isp_name); 1077 return (0); 1078 1079 case ISPCTL_RESET_DEV: 1080 /* 1081 * Note that under parallel SCSI, this issues a BDR message. 1082 * Under FC, we could probably be using ABORT TASK SET 1083 * command. 1084 */ 1085 1086 mbs.param[0] = MBOX_ABORT_TARGET; 1087 mbs.param[1] = ((long)arg) << 8; 1088 mbs.param[2] = 2; /* 'delay', in seconds */ 1089 isp_mboxcmd(isp, &mbs); 1090 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1091 isp_dumpregs(isp, "SCSI Target reset failed"); 1092 break; 1093 } 1094 PRINTF("%s: Target %d Reset Succeeded\n", isp->isp_name, 1095 (int) ((long) arg)); 1096 isp->isp_sendmarker = 1; 1097 return (0); 1098 1099 case ISPCTL_ABORT_CMD: 1100 xs = (ISP_SCSI_XFER_T *) arg; 1101 for (i = 0; i < RQUEST_QUEUE_LEN; i++) { 1102 if (xs == isp->isp_xflist[i]) { 1103 break; 1104 } 1105 } 1106 if (i == RQUEST_QUEUE_LEN) { 1107 PRINTF("%s: isp_control- cannot find command to abort " 1108 "in active list\n", isp->isp_name); 1109 break; 1110 } 1111 mbs.param[0] = MBOX_ABORT; 1112 mbs.param[1] = XS_TGT(xs) | XS_LUN(xs); 1113 mbs.param[2] = (i+1) >> 16; 1114 mbs.param[3] = (i+1) & 0xffff; 1115 isp_mboxcmd(isp, &mbs); 1116 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1117 PRINTF("%s: isp_control MBOX_ABORT failure (code %x)\n", 1118 isp->isp_name, mbs.param[0]); 1119 break; 1120 } 1121 PRINTF("%s: command for target %d lun %d was aborted\n", 1122 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1123 return (0); 1124 1125 case ISPCTL_UPDATE_PARAMS: 1126 isp_update(isp); 1127 return(0); |
974 } | 1128 } |
975 return (1); | 1129 return (-1); |
976} 977 | 1130} 1131 |
1132/* 1133 * Interrupt Service Routine(s). 1134 * 1135 * External (OS) framework has done the appropriate locking, 1136 * and the locking will be held throughout this function. 1137 */ 1138 |
|
978int 979isp_intr(arg) 980 void *arg; 981{ | 1139int 1140isp_intr(arg) 1141 void *arg; 1142{ |
982 ISP_SCSI_XFER_T *xs; | 1143 ISP_SCSI_XFER_T *complist[RESULT_QUEUE_LEN], *xs; |
983 struct ispsoftc *isp = arg; | 1144 struct ispsoftc *isp = arg; |
984 u_int16_t iptr, optr, isr; | 1145 u_int8_t iptr, optr; 1146 u_int16_t isr; 1147 int i, ndone = 0; |
985 986 isr = ISP_READ(isp, BIU_ISR); 987 if (isp->isp_type & ISP_HA_FC) { 988 if (isr == 0 || (isr & BIU2100_ISR_RISC_INT) == 0) { 989 if (isr) { 990 IDPRINTF(4, ("%s: isp_intr isr=%x\n", 991 isp->isp_name, isr)); 992 } --- 4 unchanged lines hidden (view full) --- 997 if (isr) { 998 IDPRINTF(4, ("%s: isp_intr isr=%x\n", 999 isp->isp_name, isr)); 1000 } 1001 return (0); 1002 } 1003 } 1004 | 1148 1149 isr = ISP_READ(isp, BIU_ISR); 1150 if (isp->isp_type & ISP_HA_FC) { 1151 if (isr == 0 || (isr & BIU2100_ISR_RISC_INT) == 0) { 1152 if (isr) { 1153 IDPRINTF(4, ("%s: isp_intr isr=%x\n", 1154 isp->isp_name, isr)); 1155 } --- 4 unchanged lines hidden (view full) --- 1160 if (isr) { 1161 IDPRINTF(4, ("%s: isp_intr isr=%x\n", 1162 isp->isp_name, isr)); 1163 } 1164 return (0); 1165 } 1166 } 1167 |
1005 optr = isp->isp_residx; | |
1006 if (ISP_READ(isp, BIU_SEMA) & 1) { | 1168 if (ISP_READ(isp, BIU_SEMA) & 1) { |
1007 u_int16_t mbox0 = ISP_READ(isp, OUTMAILBOX0); 1008 switch (mbox0) { 1009 case ASYNC_BUS_RESET: 1010 case ASYNC_TIMEOUT_RESET: 1011 PRINTF("%s: bus or timeout reset\n", isp->isp_name); 1012 isp->isp_sendmarker = 1; 1013 break; 1014 case ASYNC_LIP_OCCURRED: 1015 PRINTF("%s: LIP occurred\n", isp->isp_name); 1016 break; 1017 case ASYNC_LOOP_UP: 1018 PRINTF("%s: Loop UP\n", isp->isp_name); 1019 break; 1020 case ASYNC_LOOP_DOWN: 1021 PRINTF("%s: Loop DOWN\n", isp->isp_name); 1022 break; 1023 case ASYNC_LOOP_RESET: 1024 PRINTF("%s: Loop RESET\n", isp->isp_name); 1025 break; 1026 default: 1027 PRINTF("%s: async %x\n", isp->isp_name, mbox0); 1028 break; 1029 } | 1169 u_int16_t mbox = ISP_READ(isp, OUTMAILBOX0); 1170 if (isp_parse_async(isp, mbox)) 1171 return (1); |
1030 ISP_WRITE(isp, BIU_SEMA, 0); 1031 } 1032 1033 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); | 1172 ISP_WRITE(isp, BIU_SEMA, 0); 1173 } 1174 1175 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); |
1176 1177 optr = isp->isp_residx; |
|
1034 iptr = ISP_READ(isp, OUTMAILBOX5); | 1178 iptr = ISP_READ(isp, OUTMAILBOX5); |
1179 |
|
1035 if (optr == iptr) { 1036 IDPRINTF(4, ("why intr? isr %x iptr %x optr %x\n", | 1180 if (optr == iptr) { 1181 IDPRINTF(4, ("why intr? isr %x iptr %x optr %x\n", |
1037 isr, optr, iptr)); | 1182 isr, optr, iptr)); |
1038 } 1039 ENABLE_INTS(isp); 1040 1041 while (optr != iptr) { 1042 ispstatusreq_t *sp; | 1183 } 1184 ENABLE_INTS(isp); 1185 1186 while (optr != iptr) { 1187 ispstatusreq_t *sp; |
1188 u_int8_t oop; |
|
1043 int buddaboom = 0; 1044 1045 sp = (ispstatusreq_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr); | 1189 int buddaboom = 0; 1190 1191 sp = (ispstatusreq_t *) ISP_QUEUE_ENTRY(isp->isp_result, optr); |
1192 oop = optr; 1193 optr = ISP_NXT_QENTRY(optr, RESULT_QUEUE_LEN); |
|
1046 | 1194 |
1047 optr = (optr + 1) & (RESULT_QUEUE_LEN(isp)-1); | |
1048 if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) { | 1195 if (sp->req_header.rqs_entry_type != RQSTYPE_RESPONSE) { |
1049 PRINTF("%s: not RESPONSE in RESPONSE Queue (0x%x)\n", 1050 isp->isp_name, sp->req_header.rqs_entry_type); | 1196 if (isp_handle_other_response(isp, sp, &optr) == 0) { 1197 ISP_WRITE(isp, INMAILBOX5, optr); 1198 continue; 1199 } 1200 /* 1201 * It really has to be a bounced request just copied 1202 * from the request queue to the response queue. 1203 */ 1204 |
1051 if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { 1052 ISP_WRITE(isp, INMAILBOX5, optr); 1053 continue; 1054 } | 1205 if (sp->req_header.rqs_entry_type != RQSTYPE_REQUEST) { 1206 ISP_WRITE(isp, INMAILBOX5, optr); 1207 continue; 1208 } |
1209 PRINTF("%s: not RESPONSE in RESPONSE Queue " 1210 "(type 0x%x) @ idx %d (next %d)\n", isp->isp_name, 1211 sp->req_header.rqs_entry_type, oop, optr); |
|
1055 buddaboom = 1; 1056 } 1057 1058 if (sp->req_header.rqs_flags & 0xf) { 1059 if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) { 1060 ISP_WRITE(isp, INMAILBOX5, optr); 1061 continue; 1062 } | 1212 buddaboom = 1; 1213 } 1214 1215 if (sp->req_header.rqs_flags & 0xf) { 1216 if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) { 1217 ISP_WRITE(isp, INMAILBOX5, optr); 1218 continue; 1219 } |
1063 PRINTF("%s: rqs_flags=%x\n", isp->isp_name, | 1220 PRINTF("%s: rqs_flags=%x", isp->isp_name, |
1064 sp->req_header.rqs_flags & 0xf); | 1221 sp->req_header.rqs_flags & 0xf); |
1222 if (sp->req_header.rqs_flags & RQSFLAG_FULL) { 1223 PRINTF("%s: internal queues full\n", 1224 isp->isp_name); 1225 /* XXXX: this command *could* get restarted */ 1226 buddaboom++; 1227 } 1228 if (sp->req_header.rqs_flags & RQSFLAG_BADHEADER) { 1229 PRINTF("%s: bad header\n", isp->isp_name); 1230 buddaboom++; 1231 } 1232 if (sp->req_header.rqs_flags & RQSFLAG_BADPACKET) { 1233 PRINTF("%s: bad request packet\n", 1234 isp->isp_name); 1235 buddaboom++; 1236 } |
|
1065 } | 1237 } |
1066 if (sp->req_handle > RQUEST_QUEUE_LEN(isp) || 1067 sp->req_handle < 1) { | 1238 if (sp->req_handle > RQUEST_QUEUE_LEN || sp->req_handle < 1) { |
1068 PRINTF("%s: bad request handle %d\n", isp->isp_name, 1069 sp->req_handle); 1070 ISP_WRITE(isp, INMAILBOX5, optr); 1071 continue; 1072 } 1073 xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[sp->req_handle - 1]; 1074 if (xs == NULL) { | 1239 PRINTF("%s: bad request handle %d\n", isp->isp_name, 1240 sp->req_handle); 1241 ISP_WRITE(isp, INMAILBOX5, optr); 1242 continue; 1243 } 1244 xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[sp->req_handle - 1]; 1245 if (xs == NULL) { |
1075 PRINTF("%s: NULL xs in xflist\n", isp->isp_name); | 1246 PRINTF("%s: NULL xs in xflist (handle %x)\n", 1247 isp->isp_name, sp->req_handle); 1248 isp_dumpxflist(isp); |
1076 ISP_WRITE(isp, INMAILBOX5, optr); 1077 continue; 1078 } 1079 isp->isp_xflist[sp->req_handle - 1] = NULL; 1080 if (sp->req_status_flags & RQSTF_BUS_RESET) { 1081 isp->isp_sendmarker = 1; 1082 } 1083 if (buddaboom) { --- 14 unchanged lines hidden (view full) --- 1098 sp->req_state_flags |= RQSF_GOT_SENSE; 1099 } 1100 } 1101 if (XS_NOERR(xs) && XS_STS(xs) == SCSI_BUSY) { 1102 XS_SETERR(xs, HBA_TGTBSY); 1103 } 1104 1105 if (sp->req_header.rqs_entry_type == RQSTYPE_RESPONSE) { | 1249 ISP_WRITE(isp, INMAILBOX5, optr); 1250 continue; 1251 } 1252 isp->isp_xflist[sp->req_handle - 1] = NULL; 1253 if (sp->req_status_flags & RQSTF_BUS_RESET) { 1254 isp->isp_sendmarker = 1; 1255 } 1256 if (buddaboom) { --- 14 unchanged lines hidden (view full) --- 1271 sp->req_state_flags |= RQSF_GOT_SENSE; 1272 } 1273 } 1274 if (XS_NOERR(xs) && XS_STS(xs) == SCSI_BUSY) { 1275 XS_SETERR(xs, HBA_TGTBSY); 1276 } 1277 1278 if (sp->req_header.rqs_entry_type == RQSTYPE_RESPONSE) { |
1106 if (XS_NOERR(xs) && sp->req_completion_status) | 1279 if (XS_NOERR(xs)) { 1280 if (sp->req_completion_status != RQCS_COMPLETE) { |
1107 isp_parse_status(isp, sp, xs); | 1281 isp_parse_status(isp, sp, xs); |
1282 } else { 1283 XS_SETERR(xs, HBA_NOERROR); 1284 } 1285 } |
|
1108 } else { 1109 PRINTF("%s: unknown return %x\n", isp->isp_name, 1110 sp->req_header.rqs_entry_type); 1111 if (XS_NOERR(xs)) 1112 XS_SETERR(xs, HBA_BOTCH); 1113 } 1114 if (isp->isp_type & ISP_HA_SCSI) { 1115 XS_RESID(xs) = sp->req_resid; 1116 } else if (sp->req_scsi_status & RQCS_RU) { 1117 XS_RESID(xs) = sp->req_resid; 1118 IDPRINTF(4, ("%s: cnt %d rsd %d\n", isp->isp_name, 1119 XS_XFRLEN(xs), sp->req_resid)); 1120 } 1121 if (XS_XFRLEN(xs)) { 1122 ISP_DMAFREE(isp, xs, sp->req_handle - 1); 1123 } | 1286 } else { 1287 PRINTF("%s: unknown return %x\n", isp->isp_name, 1288 sp->req_header.rqs_entry_type); 1289 if (XS_NOERR(xs)) 1290 XS_SETERR(xs, HBA_BOTCH); 1291 } 1292 if (isp->isp_type & ISP_HA_SCSI) { 1293 XS_RESID(xs) = sp->req_resid; 1294 } else if (sp->req_scsi_status & RQCS_RU) { 1295 XS_RESID(xs) = sp->req_resid; 1296 IDPRINTF(4, ("%s: cnt %d rsd %d\n", isp->isp_name, 1297 XS_XFRLEN(xs), sp->req_resid)); 1298 } 1299 if (XS_XFRLEN(xs)) { 1300 ISP_DMAFREE(isp, xs, sp->req_handle - 1); 1301 } |
1302 /* 1303 * XXX: If we have a check condition, but no Sense Data, 1304 * XXX: mark it as an error (ARQ failed). We need to 1305 * XXX: to do a more distinct job because there may 1306 * XXX: cases where ARQ is disabled. 1307 */ 1308 if (XS_STS(xs) == SCSI_CHECK && !(XS_IS_SNS_VALID(xs))) { 1309 if (XS_NOERR(xs)) { 1310 PRINTF("%s: ARQ Failure\n", isp->isp_name); 1311 XS_SETERR(xs, HBA_ARQFAIL); 1312 } 1313 } |
|
1124 if ((isp->isp_dblev >= 5) || 1125 (isp->isp_dblev > 2 && !XS_NOERR(xs))) { | 1314 if ((isp->isp_dblev >= 5) || 1315 (isp->isp_dblev > 2 && !XS_NOERR(xs))) { |
1126 PRINTF("%s(%d.%d): FIN%d cmd0x%x len%d resid%d STS %x", | 1316 PRINTF("%s(%d.%d): FIN%d dl%d resid%d STS %x", |
1127 isp->isp_name, XS_TGT(xs), XS_LUN(xs), | 1317 isp->isp_name, XS_TGT(xs), XS_LUN(xs), |
1128 sp->req_header.rqs_seqno, *(u_char *) XS_CDBP(xs), 1129 XS_XFRLEN(xs), XS_RESID(xs), XS_STS(xs)); | 1318 sp->req_header.rqs_seqno, XS_XFRLEN(xs), 1319 XS_RESID(xs), XS_STS(xs)); |
1130 if (sp->req_state_flags & RQSF_GOT_SENSE) { 1131 PRINTF(" Skey: %x", XS_SNSKEY(xs)); 1132 if (!(XS_IS_SNS_VALID(xs))) { 1133 PRINTF(" BUT NOT SET"); 1134 } 1135 } | 1320 if (sp->req_state_flags & RQSF_GOT_SENSE) { 1321 PRINTF(" Skey: %x", XS_SNSKEY(xs)); 1322 if (!(XS_IS_SNS_VALID(xs))) { 1323 PRINTF(" BUT NOT SET"); 1324 } 1325 } |
1136 PRINTF(" XS_ERR(xs) %d\n", XS_ERR(xs)); | 1326 PRINTF(" XS_ERR=0x%x\n", XS_ERR(xs)); |
1137 } | 1327 } |
1328 |
|
1138 ISP_WRITE(isp, INMAILBOX5, optr); 1139 isp->isp_nactive--; 1140 if (isp->isp_nactive < 0) 1141 isp->isp_nactive = 0; | 1329 ISP_WRITE(isp, INMAILBOX5, optr); 1330 isp->isp_nactive--; 1331 if (isp->isp_nactive < 0) 1332 isp->isp_nactive = 0; |
1142 XS_CMD_DONE(xs); | 1333 complist[ndone++] = xs; /* defer completion call until later */ |
1143 } | 1334 } |
1335 /* 1336 * If we completed any commands, then it's valid to find out 1337 * what the outpointer is. 1338 */ 1339 if (ndone) { 1340 isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4); 1341 } |
|
1144 isp->isp_residx = optr; | 1342 isp->isp_residx = optr; |
1343 for (i = 0; i < ndone; i++) { 1344 xs = complist[i]; 1345 if (xs) { 1346 XS_CMD_DONE(xs); 1347 } 1348 } |
|
1145 return (1); 1146} 1147 1148/* 1149 * Support routines. 1150 */ 1151 | 1349 return (1); 1350} 1351 1352/* 1353 * Support routines. 1354 */ 1355 |
1356static int 1357isp_parse_async(isp, mbox) 1358 struct ispsoftc *isp; 1359 u_int16_t mbox; 1360{ 1361 switch (mbox) { 1362 case ASYNC_BUS_RESET: 1363 PRINTF("%s: SCSI bus reset detected\n", isp->isp_name); 1364 isp->isp_sendmarker = 1; 1365 break; 1366 1367 case ASYNC_SYSTEM_ERROR: 1368 mbox = ISP_READ(isp, OUTMAILBOX1); 1369 PRINTF("%s: Internal FW Error @ RISC Addr 0x%x\n", 1370 isp->isp_name, mbox); 1371 isp_restart(isp); 1372 /* no point continuing after this */ 1373 return (1); 1374 1375 case ASYNC_RQS_XFER_ERR: 1376 PRINTF("%s: Request Queue Transfer Error\n", isp->isp_name); 1377 break; 1378 1379 case ASYNC_RSP_XFER_ERR: 1380 PRINTF("%s: Response Queue Transfer Error\n", isp->isp_name); 1381 break; 1382 1383 case ASYNC_QWAKEUP: 1384 /* don't need to be chatty */ 1385 mbox = ISP_READ(isp, OUTMAILBOX4); 1386 break; 1387 1388 case ASYNC_TIMEOUT_RESET: 1389 PRINTF("%s: timeout initiated SCSI bus reset\n", isp->isp_name); 1390 isp->isp_sendmarker = 1; 1391 break; 1392 1393 case ASYNC_UNSPEC_TMODE: 1394 PRINTF("%s: mystery async target completion\n", isp->isp_name); 1395 break; 1396 1397 case ASYNC_EXTMSG_UNDERRUN: 1398 PRINTF("%s: extended message underrun\n", isp->isp_name); 1399 break; 1400 1401 case ASYNC_SCAM_INT: 1402 PRINTF("%s: SCAM interrupt\n", isp->isp_name); 1403 break; 1404 1405 case ASYNC_HUNG_SCSI: 1406 PRINTF("%s: stalled SCSI Bus after DATA Overrun\n", 1407 isp->isp_name); 1408 /* XXX: Need to issue SCSI reset at this point */ 1409 break; 1410 1411 case ASYNC_KILLED_BUS: 1412 PRINTF("%s: SCSI Bus reset after DATA Overrun\n", 1413 isp->isp_name); 1414 break; 1415 1416 case ASYNC_BUS_TRANSIT: 1417 PRINTF("%s: LBD->HVD Transition 0x%x\n", 1418 isp->isp_name, ISP_READ(isp, OUTMAILBOX1)); 1419 break; 1420 1421 case ASYNC_CMD_CMPLT: 1422 PRINTF("%s: fast post completion\n", isp->isp_name); 1423#if 0 1424 fast_post_handle = (ISP_READ(isp, OUTMAILBOX1) << 16) | 1425 ISP_READ(isp, OUTMAILBOX2); 1426#endif 1427 break; 1428 1429 case ASYNC_CTIO_DONE: 1430 PRINTF("%s: CTIO done\n", isp->isp_name); 1431 break; 1432 1433 case ASYNC_LIP_OCCURRED: 1434 PRINTF("%s: LIP occurred\n", isp->isp_name); 1435 break; 1436 1437 case ASYNC_LOOP_UP: 1438 PRINTF("%s: Loop UP\n", isp->isp_name); 1439 break; 1440 1441 case ASYNC_LOOP_DOWN: 1442 PRINTF("%s: Loop DOWN\n", isp->isp_name); 1443 break; 1444 1445 case ASYNC_LOOP_RESET: 1446 PRINTF("%s: Loop RESET\n", isp->isp_name); 1447 break; 1448 1449 case ASYNC_PDB_CHANGED: 1450 PRINTF("%s: Port Database Changed\n", isp->isp_name); 1451 break; 1452 1453 case ASYNC_CHANGE_NOTIFY: 1454 PRINTF("%s: Name Server Database Changed\n", isp->isp_name); 1455 break; 1456 1457 default: 1458 PRINTF("%s: async %x\n", isp->isp_name, mbox); 1459 break; 1460 } 1461 return (0); 1462} 1463 1464static int 1465isp_handle_other_response(isp, sp, optrp) 1466 struct ispsoftc *isp; 1467 ispstatusreq_t *sp; 1468 u_int8_t *optrp; 1469{ 1470 u_int8_t iptr, optr; 1471 int reqsize = 0; 1472 void *ireqp = NULL; 1473 1474 switch (sp->req_header.rqs_entry_type) { 1475 case RQSTYPE_REQUEST: 1476 return (-1); 1477#if defined(ISP2100_TARGET_MODE) || defined(ISP_TARGET_MODE) 1478 case RQSTYPE_NOTIFY_ACK: 1479 { 1480 ispnotify_t *spx = (ispnotify_t *) sp; 1481 PRINTF("%s: Immediate Notify Ack %d.%d Status 0x%x Sequence " 1482 "0x%x\n", isp->isp_name, spx->req_initiator, spx->req_lun, 1483 spx->req_status, spx->req_sequence); 1484 break; 1485 } 1486 case RQSTYPE_NOTIFY: 1487 { 1488 ispnotify_t *spx = (ispnotify_t *) sp; 1489 1490 PRINTF("%s: Notify loopid %d to lun %d req_status 0x%x " 1491 "req_task_flags 0x%x seq 0x%x\n", isp->isp_name, spx->req_initiator, spx->req_lun, spx->req_status, 1492 spx->req_task_flags, spx->req_sequence); 1493 reqsize = sizeof (*spx); 1494 spx->req_header.rqs_entry_type = RQSTYPE_NOTIFY_ACK; 1495 spx->req_header.rqs_entry_count = 1; 1496 spx->req_header.rqs_flags = 0; 1497 spx->req_header.rqs_seqno = isp->isp_seqno++; 1498 spx->req_handle = (spx->req_initiator<<16) | RQSTYPE_NOTIFY_ACK; 1499 if (spx->req_status == IN_RSRC_UNAVAIL) 1500 spx->req_flags = LUN_INCR_CMD; 1501 else if (spx->req_status == IN_NOCAP) 1502 spx->req_flags = LUN_INCR_IMMED; 1503 else { 1504 reqsize = 0; 1505 } 1506 ireqp = spx; 1507 break; 1508 } 1509 case RQSTYPE_ENABLE_LUN: 1510 { 1511 isplun_t *ip = (isplun_t *) sp; 1512 if (ip->req_status != 1) { 1513 PRINTF("%s: ENABLE LUN returned status 0x%x\n", 1514 isp->isp_name, ip->req_status); 1515 } 1516 break; 1517 } 1518 case RQSTYPE_ATIO2: 1519 { 1520 fcparam *fcp = isp->isp_param; 1521 ispctiot2_t local, *ct2 = NULL; 1522 ispatiot2_t *at2 = (ispatiot2_t *) sp; 1523 int s; 1524 1525 PRINTF("%s: atio2 loopid %d for lun %d rxid 0x%x flags 0x%x " 1526 "task flags 0x%x exec codes 0x%x\n", isp->isp_name, 1527 at2->req_initiator, at2->req_lun, at2->req_rxid, 1528 at2->req_flags, at2->req_taskflags, at2->req_execodes); 1529 1530 switch (at2->req_status & ~ATIO_SENSEVALID) { 1531 case ATIO_PATH_INVALID: 1532 PRINTF("%s: ATIO2 Path Invalid\n", isp->isp_name); 1533 break; 1534 case ATIO_NOCAP: 1535 PRINTF("%s: ATIO2 No Cap\n", isp->isp_name); 1536 break; 1537 case ATIO_BDR_MSG: 1538 PRINTF("%s: ATIO2 BDR Received\n", isp->isp_name); 1539 break; 1540 case ATIO_CDB_RECEIVED: 1541 ct2 = &local; 1542 break; 1543 default: 1544 PRINTF("%s: unknown req_status 0x%x\n", isp->isp_name, 1545 at2->req_status); 1546 break; 1547 } 1548 if (ct2 == NULL) { 1549 /* 1550 * Just do an ACCEPT on this fellow. 1551 */ 1552 at2->req_header.rqs_entry_type = RQSTYPE_ATIO2; 1553 at2->req_header.rqs_flags = 0; 1554 at2->req_flags = 1; 1555 ireqp = at2; 1556 reqsize = sizeof (*at2); 1557 break; 1558 } 1559 PRINTF("%s: datalen %d cdb0=0x%x\n", isp->isp_name, 1560 at2->req_datalen, at2->req_cdb[0]); 1561 bzero ((void *) ct2, sizeof (*ct2)); 1562 ct2->req_header.rqs_entry_type = RQSTYPE_CTIO2; 1563 ct2->req_header.rqs_entry_count = 1; 1564 ct2->req_header.rqs_flags = 0; 1565 ct2->req_header.rqs_seqno = isp->isp_seqno++; 1566 ct2->req_handle = (at2->req_initiator << 16) | at2->req_lun; 1567 ct2->req_lun = at2->req_lun; 1568 ct2->req_initiator = at2->req_initiator; 1569 ct2->req_rxid = at2->req_rxid; 1570 1571 ct2->req_flags = CTIO_SEND_STATUS; 1572 switch (at2->req_cdb[0]) { 1573 case 0x0: /* TUR */ 1574 ct2->req_flags |= CTIO_NODATA | CTIO2_SMODE0; 1575 ct2->req_m.mode0.req_scsi_status = CTIO2_STATUS_VALID; 1576 break; 1577 1578 case 0x3: /* REQUEST SENSE */ 1579 case 0x12: /* INQUIRE */ 1580 ct2->req_flags |= CTIO_SEND_DATA | CTIO2_SMODE0; 1581 ct2->req_m.mode0.req_scsi_status = CTIO2_STATUS_VALID; 1582 ct2->req_seg_count = 1; 1583 if (at2->req_cdb[0] == 0x12) { 1584 s = sizeof(tgtiqd); 1585 bcopy((void *)tgtiqd, fcp->isp_scratch, s); 1586 } else { 1587 s = at2->req_datalen; 1588 bzero(fcp->isp_scratch, s); 1589 } 1590 ct2->req_m.mode0.req_dataseg[0].ds_base = 1591 fcp->isp_scdma; 1592 ct2->req_m.mode0.req_dataseg[0].ds_count = s; 1593 ct2->req_m.mode0.req_datalen = s; 1594#if 0 1595 if (at2->req_datalen < s) { 1596 ct2->req_m.mode1.req_scsi_status |= 1597 CTIO2_RESP_VALID|CTIO2_RSPOVERUN; 1598 } else if (at2->req_datalen > s) { 1599 ct2->req_m.mode1.req_scsi_status |= 1600 CTIO2_RESP_VALID|CTIO2_RSPUNDERUN; 1601 } 1602#endif 1603 break; 1604 1605 default: /* ALL OTHERS */ 1606 ct2->req_flags |= CTIO_NODATA | CTIO2_SMODE1; 1607 ct2->req_m.mode1.req_scsi_status = 0; 1608#if 0 1609 if (at2->req_datalen) { 1610 ct2->req_m.mode1.req_scsi_status |= 1611 CTIO2_RSPUNDERUN; 1612#if BYTE_ORDER == BIG_ENDIAN 1613 ct2->req_resid[1] = at2->req_datalen & 0xff; 1614 ct2->req_resid[0] = 1615 (at2->req_datalen >> 8) & 0xff; 1616 ct2->req_resid[3] = 1617 (at2->req_datalen >> 16) & 0xff; 1618 ct2->req_resid[2] = 1619 (at2->req_datalen >> 24) & 0xff; 1620#else 1621 ct2->req_resid[0] = at2->req_datalen & 0xff; 1622 ct2->req_resid[1] = 1623 (at2->req_datalen >> 8) & 0xff; 1624 ct2->req_resid[2] = 1625 (at2->req_datalen >> 16) & 0xff; 1626 ct2->req_resid[3] = 1627 (at2->req_datalen >> 24) & 0xff; 1628#endif 1629 } 1630#endif 1631 if ((at2->req_status & ATIO_SENSEVALID) == 0) { 1632 ct2->req_m.mode1.req_sense_len = 18; 1633 ct2->req_m.mode1.req_scsi_status |= 2; 1634 ct2->req_m.mode1.req_response[0] = 0x70; 1635 ct2->req_m.mode1.req_response[2] = 0x2; 1636 } else { 1637 ct2->req_m.mode1.req_sense_len = 18; 1638 ct2->req_m.mode1.req_scsi_status |= 1639 at2->req_scsi_status; 1640 bcopy((void *)at2->req_sense, 1641 (void *)ct2->req_m.mode1.req_response, 1642 sizeof (at2->req_sense)); 1643 } 1644 break; 1645 } 1646 reqsize = sizeof (*ct2); 1647 ireqp = ct2; 1648 break; 1649 } 1650 case RQSTYPE_CTIO2: 1651 { 1652 ispatiot2_t *at2; 1653 ispctiot2_t *ct2 = (ispctiot2_t *) sp; 1654 PRINTF("%s: CTIO2 returned status 0x%x\n", isp->isp_name, 1655 ct2->req_status); 1656 /* 1657 * Return the ATIO to the board. 1658 */ 1659 at2 = (ispatiot2_t *) sp; 1660 at2->req_header.rqs_entry_type = RQSTYPE_ATIO2; 1661 at2->req_header.rqs_entry_count = 1; 1662 at2->req_header.rqs_flags = 0; 1663 at2->req_header.rqs_seqno = isp->isp_seqno++; 1664 at2->req_status = 1; 1665 reqsize = sizeof (*at2); 1666 ireqp = at2; 1667 break; 1668 } 1669#endif 1670 default: 1671 PRINTF("%s: other response type %x\n", isp->isp_name, 1672 sp->req_header.rqs_entry_type); 1673 break; 1674 } 1675 if (reqsize) { 1676 void *reqp; 1677 optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4); 1678 iptr = isp->isp_reqidx; 1679 reqp = (void *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr); 1680 iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN); 1681 if (iptr == optr) { 1682 PRINTF("%s: Request Queue Overflow other response\n", 1683 isp->isp_name); 1684 } else { 1685 bcopy(ireqp, reqp, reqsize); 1686 ISP_WRITE(isp, INMAILBOX4, iptr); 1687 isp->isp_reqidx = iptr; 1688 } 1689 } 1690 return (0); 1691} 1692 1693#if defined(ISP2100_TARGET_MODE) || defined(ISP_TARGET_MODE) 1694/* 1695 * Locks held, and ints disabled (if FC). 1696 * 1697 * XXX: SETUP ONLY FOR INITIAL ENABLING RIGHT NOW 1698 */ 1699static int 1700isp_modify_lun(isp, lun, icnt, ccnt) 1701 struct ispsoftc *isp; 1702 int lun; /* logical unit to enable, modify, or disable */ 1703 int icnt; /* immediate notify count */ 1704 int ccnt; /* command count */ 1705{ 1706 isplun_t *ip = NULL; 1707 u_int8_t iptr, optr; 1708 1709 optr = isp->isp_reqodx = ISP_READ(isp, OUTMAILBOX4); 1710 iptr = isp->isp_reqidx; 1711 ip = (isplun_t *) ISP_QUEUE_ENTRY(isp->isp_rquest, iptr); 1712 iptr = ISP_NXT_QENTRY(iptr, RQUEST_QUEUE_LEN); 1713 if (iptr == optr) { 1714 PRINTF("%s: Request Queue Overflow in isp_modify_lun\n", 1715 isp->isp_name); 1716 return (-1); 1717 } 1718 1719 bzero((void *) ip, sizeof (*ip)); 1720 ip->req_header.rqs_entry_type = RQSTYPE_ENABLE_LUN; 1721 ip->req_header.rqs_entry_count = 1; 1722 ip->req_header.rqs_flags = 0; 1723 ip->req_header.rqs_seqno = isp->isp_seqno++; 1724 ip->req_handle = RQSTYPE_ENABLE_LUN; 1725 ip->req_lun = lun; 1726 ip->req_cmdcount = ccnt; 1727 ip->req_imcount = icnt; 1728 ip->req_timeout = 0; /* default 30 seconds */ 1729 ISP_WRITE(isp, INMAILBOX4, iptr); 1730 isp->isp_reqidx = iptr; 1731 return (0); 1732} 1733#endif 1734 |
|
1152static void 1153isp_parse_status(isp, sp, xs) 1154 struct ispsoftc *isp; 1155 ispstatusreq_t *sp; 1156 ISP_SCSI_XFER_T *xs; 1157{ 1158 switch (sp->req_completion_status) { 1159 case RQCS_COMPLETE: 1160 XS_SETERR(xs, HBA_NOERROR); 1161 return; 1162 1163 case RQCS_INCOMPLETE: 1164 if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) { | 1735static void 1736isp_parse_status(isp, sp, xs) 1737 struct ispsoftc *isp; 1738 ispstatusreq_t *sp; 1739 ISP_SCSI_XFER_T *xs; 1740{ 1741 switch (sp->req_completion_status) { 1742 case RQCS_COMPLETE: 1743 XS_SETERR(xs, HBA_NOERROR); 1744 return; 1745 1746 case RQCS_INCOMPLETE: 1747 if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) { |
1748 IDPRINTF(3, ("%s: Selection Timeout for target %d\n", 1749 isp->isp_name, XS_TGT(xs))); |
|
1165 XS_SETERR(xs, HBA_SELTIMEOUT); 1166 return; 1167 } | 1750 XS_SETERR(xs, HBA_SELTIMEOUT); 1751 return; 1752 } |
1168 PRINTF("%s: incomplete, state %x\n", 1169 isp->isp_name, sp->req_state_flags); | 1753 PRINTF("%s: command incomplete for target %d lun %d, state " 1754 "0x%x\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs), 1755 sp->req_state_flags); |
1170 break; 1171 | 1756 break; 1757 |
1758 case RQCS_DMA_ERROR: 1759 PRINTF("%s: DMA error for command on target %d, lun %d\n", 1760 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1761 break; 1762 |
|
1172 case RQCS_TRANSPORT_ERROR: 1173 PRINTF("%s: transport error\n", isp->isp_name); 1174 isp_prtstst(sp); 1175 break; 1176 | 1763 case RQCS_TRANSPORT_ERROR: 1764 PRINTF("%s: transport error\n", isp->isp_name); 1765 isp_prtstst(sp); 1766 break; 1767 |
1768 case RQCS_RESET_OCCURRED: 1769 IDPRINTF(2, ("%s: bus reset destroyed command for target %d " 1770 "lun %d\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs))); 1771 isp->isp_sendmarker = 1; 1772 XS_SETERR(xs, HBA_BUSRESET); 1773 return; 1774 1775 case RQCS_ABORTED: 1776 PRINTF("%s: command aborted for target %d lun %d\n", 1777 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1778 isp->isp_sendmarker = 1; 1779 XS_SETERR(xs, HBA_ABORTED); 1780 return; 1781 1782 case RQCS_TIMEOUT: 1783 IDPRINTF(2, ("%s: command timed out for target %d lun %d\n", 1784 isp->isp_name, XS_TGT(xs), XS_LUN(xs))); 1785 XS_SETERR(xs, HBA_CMDTIMEOUT); 1786 return; 1787 |
|
1177 case RQCS_DATA_OVERRUN: 1178 if (isp->isp_type & ISP_HA_FC) { 1179 XS_RESID(xs) = sp->req_resid; 1180 break; 1181 } | 1788 case RQCS_DATA_OVERRUN: 1789 if (isp->isp_type & ISP_HA_FC) { 1790 XS_RESID(xs) = sp->req_resid; 1791 break; 1792 } |
1182 XS_SETERR(xs, HBA_NOERROR); | 1793 XS_SETERR(xs, HBA_DATAOVR); |
1183 return; 1184 | 1794 return; 1795 |
1796 case RQCS_COMMAND_OVERRUN: 1797 PRINTF("%s: command overrun for command on target %d, lun %d\n", 1798 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1799 break; 1800 1801 case RQCS_STATUS_OVERRUN: 1802 PRINTF("%s: status overrun for command on target %d, lun %d\n", 1803 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1804 break; 1805 1806 case RQCS_BAD_MESSAGE: 1807 PRINTF("%s: message not COMMAND COMPLETE after status on " 1808 "target %d, lun %d\n", isp->isp_name, XS_TGT(xs), 1809 XS_LUN(xs)); 1810 break; 1811 1812 case RQCS_NO_MESSAGE_OUT: 1813 PRINTF("%s: No MESSAGE OUT phase after selection on " 1814 "target %d, lun %d\n", isp->isp_name, XS_TGT(xs), 1815 XS_LUN(xs)); 1816 break; 1817 1818 case RQCS_EXT_ID_FAILED: 1819 PRINTF("%s: EXTENDED IDENTIFY failed on target %d, lun %d\n", 1820 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1821 break; 1822 1823 case RQCS_IDE_MSG_FAILED: 1824 PRINTF("%s: target %d lun %d rejected INITIATOR DETECTED " 1825 "ERROR message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1826 break; 1827 1828 case RQCS_ABORT_MSG_FAILED: 1829 PRINTF("%s: target %d lun %d rejected ABORT message\n", 1830 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1831 break; 1832 1833 case RQCS_REJECT_MSG_FAILED: 1834 PRINTF("%s: target %d lun %d rejected MESSAGE REJECT message\n", 1835 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1836 break; 1837 1838 case RQCS_NOP_MSG_FAILED: 1839 PRINTF("%s: target %d lun %d rejected NOP message\n", 1840 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1841 break; 1842 1843 case RQCS_PARITY_ERROR_MSG_FAILED: 1844 PRINTF("%s: target %d lun %d rejected MESSAGE PARITY ERROR " 1845 "message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1846 break; 1847 1848 case RQCS_DEVICE_RESET_MSG_FAILED: 1849 PRINTF("%s: target %d lun %d rejected BUS DEVICE RESET " 1850 "message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1851 break; 1852 1853 case RQCS_ID_MSG_FAILED: 1854 PRINTF("%s: target %d lun %d rejected IDENTIFY " 1855 "message\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1856 break; 1857 1858 case RQCS_UNEXP_BUS_FREE: 1859 PRINTF("%s: target %d lun %d had unexeptected bus free\n", 1860 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1861 break; 1862 |
|
1185 case RQCS_DATA_UNDERRUN: 1186 if (isp->isp_type & ISP_HA_FC) { 1187 XS_RESID(xs) = sp->req_resid; 1188 /* an UNDERRUN is not a botch ??? */ 1189 } 1190 XS_SETERR(xs, HBA_NOERROR); 1191 return; 1192 | 1863 case RQCS_DATA_UNDERRUN: 1864 if (isp->isp_type & ISP_HA_FC) { 1865 XS_RESID(xs) = sp->req_resid; 1866 /* an UNDERRUN is not a botch ??? */ 1867 } 1868 XS_SETERR(xs, HBA_NOERROR); 1869 return; 1870 |
1193 case RQCS_TIMEOUT: 1194 XS_SETERR(xs, HBA_CMDTIMEOUT); 1195 return; | 1871 case RQCS_XACT_ERR1: 1872 PRINTF("%s: HBA attempted queued transaction with disconnect " 1873 "not set for target %d lun %d\n", isp->isp_name, XS_TGT(xs), 1874 XS_LUN(xs)); 1875 break; |
1196 | 1876 |
1197 case RQCS_RESET_OCCURRED: 1198 PRINTF("%s: reset occurred, %d active\n", isp->isp_name, 1199 isp->isp_nactive); 1200 isp->isp_sendmarker = 1; 1201 XS_SETERR(xs, HBA_BUSRESET); | 1877 case RQCS_XACT_ERR2: 1878 PRINTF("%s: HBA attempted queued transaction to target " 1879 "routine %d on target %d\n", isp->isp_name, XS_LUN(xs), 1880 XS_TGT(xs)); 1881 break; 1882 1883 case RQCS_XACT_ERR3: 1884 PRINTF("%s: HBA attempted queued transaction for target %d lun " 1885 "%d when queueing disabled\n", isp->isp_name, XS_TGT(xs), 1886 XS_LUN(xs)); 1887 break; 1888 1889 case RQCS_BAD_ENTRY: 1890 PRINTF("%s: invalid IOCB entry type detected\n", isp->isp_name); 1891 break; 1892 1893 case RQCS_QUEUE_FULL: 1894 PRINTF("%s: internal queues full for target %d lun %d\n", 1895 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1896 break; 1897 1898 case RQCS_PHASE_SKIPPED: 1899 PRINTF("%s: SCSI phase skipped (e.g., COMMAND COMPLETE w/o " 1900 "STATUS phase) for target %d lun %d\n", isp->isp_name, 1901 XS_TGT(xs), XS_LUN(xs)); 1902 break; 1903 1904 case RQCS_ARQS_FAILED: 1905 PRINTF("%s: Auto Request Sense failed for target %d lun %d\n", 1906 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1907 XS_SETERR(xs, HBA_ARQFAIL); |
1202 return; 1203 | 1908 return; 1909 |
1204 case RQCS_ABORTED: 1205 PRINTF("%s: command aborted\n", isp->isp_name); 1206 isp->isp_sendmarker = 1; 1207 XS_SETERR(xs, HBA_ABORTED); | 1910 case RQCS_WIDE_FAILED: 1911 PRINTF("%s: Wide Negotiation failed for target %d lun %d\n", 1912 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1913 if (isp->isp_type & ISP_HA_SCSI) { 1914 sdparam *sdp = isp->isp_param; 1915 isp->isp_update = 1; 1916 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 1917 sdp->isp_devparam[XS_TGT(xs)].dev_flags &= ~DPARM_WIDE; 1918 } 1919 XS_SETERR(xs, HBA_NOERROR); |
1208 return; 1209 | 1920 return; 1921 |
1922 case RQCS_SYNCXFER_FAILED: 1923 PRINTF("%s: SDTR Message failed for target %d lun %d\n", 1924 isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1925 if (isp->isp_type & ISP_HA_SCSI) { 1926 sdparam *sdp = isp->isp_param; 1927 isp->isp_update = 1; 1928 sdp->isp_devparam[XS_TGT(xs)].dev_update = 1; 1929 sdp->isp_devparam[XS_TGT(xs)].dev_flags &= ~DPARM_SYNC; 1930 } 1931 break; 1932 1933 case RQCS_LVD_BUSERR: 1934 PRINTF("%s: Bad LVD Bus condition while talking to target %d " 1935 "lun %d\n", isp->isp_name, XS_TGT(xs), XS_LUN(xs)); 1936 break; 1937 |
|
1210 case RQCS_PORT_UNAVAILABLE: 1211 /* 1212 * No such port on the loop. Moral equivalent of SELTIMEO 1213 */ | 1938 case RQCS_PORT_UNAVAILABLE: 1939 /* 1940 * No such port on the loop. Moral equivalent of SELTIMEO 1941 */ |
1942 IDPRINTF(3, ("%s: Port Unavailable for target %d\n", 1943 isp->isp_name, XS_TGT(xs))); |
|
1214 XS_SETERR(xs, HBA_SELTIMEOUT); 1215 return; 1216 1217 case RQCS_PORT_LOGGED_OUT: | 1944 XS_SETERR(xs, HBA_SELTIMEOUT); 1945 return; 1946 1947 case RQCS_PORT_LOGGED_OUT: |
1948 /* 1949 * It was there (maybe)- treat as a selection timeout. 1950 */ |
|
1218 PRINTF("%s: port logout for target %d\n", 1219 isp->isp_name, XS_TGT(xs)); | 1951 PRINTF("%s: port logout for target %d\n", 1952 isp->isp_name, XS_TGT(xs)); |
1220 break; | 1953 XS_SETERR(xs, HBA_SELTIMEOUT); 1954 return; |
1221 1222 case RQCS_PORT_CHANGED: 1223 PRINTF("%s: port changed for target %d\n", 1224 isp->isp_name, XS_TGT(xs)); 1225 break; 1226 1227 case RQCS_PORT_BUSY: 1228 PRINTF("%s: port busy for target %d\n", --- 40 unchanged lines hidden (view full) --- 1269 MAKNIB(2, 2), /* 0x18: MBOX_BUS_RESET */ 1270 MAKNIB(2, 3), /* 0x19: MBOX_STOP_QUEUE */ 1271 MAKNIB(2, 3), /* 0x1a: MBOX_START_QUEUE */ 1272 MAKNIB(2, 3), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 1273 MAKNIB(2, 3), /* 0x1c: MBOX_ABORT_QUEUE */ 1274 MAKNIB(2, 4), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 1275 MAKNIB(0, 0), /* 0x1e: */ 1276 MAKNIB(1, 3), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ | 1955 1956 case RQCS_PORT_CHANGED: 1957 PRINTF("%s: port changed for target %d\n", 1958 isp->isp_name, XS_TGT(xs)); 1959 break; 1960 1961 case RQCS_PORT_BUSY: 1962 PRINTF("%s: port busy for target %d\n", --- 40 unchanged lines hidden (view full) --- 2003 MAKNIB(2, 2), /* 0x18: MBOX_BUS_RESET */ 2004 MAKNIB(2, 3), /* 0x19: MBOX_STOP_QUEUE */ 2005 MAKNIB(2, 3), /* 0x1a: MBOX_START_QUEUE */ 2006 MAKNIB(2, 3), /* 0x1b: MBOX_SINGLE_STEP_QUEUE */ 2007 MAKNIB(2, 3), /* 0x1c: MBOX_ABORT_QUEUE */ 2008 MAKNIB(2, 4), /* 0x1d: MBOX_GET_DEV_QUEUE_STATUS */ 2009 MAKNIB(0, 0), /* 0x1e: */ 2010 MAKNIB(1, 3), /* 0x1f: MBOX_GET_FIRMWARE_STATUS */ |
1277 MAKNIB(1, 2), /* 0x20: MBOX_GET_INIT_SCSI_ID */ | 2011 MAKNIB(1, 3), /* 0x20: MBOX_GET_INIT_SCSI_ID, MBOX_GET_LOOP_ID */ |
1278 MAKNIB(1, 2), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ 1279 MAKNIB(1, 3), /* 0x22: MBOX_GET_RETRY_COUNT */ 1280 MAKNIB(1, 2), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ 1281 MAKNIB(1, 2), /* 0x24: MBOX_GET_CLOCK_RATE */ 1282 MAKNIB(1, 2), /* 0x25: MBOX_GET_ACT_NEG_STATE */ 1283 MAKNIB(1, 2), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ 1284 MAKNIB(1, 3), /* 0x27: MBOX_GET_PCI_PARAMS */ 1285 MAKNIB(2, 4), /* 0x28: MBOX_GET_TARGET_PARAMS */ --- 66 unchanged lines hidden (view full) --- 1352#define NMBCOM (sizeof (mbpcnt) / sizeof (mbpcnt[0])) 1353 1354static void 1355isp_mboxcmd(isp, mbp) 1356 struct ispsoftc *isp; 1357 mbreg_t *mbp; 1358{ 1359 int outparam, inparam; | 2012 MAKNIB(1, 2), /* 0x21: MBOX_GET_SELECT_TIMEOUT */ 2013 MAKNIB(1, 3), /* 0x22: MBOX_GET_RETRY_COUNT */ 2014 MAKNIB(1, 2), /* 0x23: MBOX_GET_TAG_AGE_LIMIT */ 2015 MAKNIB(1, 2), /* 0x24: MBOX_GET_CLOCK_RATE */ 2016 MAKNIB(1, 2), /* 0x25: MBOX_GET_ACT_NEG_STATE */ 2017 MAKNIB(1, 2), /* 0x26: MBOX_GET_ASYNC_DATA_SETUP_TIME */ 2018 MAKNIB(1, 3), /* 0x27: MBOX_GET_PCI_PARAMS */ 2019 MAKNIB(2, 4), /* 0x28: MBOX_GET_TARGET_PARAMS */ --- 66 unchanged lines hidden (view full) --- 2086#define NMBCOM (sizeof (mbpcnt) / sizeof (mbpcnt[0])) 2087 2088static void 2089isp_mboxcmd(isp, mbp) 2090 struct ispsoftc *isp; 2091 mbreg_t *mbp; 2092{ 2093 int outparam, inparam; |
1360 int loops; | 2094 int loops, dld = 0; |
1361 u_int8_t opcode; 1362 1363 if (mbp->param[0] == ISP2100_SET_PCI_PARAM) { 1364 opcode = mbp->param[0] = MBOX_SET_PCI_PARAMETERS; 1365 inparam = 4; 1366 outparam = 4; 1367 goto command_known; 1368 } else if (mbp->param[0] > NMBCOM) { --- 8 unchanged lines hidden (view full) --- 1377 if (inparam == 0 && outparam == 0) { 1378 PRINTF("%s: no parameters for %x\n", isp->isp_name, 1379 mbp->param[0]); 1380 return; 1381 } 1382 1383 1384command_known: | 2095 u_int8_t opcode; 2096 2097 if (mbp->param[0] == ISP2100_SET_PCI_PARAM) { 2098 opcode = mbp->param[0] = MBOX_SET_PCI_PARAMETERS; 2099 inparam = 4; 2100 outparam = 4; 2101 goto command_known; 2102 } else if (mbp->param[0] > NMBCOM) { --- 8 unchanged lines hidden (view full) --- 2111 if (inparam == 0 && outparam == 0) { 2112 PRINTF("%s: no parameters for %x\n", isp->isp_name, 2113 mbp->param[0]); 2114 return; 2115 } 2116 2117 2118command_known: |
2119 |
|
1385 /* 1386 * Make sure we can send some words.. 1387 */ 1388 1389 loops = MBOX_DELAY_COUNT; 1390 while ((ISP_READ(isp, HCCR) & HCCR_HOST_INT) != 0) { 1391 SYS_DELAY(100); 1392 if (--loops < 0) { 1393 PRINTF("%s: isp_mboxcmd timeout #1\n", isp->isp_name); | 2120 /* 2121 * Make sure we can send some words.. 2122 */ 2123 2124 loops = MBOX_DELAY_COUNT; 2125 while ((ISP_READ(isp, HCCR) & HCCR_HOST_INT) != 0) { 2126 SYS_DELAY(100); 2127 if (--loops < 0) { 2128 PRINTF("%s: isp_mboxcmd timeout #1\n", isp->isp_name); |
1394 return; | 2129 if (dld++) { 2130 return; 2131 } 2132 PRINTF("%s: but we'll try again, isr=%x\n", 2133 isp->isp_name, ISP_READ(isp, BIU_ISR)); 2134 if (ISP_READ(isp, BIU_SEMA) & 1) { 2135 u_int16_t mbox = ISP_READ(isp, OUTMAILBOX0); 2136 if (isp_parse_async(isp, mbox)) 2137 return; 2138 ISP_WRITE(isp, BIU_SEMA, 0); 2139 } 2140 ISP_WRITE(isp, HCCR, HCCR_CMD_CLEAR_RISC_INT); 2141 goto command_known; |
1395 } 1396 } 1397 1398 /* 1399 * Write input parameters 1400 */ 1401 switch (inparam) { 1402 case 8: ISP_WRITE(isp, INMAILBOX7, mbp->param[7]); mbp->param[7] = 0; --- 87 unchanged lines hidden (view full) --- 1490 1491 /* 1492 * Just to be chatty here... 1493 */ 1494 switch(mbp->param[0]) { 1495 case MBOX_COMMAND_COMPLETE: 1496 break; 1497 case MBOX_INVALID_COMMAND: | 2142 } 2143 } 2144 2145 /* 2146 * Write input parameters 2147 */ 2148 switch (inparam) { 2149 case 8: ISP_WRITE(isp, INMAILBOX7, mbp->param[7]); mbp->param[7] = 0; --- 87 unchanged lines hidden (view full) --- 2237 2238 /* 2239 * Just to be chatty here... 2240 */ 2241 switch(mbp->param[0]) { 2242 case MBOX_COMMAND_COMPLETE: 2243 break; 2244 case MBOX_INVALID_COMMAND: |
1498 /* 1499 * GET_CLOCK_RATE can fail a lot 1500 * So can a couple of other commands. 1501 */ 1502 if (isp->isp_dblev > 2 && opcode != MBOX_GET_CLOCK_RATE) { 1503 PRINTF("%s: mbox cmd %x failed with INVALID_COMMAND\n", 1504 isp->isp_name, opcode); 1505 } | 2245 IDPRINTF(2, ("%s: mbox cmd %x failed with INVALID_COMMAND\n", 2246 isp->isp_name, opcode)); |
1506 break; 1507 case MBOX_HOST_INTERFACE_ERROR: 1508 PRINTF("%s: mbox cmd %x failed with HOST_INTERFACE_ERROR\n", | 2247 break; 2248 case MBOX_HOST_INTERFACE_ERROR: 2249 PRINTF("%s: mbox cmd %x failed with HOST_INTERFACE_ERROR\n", |
1509 isp->isp_name, opcode); | 2250 isp->isp_name, opcode); |
1510 break; 1511 case MBOX_TEST_FAILED: 1512 PRINTF("%s: mbox cmd %x failed with TEST_FAILED\n", | 2251 break; 2252 case MBOX_TEST_FAILED: 2253 PRINTF("%s: mbox cmd %x failed with TEST_FAILED\n", |
1513 isp->isp_name, opcode); | 2254 isp->isp_name, opcode); |
1514 break; 1515 case MBOX_COMMAND_ERROR: 1516 PRINTF("%s: mbox cmd %x failed with COMMAND_ERROR\n", | 2255 break; 2256 case MBOX_COMMAND_ERROR: 2257 PRINTF("%s: mbox cmd %x failed with COMMAND_ERROR\n", |
1517 isp->isp_name, opcode); | 2258 isp->isp_name, opcode); |
1518 break; 1519 case MBOX_COMMAND_PARAM_ERROR: 1520 PRINTF("%s: mbox cmd %x failed with COMMAND_PARAM_ERROR\n", | 2259 break; 2260 case MBOX_COMMAND_PARAM_ERROR: 2261 PRINTF("%s: mbox cmd %x failed with COMMAND_PARAM_ERROR\n", |
1521 isp->isp_name, opcode); | 2262 isp->isp_name, opcode); |
1522 break; 1523 | 2263 break; 2264 |
2265 case ASYNC_LOOP_UP: |
|
1524 case ASYNC_LIP_OCCURRED: 1525 break; 1526 1527 default: 1528 /* 1529 * The expected return of EXEC_FIRMWARE is zero. 1530 */ 1531 if ((opcode == MBOX_EXEC_FIRMWARE && mbp->param[0] != 0) || 1532 (opcode != MBOX_EXEC_FIRMWARE)) { 1533 PRINTF("%s: mbox cmd %x failed with error %x\n", 1534 isp->isp_name, opcode, mbp->param[0]); 1535 } 1536 break; 1537 } 1538} 1539 | 2266 case ASYNC_LIP_OCCURRED: 2267 break; 2268 2269 default: 2270 /* 2271 * The expected return of EXEC_FIRMWARE is zero. 2272 */ 2273 if ((opcode == MBOX_EXEC_FIRMWARE && mbp->param[0] != 0) || 2274 (opcode != MBOX_EXEC_FIRMWARE)) { 2275 PRINTF("%s: mbox cmd %x failed with error %x\n", 2276 isp->isp_name, opcode, mbp->param[0]); 2277 } 2278 break; 2279 } 2280} 2281 |
1540static void 1541isp_lostcmd(struct ispsoftc *isp, ISP_SCSI_XFER_T *xs, ispreq_t *req) | 2282void 2283isp_lostcmd(isp, xs) 2284 struct ispsoftc *isp; 2285 ISP_SCSI_XFER_T *xs; |
1542{ 1543 mbreg_t mbs; 1544 1545 mbs.param[0] = MBOX_GET_FIRMWARE_STATUS; 1546 isp_mboxcmd(isp, &mbs); 1547 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1548 isp_dumpregs(isp, "couldn't GET FIRMWARE STATUS"); 1549 return; 1550 } 1551 if (mbs.param[1]) { 1552 PRINTF("%s: %d commands on completion queue\n", 1553 isp->isp_name, mbs.param[1]); 1554 } 1555 if (XS_NULL(xs)) 1556 return; 1557 1558 mbs.param[0] = MBOX_GET_DEV_QUEUE_STATUS; | 2286{ 2287 mbreg_t mbs; 2288 2289 mbs.param[0] = MBOX_GET_FIRMWARE_STATUS; 2290 isp_mboxcmd(isp, &mbs); 2291 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2292 isp_dumpregs(isp, "couldn't GET FIRMWARE STATUS"); 2293 return; 2294 } 2295 if (mbs.param[1]) { 2296 PRINTF("%s: %d commands on completion queue\n", 2297 isp->isp_name, mbs.param[1]); 2298 } 2299 if (XS_NULL(xs)) 2300 return; 2301 2302 mbs.param[0] = MBOX_GET_DEV_QUEUE_STATUS; |
1559 mbs.param[1] = XS_TGT(xs) << 8 | XS_LUN(xs); | 2303 mbs.param[1] = (XS_TGT(xs) << 8) | XS_LUN(xs); |
1560 isp_mboxcmd(isp, &mbs); 1561 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1562 isp_dumpregs(isp, "couldn't GET DEVICE QUEUE STATUS"); 1563 return; 1564 } 1565 PRINTF("%s: lost command for target %d lun %d, %d active of %d, " 1566 "Queue State: %x\n", isp->isp_name, XS_TGT(xs), 1567 XS_LUN(xs), mbs.param[2], mbs.param[3], mbs.param[1]); 1568 1569 isp_dumpregs(isp, "lost command"); 1570 /* 1571 * XXX: Need to try and do something to recover. 1572 */ 1573} 1574 1575static void | 2304 isp_mboxcmd(isp, &mbs); 2305 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2306 isp_dumpregs(isp, "couldn't GET DEVICE QUEUE STATUS"); 2307 return; 2308 } 2309 PRINTF("%s: lost command for target %d lun %d, %d active of %d, " 2310 "Queue State: %x\n", isp->isp_name, XS_TGT(xs), 2311 XS_LUN(xs), mbs.param[2], mbs.param[3], mbs.param[1]); 2312 2313 isp_dumpregs(isp, "lost command"); 2314 /* 2315 * XXX: Need to try and do something to recover. 2316 */ 2317} 2318 2319static void |
1576isp_dumpregs(struct ispsoftc *isp, const char *msg) | 2320isp_dumpregs(isp, msg) 2321 struct ispsoftc *isp; 2322 const char *msg; |
1577{ 1578 PRINTF("%s: %s\n", isp->isp_name, msg); 1579 if (isp->isp_type & ISP_HA_SCSI) 1580 PRINTF(" biu_conf1=%x", ISP_READ(isp, BIU_CONF1)); 1581 else 1582 PRINTF(" biu_csr=%x", ISP_READ(isp, BIU2100_CSR)); 1583 PRINTF(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR), 1584 ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA)); --- 12 unchanged lines hidden (view full) --- 1597 ISP_READ(isp, SXP_GROSS_ERR), 1598 ISP_READ(isp, SXP_PINS_CONTROL)); 1599 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 1600 } 1601 ISP_DUMPREGS(isp); 1602} 1603 1604static void | 2323{ 2324 PRINTF("%s: %s\n", isp->isp_name, msg); 2325 if (isp->isp_type & ISP_HA_SCSI) 2326 PRINTF(" biu_conf1=%x", ISP_READ(isp, BIU_CONF1)); 2327 else 2328 PRINTF(" biu_csr=%x", ISP_READ(isp, BIU2100_CSR)); 2329 PRINTF(" biu_icr=%x biu_isr=%x biu_sema=%x ", ISP_READ(isp, BIU_ICR), 2330 ISP_READ(isp, BIU_ISR), ISP_READ(isp, BIU_SEMA)); --- 12 unchanged lines hidden (view full) --- 2343 ISP_READ(isp, SXP_GROSS_ERR), 2344 ISP_READ(isp, SXP_PINS_CONTROL)); 2345 ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE); 2346 } 2347 ISP_DUMPREGS(isp); 2348} 2349 2350static void |
1605isp_fw_state(struct ispsoftc *isp) | 2351isp_dumpxflist(isp) 2352 struct ispsoftc *isp; |
1606{ | 2353{ |
2354 volatile ISP_SCSI_XFER_T *xs; 2355 int i, hdp; 2356 2357 for (hdp = i = 0; i < RQUEST_QUEUE_LEN; i++) { 2358 xs = isp->isp_xflist[i]; 2359 if (xs == NULL) { 2360 continue; 2361 } 2362 if (hdp == 0) { 2363 PRINTF("%s: active requests\n", isp->isp_name); 2364 hdp++; 2365 } 2366 PRINTF(" Active Handle %d: tgt %d lun %d dlen %d\n", 2367 i+1, XS_TGT(xs), XS_LUN(xs), XS_XFRLEN(xs)); 2368 } 2369} 2370 2371static void 2372isp_fw_state(isp) 2373 struct ispsoftc *isp; 2374{ |
|
1607 mbreg_t mbs; 1608 if (isp->isp_type & ISP_HA_FC) { 1609 int once = 0; 1610 fcparam *fcp = isp->isp_param; 1611again: 1612 mbs.param[0] = MBOX_GET_FW_STATE; 1613 isp_mboxcmd(isp, &mbs); 1614 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 2375 mbreg_t mbs; 2376 if (isp->isp_type & ISP_HA_FC) { 2377 int once = 0; 2378 fcparam *fcp = isp->isp_param; 2379again: 2380 mbs.param[0] = MBOX_GET_FW_STATE; 2381 isp_mboxcmd(isp, &mbs); 2382 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
1615 if (mbs.param[0] == ASYNC_LIP_OCCURRED) { 1616 if (!once++) { | 2383 if (mbs.param[0] == ASYNC_LIP_OCCURRED || 2384 mbs.param[0] == ASYNC_LOOP_UP) { 2385 if (once++ < 2) { |
1617 goto again; 1618 } 1619 } 1620 isp_dumpregs(isp, "GET FIRMWARE STATE failed"); 1621 return; 1622 } 1623 fcp->isp_fwstate = mbs.param[1]; 1624 } 1625} 1626 1627static void | 2386 goto again; 2387 } 2388 } 2389 isp_dumpregs(isp, "GET FIRMWARE STATE failed"); 2390 return; 2391 } 2392 fcp->isp_fwstate = mbs.param[1]; 2393 } 2394} 2395 2396static void |
1628isp_setdparm(struct ispsoftc *isp) | 2397isp_update(isp) 2398 struct ispsoftc *isp; |
1629{ | 2399{ |
1630 int i; | 2400 int tgt; |
1631 mbreg_t mbs; 1632 sdparam *sdp; 1633 | 2401 mbreg_t mbs; 2402 sdparam *sdp; 2403 |
1634 isp->isp_fwrev = 0; | 2404 isp->isp_update = 0; 2405 |
1635 if (isp->isp_type & ISP_HA_FC) { | 2406 if (isp->isp_type & ISP_HA_FC) { |
1636 /* 1637 * ROM in 2100 doesn't appear to support ABOUT_FIRMWARE 1638 */ | |
1639 return; 1640 } 1641 | 2407 return; 2408 } 2409 |
1642 mbs.param[0] = MBOX_ABOUT_FIRMWARE; 1643 isp_mboxcmd(isp, &mbs); 1644 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1645 IDPRINTF(3, ("1st ABOUT FIRMWARE command failed")); 1646 } else { 1647 isp->isp_fwrev = 1648 (((u_int16_t) mbs.param[1]) << 10) + mbs.param[2]; | 2410 sdp = isp->isp_param; 2411 for (tgt = 0; tgt < MAX_TARGETS; tgt++) { 2412 if (sdp->isp_devparam[tgt].dev_enable == 0) { 2413 continue; 2414 } 2415 if (sdp->isp_devparam[tgt].dev_update == 0) { 2416 continue; 2417 } 2418 2419 mbs.param[0] = MBOX_SET_TARGET_PARAMS; 2420 mbs.param[1] = tgt << 8; 2421 mbs.param[2] = sdp->isp_devparam[tgt].dev_flags; 2422 mbs.param[3] = 2423 (sdp->isp_devparam[tgt].sync_offset << 8) | 2424 (sdp->isp_devparam[tgt].sync_period); 2425 2426 IDPRINTF(3, ("\n%s: tgt %d cflags %x offset %x period %x\n", 2427 isp->isp_name, tgt, mbs.param[2], mbs.param[3] >> 8, 2428 mbs.param[3] & 0xff)); 2429 2430 isp_mboxcmd(isp, &mbs); 2431 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2432 PRINTF("%s: failed to change SCSI parameters for " 2433 "target %d\n", isp->isp_name, tgt); 2434 } else { 2435 char *wt; 2436 int x, flags; 2437 2438 flags = sdp->isp_devparam[tgt].cur_dflags = 2439 sdp->isp_devparam[tgt].dev_flags; 2440 2441 x = sdp->isp_devparam[tgt].sync_period & 0xff; 2442 if (flags & DPARM_SYNC) { 2443 if (x == (ISP_20M_SYNCPARMS & 0xff)) { 2444 x = 20; 2445 } else if (x == (ISP_10M_SYNCPARMS & 0xff)) { 2446 x = 10; 2447 } else if (x == (ISP_08M_SYNCPARMS & 0xff)) { 2448 x = 8; 2449 } else if (x == (ISP_05M_SYNCPARMS & 0xff)) { 2450 x = 5; 2451 } else if (x == (ISP_04M_SYNCPARMS & 0xff)) { 2452 x = 4; 2453 } else { 2454 x = 0; 2455 } 2456 } else { 2457 x = 0; 2458 } 2459 switch (flags & (DPARM_WIDE|DPARM_TQING)) { 2460 case DPARM_WIDE: 2461 wt = ", 16 bit wide\n"; 2462 break; 2463 case DPARM_TQING: 2464 wt = ", Tagged Queueing Enabled\n"; 2465 break; 2466 case DPARM_WIDE|DPARM_TQING: 2467 wt = ", 16 bit wide, Tagged Queueing Enabled\n"; 2468 break; 2469 2470 default: 2471 wt = "\n"; 2472 break; 2473 } 2474 if (x) { 2475 IDPRINTF(3, ("%s: Target %d maximum Sync Mode " 2476 "at %dMHz%s", isp->isp_name, tgt, x, wt)); 2477 } else { 2478 IDPRINTF(3, ("%s: Target %d Async Mode%s", 2479 isp->isp_name, tgt, wt)); 2480 } 2481 } 2482 sdp->isp_devparam[tgt].dev_update = 0; |
1649 } | 2483 } |
2484} |
|
1650 | 2485 |
2486static void 2487isp_setdfltparm(isp) 2488 struct ispsoftc *isp; 2489{ 2490 int i, use_nvram; 2491 mbreg_t mbs; 2492 sdparam *sdp; |
|
1651 | 2493 |
1652 sdp = (sdparam *) isp->isp_param; | |
1653 /* | 2494 /* |
1654 * Try and get old clock rate out before we hit the 1655 * chip over the head- but if and only if we don't 1656 * know our desired clock rate. | 2495 * Been there, done that, got the T-shirt... |
1657 */ | 2496 */ |
1658 if (isp->isp_mdvec->dv_clock == 0) { 1659 mbs.param[0] = MBOX_GET_CLOCK_RATE; 1660 isp_mboxcmd(isp, &mbs); 1661 if (mbs.param[0] == MBOX_COMMAND_COMPLETE) { 1662 sdp->isp_clock = mbs.param[1]; 1663 PRINTF("%s: using board clock 0x%x\n", 1664 isp->isp_name, sdp->isp_clock); 1665 } 1666 } else { 1667 sdp->isp_clock = isp->isp_mdvec->dv_clock; | 2497 if (isp->isp_gotdparms) { 2498 IDPRINTF(3, ("%s: already have dparms\n", isp->isp_name)); 2499 return; |
1668 } | 2500 } |
2501 isp->isp_gotdparms = 1; |
|
1669 | 2502 |
2503 use_nvram = (isp_read_nvram(isp) == 0); 2504 if (use_nvram) { 2505 return; 2506 } 2507 if (isp->isp_type & ISP_HA_FC) { 2508 fcparam *fcp = (fcparam *) isp->isp_param; 2509 fcp->isp_maxfrmlen = ICB_DFLT_FRMLEN; 2510 fcp->isp_maxalloc = 256; 2511 fcp->isp_execthrottle = 16; 2512 fcp->isp_retry_delay = 5; 2513 fcp->isp_retry_count = 0; 2514 /* 2515 * It would be nice to fake up a WWN in case we don't 2516 * get one out of NVRAM. Solaris does this for SOCAL 2517 * cards that don't have SBus properties- it sets up 2518 * a WWN based upon the system MAC Address. 2519 */ 2520 fcp->isp_wwn = 0; 2521 return; 2522 } 2523 2524 sdp = (sdparam *) isp->isp_param; |
|
1670 mbs.param[0] = MBOX_GET_ACT_NEG_STATE; 1671 isp_mboxcmd(isp, &mbs); 1672 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 1673 IDPRINTF(2, ("could not GET ACT NEG STATE\n")); 1674 sdp->isp_req_ack_active_neg = 1; 1675 sdp->isp_data_line_active_neg = 1; 1676 } else { 1677 sdp->isp_req_ack_active_neg = (mbs.param[1] >> 4) & 0x1; 1678 sdp->isp_data_line_active_neg = (mbs.param[1] >> 5) & 0x1; 1679 } 1680 for (i = 0; i < MAX_TARGETS; i++) { | 2525 mbs.param[0] = MBOX_GET_ACT_NEG_STATE; 2526 isp_mboxcmd(isp, &mbs); 2527 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { 2528 IDPRINTF(2, ("could not GET ACT NEG STATE\n")); 2529 sdp->isp_req_ack_active_neg = 1; 2530 sdp->isp_data_line_active_neg = 1; 2531 } else { 2532 sdp->isp_req_ack_active_neg = (mbs.param[1] >> 4) & 0x1; 2533 sdp->isp_data_line_active_neg = (mbs.param[1] >> 5) & 0x1; 2534 } 2535 for (i = 0; i < MAX_TARGETS; i++) { |
2536 |
|
1681 mbs.param[0] = MBOX_GET_TARGET_PARAMS; 1682 mbs.param[1] = i << 8; 1683 isp_mboxcmd(isp, &mbs); 1684 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { | 2537 mbs.param[0] = MBOX_GET_TARGET_PARAMS; 2538 mbs.param[1] = i << 8; 2539 isp_mboxcmd(isp, &mbs); 2540 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) { |
1685 IDPRINTF(2, ("cannot get params for target %d\n", i)); 1686 sdp->isp_devparam[i].sync_period = 1687 ISP_10M_SYNCPARMS & 0xff; | 2541 PRINTF("%s: can't get SCSI parameters for target %d\n", 2542 isp->isp_name, i); 2543 sdp->isp_devparam[i].sync_period = 0; 2544 sdp->isp_devparam[i].sync_offset = 0; 2545 sdp->isp_devparam[i].dev_flags = DPARM_SAFE_DFLT; 2546 continue; 2547 } 2548 sdp->isp_devparam[i].dev_flags = mbs.param[2]; 2549 2550 /* 2551 * The maximum period we can really see 2552 * here is 100 (decimal), or 400 ns. 2553 * For some unknown reason we sometimes 2554 * get back wildass numbers from the 2555 * boot device's parameters. 2556 * 2557 * XXX: Hmm- this may be based on a different 2558 * XXX: clock rate. 2559 */ 2560 if ((mbs.param[3] & 0xff) <= 0x64) { 2561 sdp->isp_devparam[i].sync_period = mbs.param[3] & 0xff; 2562 sdp->isp_devparam[i].sync_offset = mbs.param[3] >> 8; 2563 } 2564 2565 /* 2566 * It is not safe to run Ultra Mode with a clock < 60. 2567 */ 2568 if (((sdp->isp_clock && sdp->isp_clock < 60) || 2569 (isp->isp_type < ISP_HA_SCSI_1020A)) && 2570 (sdp->isp_devparam[i].sync_period == 2571 (ISP_20M_SYNCPARMS & 0xff))) { |
1688 sdp->isp_devparam[i].sync_offset = 1689 ISP_10M_SYNCPARMS >> 8; | 2572 sdp->isp_devparam[i].sync_offset = 2573 ISP_10M_SYNCPARMS >> 8; |
1690 sdp->isp_devparam[i].dev_flags = DPARM_DEFAULT; 1691 } else { 1692 IDPRINTF(3, ("\%s: target %d - flags 0x%x, sync %x\n", 1693 isp->isp_name, i, mbs.param[2], mbs.param[3])); 1694 sdp->isp_devparam[i].dev_flags = mbs.param[2] >> 8; 1695 /* 1696 * The maximum period we can really see 1697 * here is 100 (decimal), or 400 ns. 1698 * For some unknown reason we sometimes 1699 * get back wildass numbers from the 1700 * boot device's paramaters. 1701 */ 1702 if ((mbs.param[3] & 0xff) <= 0x64) { 1703 sdp->isp_devparam[i].sync_period = 1704 mbs.param[3] & 0xff; 1705 sdp->isp_devparam[i].sync_offset = 1706 mbs.param[3] >> 8; 1707 } | 2574 sdp->isp_devparam[i].sync_period = 2575 ISP_10M_SYNCPARMS & 0xff; |
1708 } | 2576 } |
2577 |
|
1709 } 1710 1711 /* 1712 * Set Default Host Adapter Parameters | 2578 } 2579 2580 /* 2581 * Set Default Host Adapter Parameters |
1713 * XXX: Should try and get them out of NVRAM | |
1714 */ | 2582 */ |
1715 sdp->isp_adapter_enabled = 1; | |
1716 sdp->isp_cmd_dma_burst_enable = 1; 1717 sdp->isp_data_dma_burst_enabl = 1; | 2583 sdp->isp_cmd_dma_burst_enable = 1; 2584 sdp->isp_data_dma_burst_enabl = 1; |
1718 sdp->isp_fifo_threshold = 2; | 2585 sdp->isp_fifo_threshold = 0; |
1719 sdp->isp_initiator_id = 7; | 2586 sdp->isp_initiator_id = 7; |
1720 sdp->isp_async_data_setup = 6; | 2587 if (isp->isp_type >= ISP_HA_SCSI_1040) { 2588 sdp->isp_async_data_setup = 9; 2589 } else { 2590 sdp->isp_async_data_setup = 6; 2591 } |
1721 sdp->isp_selection_timeout = 250; 1722 sdp->isp_max_queue_depth = 128; 1723 sdp->isp_tag_aging = 8; 1724 sdp->isp_bus_reset_delay = 3; 1725 sdp->isp_retry_count = 0; 1726 sdp->isp_retry_delay = 1; 1727 1728 for (i = 0; i < MAX_TARGETS; i++) { 1729 sdp->isp_devparam[i].exc_throttle = 16; 1730 sdp->isp_devparam[i].dev_enable = 1; 1731 } 1732} 1733 | 2592 sdp->isp_selection_timeout = 250; 2593 sdp->isp_max_queue_depth = 128; 2594 sdp->isp_tag_aging = 8; 2595 sdp->isp_bus_reset_delay = 3; 2596 sdp->isp_retry_count = 0; 2597 sdp->isp_retry_delay = 1; 2598 2599 for (i = 0; i < MAX_TARGETS; i++) { 2600 sdp->isp_devparam[i].exc_throttle = 16; 2601 sdp->isp_devparam[i].dev_enable = 1; 2602 } 2603} 2604 |
1734static void 1735isp_phoenix(struct ispsoftc *isp) | 2605/* 2606 * Re-initialize the ISP and complete all orphaned commands 2607 * with a 'botched' notice. 2608 * 2609 * Locks held prior to coming here. 2610 */ 2611 2612void 2613isp_restart(isp) 2614 struct ispsoftc *isp; |
1736{ | 2615{ |
1737 ISP_SCSI_XFER_T *tlist[MAXISPREQUEST], *xs; | 2616 ISP_SCSI_XFER_T *tlist[RQUEST_QUEUE_LEN], *xs; |
1738 int i; 1739 | 2617 int i; 2618 |
1740 for (i = 0; i < RQUEST_QUEUE_LEN(isp); i++) { | 2619 for (i = 0; i < RQUEST_QUEUE_LEN; i++) { |
1741 tlist[i] = (ISP_SCSI_XFER_T *) isp->isp_xflist[i]; 1742 } 1743 isp_reset(isp); | 2620 tlist[i] = (ISP_SCSI_XFER_T *) isp->isp_xflist[i]; 2621 } 2622 isp_reset(isp); |
1744 isp_init(isp); 1745 isp->isp_state = ISP_RUNSTATE; | 2623 if (isp->isp_state == ISP_RESETSTATE) { 2624 isp_init(isp); 2625 if (isp->isp_state == ISP_INITSTATE) { 2626 isp->isp_state = ISP_RUNSTATE; 2627 } 2628 } 2629 if (isp->isp_state != ISP_RUNSTATE) { 2630 PRINTF("%s: isp_restart cannot restart ISP\n", isp->isp_name); 2631 } |
1746 | 2632 |
1747 for (i = 0; i < RQUEST_QUEUE_LEN(isp); i++) { | 2633 for (i = 0; i < RQUEST_QUEUE_LEN; i++) { |
1748 xs = tlist[i]; 1749 if (XS_NULL(xs)) 1750 continue; 1751 isp->isp_nactive--; 1752 if (isp->isp_nactive < 0) 1753 isp->isp_nactive = 0; 1754 XS_RESID(xs) = XS_XFRLEN(xs); | 2634 xs = tlist[i]; 2635 if (XS_NULL(xs)) 2636 continue; 2637 isp->isp_nactive--; 2638 if (isp->isp_nactive < 0) 2639 isp->isp_nactive = 0; 2640 XS_RESID(xs) = XS_XFRLEN(xs); |
1755 XS_SETERR(xs, HBA_BOTCH); | 2641 XS_SETERR(xs, HBA_BUSRESET); |
1756 XS_CMD_DONE(xs); 1757 } 1758} 1759 1760void | 2642 XS_CMD_DONE(xs); 2643 } 2644} 2645 2646void |
1761isp_watch(void *arg) | 2647isp_watch(arg) 2648 void *arg; |
1762{ 1763 int i; 1764 struct ispsoftc *isp = arg; 1765 ISP_SCSI_XFER_T *xs; 1766 ISP_LOCKVAL_DECL; 1767 1768 /* 1769 * Look for completely dead commands (but not polled ones). 1770 */ | 2649{ 2650 int i; 2651 struct ispsoftc *isp = arg; 2652 ISP_SCSI_XFER_T *xs; 2653 ISP_LOCKVAL_DECL; 2654 2655 /* 2656 * Look for completely dead commands (but not polled ones). 2657 */ |
1771 ISP_LOCK; 1772 for (i = 0; i < RQUEST_QUEUE_LEN(isp); i++) { | 2658 ISP_ILOCK(isp); 2659 for (i = 0; i < RQUEST_QUEUE_LEN; i++) { |
1773 if ((xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[i]) == NULL) { 1774 continue; 1775 } | 2660 if ((xs = (ISP_SCSI_XFER_T *) isp->isp_xflist[i]) == NULL) { 2661 continue; 2662 } |
1776 if (XS_POLLDCMD(xs)) 1777 continue; | |
1778 if (XS_TIME(xs) == 0) { 1779 continue; 1780 } 1781 XS_TIME(xs) -= (WATCH_INTERVAL * 1000); 1782 /* 1783 * Avoid later thinking that this 1784 * transaction is not being timed. 1785 * Then give ourselves to watchdog 1786 * periods of grace. 1787 */ 1788 if (XS_TIME(xs) == 0) 1789 XS_TIME(xs) = 1; 1790 else if (XS_TIME(xs) > -(2 * WATCH_INTERVAL * 1000)) { 1791 continue; 1792 } | 2663 if (XS_TIME(xs) == 0) { 2664 continue; 2665 } 2666 XS_TIME(xs) -= (WATCH_INTERVAL * 1000); 2667 /* 2668 * Avoid later thinking that this 2669 * transaction is not being timed. 2670 * Then give ourselves to watchdog 2671 * periods of grace. 2672 */ 2673 if (XS_TIME(xs) == 0) 2674 XS_TIME(xs) = 1; 2675 else if (XS_TIME(xs) > -(2 * WATCH_INTERVAL * 1000)) { 2676 continue; 2677 } |
1793 if (isp_abortcmd(isp, i)) { | 2678 if (isp_control(isp, ISPCTL_ABORT_CMD, xs)) { |
1794 PRINTF("%s: isp_watch failed to abort command\n", | 2679 PRINTF("%s: isp_watch failed to abort command\n", |
1795 isp->isp_name); 1796 isp_phoenix(isp); | 2680 isp->isp_name); 2681 isp_restart(isp); |
1797 break; 1798 } 1799 } | 2682 break; 2683 } 2684 } |
1800 ISP_UNLOCK; | 2685 ISP_IUNLOCK(isp); |
1801 RESTART_WATCHDOG(isp_watch, isp); 1802} 1803 1804static void | 2686 RESTART_WATCHDOG(isp_watch, isp); 2687} 2688 2689static void |
1805isp_prtstst(ispstatusreq_t *sp) | 2690isp_prtstst(sp) 2691 ispstatusreq_t *sp; |
1806{ 1807 PRINTF("states->"); 1808 if (sp->req_state_flags & RQSF_GOT_BUS) 1809 PRINTF("GOT_BUS "); 1810 if (sp->req_state_flags & RQSF_GOT_TARGET) 1811 PRINTF("GOT_TGT "); 1812 if (sp->req_state_flags & RQSF_SENT_CDB) 1813 PRINTF("SENT_CDB "); --- 20 unchanged lines hidden (view full) --- 1834 if (sp->req_status_flags & RQSTF_ABORTED) 1835 PRINTF("Aborted "); 1836 if (sp->req_status_flags & RQSTF_TIMEOUT) 1837 PRINTF("Timeout "); 1838 if (sp->req_status_flags & RQSTF_NEGOTIATION) 1839 PRINTF("Negotiation "); 1840 PRINTF("\n"); 1841} | 2692{ 2693 PRINTF("states->"); 2694 if (sp->req_state_flags & RQSF_GOT_BUS) 2695 PRINTF("GOT_BUS "); 2696 if (sp->req_state_flags & RQSF_GOT_TARGET) 2697 PRINTF("GOT_TGT "); 2698 if (sp->req_state_flags & RQSF_SENT_CDB) 2699 PRINTF("SENT_CDB "); --- 20 unchanged lines hidden (view full) --- 2720 if (sp->req_status_flags & RQSTF_ABORTED) 2721 PRINTF("Aborted "); 2722 if (sp->req_status_flags & RQSTF_TIMEOUT) 2723 PRINTF("Timeout "); 2724 if (sp->req_status_flags & RQSTF_NEGOTIATION) 2725 PRINTF("Negotiation "); 2726 PRINTF("\n"); 2727} |
2728 2729/* 2730 * NVRAM Routines 2731 */ 2732 2733static int 2734isp_read_nvram(isp) 2735 struct ispsoftc *isp; 2736{ 2737 int i, amt; 2738 u_int8_t csum, minversion; 2739 union { 2740 u_int8_t _x[ISP2100_NVRAM_SIZE]; 2741 u_int16_t _s[ISP2100_NVRAM_SIZE>>1]; 2742 } _n; 2743#define nvram_data _n._x 2744#define nvram_words _n._s 2745 2746 if (isp->isp_type & ISP_HA_FC) { 2747 amt = ISP2100_NVRAM_SIZE; 2748 minversion = 1; 2749 } else { 2750 amt = ISP_NVRAM_SIZE; 2751 minversion = 2; 2752 } 2753 2754 /* 2755 * Just read the first two words first to see if we have a valid 2756 * NVRAM to continue reading the rest with. 2757 */ 2758 for (i = 0; i < 2; i++) { 2759 isp_rdnvram_word(isp, i, &nvram_words[i]); 2760 } 2761 if (nvram_data[0] != 'I' || nvram_data[1] != 'S' || 2762 nvram_data[2] != 'P') { 2763 if (isp->isp_bustype != ISP_BT_SBUS) { 2764 PRINTF("%s: invalid NVRAM header\n", isp->isp_name); 2765 } 2766 return (-1); 2767 } 2768 for (i = 2; i < amt>>1; i++) { 2769 isp_rdnvram_word(isp, i, &nvram_words[i]); 2770 } 2771 for (csum = 0, i = 0; i < amt; i++) { 2772 csum += nvram_data[i]; 2773 } 2774 if (csum != 0) { 2775 PRINTF("%s: invalid NVRAM checksum\n", isp->isp_name); 2776 return (-1); 2777 } 2778 if (ISP_NVRAM_VERSION(nvram_data) < minversion) { 2779 PRINTF("%s: version %d NVRAM not understood\n", isp->isp_name, 2780 ISP_NVRAM_VERSION(nvram_data)); 2781 return (-1); 2782 } 2783 2784 if (isp->isp_type & ISP_HA_SCSI) { 2785 sdparam *sdp = (sdparam *) isp->isp_param; 2786 2787 /* XXX CHECK THIS FOR SANITY XXX */ 2788 sdp->isp_fifo_threshold = 2789 ISP_NVRAM_FIFO_THRESHOLD(nvram_data); 2790 2791 sdp->isp_initiator_id = 2792 ISP_NVRAM_INITIATOR_ID(nvram_data); 2793 2794 sdp->isp_bus_reset_delay = 2795 ISP_NVRAM_BUS_RESET_DELAY(nvram_data); 2796 2797 sdp->isp_retry_count = 2798 ISP_NVRAM_BUS_RETRY_COUNT(nvram_data); 2799 2800 sdp->isp_retry_delay = 2801 ISP_NVRAM_BUS_RETRY_DELAY(nvram_data); 2802 2803 sdp->isp_async_data_setup = 2804 ISP_NVRAM_ASYNC_DATA_SETUP_TIME(nvram_data); 2805 2806 if (isp->isp_type >= ISP_HA_SCSI_1040) { 2807 if (sdp->isp_async_data_setup < 9) { 2808 sdp->isp_async_data_setup = 9; 2809 } 2810 } else { 2811 if (sdp->isp_async_data_setup != 6) { 2812 sdp->isp_async_data_setup = 6; 2813 } 2814 } 2815 2816 sdp->isp_req_ack_active_neg = 2817 ISP_NVRAM_REQ_ACK_ACTIVE_NEGATION(nvram_data); 2818 2819 sdp->isp_data_line_active_neg = 2820 ISP_NVRAM_DATA_LINE_ACTIVE_NEGATION(nvram_data); 2821 2822 sdp->isp_data_dma_burst_enabl = 2823 ISP_NVRAM_DATA_DMA_BURST_ENABLE(nvram_data); 2824 2825 sdp->isp_cmd_dma_burst_enable = 2826 ISP_NVRAM_CMD_DMA_BURST_ENABLE(nvram_data); 2827 2828 sdp->isp_tag_aging = 2829 ISP_NVRAM_TAG_AGE_LIMIT(nvram_data); 2830 2831 /* XXX ISP_NVRAM_FIFO_THRESHOLD_128 XXX */ 2832 2833 sdp->isp_selection_timeout = 2834 ISP_NVRAM_SELECTION_TIMEOUT(nvram_data); 2835 2836 sdp->isp_max_queue_depth = 2837 ISP_NVRAM_MAX_QUEUE_DEPTH(nvram_data); 2838 2839 sdp->isp_fast_mttr = ISP_NVRAM_FAST_MTTR_ENABLE(nvram_data); 2840 2841 for (i = 0; i < 16; i++) { 2842 sdp->isp_devparam[i].dev_enable = 2843 ISP_NVRAM_TGT_DEVICE_ENABLE(nvram_data, i); 2844 sdp->isp_devparam[i].exc_throttle = 2845 ISP_NVRAM_TGT_EXEC_THROTTLE(nvram_data, i); 2846 sdp->isp_devparam[i].sync_offset = 2847 ISP_NVRAM_TGT_SYNC_OFFSET(nvram_data, i); 2848 sdp->isp_devparam[i].sync_period = 2849 ISP_NVRAM_TGT_SYNC_PERIOD(nvram_data, i); 2850 2851 if (isp->isp_type < ISP_HA_SCSI_1040) { 2852 /* 2853 * If we're not ultra, we can't possibly 2854 * be a shorter period than this. 2855 */ 2856 if (sdp->isp_devparam[i].sync_period < 0x19) { 2857 sdp->isp_devparam[i].sync_period = 2858 0x19; 2859 } 2860 if (sdp->isp_devparam[i].sync_offset > 0xc) { 2861 sdp->isp_devparam[i].sync_offset = 2862 0x0c; 2863 } 2864 } else { 2865 if (sdp->isp_devparam[i].sync_offset > 0x8) { 2866 sdp->isp_devparam[i].sync_offset = 0x8; 2867 } 2868 } 2869 2870 sdp->isp_devparam[i].dev_flags = 0; 2871 2872 if (ISP_NVRAM_TGT_RENEG(nvram_data, i)) 2873 sdp->isp_devparam[i].dev_flags |= DPARM_RENEG; 2874 if (ISP_NVRAM_TGT_QFRZ(nvram_data, i)) { 2875 PRINTF("%s: not supporting QFRZ option for " 2876 "target %d\n", isp->isp_name, i); 2877 } 2878 sdp->isp_devparam[i].dev_flags |= DPARM_ARQ; 2879 if (ISP_NVRAM_TGT_ARQ(nvram_data, i) == 0) { 2880 PRINTF("%s: not disabling ARQ option for " 2881 "target %d\n", isp->isp_name, i); 2882 } 2883 if (ISP_NVRAM_TGT_TQING(nvram_data, i)) 2884 sdp->isp_devparam[i].dev_flags |= DPARM_TQING; 2885 if (ISP_NVRAM_TGT_SYNC(nvram_data, i)) 2886 sdp->isp_devparam[i].dev_flags |= DPARM_SYNC; 2887 if (ISP_NVRAM_TGT_WIDE(nvram_data, i)) 2888 sdp->isp_devparam[i].dev_flags |= DPARM_WIDE; 2889 if (ISP_NVRAM_TGT_PARITY(nvram_data, i)) 2890 sdp->isp_devparam[i].dev_flags |= DPARM_PARITY; 2891 if (ISP_NVRAM_TGT_DISC(nvram_data, i)) 2892 sdp->isp_devparam[i].dev_flags |= DPARM_DISC; 2893 } 2894 } else { 2895 fcparam *fcp = (fcparam *) isp->isp_param; 2896 union { 2897 struct { 2898#if BYTE_ORDER == BIG_ENDIAN 2899 u_int32_t hi32; 2900 u_int32_t lo32; 2901#else 2902 u_int32_t lo32; 2903 u_int32_t hi32; 2904#endif 2905 } wds; 2906 u_int64_t full64; 2907 } wwnstore; 2908 2909 wwnstore.full64 = ISP2100_NVRAM_NODE_NAME(nvram_data); 2910 PRINTF("%s: Adapter WWN 0x%08x%08x\n", isp->isp_name, 2911 wwnstore.wds.hi32, wwnstore.wds.lo32); 2912 fcp->isp_wwn = wwnstore.full64; 2913 wwnstore.full64 = ISP2100_NVRAM_BOOT_NODE_NAME(nvram_data); 2914 if (wwnstore.full64 != 0) { 2915 PRINTF("%s: BOOT DEVICE WWN 0x%08x%08x\n", isp->isp_name, 2916 wwnstore.wds.hi32, wwnstore.wds.lo32); 2917 } 2918 fcp->isp_maxalloc = 2919 ISP2100_NVRAM_MAXIOCBALLOCATION(nvram_data); 2920 fcp->isp_maxfrmlen = 2921 ISP2100_NVRAM_MAXFRAMELENGTH(nvram_data); 2922 fcp->isp_retry_delay = 2923 ISP2100_NVRAM_RETRY_DELAY(nvram_data); 2924 fcp->isp_retry_count = 2925 ISP2100_NVRAM_RETRY_COUNT(nvram_data); 2926 fcp->isp_loopid = 2927 ISP2100_NVRAM_HARDLOOPID(nvram_data); 2928 fcp->isp_execthrottle = 2929 ISP2100_NVRAM_EXECUTION_THROTTLE(nvram_data); 2930 } 2931 return (0); 2932} 2933 2934static void 2935isp_rdnvram_word(isp, wo, rp) 2936 struct ispsoftc *isp; 2937 int wo; 2938 u_int16_t *rp; 2939{ 2940 int i, cbits; 2941 u_int16_t bit, rqst; 2942 2943 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 2944 SYS_DELAY(2); 2945 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 2946 SYS_DELAY(2); 2947 2948 if (isp->isp_type & ISP_HA_FC) { 2949 wo &= ((ISP2100_NVRAM_SIZE >> 1) - 1); 2950 rqst = (ISP_NVRAM_READ << 8) | wo; 2951 cbits = 10; 2952 } else { 2953 wo &= ((ISP_NVRAM_SIZE >> 1) - 1); 2954 rqst = (ISP_NVRAM_READ << 6) | wo; 2955 cbits = 8; 2956 } 2957 2958 /* 2959 * Clock the word select request out... 2960 */ 2961 for (i = cbits; i >= 0; i--) { 2962 if ((rqst >> i) & 1) { 2963 bit = BIU_NVRAM_SELECT | BIU_NVRAM_DATAOUT; 2964 } else { 2965 bit = BIU_NVRAM_SELECT; 2966 } 2967 ISP_WRITE(isp, BIU_NVRAM, bit); 2968 SYS_DELAY(2); 2969 ISP_WRITE(isp, BIU_NVRAM, bit | BIU_NVRAM_CLOCK); 2970 SYS_DELAY(2); 2971 ISP_WRITE(isp, BIU_NVRAM, bit); 2972 SYS_DELAY(2); 2973 } 2974 /* 2975 * Now read the result back in (bits come back in MSB format). 2976 */ 2977 *rp = 0; 2978 for (i = 0; i < 16; i++) { 2979 u_int16_t rv; 2980 *rp <<= 1; 2981 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT|BIU_NVRAM_CLOCK); 2982 SYS_DELAY(2); 2983 rv = ISP_READ(isp, BIU_NVRAM); 2984 if (rv & BIU_NVRAM_DATAIN) { 2985 *rp |= 1; 2986 } 2987 SYS_DELAY(2); 2988 ISP_WRITE(isp, BIU_NVRAM, BIU_NVRAM_SELECT); 2989 SYS_DELAY(2); 2990 } 2991 ISP_WRITE(isp, BIU_NVRAM, 0); 2992 SYS_DELAY(2); 2993#if BYTE_ORDER == BIG_ENDIAN 2994 *rp = ((*rp >> 8) | ((*rp & 0xff) << 8)); 2995#endif 2996} |
|