1 /* $NetBSD: aic7xxx_osm.c,v 1.42 2022/02/23 21:54:41 andvar Exp $ */
2
3 /*
4 * Bus independent FreeBSD shim for the aic7xxx based adaptec SCSI controllers
5 *
6 * Copyright (c) 1994-2001 Justin T. Gibbs.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions, and the following disclaimer,
14 * without modification.
15 * 2. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * Alternatively, this software may be distributed under the terms of the
19 * GNU Public License ("GPL").
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
25 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * //depot/aic7xxx/freebsd/dev/aic7xxx/aic7xxx_osm.c#12 $
34 *
35 * $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_osm.c,v 1.31 2002/11/30 19:08:58 scottl Exp $
36 */
37 /*
38 * Ported from FreeBSD by Pascal Renauld, Network Storage Solutions, Inc. - April 2003
39 */
40
41 #include <sys/cdefs.h>
42 __KERNEL_RCSID(0, "$NetBSD: aic7xxx_osm.c,v 1.42 2022/02/23 21:54:41 andvar Exp $");
43
44 #include <dev/ic/aic7xxx_osm.h>
45 #include <dev/ic/aic7xxx_inline.h>
46
47 #ifndef AHC_TMODE_ENABLE
48 #define AHC_TMODE_ENABLE 0
49 #endif
50
51
52 static void ahc_action(struct scsipi_channel *chan,
53 scsipi_adapter_req_t req, void *arg);
54 static void ahc_execute_scb(void *arg, bus_dma_segment_t *dm_segs,
55 int nsegments);
56 static int ahc_poll(struct ahc_softc *ahc, int wait);
57 static void ahc_setup_data(struct ahc_softc *ahc,
58 struct scsipi_xfer *xs, struct scb *scb);
59 static void ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb);
60 static int ahc_ioctl(struct scsipi_channel *channel, u_long cmd,
61 void *addr, int flag, struct proc *p);
62
63 static bool ahc_pmf_suspend(device_t, const pmf_qual_t *);
64 static bool ahc_pmf_resume(device_t, const pmf_qual_t *);
65 static bool ahc_pmf_shutdown(device_t, int);
66
67
68 /*
69 * Attach all the sub-devices we can find
70 */
71 int
ahc_attach(struct ahc_softc * ahc)72 ahc_attach(struct ahc_softc *ahc)
73 {
74 u_long s;
75 int i;
76 char ahc_info[256];
77
78 LIST_INIT(&ahc->pending_scbs);
79 for (i = 0; i < AHC_NUM_TARGETS; i++)
80 TAILQ_INIT(&ahc->untagged_queues[i]);
81
82 ahc_lock(ahc, &s);
83
84 ahc->sc_adapter.adapt_dev = ahc->sc_dev;
85 ahc->sc_adapter.adapt_nchannels = (ahc->features & AHC_TWIN) ? 2 : 1;
86
87 ahc->sc_adapter.adapt_openings = ahc->scb_data->numscbs - 1;
88 ahc->sc_adapter.adapt_max_periph = 16;
89
90 ahc->sc_adapter.adapt_ioctl = ahc_ioctl;
91 ahc->sc_adapter.adapt_minphys = ahc_minphys;
92 ahc->sc_adapter.adapt_request = ahc_action;
93
94 ahc->sc_channel.chan_adapter = &ahc->sc_adapter;
95 ahc->sc_channel.chan_bustype = &scsi_bustype;
96 ahc->sc_channel.chan_channel = 0;
97 ahc->sc_channel.chan_ntargets = (ahc->features & AHC_WIDE) ? 16 : 8;
98 ahc->sc_channel.chan_nluns = 8 /*AHC_NUM_LUNS*/;
99 ahc->sc_channel.chan_id = ahc->our_id;
100 ahc->sc_channel.chan_flags |= SCSIPI_CHAN_CANGROW;
101
102 if (ahc->features & AHC_TWIN) {
103 ahc->sc_channel_b = ahc->sc_channel;
104 ahc->sc_channel_b.chan_id = ahc->our_id_b;
105 ahc->sc_channel_b.chan_channel = 1;
106 }
107
108 ahc_controller_info(ahc, ahc_info, sizeof(ahc_info));
109 printf("%s: %s\n", device_xname(ahc->sc_dev), ahc_info);
110
111 if ((ahc->flags & AHC_PRIMARY_CHANNEL) == 0) {
112 ahc->sc_child = config_found(ahc->sc_dev,
113 &ahc->sc_channel, scsiprint, CFARGS_NONE);
114 if (ahc->features & AHC_TWIN)
115 ahc->sc_child_b = config_found(ahc->sc_dev,
116 &ahc->sc_channel_b, scsiprint, CFARGS_NONE);
117 } else {
118 if (ahc->features & AHC_TWIN)
119 ahc->sc_child = config_found(ahc->sc_dev,
120 &ahc->sc_channel_b, scsiprint, CFARGS_NONE);
121 ahc->sc_child_b = config_found(ahc->sc_dev,
122 &ahc->sc_channel, scsiprint, CFARGS_NONE);
123 }
124
125 ahc_intr_enable(ahc, TRUE);
126
127 if (ahc->flags & AHC_RESET_BUS_A)
128 ahc_reset_channel(ahc, 'A', TRUE);
129 if ((ahc->features & AHC_TWIN) && ahc->flags & AHC_RESET_BUS_B)
130 ahc_reset_channel(ahc, 'B', TRUE);
131
132 if (!pmf_device_register1(ahc->sc_dev,
133 ahc_pmf_suspend, ahc_pmf_resume, ahc_pmf_shutdown))
134 aprint_error_dev(ahc->sc_dev,
135 "couldn't establish power handler\n");
136
137 ahc_unlock(ahc, &s);
138 return (1);
139 }
140
141 /*
142 * XXX we should call the real suspend and resume functions here
143 * but pmf(9) stuff on cardbus backend is untested yet
144 */
145
146 static bool
ahc_pmf_suspend(device_t dev,const pmf_qual_t * qual)147 ahc_pmf_suspend(device_t dev, const pmf_qual_t *qual)
148 {
149 struct ahc_softc *sc = device_private(dev);
150 #if 0
151 return (ahc_suspend(sc) == 0);
152 #else
153 ahc_shutdown(sc);
154 return true;
155 #endif
156 }
157
158 static bool
ahc_pmf_resume(device_t dev,const pmf_qual_t * qual)159 ahc_pmf_resume(device_t dev, const pmf_qual_t *qual)
160 {
161 #if 0
162 struct ahc_softc *sc = device_private(dev);
163
164 return (ahc_resume(sc) == 0);
165 #else
166 return true;
167 #endif
168 }
169
170 static bool
ahc_pmf_shutdown(device_t dev,int howto)171 ahc_pmf_shutdown(device_t dev, int howto)
172 {
173 struct ahc_softc *sc = device_private(dev);
174
175 /* Disable all interrupt sources by resetting the controller */
176 ahc_shutdown(sc);
177
178 return true;
179 }
180
181 /*
182 * Catch an interrupt from the adapter
183 */
184 void
ahc_platform_intr(void * arg)185 ahc_platform_intr(void *arg)
186 {
187 struct ahc_softc *ahc;
188
189 ahc = arg;
190 ahc_intr(ahc);
191 }
192
193 /*
194 * We have an scb which has been processed by the
195 * adaptor, now we look to see how the operation
196 * went.
197 */
198 void
ahc_done(struct ahc_softc * ahc,struct scb * scb)199 ahc_done(struct ahc_softc *ahc, struct scb *scb)
200 {
201 struct scsipi_xfer *xs;
202 struct scsipi_periph *periph;
203 u_long s;
204
205 xs = scb->xs;
206 periph = xs->xs_periph;
207 LIST_REMOVE(scb, pending_links);
208 if ((scb->flags & SCB_UNTAGGEDQ) != 0) {
209 struct scb_tailq *untagged_q;
210 int target_offset;
211
212 target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
213 untagged_q = &ahc->untagged_queues[target_offset];
214 TAILQ_REMOVE(untagged_q, scb, links.tqe);
215 scb->flags &= ~SCB_UNTAGGEDQ;
216 ahc_run_untagged_queue(ahc, untagged_q);
217 }
218
219 callout_stop(&scb->xs->xs_callout);
220
221 if (xs->datalen) {
222 int op;
223
224 if (xs->xs_control & XS_CTL_DATA_IN)
225 op = BUS_DMASYNC_POSTREAD;
226 else
227 op = BUS_DMASYNC_POSTWRITE;
228 bus_dmamap_sync(ahc->parent_dmat, scb->dmamap, 0,
229 scb->dmamap->dm_mapsize, op);
230 bus_dmamap_unload(ahc->parent_dmat, scb->dmamap);
231 }
232
233 /*
234 * If the recovery SCB completes, we have to be
235 * out of our timeout.
236 */
237 if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
238 struct scb *list_scb;
239
240 /*
241 * We were able to complete the command successfully,
242 * so reinstate the timeouts for all other pending
243 * commands.
244 */
245 LIST_FOREACH(list_scb, &ahc->pending_scbs, pending_links) {
246 if (!(list_scb->xs->xs_control & XS_CTL_POLL)) {
247 callout_reset(&list_scb->xs->xs_callout,
248 (list_scb->xs->timeout > 1000000) ?
249 (list_scb->xs->timeout / 1000) * hz :
250 (list_scb->xs->timeout * hz) / 1000,
251 ahc_timeout, list_scb);
252 }
253 }
254
255 if (ahc_get_transaction_status(scb) == CAM_BDR_SENT
256 || ahc_get_transaction_status(scb) == CAM_REQ_ABORTED)
257 ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
258 scsipi_printaddr(xs->xs_periph);
259 printf("%s: no longer in timeout, status = %x\n",
260 ahc_name(ahc), xs->status);
261
262 scsipi_channel_thaw(&ahc->sc_channel, 1);
263 if (ahc->features & AHC_TWIN)
264 scsipi_channel_thaw(&ahc->sc_channel_b, 1);
265 }
266
267 /* Don't clobber any existing error state */
268 if (xs->error != XS_NOERROR) {
269 /* Don't clobber any existing error state */
270 } else if ((scb->flags & SCB_SENSE) != 0) {
271 /*
272 * We performed autosense retrieval.
273 *
274 * Zero any sense not transferred by the
275 * device. The SCSI spec mandates that any
276 * untransferred data should be assumed to be
277 * zero. Complete the 'bounce' of sense information
278 * through buffers accessible via bus-space by
279 * copying it into the clients csio.
280 */
281 memset(&xs->sense.scsi_sense, 0, sizeof(xs->sense.scsi_sense));
282 memcpy(&xs->sense.scsi_sense,
283 ahc_get_sense_buf(ahc, scb),
284 sizeof(xs->sense.scsi_sense));
285 xs->error = XS_SENSE;
286 }
287 if (scb->flags & SCB_FREEZE_QUEUE) {
288 scsipi_periph_thaw(periph, 1);
289 scb->flags &= ~SCB_FREEZE_QUEUE;
290 }
291
292 ahc_lock(ahc, &s);
293 ahc_free_scb(ahc, scb);
294 ahc_unlock(ahc, &s);
295
296 scsipi_done(xs);
297 }
298
299 static int
ahc_ioctl(struct scsipi_channel * channel,u_long cmd,void * addr,int flag,struct proc * p)300 ahc_ioctl(struct scsipi_channel *channel, u_long cmd, void *addr,
301 int flag, struct proc *p)
302 {
303 struct ahc_softc *ahc;
304 int s, ret = ENOTTY;
305
306 ahc = device_private(channel->chan_adapter->adapt_dev);
307
308 switch (cmd) {
309 case SCBUSIORESET:
310 s = splbio();
311 ahc_reset_channel(ahc, channel->chan_channel == 1 ? 'B' : 'A',
312 TRUE);
313 splx(s);
314 ret = 0;
315 break;
316 default:
317 break;
318 }
319
320 return ret;
321 }
322
323 static void
ahc_action(struct scsipi_channel * chan,scsipi_adapter_req_t req,void * arg)324 ahc_action(struct scsipi_channel *chan, scsipi_adapter_req_t req, void *arg)
325 {
326 struct ahc_softc *ahc;
327 int s;
328 struct ahc_initiator_tinfo *tinfo;
329 struct ahc_tmode_tstate *tstate;
330
331 ahc = device_private(chan->chan_adapter->adapt_dev);
332
333 switch (req) {
334
335 case ADAPTER_REQ_RUN_XFER:
336 {
337 struct scsipi_xfer *xs;
338 struct scsipi_periph *periph;
339 struct scb *scb;
340 struct hardware_scb *hscb;
341 u_int target_id;
342 u_int our_id;
343 u_long ss;
344
345 xs = arg;
346 periph = xs->xs_periph;
347
348 target_id = periph->periph_target;
349 our_id = ahc->our_id;
350
351 SC_DEBUG(xs->xs_periph, SCSIPI_DB3, ("ahc_action\n"));
352
353 /*
354 * get an scb to use.
355 */
356 ahc_lock(ahc, &ss);
357 if ((scb = ahc_get_scb(ahc)) == NULL) {
358 xs->error = XS_RESOURCE_SHORTAGE;
359 ahc_unlock(ahc, &ss);
360 scsipi_done(xs);
361 return;
362 }
363 ahc_unlock(ahc, &ss);
364
365 hscb = scb->hscb;
366
367 SC_DEBUG(periph, SCSIPI_DB3, ("start scb(%p)\n", scb));
368 scb->xs = xs;
369
370 /*
371 * Put all the arguments for the xfer in the scb
372 */
373 hscb->control = 0;
374 hscb->scsiid = BUILD_SCSIID(ahc, 0, target_id, our_id);
375 hscb->lun = periph->periph_lun;
376 if (xs->xs_control & XS_CTL_RESET) {
377 hscb->cdb_len = 0;
378 scb->flags |= SCB_DEVICE_RESET;
379 hscb->control |= MK_MESSAGE;
380 ahc_execute_scb(scb, NULL, 0);
381 }
382
383 ahc_setup_data(ahc, xs, scb);
384
385 break;
386 }
387 case ADAPTER_REQ_GROW_RESOURCES:
388 #ifdef AHC_DEBUG
389 printf("%s: ADAPTER_REQ_GROW_RESOURCES\n", ahc_name(ahc));
390 #endif
391 chan->chan_adapter->adapt_openings += ahc_alloc_scbs(ahc);
392 if (ahc->scb_data->numscbs >= AHC_SCB_MAX_ALLOC)
393 chan->chan_flags &= ~SCSIPI_CHAN_CANGROW;
394 return;
395
396 case ADAPTER_REQ_SET_XFER_MODE:
397 {
398 struct scsipi_xfer_mode *xm = arg;
399 struct ahc_devinfo devinfo;
400 int target_id, our_id, first;
401 u_int width;
402 char channel;
403 u_int ppr_options = 0, period, offset;
404 struct ahc_syncrate *syncrate;
405 uint16_t old_autoneg;
406
407 target_id = xm->xm_target;
408 our_id = chan->chan_id;
409 channel = (chan->chan_channel == 1) ? 'B' : 'A';
410 s = splbio();
411 tinfo = ahc_fetch_transinfo(ahc, channel, our_id, target_id,
412 &tstate);
413 ahc_compile_devinfo(&devinfo, our_id, target_id,
414 0, channel, ROLE_INITIATOR);
415
416 old_autoneg = tstate->auto_negotiate;
417
418 /*
419 * XXX since the period and offset are not provided here,
420 * fake things by forcing a renegotiation using the user
421 * settings if this is called for the first time (i.e.
422 * during probe). Also, cap various values at the user
423 * values, assuming that the user set it up that way.
424 */
425 if (ahc->inited_target[target_id] == 0) {
426 period = tinfo->user.period;
427 offset = tinfo->user.offset;
428 ppr_options = tinfo->user.ppr_options;
429 width = tinfo->user.width;
430 tstate->tagenable |=
431 (ahc->user_tagenable & devinfo.target_mask);
432 tstate->discenable |=
433 (ahc->user_discenable & devinfo.target_mask);
434 ahc->inited_target[target_id] = 1;
435 first = 1;
436 } else
437 first = 0;
438
439 if (xm->xm_mode & (PERIPH_CAP_WIDE16 | PERIPH_CAP_DT))
440 width = MSG_EXT_WDTR_BUS_16_BIT;
441 else
442 width = MSG_EXT_WDTR_BUS_8_BIT;
443
444 ahc_validate_width(ahc, NULL, &width, ROLE_UNKNOWN);
445 if (width > tinfo->user.width)
446 width = tinfo->user.width;
447 ahc_set_width(ahc, &devinfo, width, AHC_TRANS_GOAL, FALSE);
448
449 if (!(xm->xm_mode & (PERIPH_CAP_SYNC | PERIPH_CAP_DT))) {
450 period = 0;
451 offset = 0;
452 ppr_options = 0;
453 }
454
455 if ((xm->xm_mode & PERIPH_CAP_DT) &&
456 (ppr_options & MSG_EXT_PPR_DT_REQ))
457 ppr_options |= MSG_EXT_PPR_DT_REQ;
458 else
459 ppr_options &= ~MSG_EXT_PPR_DT_REQ;
460 if ((tstate->discenable & devinfo.target_mask) == 0 ||
461 (tstate->tagenable & devinfo.target_mask) == 0)
462 ppr_options &= ~MSG_EXT_PPR_IU_REQ;
463
464 if ((xm->xm_mode & PERIPH_CAP_TQING) &&
465 (ahc->user_tagenable & devinfo.target_mask))
466 tstate->tagenable |= devinfo.target_mask;
467 else
468 tstate->tagenable &= ~devinfo.target_mask;
469
470 syncrate = ahc_find_syncrate(ahc, &period, &ppr_options,
471 AHC_SYNCRATE_MAX);
472 ahc_validate_offset(ahc, NULL, syncrate, &offset,
473 width, ROLE_UNKNOWN);
474
475 if (offset == 0) {
476 period = 0;
477 ppr_options = 0;
478 }
479
480 if (ppr_options != 0
481 && tinfo->user.transport_version >= 3) {
482 tinfo->goal.transport_version =
483 tinfo->user.transport_version;
484 tinfo->curr.transport_version =
485 tinfo->user.transport_version;
486 }
487
488 ahc_set_syncrate(ahc, &devinfo, syncrate, period, offset,
489 ppr_options, AHC_TRANS_GOAL, FALSE);
490
491 /*
492 * If this is the first request, and no negotiation is
493 * needed, just confirm the state to the scsipi layer,
494 * so that it can print a message.
495 */
496 if (old_autoneg == tstate->auto_negotiate && first) {
497 xm->xm_mode = 0;
498 xm->xm_period = tinfo->curr.period;
499 xm->xm_offset = tinfo->curr.offset;
500 if (tinfo->curr.width == MSG_EXT_WDTR_BUS_16_BIT)
501 xm->xm_mode |= PERIPH_CAP_WIDE16;
502 if (tinfo->curr.period)
503 xm->xm_mode |= PERIPH_CAP_SYNC;
504 if (tstate->tagenable & devinfo.target_mask)
505 xm->xm_mode |= PERIPH_CAP_TQING;
506 if (tinfo->curr.ppr_options & MSG_EXT_PPR_DT_REQ)
507 xm->xm_mode |= PERIPH_CAP_DT;
508 scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, xm);
509 }
510 splx(s);
511 }
512 }
513
514 return;
515 }
516
517 static void
ahc_execute_scb(void * arg,bus_dma_segment_t * dm_segs,int nsegments)518 ahc_execute_scb(void *arg, bus_dma_segment_t *dm_segs, int nsegments)
519 {
520 struct scb *scb;
521 struct scsipi_xfer *xs;
522 struct ahc_softc *ahc;
523 struct ahc_initiator_tinfo *tinfo;
524 struct ahc_tmode_tstate *tstate;
525
526 u_int mask;
527 u_long s;
528
529 scb = (struct scb *)arg;
530 xs = scb->xs;
531 xs->error = 0;
532 xs->status = 0;
533 xs->xs_status = 0;
534 ahc = device_private(
535 xs->xs_periph->periph_channel->chan_adapter->adapt_dev);
536
537 if (nsegments != 0) {
538 struct ahc_dma_seg *sg;
539 bus_dma_segment_t *end_seg;
540 int op;
541
542 end_seg = dm_segs + nsegments;
543
544 /* Copy the segments into our SG list */
545 sg = scb->sg_list;
546 while (dm_segs < end_seg) {
547 uint32_t len;
548
549 sg->addr = ahc_htole32(dm_segs->ds_addr);
550 len = dm_segs->ds_len
551 | ((dm_segs->ds_addr >> 8) & AHC_SG_HIGH_ADDR_MASK);
552 sg->len = ahc_htole32(len);
553 sg++;
554 dm_segs++;
555 }
556
557 /*
558 * Note where to find the SG entries in bus space.
559 * We also set the full residual flag which the
560 * sequencer will clear as soon as a data transfer
561 * occurs.
562 */
563 scb->hscb->sgptr = ahc_htole32(scb->sg_list_phys|SG_FULL_RESID);
564
565 if (xs->xs_control & XS_CTL_DATA_IN)
566 op = BUS_DMASYNC_PREREAD;
567 else
568 op = BUS_DMASYNC_PREWRITE;
569
570 bus_dmamap_sync(ahc->parent_dmat, scb->dmamap, 0,
571 scb->dmamap->dm_mapsize, op);
572
573 sg--;
574 sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
575
576 /* Copy the first SG into the "current" data pointer area */
577 scb->hscb->dataptr = scb->sg_list->addr;
578 scb->hscb->datacnt = scb->sg_list->len;
579 } else {
580 scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
581 scb->hscb->dataptr = 0;
582 scb->hscb->datacnt = 0;
583 }
584
585 scb->sg_count = nsegments;
586
587 ahc_lock(ahc, &s);
588
589 /*
590 * Last time we need to check if this SCB needs to
591 * be aborted.
592 */
593 if (xs->xs_status & XS_STS_DONE) {
594 if (nsegments != 0)
595 bus_dmamap_unload(ahc->buffer_dmat, scb->dmamap);
596 ahc_free_scb(ahc, scb);
597 ahc_unlock(ahc, &s);
598 scsipi_done(xs);
599 return;
600 }
601
602 tinfo = ahc_fetch_transinfo(ahc, ahc->channel,
603 SCSIID_OUR_ID(scb->hscb->scsiid),
604 SCSIID_TARGET(ahc, scb->hscb->scsiid),
605 &tstate);
606
607 mask = SCB_GET_TARGET_MASK(ahc, scb);
608 scb->hscb->scsirate = tinfo->scsirate;
609 scb->hscb->scsioffset = tinfo->curr.offset;
610
611 if ((tstate->ultraenb & mask) != 0)
612 scb->hscb->control |= ULTRAENB;
613
614 if ((tstate->discenable & mask) != 0)
615 scb->hscb->control |= DISCENB;
616
617 if (xs->xs_tag_type)
618 scb->hscb->control |= xs->xs_tag_type;
619
620 #if 1 /* This looks like it makes sense at first, but it can loop */
621 if ((xs->xs_control & XS_CTL_DISCOVERY) && (tinfo->goal.width == 0
622 && tinfo->goal.offset == 0
623 && tinfo->goal.ppr_options == 0)) {
624 scb->flags |= SCB_NEGOTIATE;
625 scb->hscb->control |= MK_MESSAGE;
626 } else
627 #endif
628 if ((tstate->auto_negotiate & mask) != 0) {
629 scb->flags |= SCB_AUTO_NEGOTIATE;
630 scb->hscb->control |= MK_MESSAGE;
631 }
632
633 LIST_INSERT_HEAD(&ahc->pending_scbs, scb, pending_links);
634
635 if (!(xs->xs_control & XS_CTL_POLL)) {
636 callout_reset(&scb->xs->xs_callout, xs->timeout > 1000000 ?
637 (xs->timeout / 1000) * hz : (xs->timeout * hz) / 1000,
638 ahc_timeout, scb);
639 }
640
641 /*
642 * We only allow one untagged transaction
643 * per target in the initiator role unless
644 * we are storing a full busy target *lun*
645 * table in SCB space.
646 */
647 if ((scb->hscb->control & (TARGET_SCB|TAG_ENB)) == 0
648 && (ahc->flags & AHC_SCB_BTT) == 0) {
649 struct scb_tailq *untagged_q;
650 int target_offset;
651
652 target_offset = SCB_GET_TARGET_OFFSET(ahc, scb);
653 untagged_q = &(ahc->untagged_queues[target_offset]);
654 TAILQ_INSERT_TAIL(untagged_q, scb, links.tqe);
655 scb->flags |= SCB_UNTAGGEDQ;
656 if (TAILQ_FIRST(untagged_q) != scb) {
657 ahc_unlock(ahc, &s);
658 return;
659 }
660 }
661 scb->flags |= SCB_ACTIVE;
662
663 if ((scb->flags & SCB_TARGET_IMMEDIATE) != 0) {
664 /* Define a mapping from our tag to the SCB. */
665 ahc->scb_data->scbindex[scb->hscb->tag] = scb;
666 ahc_pause(ahc);
667 if ((ahc->flags & AHC_PAGESCBS) == 0)
668 ahc_outb(ahc, SCBPTR, scb->hscb->tag);
669 ahc_outb(ahc, TARG_IMMEDIATE_SCB, scb->hscb->tag);
670 ahc_unpause(ahc);
671 } else {
672 ahc_queue_scb(ahc, scb);
673 }
674
675 if (!(xs->xs_control & XS_CTL_POLL)) {
676 ahc_unlock(ahc, &s);
677 return;
678 }
679
680 /*
681 * If we can't use interrupts, poll for completion
682 */
683
684 SC_DEBUG(xs->xs_periph, SCSIPI_DB3, ("cmd_poll\n"));
685 do {
686 if (ahc_poll(ahc, xs->timeout)) {
687 if (!(xs->xs_control & XS_CTL_SILENT))
688 printf("cmd fail\n");
689 ahc_timeout(scb);
690 break;
691 }
692 } while (!(xs->xs_status & XS_STS_DONE));
693 ahc_unlock(ahc, &s);
694
695 return;
696 }
697
698 static int
ahc_poll(struct ahc_softc * ahc,int wait)699 ahc_poll(struct ahc_softc *ahc, int wait)
700 {
701 while (--wait) {
702 DELAY(1000);
703 if (ahc_inb(ahc, INTSTAT) & INT_PEND)
704 break;
705 }
706
707 if (wait == 0) {
708 printf("%s: board is not responding\n", ahc_name(ahc));
709 return (EIO);
710 }
711
712 ahc_intr(ahc);
713 return (0);
714 }
715
716 static void
ahc_setup_data(struct ahc_softc * ahc,struct scsipi_xfer * xs,struct scb * scb)717 ahc_setup_data(struct ahc_softc *ahc, struct scsipi_xfer *xs,
718 struct scb *scb)
719 {
720 struct hardware_scb *hscb;
721
722 hscb = scb->hscb;
723 xs->resid = xs->status = 0;
724
725 hscb->cdb_len = xs->cmdlen;
726 if (hscb->cdb_len > sizeof(hscb->cdb32)) {
727 u_long s;
728
729 ahc_set_transaction_status(scb, CAM_REQ_INVALID);
730 ahc_lock(ahc, &s);
731 ahc_free_scb(ahc, scb);
732 ahc_unlock(ahc, &s);
733 scsipi_done(xs);
734 return;
735 }
736
737 if (hscb->cdb_len > 12) {
738 memcpy(hscb->cdb32, xs->cmd, hscb->cdb_len);
739 scb->flags |= SCB_CDB32_PTR;
740 } else {
741 memcpy(hscb->shared_data.cdb, xs->cmd, hscb->cdb_len);
742 }
743
744 /* Only use S/G if there is a transfer */
745 if (xs->datalen) {
746 int error;
747
748 error = bus_dmamap_load(ahc->parent_dmat,
749 scb->dmamap, xs->data,
750 xs->datalen, NULL,
751 ((xs->xs_control & XS_CTL_NOSLEEP) ?
752 BUS_DMA_NOWAIT : BUS_DMA_WAITOK) |
753 BUS_DMA_STREAMING |
754 ((xs->xs_control & XS_CTL_DATA_IN) ?
755 BUS_DMA_READ : BUS_DMA_WRITE));
756 if (error) {
757 #ifdef AHC_DEBUG
758 printf("%s: in ahc_setup_data(): bus_dmamap_load() "
759 "= %d\n",
760 ahc_name(ahc), error);
761 #endif
762 xs->error = XS_RESOURCE_SHORTAGE;
763 scsipi_done(xs);
764 return;
765 }
766 ahc_execute_scb(scb,
767 scb->dmamap->dm_segs,
768 scb->dmamap->dm_nsegs);
769 } else {
770 ahc_execute_scb(scb, NULL, 0);
771 }
772 }
773
774 static void
ahc_set_recoveryscb(struct ahc_softc * ahc,struct scb * scb)775 ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb) {
776
777 if ((scb->flags & SCB_RECOVERY_SCB) == 0) {
778 struct scb *list_scb;
779
780 scb->flags |= SCB_RECOVERY_SCB;
781
782 /*
783 * Take all queued, but not sent SCBs out of the equation.
784 * Also ensure that no new CCBs are queued to us while we
785 * try to fix this problem.
786 */
787 scsipi_channel_freeze(&ahc->sc_channel, 1);
788 if (ahc->features & AHC_TWIN)
789 scsipi_channel_freeze(&ahc->sc_channel_b, 1);
790
791 /*
792 * Go through all of our pending SCBs and remove
793 * any scheduled timeouts for them. We will reschedule
794 * them after we've successfully fixed this problem.
795 */
796 LIST_FOREACH(list_scb, &ahc->pending_scbs, pending_links) {
797 callout_stop(&list_scb->xs->xs_callout);
798 }
799 }
800 }
801
802 void
ahc_timeout(void * arg)803 ahc_timeout(void *arg)
804 {
805 struct scb *scb;
806 struct ahc_softc *ahc;
807 u_long s;
808 int found;
809 u_int last_phase;
810 int target;
811 int lun;
812 int i;
813 char channel;
814
815 scb = arg;
816 ahc = scb->ahc_softc;
817
818 ahc_lock(ahc, &s);
819
820 ahc_pause_and_flushwork(ahc);
821
822 if ((scb->flags & SCB_ACTIVE) == 0) {
823 /* Previous timeout took care of me already */
824 printf("%s: Timedout SCB already complete. "
825 "Interrupts may not be functioning.\n", ahc_name(ahc));
826 ahc_unpause(ahc);
827 ahc_unlock(ahc, &s);
828 return;
829 }
830
831 target = SCB_GET_TARGET(ahc, scb);
832 channel = SCB_GET_CHANNEL(ahc, scb);
833 lun = SCB_GET_LUN(scb);
834
835 ahc_print_path(ahc, scb);
836 printf("SCB 0x%x - timed out\n", scb->hscb->tag);
837 ahc_dump_card_state(ahc);
838 last_phase = ahc_inb(ahc, LASTPHASE);
839 if (scb->sg_count > 0) {
840 for (i = 0; i < scb->sg_count; i++) {
841 printf("sg[%d] - Addr 0x%x : Length %d\n",
842 i,
843 scb->sg_list[i].addr,
844 scb->sg_list[i].len & AHC_SG_LEN_MASK);
845 }
846 }
847 if (scb->flags & (SCB_DEVICE_RESET|SCB_ABORT)) {
848 /*
849 * Been down this road before.
850 * Do a full bus reset.
851 */
852 bus_reset:
853 ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
854 found = ahc_reset_channel(ahc, channel, /*Initiate Reset*/TRUE);
855 printf("%s: Issued Channel %c Bus Reset. "
856 "%d SCBs aborted\n", ahc_name(ahc), channel, found);
857 } else {
858 /*
859 * If we are a target, transition to bus free and report
860 * the timeout.
861 *
862 * The target/initiator that is holding up the bus may not
863 * be the same as the one that triggered this timeout
864 * (different commands have different timeout lengths).
865 * If the bus is idle and we are acting as the initiator
866 * for this request, queue a BDR message to the timed out
867 * target. Otherwise, if the timed out transaction is
868 * active:
869 * Initiator transaction:
870 * Stuff the message buffer with a BDR message and assert
871 * ATN in the hopes that the target will let go of the bus
872 * and go to the mesgout phase. If this fails, we'll
873 * get another timeout 2 seconds later which will attempt
874 * a bus reset.
875 *
876 * Target transaction:
877 * Transition to BUS FREE and report the error.
878 * It's good to be the target!
879 */
880 u_int active_scb_index;
881 u_int saved_scbptr;
882
883 saved_scbptr = ahc_inb(ahc, SCBPTR);
884 active_scb_index = ahc_inb(ahc, SCB_TAG);
885
886 if ((ahc_inb(ahc, SEQ_FLAGS) & NOT_IDENTIFIED) == 0
887 && (active_scb_index < ahc->scb_data->numscbs)) {
888 struct scb *active_scb;
889
890 /*
891 * If the active SCB is not us, assume that
892 * the active SCB has a longer timeout than
893 * the timedout SCB, and wait for the active
894 * SCB to timeout.
895 */
896 active_scb = ahc_lookup_scb(ahc, active_scb_index);
897 if (active_scb != scb) {
898 uint64_t newtimeout;
899
900 ahc_print_path(ahc, scb);
901 printf("Other SCB Timeout%s",
902 (scb->flags & SCB_OTHERTCL_TIMEOUT) != 0
903 ? " again\n" : "\n");
904 scb->flags |= SCB_OTHERTCL_TIMEOUT;
905 newtimeout = MAX(active_scb->xs->timeout,
906 scb->xs->timeout);
907 callout_reset(&scb->xs->xs_callout,
908 newtimeout > 1000000 ?
909 (newtimeout / 1000) * hz :
910 (newtimeout * hz) / 1000,
911 ahc_timeout, scb);
912 ahc_unpause(ahc);
913 ahc_unlock(ahc, &s);
914 return;
915 }
916
917 /* It's us */
918 if ((scb->flags & SCB_TARGET_SCB) != 0) {
919
920 /*
921 * Send back any queued up transactions
922 * and properly record the error condition.
923 */
924 ahc_abort_scbs(ahc, SCB_GET_TARGET(ahc, scb),
925 SCB_GET_CHANNEL(ahc, scb),
926 SCB_GET_LUN(scb),
927 scb->hscb->tag,
928 ROLE_TARGET,
929 CAM_CMD_TIMEOUT);
930
931 /* Will clear us from the bus */
932 ahc_restart(ahc);
933 ahc_unlock(ahc, &s);
934 return;
935 }
936
937 ahc_set_recoveryscb(ahc, active_scb);
938 ahc_outb(ahc, MSG_OUT, HOST_MSG);
939 ahc_outb(ahc, SCSISIGO, last_phase|ATNO);
940 ahc_print_path(ahc, active_scb);
941 printf("BDR message in message buffer\n");
942 active_scb->flags |= SCB_DEVICE_RESET;
943 callout_reset(&active_scb->xs->xs_callout,
944 2 * hz, ahc_timeout, active_scb);
945 ahc_unpause(ahc);
946 } else {
947 int disconnected;
948
949 /* XXX Shouldn't panic. Just punt instead? */
950 if ((scb->flags & SCB_TARGET_SCB) != 0)
951 panic("Timed-out target SCB but bus idle");
952
953 if (last_phase != P_BUSFREE
954 && (ahc_inb(ahc, SSTAT0) & TARGET) != 0) {
955 /* XXX What happened to the SCB? */
956 /* Hung target selection. Goto busfree */
957 printf("%s: Hung target selection\n",
958 ahc_name(ahc));
959 ahc_restart(ahc);
960 ahc_unlock(ahc, &s);
961 return;
962 }
963
964 if (ahc_search_qinfifo(ahc, target, channel, lun,
965 scb->hscb->tag, ROLE_INITIATOR,
966 /*status*/0, SEARCH_COUNT) > 0) {
967 disconnected = FALSE;
968 } else {
969 disconnected = TRUE;
970 }
971
972 if (disconnected) {
973
974 ahc_set_recoveryscb(ahc, scb);
975 /*
976 * Actually re-queue this SCB in an attempt
977 * to select the device before it reconnects.
978 * In either case (selection or reselection),
979 * we will now issue a target reset to the
980 * timed-out device.
981 *
982 * Set the MK_MESSAGE control bit indicating
983 * that we desire to send a message. We
984 * also set the disconnected flag since
985 * in the paging case there is no guarantee
986 * that our SCB control byte matches the
987 * version on the card. We don't want the
988 * sequencer to abort the command thinking
989 * an unsolicited reselection occurred.
990 */
991 scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
992 scb->flags |= SCB_DEVICE_RESET;
993
994 /*
995 * Remove any cached copy of this SCB in the
996 * disconnected list in preparation for the
997 * queuing of our abort SCB. We use the
998 * same element in the SCB, SCB_NEXT, for
999 * both the qinfifo and the disconnected list.
1000 */
1001 ahc_search_disc_list(ahc, target, channel,
1002 lun, scb->hscb->tag,
1003 /*stop_on_first*/TRUE,
1004 /*remove*/TRUE,
1005 /*save_state*/FALSE);
1006
1007 /*
1008 * In the non-paging case, the sequencer will
1009 * never re-reference the in-core SCB.
1010 * To make sure we are notified during
1011 * reslection, set the MK_MESSAGE flag in
1012 * the card's copy of the SCB.
1013 */
1014 if ((ahc->flags & AHC_PAGESCBS) == 0) {
1015 ahc_outb(ahc, SCBPTR, scb->hscb->tag);
1016 ahc_outb(ahc, SCB_CONTROL,
1017 ahc_inb(ahc, SCB_CONTROL)
1018 | MK_MESSAGE);
1019 }
1020
1021 /*
1022 * Clear out any entries in the QINFIFO first
1023 * so we are the next SCB for this target
1024 * to run.
1025 */
1026 ahc_search_qinfifo(ahc,
1027 SCB_GET_TARGET(ahc, scb),
1028 channel, SCB_GET_LUN(scb),
1029 SCB_LIST_NULL,
1030 ROLE_INITIATOR,
1031 CAM_REQUEUE_REQ,
1032 SEARCH_COMPLETE);
1033 ahc_print_path(ahc, scb);
1034 printf("Queuing a BDR SCB\n");
1035 ahc_qinfifo_requeue_tail(ahc, scb);
1036 ahc_outb(ahc, SCBPTR, saved_scbptr);
1037 callout_reset(&scb->xs->xs_callout, 2 * hz,
1038 ahc_timeout, scb);
1039 ahc_unpause(ahc);
1040 } else {
1041 /* Go "immediately" to the bus reset */
1042 /* This shouldn't happen */
1043 ahc_set_recoveryscb(ahc, scb);
1044 ahc_print_path(ahc, scb);
1045 printf("SCB %d: Immediate reset. "
1046 "Flags = 0x%x\n", scb->hscb->tag,
1047 scb->flags);
1048 goto bus_reset;
1049 }
1050 }
1051 }
1052 ahc_unlock(ahc, &s);
1053 }
1054
1055 void
ahc_platform_set_tags(struct ahc_softc * ahc,struct ahc_devinfo * devinfo,int enable)1056 ahc_platform_set_tags(struct ahc_softc *ahc,
1057 struct ahc_devinfo *devinfo, int enable)
1058 {
1059 struct ahc_tmode_tstate *tstate;
1060
1061 ahc_fetch_transinfo(ahc, devinfo->channel, devinfo->our_scsiid,
1062 devinfo->target, &tstate);
1063
1064 if (enable)
1065 tstate->tagenable |= devinfo->target_mask;
1066 else
1067 tstate->tagenable &= ~devinfo->target_mask;
1068 }
1069
1070 int
ahc_platform_alloc(struct ahc_softc * ahc,void * platform_arg)1071 ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg)
1072 {
1073 if (sizeof(struct ahc_platform_data) == 0)
1074 return 0;
1075 ahc->platform_data = malloc(sizeof(struct ahc_platform_data), M_DEVBUF,
1076 M_WAITOK);
1077 return (0);
1078 }
1079
1080 void
ahc_platform_free(struct ahc_softc * ahc)1081 ahc_platform_free(struct ahc_softc *ahc)
1082 {
1083 if (sizeof(struct ahc_platform_data) == 0)
1084 return;
1085 free(ahc->platform_data, M_DEVBUF);
1086 }
1087
1088 int
ahc_softc_comp(struct ahc_softc * lahc,struct ahc_softc * rahc)1089 ahc_softc_comp(struct ahc_softc *lahc, struct ahc_softc *rahc)
1090 {
1091 return (0);
1092 }
1093
1094 int
ahc_detach(struct ahc_softc * ahc,int flags)1095 ahc_detach(struct ahc_softc *ahc, int flags)
1096 {
1097 int rv = 0;
1098
1099 ahc_intr_enable(ahc, FALSE);
1100 if (ahc->sc_child != NULL)
1101 rv = config_detach(ahc->sc_child, flags);
1102 if (rv == 0 && ahc->sc_child_b != NULL)
1103 rv = config_detach(ahc->sc_child_b, flags);
1104
1105 pmf_device_deregister(ahc->sc_dev);
1106 ahc_free(ahc);
1107
1108 return (rv);
1109 }
1110
1111
1112 void
ahc_send_async(struct ahc_softc * ahc,char channel,u_int target,u_int lun,ac_code code,void * opt_arg)1113 ahc_send_async(struct ahc_softc *ahc, char channel, u_int target, u_int lun,
1114 ac_code code, void *opt_arg)
1115 {
1116 struct ahc_tmode_tstate *tstate;
1117 struct ahc_initiator_tinfo *tinfo;
1118 struct ahc_devinfo devinfo;
1119 struct scsipi_channel *chan;
1120 struct scsipi_xfer_mode xm;
1121
1122 chan = channel == 'B' ? &ahc->sc_channel_b : &ahc->sc_channel;
1123 switch (code) {
1124 case AC_TRANSFER_NEG:
1125 tinfo = ahc_fetch_transinfo(ahc, channel, ahc->our_id, target,
1126 &tstate);
1127 ahc_compile_devinfo(&devinfo, ahc->our_id, target, lun,
1128 channel, ROLE_UNKNOWN);
1129 /*
1130 * Don't bother if negotiating. XXX?
1131 */
1132 if (tinfo->curr.period != tinfo->goal.period
1133 || tinfo->curr.width != tinfo->goal.width
1134 || tinfo->curr.offset != tinfo->goal.offset
1135 || tinfo->curr.ppr_options != tinfo->goal.ppr_options)
1136 break;
1137 xm.xm_target = target;
1138 xm.xm_mode = 0;
1139 xm.xm_period = tinfo->curr.period;
1140 xm.xm_offset = tinfo->curr.offset;
1141 if (tinfo->curr.width == MSG_EXT_WDTR_BUS_16_BIT)
1142 xm.xm_mode |= PERIPH_CAP_WIDE16;
1143 if (tinfo->curr.period)
1144 xm.xm_mode |= PERIPH_CAP_SYNC;
1145 if (tstate->tagenable & devinfo.target_mask)
1146 xm.xm_mode |= PERIPH_CAP_TQING;
1147 if (tinfo->curr.ppr_options & MSG_EXT_PPR_DT_REQ)
1148 xm.xm_mode |= PERIPH_CAP_DT;
1149 scsipi_async_event(chan, ASYNC_EVENT_XFER_MODE, &xm);
1150 break;
1151 case AC_BUS_RESET:
1152 scsipi_async_event(chan, ASYNC_EVENT_RESET, NULL);
1153 case AC_SENT_BDR:
1154 default:
1155 break;
1156 }
1157 }
1158