isp.c (b05f17a12fc58914e0a5b17f90331627b600432d) isp.c (b760d2eca9862883f6e9094c5e28e65d1e925d9a)
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2009-2020 Alexander Motin <mav@FreeBSD.org>
5 * Copyright (c) 1997-2009 by Matthew Jacob
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

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

59#ifdef __linux__
60#include "isp_linux.h"
61#endif
62#ifdef __svr4__
63#include "isp_solaris.h"
64#endif
65
66/*
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2009-2020 Alexander Motin <mav@FreeBSD.org>
5 * Copyright (c) 1997-2009 by Matthew Jacob
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without

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

59#ifdef __linux__
60#include "isp_linux.h"
61#endif
62#ifdef __svr4__
63#include "isp_solaris.h"
64#endif
65
66/*
67 * General defines
68 */
69#define MBOX_DELAY_COUNT 1000000 / 100
70
71/*
72 * Local static data
73 */
74static const char notresp[] = "Unknown IOCB in RESPONSE Queue (type 0x%x) @ idx %d (next %d)";
75static const char bun[] = "bad underrun (count %d, resid %d, status %s)";
76static const char lipd[] = "Chan %d LIP destroyed %d active commands";
77static const char sacq[] = "unable to acquire scratch area";
78
79static const uint8_t alpa_map[] = {

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

94 0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17,
95 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00
96};
97
98/*
99 * Local function prototypes.
100 */
101static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *, uint16_t);
67 * Local static data
68 */
69static const char notresp[] = "Unknown IOCB in RESPONSE Queue (type 0x%x) @ idx %d (next %d)";
70static const char bun[] = "bad underrun (count %d, resid %d, status %s)";
71static const char lipd[] = "Chan %d LIP destroyed %d active commands";
72static const char sacq[] = "unable to acquire scratch area";
73
74static const uint8_t alpa_map[] = {

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

89 0x25, 0x23, 0x1f, 0x1e, 0x1d, 0x1b, 0x18, 0x17,
90 0x10, 0x0f, 0x08, 0x04, 0x02, 0x01, 0x00
91};
92
93/*
94 * Local function prototypes.
95 */
96static int isp_handle_other_response(ispsoftc_t *, int, isphdr_t *, uint32_t *, uint16_t);
102static void isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *, uint32_t *);
97static void isp_parse_status_24xx(ispsoftc_t *, isp24xx_statusreq_t *, XS_T *);
103static void isp_clear_portdb(ispsoftc_t *, int);
104static void isp_mark_portdb(ispsoftc_t *, int);
105static int isp_plogx(ispsoftc_t *, int, uint16_t, uint32_t, int);
106static int isp_getpdb(ispsoftc_t *, int, uint16_t, isp_pdb_t *);
107static int isp_gethandles(ispsoftc_t *, int, uint16_t *, int *, int);
108static void isp_dump_chip_portdb(ispsoftc_t *, int);
109static uint64_t isp_get_wwn(ispsoftc_t *, int, int, int);
110static int isp_fclink_test(ispsoftc_t *, int, int);

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

