1 /*        $NetBSD: aic7xxx_osm.c,v 1.43 2023/08/01 21:26:28 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.43 2023/08/01 21:26:28 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                                          * reselection, 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