Home | History | Annotate | Download | only in ic

Lines Matching defs:isp

91 isp_attach(struct ispsoftc *isp)
93 device_t self = isp->isp_osinfo.dev;
96 isp->isp_state = ISP_RUNSTATE;
98 isp->isp_osinfo.adapter.adapt_dev = self;
99 isp->isp_osinfo.adapter.adapt_openings = isp->isp_maxcmds;
100 isp->isp_osinfo.loop_down_limit = 300;
106 isp->isp_osinfo.adapter.adapt_max_periph = uimin(isp->isp_maxcmds, 255);
107 isp->isp_osinfo.adapter.adapt_ioctl = ispioctl;
108 isp->isp_osinfo.adapter.adapt_request = isprequest;
109 if (isp->isp_type <= ISP_HA_SCSI_1020A) {
110 isp->isp_osinfo.adapter.adapt_minphys = ispminphys_1020;
112 isp->isp_osinfo.adapter.adapt_minphys = ispminphys;
115 callout_init(&isp->isp_osinfo.gdt, 0);
116 callout_setfunc(&isp->isp_osinfo.gdt, isp_gdt, isp);
117 callout_init(&isp->isp_osinfo.ldt, 0);
118 callout_setfunc(&isp->isp_osinfo.ldt, isp_ldt, isp);
119 if (IS_FC(isp)) {
120 if (kthread_create(PRI_NONE, 0, NULL, isp_fc_worker, isp,
121 &isp->isp_osinfo.thread, "%s:fc_thrd",
123 isp_prt(isp, ISP_LOGERR,
129 for (i = 0; i != isp->isp_osinfo.adapter.adapt_nchannels; i++) {
130 isp->isp_osinfo.chan[i].chan_adapter =
131 &isp->isp_osinfo.adapter;
132 isp->isp_osinfo.chan[i].chan_bustype = &scsi_bustype;
133 isp->isp_osinfo.chan[i].chan_channel = i;
138 isp->isp_osinfo.chan[i].chan_nluns = uimin(isp->isp_maxluns, 8);
139 if (IS_FC(isp)) {
140 isp->isp_osinfo.chan[i].chan_ntargets = MAX_FC_TARG;
141 if (ISP_CAP_2KLOGIN(isp) == 0 && MAX_FC_TARG > 256) {
142 isp->isp_osinfo.chan[i].chan_ntargets = 256;
144 isp->isp_osinfo.chan[i].chan_id = MAX_FC_TARG;
146 isp->isp_osinfo.chan[i].chan_ntargets = MAX_TARGETS;
147 isp->isp_osinfo.chan[i].chan_id =
148 SDPARAM(isp, i)->isp_initiator_id;
149 ISP_LOCK(isp);
150 (void) isp_control(isp, ISPCTL_RESET_BUS, i);
151 ISP_UNLOCK(isp);
165 struct ispsoftc *isp = device_private(self);
167 isp->isp_osinfo.mbox_sleep_ok = 1;
169 if (IS_FC(isp) && (FCPARAM(isp, 0)->isp_fwstate != FW_READY ||
170 FCPARAM(isp, 0)->isp_loopstate != LOOP_READY)) {
171 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
173 callout_schedule(&isp->isp_osinfo.ldt, isp_quickboot_time * hz);
179 for (i = 0; i < isp->isp_osinfo.adapter.adapt_nchannels; i++) {
180 config_found(self, &isp->isp_osinfo.chan[i], scsiprint,
210 struct ispsoftc *isp = device_private(chan->chan_adapter->adapt_dev);
216 int olddblev = isp->isp_dblev;
217 isp->isp_dblev = *(int *)addr;
224 if (bus < 0 || bus >= isp->isp_nchan) {
228 if (IS_FC(isp)) {
229 *(int *)addr = FCPARAM(isp, bus)->role;
231 *(int *)addr = SDPARAM(isp, bus)->role;
239 if (bus < 0 || bus >= isp->isp_nchan) {
248 if (IS_FC(isp)) {
249 *(int *)addr = FCPARAM(isp, bus)->role;
250 FCPARAM(isp, bus)->role = nr;
252 *(int *)addr = SDPARAM(isp, bus)->role;
253 SDPARAM(isp, bus)->role = nr;
259 ISP_LOCK(isp);
260 isp_reinit(isp, 0);
261 ISP_UNLOCK(isp);
266 if (IS_FC(isp)) {
268 if (bus < 0 || bus >= isp->isp_nchan) {
272 ISP_LOCK(isp);
273 if (isp_fc_runstate(isp, bus, 5 * 1000000)) {
278 ISP_UNLOCK(isp);
283 if (IS_FC(isp)) {
285 if (bus < 0 || bus >= isp->isp_nchan) {
289 ISP_LOCK(isp);
290 if (isp_control(isp, ISPCTL_SEND_LIP, bus)) {
295 ISP_UNLOCK(isp);
303 if (IS_SCSI(isp)) {
310 lp = &FCPARAM(isp, ifc->chan)->portdb[ifc->loopid];
329 sp->isp_type = isp->isp_type;
330 sp->isp_revision = isp->isp_revision;
331 ISP_LOCK(isp);
332 sp->isp_stats[ISP_INTCNT] = isp->isp_intcnt;
333 sp->isp_stats[ISP_INTBOGUS] = isp->isp_intbogus;
334 sp->isp_stats[ISP_INTMBOXC] = isp->isp_intmboxc;
335 sp->isp_stats[ISP_INGOASYNC] = isp->isp_intoasync;
336 sp->isp_stats[ISP_RSLTCCMPLT] = isp->isp_rsltccmplt;
337 sp->isp_stats[ISP_FPHCCMCPLT] = isp->isp_fphccmplt;
338 sp->isp_stats[ISP_RSCCHIWAT] = isp->isp_rscchiwater;
339 sp->isp_stats[ISP_FPCCHIWAT] = isp->isp_fpcchiwater;
340 ISP_UNLOCK(isp);
345 ISP_LOCK(isp);
346 isp->isp_intcnt = 0;
347 isp->isp_intbogus = 0;
348 isp->isp_intmboxc = 0;
349 isp->isp_intoasync = 0;
350 isp->isp_rsltccmplt = 0;
351 isp->isp_fphccmplt = 0;
352 isp->isp_rscchiwater = 0;
353 isp->isp_fpcchiwater = 0;
354 ISP_UNLOCK(isp);
362 if (bus < 0 || bus >= isp->isp_nchan) {
366 hba->fc_fw_major = ISP_FW_MAJORX(isp->isp_fwrev);
367 hba->fc_fw_minor = ISP_FW_MINORX(isp->isp_fwrev);
368 hba->fc_fw_micro = ISP_FW_MICROX(isp->isp_fwrev);
369 hba->fc_nchannels = isp->isp_nchan;
370 hba->fc_nports = isp->isp_nchan;/* XXXX 24XX STUFF? XXX */
371 if (IS_FC(isp)) {
372 hba->fc_speed = FCPARAM(isp, bus)->isp_gbspeed;
373 hba->fc_topology = FCPARAM(isp, bus)->isp_topo + 1;
374 hba->fc_loopid = FCPARAM(isp, bus)->isp_loopid;
375 hba->nvram_node_wwn = FCPARAM(isp, bus)->isp_wwnn_nvram;
376 hba->nvram_port_wwn = FCPARAM(isp, bus)->isp_wwpn_nvram;
377 hba->active_node_wwn = FCPARAM(isp, bus)->isp_wwnn;
378 hba->active_port_wwn = FCPARAM(isp, bus)->isp_wwpn;
397 if (IS_SCSI(isp)) {
402 if (bus < 0 || bus >= isp->isp_nchan) {
410 if (ISP_CAP_2KLOGIN(isp) == 0) {
448 FCPARAM(isp, bus)->sendmarker = 1;
450 ISP_LOCK(isp);
451 retval = isp_control(isp, ISPCTL_RUN_MBOXCMD, &mbs);
452 ISP_UNLOCK(isp);
465 if (IS_SCSI(isp)) {
477 if (channel >= isp->isp_nchan) {
485 if (ISP_CAP_2KLOGIN(isp)) {
491 ISP_LOCK(isp);
492 retval = isp_control(isp, ISPCTL_GET_NAMES, channel,
494 ISP_UNLOCK(isp);
515 ISP_LOCK(isp);
516 if (isp_control(isp, ISPCTL_RESET_BUS, &chan->chan_channel)) {
521 ISP_UNLOCK(isp);
530 ispcmd(struct ispsoftc *isp, XS_T *xs)
535 ISP_LOCK(isp);
536 if (isp->isp_state < ISP_RUNSTATE) {
537 ISP_DISABLE_INTS(isp);
538 isp_init(isp);
539 if (isp->isp_state != ISP_INITSTATE) {
540 ISP_ENABLE_INTS(isp);
541 ISP_UNLOCK(isp);
542 isp_prt(isp, ISP_LOGERR, "isp not at init state");
547 isp->isp_state = ISP_RUNSTATE;
548 ISP_ENABLE_INTS(isp);
556 if (IS_FC(isp) && (FCPARAM(isp, chan)->isp_fwstate != FW_READY ||
557 FCPARAM(isp, chan)->isp_loopstate != LOOP_READY) &&
558 isp->isp_osinfo.thread == NULL) {
559 ombi = isp->isp_osinfo.mbox_sleep_ok != 0;
563 isp->isp_osinfo.mbox_sleep_ok = 0;
566 if (isp->isp_osinfo.loop_checked == 0) {
568 isp->isp_osinfo.loop_checked = 1;
573 if (isp_fc_runstate(isp, XS_CHANNEL(xs), delay_time) != 0) {
575 isp->isp_osinfo.mbox_sleep_ok = ombi;
577 if (FCPARAM(isp, XS_CHANNEL(xs))->loop_seen_once == 0) {
580 ISP_UNLOCK(isp);
588 (isp->isp_osinfo.blocked || isp->isp_osinfo.paused);
589 isp->isp_osinfo.blocked = isp->isp_osinfo.paused = 0;
591 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
593 scsipi_channel_thaw(&isp->isp_osinfo.chan[chan],
598 isp->isp_osinfo.mbox_sleep_ok = ombi;
602 if (isp->isp_osinfo.paused) {
603 isp_prt(isp, ISP_LOGWARN, "I/O while paused");
606 ISP_UNLOCK(isp);
609 if (isp->isp_osinfo.blocked) {
610 isp_prt(isp, ISP_LOGWARN,
619 ISP_UNLOCK(isp);
624 ombi = isp->isp_osinfo.mbox_sleep_ok;
625 isp->isp_osinfo.mbox_sleep_ok = 0;
630 if (IS_FC(isp) && isp->isp_osinfo.wwns[XS_TGT(xs)] == 0) {
631 fcparam *fcp = FCPARAM(isp, XS_CHANNEL(xs));
638 isp->isp_osinfo.wwns[XS_TGT(xs)] =
643 isp_polled_cmd_wait(isp, xs);
644 isp->isp_osinfo.mbox_sleep_ok = ombi;
650 isp->isp_osinfo.paused = 1;
652 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
654 for (chan = 0; chan < isp->isp_nchan; chan++) {
655 scsipi_channel_freeze(&isp->isp_osinfo.chan[chan], 1);
667 if (FCPARAM(isp, XS_CHANNEL(xs))->loop_seen_once == 0) {
670 lim = isp->isp_osinfo.loop_down_limit;
672 if (isp->isp_osinfo.loop_down_time >= lim) {
673 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
675 isp->isp_osinfo.loop_down_time, lim);
680 if (isp->isp_osinfo.blocked == 0) {
681 isp->isp_osinfo.blocked = 1;
682 scsipi_channel_freeze(&isp->isp_osinfo.chan[chan], 1);
683 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
686 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
696 ISP_UNLOCK(isp);
702 struct ispsoftc *isp = device_private(chan->chan_adapter->adapt_dev);
706 ispcmd(isp, (XS_T *) arg);
714 if (IS_SCSI(isp)) {
717 sdparam *sdp = SDPARAM(isp, chan->chan_channel);
725 ISP_LOCK(isp);
730 ISP_UNLOCK(isp);
731 isp_prt(isp, ISP_LOGDEBUG1,
742 isp_polled_cmd_wait(struct ispsoftc *isp, XS_T *xs)
756 if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {
757 isp_intr(isp, isr, sema, mbox);
771 if (isp_control(isp, ISPCTL_ABORT_CMD, xs)) {
772 isp_reinit(isp, 0);
775 isp_prt(isp, ISP_LOGERR, "polled command timed out");
786 struct ispsoftc *isp = XS_ISP(xs);
789 isp_prt(isp, ISP_LOGDEBUG1,
800 if (isp->isp_osinfo.paused) {
802 isp->isp_osinfo.paused = 0;
803 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
805 for (i = 0; i < isp->isp_nchan; i++) {
806 scsipi_channel_timed_thaw(&isp->isp_osinfo.chan[i]);
810 isp_prt(isp, ISP_LOGERR,
823 struct ispsoftc *isp = XS_ISP(xs);
828 ISP_ILOCK(isp);
829 sok = isp->isp_osinfo.mbox_sleep_ok;
830 isp->isp_osinfo.mbox_sleep_ok = 0;
836 handle = isp_find_handle(isp, xs);
842 isp_prt(isp, ISP_LOGDEBUG1,
848 isp_prt(isp, ISP_LOGDEBUG1,
855 if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {
856 isp_intr(isp, isr, sema, mbox);
860 isp_prt(isp, ISP_LOGDEBUG1,
865 isp_prt(isp, ISP_LOGDEBUG1,
871 (void) isp_control(isp, ISPCTL_ABORT_CMD, arg);
877 ISP_DMAFREE(isp, xs, handle);
879 isp_destroy_handle(isp, handle);
886 isp_prt(isp, ISP_LOGDEBUG2,
890 qe = isp_getrqentry(isp);
899 isp_put_marker(isp, mp, qe);
900 ISP_SYNC_REQUEST(isp);
903 isp_prt(isp, ISP_LOGDEBUG0, "watchdog with no command");
906 isp->isp_osinfo.mbox_sleep_ok = sok;
907 ISP_IUNLOCK(isp);
923 ispsoftc_t *isp = arg;
927 isp_prt(isp, ISP_LOGDEBUG0, "GDT timer expired");
928 ISP_LOCK(isp);
930 lp = &FCPARAM(isp, 0)->portdb[dbidx];
947 FCPARAM(isp, 0)->isp_dev_map[tgt] = 0;
950 isp_prt(isp, ISP_LOGCONFIG, prom3, lp->portid, tgt,
952 isp_make_gone(isp, tgt);
955 callout_schedule(&isp->isp_osinfo.gdt, hz);
957 isp->isp_osinfo.gdt_running = 0;
958 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
961 ISP_UNLOCK(isp);
976 ispsoftc_t *isp = arg;
980 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Loop Down Timer expired");
981 ISP_LOCK(isp);
987 lp = &FCPARAM(isp, 0)->portdb[dbidx];
1013 FCPARAM(isp, 0)->isp_dev_map[tgt] = 0;
1015 isp_prt(isp, ISP_LOGCONFIG, prom3, lp->portid, tgt,
1017 isp_make_gone(isp, tgt);
1024 isp->isp_osinfo.loop_down_time = isp->isp_osinfo.loop_down_limit+1;
1025 wakeup(&isp->isp_osinfo.thread);
1026 ISP_UNLOCK(isp);
1030 isp_make_here(ispsoftc_t *isp, int tgt)
1032 isp_prt(isp, ISP_LOGINFO, "target %d has arrived", tgt);
1036 isp_make_gone(ispsoftc_t *isp, int tgt)
1038 isp_prt(isp, ISP_LOGINFO, "target %d has departed", tgt);
1044 ispsoftc_t *isp = arg;
1053 while (isp->isp_osinfo.thread != NULL) {
1056 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "checking FC state");
1057 sok = isp->isp_osinfo.mbox_sleep_ok;
1058 isp->isp_osinfo.mbox_sleep_ok = 1;
1059 lb = isp_fc_runstate(isp, chan, 250000);
1060 isp->isp_osinfo.mbox_sleep_ok = sok;
1065 isp->isp_osinfo.loop_down_time += slp;
1068 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1070 isp->isp_osinfo.loop_down_time);
1072 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1074 lb, isp->isp_osinfo.loop_down_time);
1084 if (FCPARAM(isp, 0)->loop_seen_once == 0) {
1087 lim = isp->isp_osinfo.loop_down_limit;
1089 if (isp->isp_osinfo.loop_down_time >= lim) {
1096 isp->isp_osinfo.blocked = 1;
1098 } else if (isp->isp_osinfo.loop_down_time < 10) {
1100 } else if (isp->isp_osinfo.loop_down_time < 30) {
1102 } else if (isp->isp_osinfo.loop_down_time < 60) {
1104 } else if (isp->isp_osinfo.loop_down_time < 120) {
1111 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1113 isp->isp_osinfo.loop_down_time = 0;
1115 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1117 scsipi_channel_thaw(&isp->isp_osinfo.chan[chan], 1);
1126 if (isp->isp_osinfo.blocked) {
1127 isp->isp_osinfo.blocked = 0;
1128 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1130 scsipi_channel_thaw(&isp->isp_osinfo.chan[chan], 1);
1132 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "sleep time %d", slp);
1133 tsleep(&isp->isp_osinfo.thread, PRIBIO, "ispf", slp * hz);
1143 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1153 wakeup(&isp->isp_osinfo.thread);
1165 isp_uninit(struct ispsoftc *isp)
1167 isp_lock(isp);
1171 ISP_DISABLE_INTS(isp);
1172 isp_unlock(isp);
1176 isp_async(struct ispsoftc *isp, ispasync_t cmd, ...)
1191 if (IS_SCSI(isp)) {
1200 sdp = SDPARAM(isp, bus);
1214 scsipi_async_event(&isp->isp_osinfo.chan[bus],
1223 isp_prt(isp, ISP_LOGINFO, "SCSI bus %d reset detected", bus);
1224 scsipi_async_event(&isp->isp_osinfo.chan[bus],
1249 if (isp->isp_osinfo.mbox_sleep_ok &&
1250 isp->isp_osinfo.blocked == 0 &&
1251 isp->isp_osinfo.thread) {
1252 isp->isp_osinfo.blocked = 1;
1253 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1255 scsipi_channel_freeze(&isp->isp_osinfo.chan[bus], 1);
1256 if (callout_pending(&isp->isp_osinfo.ldt) == 0) {
1257 callout_schedule(&isp->isp_osinfo.ldt,
1258 isp->isp_osinfo.loop_down_limit * hz);
1259 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1263 isp_prt(isp, ISP_LOGINFO, "%s", msg);
1271 isp_prt(isp, ISP_LOGINFO, "Loop UP");
1279 if ((FCPARAM(isp, bus)->role & ISP_ROLE_INITIATOR) &&
1281 int dbidx = lp - FCPARAM(isp, bus)->portdb;
1288 if (FCPARAM(isp, bus)->isp_dev_map[i] == 0) {
1293 FCPARAM(isp, bus)->isp_dev_map[i] = dbidx + 1;
1296 isp_prt(isp, ISP_LOGWARN, "out of target ids");
1297 isp_dump_portdb(isp, bus);
1302 isp_prt(isp, ISP_LOGCONFIG, prom2,
1309 isp_make_here(isp, tgt);
1311 isp_prt(isp, ISP_LOGCONFIG, prom,
1329 FCPARAM(isp, bus)->isp_dev_map[tgt] = 0;
1331 isp_prt(isp, ISP_LOGCONFIG, prom3,
1333 isp_make_gone(isp, tgt);
1335 isp_prt(isp, ISP_LOGCONFIG, prom,
1349 FCPARAM(isp, bus)->isp_dev_map[t] =
1350 (lp - FCPARAM(isp, bus)->portdb) + 1;
1352 isp_prt(isp, ISP_LOGCONFIG, prom2,
1360 isp_prt(isp, ISP_LOGCONFIG, prom,
1377 isp_prt(isp, ISP_LOGCONFIG, prom2,
1385 isp_prt(isp, ISP_LOGCONFIG, prom,
1409 lp->new_reserved = isp->isp_osinfo.gone_device_time;
1411 if (isp->isp_osinfo.gdt_running == 0) {
1412 isp->isp_osinfo.gdt_running = 1;
1413 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1415 callout_schedule(&isp->isp_osinfo.gdt, hz);
1418 isp_prt(isp, ISP_LOGCONFIG, prom2,
1426 isp_prt(isp, ISP_LOGCONFIG, prom,
1454 if (callout_pending(&isp->isp_osinfo.ldt)) {
1455 callout_stop(&isp->isp_osinfo.ldt);
1456 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1459 isp_prt(isp, ISP_LOGINFO, "%s", msg);
1467 if (isp->isp_osinfo.blocked == 0) {
1468 isp->isp_osinfo.blocked = 1;
1469 if (isp->isp_osinfo.thread) {
1470 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1472 scsipi_channel_freeze(&isp->isp_osinfo.chan[bus], 1);
1479 if (isp->isp_osinfo.thread) {
1480 wakeup(&isp->isp_osinfo.thread);
1482 isp_prt(isp, ISP_LOGDEBUG1, "no FC thread yet");
1489 mbox1 = ISP_READ(isp, OUTMAILBOX1);
1490 if (IS_DUALBUS(isp)) {
1491 bus = ISP_READ(isp, OUTMAILBOX6);
1495 isp_prt(isp, ISP_LOGERR,
1498 if (IS_FC(isp)) {
1499 if (isp->isp_osinfo.blocked == 0) {
1500 isp->isp_osinfo.blocked = 1;
1501 isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
1503 scsipi_channel_freeze(&isp->isp_osinfo.chan[bus], 1);
1506 mbox1 = isp->isp_osinfo.mbox_sleep_ok;
1507 isp->isp_osinfo.mbox_sleep_ok = 0;
1508 isp_reinit(isp, 0);
1509 isp->isp_osinfo.mbox_sleep_ok = mbox1;
1510 isp_async(isp, ISPASYNC_FW_RESTARTED, NULL);
1519 isp_prt(struct ispsoftc *isp, int level, const char *fmt, ...)
1522 if (level != ISP_LOGALL && (level & isp->isp_dblev) == 0) {
1525 printf("%s: ", device_xname(isp->isp_osinfo.dev));
1533 isp_xs_prt(struct ispsoftc *isp, XS_T *xs, int level, const char *fmt, ...)
1536 if (level != ISP_LOGALL && (level & isp->isp_dblev) == 0) {
1547 isp_lock(struct ispsoftc *isp)
1550 if (isp->isp_osinfo.islocked++ == 0) {
1551 isp->isp_osinfo.splsaved = s;
1558 isp_unlock(struct ispsoftc *isp)
1560 if (isp->isp_osinfo.islocked-- <= 1) {
1561 isp->isp_osinfo.islocked = 0;
1562 splx(isp->isp_osinfo.splsaved);
1579 isp_mbox_acquire(ispsoftc_t *isp)
1581 if (isp->isp_osinfo.mboxbsy) {
1584 isp->isp_osinfo.mboxcmd_done = 0;
1585 isp->isp_osinfo.mboxbsy = 1;
1591 isp_mbox_wait_complete(struct ispsoftc *isp, mbreg_t *mbp)
1600 maxc = isp->isp_mbxwrk0 + 1;
1603 if (isp->isp_osinfo.mbox_sleep_ok) {
1619 isp->isp_osinfo.mbox_sleep_ok = 0;
1620 isp->isp_osinfo.mbox_sleeping = 1;
1621 tsleep(&isp->isp_mbxworkp, PRIBIO, "ispmbx_sleep", to);
1622 isp->isp_osinfo.mbox_sleeping = 0;
1623 isp->isp_osinfo.mbox_sleep_ok = 1;
1629 if (isp->isp_osinfo.mboxcmd_done) {
1632 if (ISP_READ_ISR(isp, &isr, &sema, &mbox)) {
1633 isp_intr(isp, isr, sema, mbox);
1634 if (isp->isp_osinfo.mboxcmd_done) {
1640 if (isp->isp_osinfo.mboxcmd_done) {
1645 if (isp->isp_osinfo.mboxcmd_done == 0) {
1650 isp_prt(isp, ISP_LOGWARN,
1652 isp->isp_osinfo.mbox_sleep_ok? "Interrupting" : "Polled",
1653 isp->isp_lastmbxcmd, (intmax_t)(elapsed.tv_sec * 1000000) +
1656 isp->isp_osinfo.mboxcmd_done = 1;
1661 isp_mbox_notify_done(ispsoftc_t *isp)
1663 if (isp->isp_osinfo.mbox_sleeping) {
1664 wakeup(&isp->isp_mbxworkp);
1666 isp->isp_osinfo.mboxcmd_done = 1;
1670 isp_mbox_release(ispsoftc_t *isp)
1672 isp->isp_osinfo.mboxbsy = 0;