150
151void
152isp_reset(ispsoftc_t *isp, int do_load_defaults)
153{
154 mbreg_t mbs;
155 char *buf;
156 uint64_t fwt;
157 uint32_t code_org, val;
98static void isp_clear_portdb(ispsoftc_t *, int);
99static void isp_mark_portdb(ispsoftc_t *, int);
100static int isp_plogx(ispsoftc_t *, int, uint16_t, uint32_t, int);
101static int isp_getpdb(ispsoftc_t *, int, uint16_t, isp_pdb_t *);
102static int isp_gethandles(ispsoftc_t *, int, uint16_t *, int *, int);
103static void isp_dump_chip_portdb(ispsoftc_t *, int);
104static uint64_t isp_get_wwn(ispsoftc_t *, int, int, int);
105static int isp_fclink_test(ispsoftc_t *, int, int);

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

145
146void
147isp_reset(ispsoftc_t *isp, int do_load_defaults)
148{
149 mbreg_t mbs;
150 char *buf;
151 uint64_t fwt;
152 uint32_t code_org, val;
158 int loops, i, dodnld = 1;
153 int loaded_fw, loops, i, dodnld = 1;
159 const char *btype = "????";
160 static const char dcrc[] = "Downloaded RISC Code Checksum Failure";
161
162 isp->isp_state = ISP_NILSTATE;
163 ISP_DISABLE_INTS(isp);
164
165 /*
166 * Put the board into PAUSE mode (so we can read the SXP registers

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

183 case ISP_HA_FC_2700:
184 btype = "2700";
185 break;
186 default:
187 break;
188 }
189
190 /*
154 const char *btype = "????";
155 static const char dcrc[] = "Downloaded RISC Code Checksum Failure";
156
157 isp->isp_state = ISP_NILSTATE;
158 ISP_DISABLE_INTS(isp);
159
160 /*
161 * Put the board into PAUSE mode (so we can read the SXP registers

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

178 case ISP_HA_FC_2700:
179 btype = "2700";
180 break;
181 default:
182 break;
183 }
184
185 /*
191 * Hit the chip over the head with hammer,
192 * and give it a chance to recover.
193 */
194
195 /*
196 * Stop DMA and wait for it to stop.
197 */
198 ISP_WRITE(isp, BIU2400_CSR, BIU2400_DMA_STOP|(3 << 4));
186 * Stop DMA and wait for it to stop.
187 */
188 ISP_WRITE(isp, BIU2400_CSR, BIU2400_DMA_STOP|(3 << 4));
199 for (val = loops = 0; loops < 30000; loops++) {
189 for (loops = 0; loops < 100000; loops++) {
200 ISP_DELAY(10);
201 val = ISP_READ(isp, BIU2400_CSR);
202 if ((val & BIU2400_DMA_ACTIVE) == 0) {
203 break;
204 }
205 }
190 ISP_DELAY(10);
191 val = ISP_READ(isp, BIU2400_CSR);
192 if ((val & BIU2400_DMA_ACTIVE) == 0) {
193 break;
194 }
195 }
206 if (val & BIU2400_DMA_ACTIVE) {
196 if (val & BIU2400_DMA_ACTIVE)
207 isp_prt(isp, ISP_LOGERR, "DMA Failed to Stop on Reset");
197 isp_prt(isp, ISP_LOGERR, "DMA Failed to Stop on Reset");
208 return;
209 }
198
210 /*
211 * Hold it in SOFT_RESET and STOP state for 100us.
212 */
213 ISP_WRITE(isp, BIU2400_CSR, BIU2400_SOFT_RESET|BIU2400_DMA_STOP|(3 << 4));
214 ISP_DELAY(100);
215 for (loops = 0; loops < 10000; loops++) {
216 ISP_DELAY(5);
217 val = ISP_READ(isp, OUTMAILBOX0);
199 /*
200 * Hold it in SOFT_RESET and STOP state for 100us.
201 */
202 ISP_WRITE(isp, BIU2400_CSR, BIU2400_SOFT_RESET|BIU2400_DMA_STOP|(3 << 4));
203 ISP_DELAY(100);
204 for (loops = 0; loops < 10000; loops++) {
205 ISP_DELAY(5);
206 val = ISP_READ(isp, OUTMAILBOX0);
218 }
219 for (val = loops = 0; loops < 500000; loops ++) {
220 val = ISP_READ(isp, BIU2400_CSR);
221 if ((val & BIU2400_SOFT_RESET) == 0) {
207 if (val != 0x4)
222 break;
208 break;
223 }
224 }
209 }
225 if (val & BIU2400_SOFT_RESET) {
226 isp_prt(isp, ISP_LOGERR, "Failed to come out of reset");
210 switch (val) {
211 case 0x0:
212 break;
213 case 0x4:
214 isp_prt(isp, ISP_LOGERR, "The ROM code is busy after 50ms.");
227 return;
215 return;
216 case 0xf:
217 isp_prt(isp, ISP_LOGERR, "Board configuration error.");
218 return;
219 default:
220 isp_prt(isp, ISP_LOGERR, "Unknown RISC Status Code 0x%x.", val);
221 return;
228 }
229
230 /*
222 }
223
224 /*
231 * Wait for ISP to be ready to go...
232 */
233 loops = MBOX_DELAY_COUNT;
234 for (;;) {
235 if (ISP_READ(isp, OUTMAILBOX0) == 0)
236 break;
237 ISP_DELAY(100);
238 if (--loops < 0) {
239 ISP_DUMPREGS(isp, "chip reset timed out");
240 return;
241 }
242 }
243
244 /*
245 * Reset RISC Processor
246 */
247 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RESET);
248 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RELEASE);
249 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RESET);
250
251 /*
252 * Post-RISC Reset stuff.
253 */
225 * Reset RISC Processor
226 */
227 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RESET);
228 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_RELEASE);
229 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RESET);
230
231 /*
232 * Post-RISC Reset stuff.
233 */
254 for (val = loops = 0; loops < 5000000; loops++) {
234 for (loops = 0; loops < 10000; loops++) {
255 ISP_DELAY(5);
256 val = ISP_READ(isp, OUTMAILBOX0);
235 ISP_DELAY(5);
236 val = ISP_READ(isp, OUTMAILBOX0);
257 if (val == 0) {
237 if (val != 0x4)
258 break;
238 break;
259 }
260 }
239 }
261 if (val != 0) {
262 isp_prt(isp, ISP_LOGERR, "reset didn't clear");
240 switch (val) {
241 case 0x0:
242 break;
243 case 0x4:
244 isp_prt(isp, ISP_LOGERR, "The ROM code is busy after 50ms.");
263 return;
245 return;
246 case 0xf:
247 isp_prt(isp, ISP_LOGERR, "Board configuration error.");
248 return;
249 default:
250 isp_prt(isp, ISP_LOGERR, "Unknown RISC Status Code 0x%x.", val);
251 return;
264 }
265
266 isp->isp_reqidx = isp->isp_reqodx = 0;
267 isp->isp_resodx = 0;
268 isp->isp_atioodx = 0;
269 ISP_WRITE(isp, BIU2400_REQINP, 0);
270 ISP_WRITE(isp, BIU2400_REQOUTP, 0);
271 ISP_WRITE(isp, BIU2400_RSPINP, 0);
272 ISP_WRITE(isp, BIU2400_RSPOUTP, 0);
273 if (!IS_26XX(isp)) {
274 ISP_WRITE(isp, BIU2400_PRI_REQINP, 0);
275 ISP_WRITE(isp, BIU2400_PRI_REQOUTP, 0);
276 }
277 ISP_WRITE(isp, BIU2400_ATIO_RSPINP, 0);
278 ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, 0);
279
280 /*
252 }
253
254 isp->isp_reqidx = isp->isp_reqodx = 0;
255 isp->isp_resodx = 0;
256 isp->isp_atioodx = 0;
257 ISP_WRITE(isp, BIU2400_REQINP, 0);
258 ISP_WRITE(isp, BIU2400_REQOUTP, 0);
259 ISP_WRITE(isp, BIU2400_RSPINP, 0);
260 ISP_WRITE(isp, BIU2400_RSPOUTP, 0);
261 if (!IS_26XX(isp)) {
262 ISP_WRITE(isp, BIU2400_PRI_REQINP, 0);
263 ISP_WRITE(isp, BIU2400_PRI_REQOUTP, 0);
264 }
265 ISP_WRITE(isp, BIU2400_ATIO_RSPINP, 0);
266 ISP_WRITE(isp, BIU2400_ATIO_RSPOUTP, 0);
267
268 /*
281 * Wait for everything to finish firing up.
282 */
283 loops = MBOX_DELAY_COUNT;
284 while (ISP_READ(isp, OUTMAILBOX0) == MBOX_BUSY) {
285 ISP_DELAY(100);
286 if (--loops < 0) {
287 isp_prt(isp, ISP_LOGERR, "MBOX_BUSY never cleared on reset");
288 return;
289 }
290 }
291
292 /*
293 * Up until this point we've done everything by just reading or
294 * setting registers. From this point on we rely on at least *some*
295 * kind of firmware running in the card.
296 */
297
298 /*
299 * Do some sanity checking by running a NOP command.
300 * If it succeeds, the ROM firmware is now running.

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

357 */
358 if (ISP_MBOXDMASETUP(isp) != 0) {
359 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
360 return;
361 }
362 }
363
364 code_org = ISP_CODE_ORG_2400;
269 * Up until this point we've done everything by just reading or
270 * setting registers. From this point on we rely on at least *some*
271 * kind of firmware running in the card.
272 */
273
274 /*
275 * Do some sanity checking by running a NOP command.
276 * If it succeeds, the ROM firmware is now running.

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

333 */
334 if (ISP_MBOXDMASETUP(isp) != 0) {
335 isp_prt(isp, ISP_LOGERR, "Cannot setup DMA");
336 return;
337 }
338 }
339
340 code_org = ISP_CODE_ORG_2400;
365 isp->isp_loaded_fw = 0;
341 loaded_fw = 0;
366 if (dodnld) {
367 const uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
368 uint32_t la, wi, wl;
369
370 /*
371 * Keep loading until we run out of f/w.
372 */
373 code_org = ptr[2]; /* 1st load address is our start addr */

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

406 wl -= nw;
407 }
408
409 if (ptr[1] == 0) {
410 break;
411 }
412 ptr += ptr[3];
413 }
342 if (dodnld) {
343 const uint32_t *ptr = isp->isp_mdvec->dv_ispfw;
344 uint32_t la, wi, wl;
345
346 /*
347 * Keep loading until we run out of f/w.
348 */
349 code_org = ptr[2]; /* 1st load address is our start addr */

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

382 wl -= nw;
383 }
384
385 if (ptr[1] == 0) {
386 break;
387 }
388 ptr += ptr[3];
389 }
414 isp->isp_loaded_fw = 1;
390 loaded_fw = 1;
415 } else if (IS_26XX(isp)) {
416 isp_prt(isp, ISP_LOGDEBUG1, "loading firmware from flash");
417 MBSINIT(&mbs, MBOX_LOAD_FLASH_FIRMWARE, MBLOGALL, 5000000);
418 mbs.ibitm = 0x01;
419 mbs.obitm = 0x07;
420 isp_mboxcmd(isp, &mbs);
421 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
422 isp_prt(isp, ISP_LOGERR, "Flash F/W load failed");
423 return;
424 }
425 } else {
426 isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
427 }
428
429 /*
430 * If we loaded firmware, verify its checksum
431 */
391 } else if (IS_26XX(isp)) {
392 isp_prt(isp, ISP_LOGDEBUG1, "loading firmware from flash");
393 MBSINIT(&mbs, MBOX_LOAD_FLASH_FIRMWARE, MBLOGALL, 5000000);
394 mbs.ibitm = 0x01;
395 mbs.obitm = 0x07;
396 isp_mboxcmd(isp, &mbs);
397 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
398 isp_prt(isp, ISP_LOGERR, "Flash F/W load failed");
399 return;
400 }
401 } else {
402 isp_prt(isp, ISP_LOGDEBUG2, "skipping f/w download");
403 }
404
405 /*
406 * If we loaded firmware, verify its checksum
407 */
432 if (isp->isp_loaded_fw) {
408 if (loaded_fw) {
433 MBSINIT(&mbs, MBOX_VERIFY_CHECKSUM, MBLOGNONE, 0);
434 mbs.param[1] = code_org >> 16;
435 mbs.param[2] = code_org;
436 isp_mboxcmd(isp, &mbs);
437 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
438 isp_prt(isp, ISP_LOGERR, dcrc);
439 return;
440 }
441 }
442
443 /*
444 * Now start it rolling.
445 *
446 * If we didn't actually download f/w,
447 * we still need to (re)start it.
448 */
449 MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 5000000);
409 MBSINIT(&mbs, MBOX_VERIFY_CHECKSUM, MBLOGNONE, 0);
410 mbs.param[1] = code_org >> 16;
411 mbs.param[2] = code_org;
412 isp_mboxcmd(isp, &mbs);
413 if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
414 isp_prt(isp, ISP_LOGERR, dcrc);
415 return;
416 }
417 }
418
419 /*
420 * Now start it rolling.
421 *
422 * If we didn't actually download f/w,
423 * we still need to (re)start it.
424 */
425 MBSINIT(&mbs, MBOX_EXEC_FIRMWARE, MBLOGALL, 5000000);
450 if (IS_26XX(isp)) {
451 mbs.param[1] = code_org >> 16;
452 mbs.param[2] = code_org;
453 } else {
454 mbs.param[1] = code_org >> 16;
455 mbs.param[2] = code_org;
456 if (isp->isp_loaded_fw)
457 mbs.param[3] = 0;
458 else
459 mbs.param[3] = 1;
460 }
426 mbs.param[1] = code_org >> 16;
427 mbs.param[2] = code_org;
428 if (!IS_26XX(isp))
429 mbs.param[3] = loaded_fw ? 0 : 1;
461 isp_mboxcmd(isp, &mbs);
462 if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
463 return;
464
465 /*
466 * Ask the chip for the current firmware version.
467 * This should prove that the new firmware is working.
468 */

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

3222void
3223isp_intr_respq(ispsoftc_t *isp)
3224{
3225 XS_T *xs, *cont_xs;
3226 uint8_t qe[QENTRY_LEN];
3227 isp24xx_statusreq_t *sp = (isp24xx_statusreq_t *)qe;
3228 ispstatus_cont_t *scp = (ispstatus_cont_t *)qe;
3229 isphdr_t *hp;
430 isp_mboxcmd(isp, &mbs);
431 if (mbs.param[0] != MBOX_COMMAND_COMPLETE)
432 return;
433
434 /*
435 * Ask the chip for the current firmware version.
436 * This should prove that the new firmware is working.
437 */

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

3191void
3192isp_intr_respq(ispsoftc_t *isp)
3193{
3194 XS_T *xs, *cont_xs;
3195 uint8_t qe[QENTRY_LEN];
3196 isp24xx_statusreq_t *sp = (isp24xx_statusreq_t *)qe;
3197 ispstatus_cont_t *scp = (ispstatus_cont_t *)qe;
3198 isphdr_t *hp;
3230 uint8_t *resp, *snsp;
3231 int buddaboom, completion_status, cont = 0, etype, i;
3232 int req_status_flags, req_state_flags, scsi_status;
3233 uint32_t iptr, cptr, optr, rlen, slen, sptr, totslen, resid;
3199 uint8_t *resp, *snsp, etype;
3200 uint16_t scsi_status;
3201 uint32_t iptr, cont = 0, cptr, optr, rlen, slen, sptr, totslen;
3234
3235 /*
3236 * We can't be getting this now.
3237 */
3238 if (isp->isp_state != ISP_RUNSTATE) {
3239 isp_prt(isp, ISP_LOGINFO, "respq interrupt when not ready");
3240 return;
3241 }

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

3249
3250 /*
3251 * Synchronize our view of this response queue entry.
3252 */
3253 MEMORYBARRIER(isp, SYNC_RESULT, cptr, QENTRY_LEN, -1);
3254 if (isp->isp_dblev & ISP_LOGDEBUG1)
3255 isp_print_qentry(isp, "Response Queue Entry", cptr, hp);
3256 isp_get_hdr(isp, hp, &sp->req_header);
3202
3203 /*
3204 * We can't be getting this now.
3205 */
3206 if (isp->isp_state != ISP_RUNSTATE) {
3207 isp_prt(isp, ISP_LOGINFO, "respq interrupt when not ready");
3208 return;
3209 }

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

3217
3218 /*
3219 * Synchronize our view of this response queue entry.
3220 */
3221 MEMORYBARRIER(isp, SYNC_RESULT, cptr, QENTRY_LEN, -1);
3222 if (isp->isp_dblev & ISP_LOGDEBUG1)
3223 isp_print_qentry(isp, "Response Queue Entry", cptr, hp);
3224 isp_get_hdr(isp, hp, &sp->req_header);
3225
3226 /*
3227 * Log IOCBs rejected by the firmware. We can't really do
3228 * much more about them, since it just should not happen.
3229 */
3230 if (sp->req_header.rqs_flags & RQSFLAG_BADTYPE) {
3231 isp_print_qentry(isp, "invalid entry type", cptr, hp);
3232 continue;
3233 }
3234 if (sp->req_header.rqs_flags & RQSFLAG_BADPARAM) {
3235 isp_print_qentry(isp, "invalid entry parameter", cptr, hp);
3236 continue;
3237 }
3238 if (sp->req_header.rqs_flags & RQSFLAG_BADCOUNT) {
3239 isp_print_qentry(isp, "invalid entry count", cptr, hp);
3240 continue;
3241 }
3242 if (sp->req_header.rqs_flags & RQSFLAG_BADORDER) {
3243 isp_print_qentry(isp, "invalid entry order", cptr, hp);
3244 continue;
3245 }
3246
3257 etype = sp->req_header.rqs_entry_type;
3258
3259 /* We expected Status Continuation, but got different IOCB. */
3260 if (cont > 0 && etype != RQSTYPE_STATUS_CONT) {
3261 cont = 0;
3262 isp_done(cont_xs);
3263 }
3264
3265 if (etype == RQSTYPE_RESPONSE) {
3266 isp_get_24xx_response(isp, (isp24xx_statusreq_t *)hp, sp);
3247 etype = sp->req_header.rqs_entry_type;
3248
3249 /* We expected Status Continuation, but got different IOCB. */
3250 if (cont > 0 && etype != RQSTYPE_STATUS_CONT) {
3251 cont = 0;
3252 isp_done(cont_xs);
3253 }
3254
3255 if (etype == RQSTYPE_RESPONSE) {
3256 isp_get_24xx_response(isp, (isp24xx_statusreq_t *)hp, sp);
3267 scsi_status = sp->req_scsi_status;
3268 completion_status = sp->req_completion_status;
3269 req_status_flags = 0;
3270 if ((scsi_status & 0xff) != 0)
3271 req_state_flags = RQSF_GOT_STATUS;
3272 else
3273 req_state_flags = 0;
3274 resid = sp->req_resid;
3257 /* FALLTHROUGH */
3275 } else if (etype == RQSTYPE_STATUS_CONT) {
3276 isp_get_cont_response(isp, (ispstatus_cont_t *)hp, scp);
3277 if (cont > 0) {
3258 } else if (etype == RQSTYPE_STATUS_CONT) {
3259 isp_get_cont_response(isp, (ispstatus_cont_t *)hp, scp);
3260 if (cont > 0) {
3278 i = min(cont, sizeof(scp->req_sense_data));
3279 XS_SENSE_APPEND(cont_xs, scp->req_sense_data, i);
3280 cont -= i;
3261 slen = min(cont, sizeof(scp->req_sense_data));
3262 XS_SENSE_APPEND(cont_xs, scp->req_sense_data, slen);
3263 cont -= slen;
3281 if (cont == 0) {
3282 isp_done(cont_xs);
3283 } else {
3284 isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN,
3285 "Expecting Status Continuations for %u bytes",
3286 cont);
3287 }
3288 } else {

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

3303 continue;
3304 } else {
3305 /* We don't know what was this -- log and skip. */
3306 isp_prt(isp, ISP_LOGERR, notresp, etype, cptr, optr);
3307 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
3308 continue;
3309 }
3310
3264 if (cont == 0) {
3265 isp_done(cont_xs);
3266 } else {
3267 isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN,
3268 "Expecting Status Continuations for %u bytes",
3269 cont);
3270 }
3271 } else {

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

3286 continue;
3287 } else {
3288 /* We don't know what was this -- log and skip. */
3289 isp_prt(isp, ISP_LOGERR, notresp, etype, cptr, optr);
3290 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
3291 continue;
3292 }
3293
3311 buddaboom = 0;
3312 if (sp->req_header.rqs_flags & RQSFLAG_MASK) {
3313 if (sp->req_header.rqs_flags & RQSFLAG_BADTYPE) {
3314 isp_print_qentry(isp, "invalid entry type",
3315 cptr, hp);
3316 buddaboom++;
3317 }
3318 if (sp->req_header.rqs_flags & RQSFLAG_BADPARAM) {
3319 isp_print_qentry(isp, "invalid entry parameter",
3320 cptr, hp);
3321 buddaboom++;
3322 }
3323 if (sp->req_header.rqs_flags & RQSFLAG_BADCOUNT) {
3324 isp_print_qentry(isp, "invalid entry count",
3325 cptr, hp);
3326 buddaboom++;
3327 }
3328 if (sp->req_header.rqs_flags & RQSFLAG_BADORDER) {
3329 isp_print_qentry(isp, "invalid entry order",
3330 cptr, hp);
3331 continue;
3332 }
3333 }
3334
3335 xs = isp_find_xs(isp, sp->req_handle);
3336 if (xs == NULL) {
3294 xs = isp_find_xs(isp, sp->req_handle);
3295 if (xs == NULL) {
3337 uint8_t ts = completion_status & 0xff;
3338 /*
3339 * Only whine if this isn't the expected fallout of
3340 * aborting the command or resetting the target.
3341 */
3296 /*
3297 * Only whine if this isn't the expected fallout of
3298 * aborting the command or resetting the target.
3299 */
3342 if (etype != RQSTYPE_RESPONSE) {
3343 isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (type 0x%x)", sp->req_handle, etype);
3344 } else if (ts != RQCS_ABORTED && ts != RQCS_RESET_OCCURRED) {
3345 isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (status 0x%x)", sp->req_handle, ts);
3346 }
3300 if (sp->req_completion_status != RQCS_ABORTED &&
3301 sp->req_completion_status != RQCS_RESET_OCCURRED)
3302 isp_prt(isp, ISP_LOGERR, "cannot find handle 0x%x (status 0x%x)",
3303 sp->req_handle, sp->req_completion_status);
3347 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
3348 continue;
3349 }
3304 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
3305 continue;
3306 }
3350 if (req_status_flags & RQSTF_BUS_RESET) {
3351 isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%jx bus was reset",
3352 XS_CHANNEL(xs), XS_TGT(xs), (uintmax_t)XS_LUN(xs));
3353 XS_SETERR(xs, HBA_BUSRESET);
3354 ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1);
3355 }
3356 if (buddaboom) {
3357 isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%jx buddaboom",
3358 XS_CHANNEL(xs), XS_TGT(xs), (uintmax_t)XS_LUN(xs));
3359 XS_SETERR(xs, HBA_BOTCH);
3360 }
3361
3307
3362 resp = snsp = NULL;
3308 resp = snsp = sp->req_rsp_sense;
3363 rlen = slen = totslen = 0;
3309 rlen = slen = totslen = 0;
3364 if ((scsi_status & (RQCS_RV|RQCS_SV)) != 0) {
3365 resp = sp->req_rsp_sense;
3310 scsi_status = sp->req_scsi_status;
3311 if (scsi_status & RQCS_RV) {
3366 rlen = sp->req_response_len;
3312 rlen = sp->req_response_len;
3313 snsp += rlen;
3367 }
3314 }
3368 if ((scsi_status & RQCS_SV) != 0) {
3369 /*
3370 * Fibre Channel F/W doesn't say we got status
3371 * if there's Sense Data instead. I guess they
3372 * think it goes w/o saying.
3373 */
3374 req_state_flags |= RQSF_GOT_STATUS|RQSF_GOT_SENSE;
3375 snsp = sp->req_rsp_sense + rlen;
3315 if (scsi_status & RQCS_SV) {
3376 totslen = sp->req_sense_len;
3316 totslen = sp->req_sense_len;
3377 slen = sizeof(sp->req_rsp_sense) - rlen;
3317 slen = MIN(totslen, sizeof(sp->req_rsp_sense) - rlen);
3378 }
3318 }
3379 if (slen > totslen)
3380 slen = totslen;
3381 if (req_state_flags & RQSF_GOT_STATUS)
3382 *XS_STSP(xs) = scsi_status & 0xff;
3319 *XS_STSP(xs) = scsi_status & 0xff;
3320 if (scsi_status & RQCS_RESID)
3321 XS_SET_RESID(xs, sp->req_fcp_residual);
3322 else
3323 XS_SET_RESID(xs, 0);
3383
3384 if (rlen >= 4 && resp[FCP_RSPNS_CODE_OFFSET] != 0) {
3385 const char *ptr;
3386 char lb[64];
3387 const char *rnames[10] = {
3388 "Task Management function complete",
3389 "FCP_DATA length different than FCP_BURST_LEN",
3390 "FCP_CMND fields invalid",
3391 "FCP_DATA parameter mismatch with FCP_DATA_RO",
3392 "Task Management function rejected",
3393 "Task Management function failed",
3394 NULL,
3395 NULL,
3396 "Task Management function succeeded",
3397 "Task Management function incorrect logical unit number",
3398 };
3399 uint8_t code = resp[FCP_RSPNS_CODE_OFFSET];
3324
3325 if (rlen >= 4 && resp[FCP_RSPNS_CODE_OFFSET] != 0) {
3326 const char *ptr;
3327 char lb[64];
3328 const char *rnames[10] = {
3329 "Task Management function complete",
3330 "FCP_DATA length different than FCP_BURST_LEN",
3331 "FCP_CMND fields invalid",
3332 "FCP_DATA parameter mismatch with FCP_DATA_RO",
3333 "Task Management function rejected",
3334 "Task Management function failed",
3335 NULL,
3336 NULL,
3337 "Task Management function succeeded",
3338 "Task Management function incorrect logical unit number",
3339 };
3340 uint8_t code = resp[FCP_RSPNS_CODE_OFFSET];
3400 if (code >= 10 || rnames[code] == NULL) {
3341 if (code >= nitems(rnames) || rnames[code] == NULL) {
3401 ISP_SNPRINTF(lb, sizeof(lb),
3402 "Unknown FCP Response Code 0x%x", code);
3403 ptr = lb;
3404 } else {
3405 ptr = rnames[code];
3406 }
3407 isp_xs_prt(isp, xs, ISP_LOGWARN,
3408 "FCP RESPONSE, LENGTH %u: %s CDB0=0x%02x",
3409 rlen, ptr, XS_CDBP(xs)[0] & 0xff);
3342 ISP_SNPRINTF(lb, sizeof(lb),
3343 "Unknown FCP Response Code 0x%x", code);
3344 ptr = lb;
3345 } else {
3346 ptr = rnames[code];
3347 }
3348 isp_xs_prt(isp, xs, ISP_LOGWARN,
3349 "FCP RESPONSE, LENGTH %u: %s CDB0=0x%02x",
3350 rlen, ptr, XS_CDBP(xs)[0] & 0xff);
3410 if (code != 0 && code != 8)
3351 if (code != FCP_RSPNS_TMF_DONE &&
3352 code != FCP_RSPNS_TMF_SUCCEEDED)
3411 XS_SETERR(xs, HBA_BOTCH);
3412 }
3353 XS_SETERR(xs, HBA_BOTCH);
3354 }
3413 isp_parse_status_24xx(isp, sp, xs, &resid);
3414 if ((XS_NOERR(xs) || XS_ERR(xs) == HBA_NOERROR) &&
3415 (*XS_STSP(xs) == SCSI_BUSY))
3416 XS_SETERR(xs, HBA_TGTBSY);
3417 if (req_status_flags & RQSF_XFER_COMPLETE) {
3418 XS_SET_RESID(xs, 0);
3419 } else if (scsi_status & RQCS_RESID) {
3420 XS_SET_RESID(xs, resid);
3421 } else {
3422 XS_SET_RESID(xs, 0);
3423 }
3355 isp_parse_status_24xx(isp, sp, xs);
3424 if (slen > 0) {
3425 XS_SAVE_SENSE(xs, snsp, slen);
3426 if (totslen > slen) {
3427 cont = totslen - slen;
3428 cont_xs = xs;
3429 isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN,
3430 "Expecting Status Continuations for %u bytes",
3431 cont);
3432 }
3433 }
3356 if (slen > 0) {
3357 XS_SAVE_SENSE(xs, snsp, slen);
3358 if (totslen > slen) {
3359 cont = totslen - slen;
3360 cont_xs = xs;
3361 isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN,
3362 "Expecting Status Continuations for %u bytes",
3363 cont);
3364 }
3365 }
3434 isp_prt(isp, ISP_LOGDEBUG2, "asked for %lu got raw resid %lu settled for %lu",
3435 (u_long)XS_XFRLEN(xs), (u_long)resid, (u_long)XS_GET_RESID(xs));
3436
3437 ISP_DMAFREE(isp, xs);
3438 isp_destroy_handle(isp, sp->req_handle);
3366
3367 ISP_DMAFREE(isp, xs);
3368 isp_destroy_handle(isp, sp->req_handle);
3439
3440 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
3441
3442 /* Complete command if we expect no Status Continuations. */
3443 if (cont == 0)
3444 isp_done(xs);
3445 }
3446
3447 /* We haven't received all Status Continuations, but that is it. */

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

3803#endif
3804 /* FALLTHROUGH */
3805 default:
3806 return (0);
3807 }
3808}
3809
3810static void
3369 ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
3370
3371 /* Complete command if we expect no Status Continuations. */
3372 if (cont == 0)
3373 isp_done(xs);
3374 }
3375
3376 /* We haven't received all Status Continuations, but that is it. */

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

3732#endif
3733 /* FALLTHROUGH */
3734 default:
3735 return (0);
3736 }
3737}
3738
3739static void
3811isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, uint32_t *rp)
3740isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs)
3812{
3813 int ru_marked, sv_marked;
3814 int chan = XS_CHANNEL(xs);
3815
3816 switch (sp->req_completion_status) {
3817 case RQCS_COMPLETE:
3741{
3742 int ru_marked, sv_marked;
3743 int chan = XS_CHANNEL(xs);
3744
3745 switch (sp->req_completion_status) {
3746 case RQCS_COMPLETE:
3818 if (XS_NOERR(xs)) {
3819 XS_SETERR(xs, HBA_NOERROR);
3820 }
3821 return;
3822
3823 case RQCS_DMA_ERROR:
3824 isp_xs_prt(isp, xs, ISP_LOGERR, "DMA error");
3747 return;
3748
3749 case RQCS_DMA_ERROR:
3750 isp_xs_prt(isp, xs, ISP_LOGERR, "DMA error");
3751 if (XS_NOERR(xs))
3752 XS_SETERR(xs, HBA_BOTCH);
3825 break;
3826
3827 case RQCS_TRANSPORT_ERROR:
3828 isp_xs_prt(isp, xs, ISP_LOGERR, "Transport Error");
3753 break;
3754
3755 case RQCS_TRANSPORT_ERROR:
3756 isp_xs_prt(isp, xs, ISP_LOGERR, "Transport Error");
3757 if (XS_NOERR(xs))
3758 XS_SETERR(xs, HBA_BOTCH);
3829 break;
3830
3831 case RQCS_RESET_OCCURRED:
3832 isp_xs_prt(isp, xs, ISP_LOGWARN, "reset destroyed command");
3833 FCPARAM(isp, chan)->sendmarker = 1;
3759 break;
3760
3761 case RQCS_RESET_OCCURRED:
3762 isp_xs_prt(isp, xs, ISP_LOGWARN, "reset destroyed command");
3763 FCPARAM(isp, chan)->sendmarker = 1;
3834 if (XS_NOERR(xs)) {
3764 if (XS_NOERR(xs))
3835 XS_SETERR(xs, HBA_BUSRESET);
3765 XS_SETERR(xs, HBA_BUSRESET);
3836 }
3837 return;
3838
3839 case RQCS_ABORTED:
3840 isp_xs_prt(isp, xs, ISP_LOGERR, "Command Aborted");
3841 FCPARAM(isp, chan)->sendmarker = 1;
3766 return;
3767
3768 case RQCS_ABORTED:
3769 isp_xs_prt(isp, xs, ISP_LOGERR, "Command Aborted");
3770 FCPARAM(isp, chan)->sendmarker = 1;
3842 if (XS_NOERR(xs)) {
3771 if (XS_NOERR(xs))
3843 XS_SETERR(xs, HBA_ABORTED);
3772 XS_SETERR(xs, HBA_ABORTED);
3844 }
3845 return;
3846
3847 case RQCS_TIMEOUT:
3848 isp_xs_prt(isp, xs, ISP_LOGWARN, "Command Timed Out");
3773 return;
3774
3775 case RQCS_TIMEOUT:
3776 isp_xs_prt(isp, xs, ISP_LOGWARN, "Command Timed Out");
3849 if (XS_NOERR(xs)) {
3777 if (XS_NOERR(xs))
3850 XS_SETERR(xs, HBA_CMDTIMEOUT);
3778 XS_SETERR(xs, HBA_CMDTIMEOUT);
3851 }
3852 return;
3853
3854 case RQCS_DATA_OVERRUN:
3855 XS_SET_RESID(xs, sp->req_resid);
3856 isp_xs_prt(isp, xs, ISP_LOGERR, "Data Overrun");
3779 return;
3780
3781 case RQCS_DATA_OVERRUN:
3782 XS_SET_RESID(xs, sp->req_resid);
3783 isp_xs_prt(isp, xs, ISP_LOGERR, "Data Overrun");
3857 if (XS_NOERR(xs)) {
3784 if (XS_NOERR(xs))
3858 XS_SETERR(xs, HBA_DATAOVR);
3785 XS_SETERR(xs, HBA_DATAOVR);
3859 }
3860 return;
3861
3786 return;
3787
3862 case RQCS_24XX_DRE: /* data reassembly error */
3788 case RQCS_DRE: /* data reassembly error */
3863 isp_prt(isp, ISP_LOGERR, "Chan %d data reassembly error for target %d", chan, XS_TGT(xs));
3789 isp_prt(isp, ISP_LOGERR, "Chan %d data reassembly error for target %d", chan, XS_TGT(xs));
3864 if (XS_NOERR(xs)) {
3865 XS_SETERR(xs, HBA_ABORTED);
3866 }
3867 *rp = XS_XFRLEN(xs);
3790 if (XS_NOERR(xs))
3791 XS_SETERR(xs, HBA_BOTCH);
3868 return;
3869
3792 return;
3793
3870 case RQCS_24XX_TABORT: /* aborted by target */
3794 case RQCS_TABORT: /* aborted by target */
3871 isp_prt(isp, ISP_LOGERR, "Chan %d target %d sent ABTS", chan, XS_TGT(xs));
3795 isp_prt(isp, ISP_LOGERR, "Chan %d target %d sent ABTS", chan, XS_TGT(xs));
3872 if (XS_NOERR(xs)) {
3796 if (XS_NOERR(xs))
3873 XS_SETERR(xs, HBA_ABORTED);
3797 XS_SETERR(xs, HBA_ABORTED);
3874 }
3875 return;
3876
3877 case RQCS_DATA_UNDERRUN:
3878 ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
3879 /*
3880 * We can get an underrun w/o things being marked
3881 * if we got a non-zero status.
3882 */
3883 sv_marked = (sp->req_scsi_status & (RQCS_SV|RQCS_RV)) != 0;
3884 if ((ru_marked == 0 && sv_marked == 0) ||
3885 (sp->req_resid > XS_XFRLEN(xs))) {
3886 isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not marked");
3798 return;
3799
3800 case RQCS_DATA_UNDERRUN:
3801 ru_marked = (sp->req_scsi_status & RQCS_RU) != 0;
3802 /*
3803 * We can get an underrun w/o things being marked
3804 * if we got a non-zero status.
3805 */
3806 sv_marked = (sp->req_scsi_status & (RQCS_SV|RQCS_RV)) != 0;
3807 if ((ru_marked == 0 && sv_marked == 0) ||
3808 (sp->req_resid > XS_XFRLEN(xs))) {
3809 isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not marked");
3887 if (XS_NOERR(xs)) {
3810 if (XS_NOERR(xs))
3888 XS_SETERR(xs, HBA_BOTCH);
3811 XS_SETERR(xs, HBA_BOTCH);
3889 }
3890 return;
3891 }
3892 XS_SET_RESID(xs, sp->req_resid);
3893 isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(xs)[0] & 0xff);
3812 return;
3813 }
3814 XS_SET_RESID(xs, sp->req_resid);
3815 isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(xs)[0] & 0xff);
3894 if (XS_NOERR(xs)) {
3895 XS_SETERR(xs, HBA_NOERROR);
3896 }
3897 return;
3898
3899 case RQCS_PORT_UNAVAILABLE:
3900 /*
3901 * No such port on the loop. Moral equivalent of SELTIMEO
3902 */
3903 case RQCS_PORT_LOGGED_OUT:
3904 {

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

3934 case RQCS_PORT_CHANGED:
3935 isp_prt(isp, ISP_LOGWARN, "port changed for target %d chan %d", XS_TGT(xs), chan);
3936 if (XS_NOERR(xs)) {
3937 *XS_STSP(xs) = SCSI_BUSY;
3938 XS_SETERR(xs, HBA_TGTBSY);
3939 }
3940 return;
3941
3816 return;
3817
3818 case RQCS_PORT_UNAVAILABLE:
3819 /*
3820 * No such port on the loop. Moral equivalent of SELTIMEO
3821 */
3822 case RQCS_PORT_LOGGED_OUT:
3823 {

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

3853 case RQCS_PORT_CHANGED:
3854 isp_prt(isp, ISP_LOGWARN, "port changed for target %d chan %d", XS_TGT(xs), chan);
3855 if (XS_NOERR(xs)) {
3856 *XS_STSP(xs) = SCSI_BUSY;
3857 XS_SETERR(xs, HBA_TGTBSY);
3858 }
3859 return;
3860
3942 case RQCS_24XX_ENOMEM: /* f/w resource unavailable */
3861 case RQCS_ENOMEM: /* f/w resource unavailable */
3943 isp_prt(isp, ISP_LOGWARN, "f/w resource unavailable for target %d chan %d", XS_TGT(xs), chan);
3944 if (XS_NOERR(xs)) {
3945 *XS_STSP(xs) = SCSI_BUSY;
3946 XS_SETERR(xs, HBA_TGTBSY);
3947 }
3948 return;
3949
3862 isp_prt(isp, ISP_LOGWARN, "f/w resource unavailable for target %d chan %d", XS_TGT(xs), chan);
3863 if (XS_NOERR(xs)) {
3864 *XS_STSP(xs) = SCSI_BUSY;
3865 XS_SETERR(xs, HBA_TGTBSY);
3866 }
3867 return;
3868
3950 case RQCS_24XX_TMO: /* task management overrun */
3869 case RQCS_TMO: /* task management overrun */
3951 isp_prt(isp, ISP_LOGWARN, "command for target %d overlapped task management for chan %d", XS_TGT(xs), chan);
3952 if (XS_NOERR(xs)) {
3953 *XS_STSP(xs) = SCSI_BUSY;
3954 XS_SETERR(xs, HBA_TGTBSY);
3955 }
3956 return;
3957
3958 default:
3959 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x on chan %d", sp->req_completion_status, chan);
3960 break;
3961 }
3870 isp_prt(isp, ISP_LOGWARN, "command for target %d overlapped task management for chan %d", XS_TGT(xs), chan);
3871 if (XS_NOERR(xs)) {
3872 *XS_STSP(xs) = SCSI_BUSY;
3873 XS_SETERR(xs, HBA_TGTBSY);
3874 }
3875 return;
3876
3877 default:
3878 isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x on chan %d", sp->req_completion_status, chan);
3879 break;
3880 }
3962 if (XS_NOERR(xs)) {
3881 if (XS_NOERR(xs))
3963 XS_SETERR(xs, HBA_BOTCH);
3882 XS_SETERR(xs, HBA_BOTCH);
3964 }
3965}
3966
3967#define ISP_FC_IBITS(op) ((mbpfc[((op)<<3) + 0] << 24) | (mbpfc[((op)<<3) + 1] << 16) | (mbpfc[((op)<<3) + 2] << 8) | (mbpfc[((op)<<3) + 3]))
3968#define ISP_FC_OBITS(op) ((mbpfc[((op)<<3) + 4] << 24) | (mbpfc[((op)<<3) + 5] << 16) | (mbpfc[((op)<<3) + 6] << 8) | (mbpfc[((op)<<3) + 7]))
3969
3970#define ISP_FC_OPMAP(in0, out0) 0, 0, 0, in0, 0, 0, 0, out0
3971#define ISP_FC_OPMAP_HALF(in1, in0, out1, out0) 0, 0, in1, in0, 0, 0, out1, out0
3972#define ISP_FC_OPMAP_FULL(in3, in2, in1, in0, out3, out2, out1, out0) in3, in2, in1, in0, out3, out2, out1, out0

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

4284 if (ibits & (1 << box)) {
4285 isp_prt(isp, ISP_LOGDEBUG3, "IN mbox %d = 0x%04x", box,
4286 mbp->param[box]);
4287 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
4288 }
4289 isp->isp_mboxtmp[box] = mbp->param[box] = 0;
4290 }
4291
3883}
3884
3885#define ISP_FC_IBITS(op) ((mbpfc[((op)<<3) + 0] << 24) | (mbpfc[((op)<<3) + 1] << 16) | (mbpfc[((op)<<3) + 2] << 8) | (mbpfc[((op)<<3) + 3]))
3886#define ISP_FC_OBITS(op) ((mbpfc[((op)<<3) + 4] << 24) | (mbpfc[((op)<<3) + 5] << 16) | (mbpfc[((op)<<3) + 6] << 8) | (mbpfc[((op)<<3) + 7]))
3887
3888#define ISP_FC_OPMAP(in0, out0) 0, 0, 0, in0, 0, 0, 0, out0
3889#define ISP_FC_OPMAP_HALF(in1, in0, out1, out0) 0, 0, in1, in0, 0, 0, out1, out0
3890#define ISP_FC_OPMAP_FULL(in3, in2, in1, in0, out3, out2, out1, out0) in3, in2, in1, in0, out3, out2, out1, out0

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

4202 if (ibits & (1 << box)) {
4203 isp_prt(isp, ISP_LOGDEBUG3, "IN mbox %d = 0x%04x", box,
4204 mbp->param[box]);
4205 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]);
4206 }
4207 isp->isp_mboxtmp[box] = mbp->param[box] = 0;
4208 }
4209
4292 isp->isp_lastmbxcmd = opcode;
4293 isp->isp_obits = obits;
4294 isp->isp_mboxbsy = 1;
4295
4296 /*
4297 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
4298 */
4299 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_SET_HOST_INT);
4300

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

4312 }
4313
4314 /*
4315 * Did the command time out?
4316 */
4317 if (isp->isp_mboxbsy) {
4318 isp->isp_mboxbsy = 0;
4319 isp_prt(isp, ISP_LOGWARN, "Mailbox Command (0x%x) Timeout (%uus) (%s:%d)",
4210 isp->isp_obits = obits;
4211 isp->isp_mboxbsy = 1;
4212
4213 /*
4214 * Set Host Interrupt condition so that RISC will pick up mailbox regs.
4215 */
4216 ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_SET_HOST_INT);
4217

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

4229 }
4230
4231 /*
4232 * Did the command time out?
4233 */
4234 if (isp->isp_mboxbsy) {
4235 isp->isp_mboxbsy = 0;
4236 isp_prt(isp, ISP_LOGWARN, "Mailbox Command (0x%x) Timeout (%uus) (%s:%d)",
4320 isp->isp_lastmbxcmd, to, mbp->func, mbp->lineno);
4237 opcode, to, mbp->func, mbp->lineno);
4321 mbp->param[0] = MBOX_TIMEOUT;
4322 goto out;
4323 }
4324
4325 /*
4326 * Copy back output registers.
4327 */
4328 for (box = 0; box < ISP_NMBOX(isp); box++) {

--- 305 unchanged lines hidden ---
4238 mbp->param[0] = MBOX_TIMEOUT;
4239 goto out;
4240 }
4241
4242 /*
4243 * Copy back output registers.
4244 */
4245 for (box = 0; box < ISP_NMBOX(isp); box++) {

--- 305 unchanged lines hidden ---