]> git.pld-linux.org Git - packages/kernel.git/blame - linux-2.4.24-aic79xxx-20031222.patch
- added description of djurban's branch
[packages/kernel.git] / linux-2.4.24-aic79xxx-20031222.patch
CommitLineData
120e4013
AM
1diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7770.c linux-2.4.24/drivers/scsi/aic7xxx/aic7770.c
2--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7770.c 2004-01-08 11:57:43.070993176 +0100
3+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7770.c 2003-12-22 22:46:59.000000000 +0100
4@@ -37,9 +37,7 @@
5 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
6 * POSSIBILITY OF SUCH DAMAGES.
7 *
8- * $Id$
9- *
10- * $FreeBSD$
11+ * $Id$
12 */
13
14 #ifdef __linux__
15@@ -175,7 +175,7 @@
16 case 15:
17 break;
18 default:
19- printf("aic7770_config: illegal irq setting %d\n", intdef);
20+ printf("aic7770_config: invalid irq setting %d\n", intdef);
21 return (ENXIO);
22 }
23
24diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7770_osm.c linux-2.4.24/drivers/scsi/aic7xxx/aic7770_osm.c
25--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7770_osm.c 2004-01-08 11:57:43.069993382 +0100
26+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7770_osm.c 2003-12-22 22:46:59.000000000 +0100
27@@ -36,7 +36,7 @@
28 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGES.
30 *
31- * $Id$
32+ * $Id$
33 */
34
35 #include "aic7xxx_osm.h"
36@@ -190,6 +190,7 @@
37 free(name, M_DEVBUF);
38 return (ENOMEM);
39 }
40+ ahc->dev_softc = dev;
41 error = aic7770_config(ahc, entry, eisaBase);
42 if (error != 0) {
43 ahc->bsh.ioport = 0;
44@@ -267,12 +268,14 @@
45 if (ahc != NULL) {
46 u_long s;
47
48+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
49+ ahc_list_unlock(&l);
50 ahc_lock(ahc, &s);
51 ahc_intr_enable(ahc, FALSE);
52 ahc_unlock(ahc, &s);
53 ahc_free(ahc);
54- }
55- ahc_list_unlock(&l);
56+ } else
57+ ahc_list_unlock(&l);
58
59 return (0);
60 }
61diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_core.c linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_core.c
62--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_core.c 2004-01-08 11:57:43.062994829 +0100
63+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_core.c 2003-12-22 22:46:59.000000000 +0100
64@@ -37,9 +37,7 @@
65 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
66 * POSSIBILITY OF SUCH DAMAGES.
67 *
68- * $Id$
69- *
70- * $FreeBSD$
71+ * $Id$
72 */
73
74 #ifdef __linux__
75@@ -224,6 +224,14 @@
76 static void ahd_download_instr(struct ahd_softc *ahd,
77 u_int instrptr, uint8_t *dconsts);
78 static int ahd_probe_stack_size(struct ahd_softc *ahd);
79+static void ahd_other_scb_timeout(struct ahd_softc *ahd,
80+ struct scb *scb,
81+ struct scb *other_scb);
82+static int ahd_scb_active_in_fifo(struct ahd_softc *ahd,
83+ struct scb *scb);
84+static void ahd_run_data_fifo(struct ahd_softc *ahd,
85+ struct scb *scb);
86+
87 #ifdef AHD_TARGET_MODE
88 static void ahd_queue_lstate_event(struct ahd_softc *ahd,
89 struct ahd_tmode_lstate *lstate,
90@@ -328,10 +336,7 @@
91 /* Always allow reselection */
92 ahd_outb(ahd, SCSISEQ1,
93 ahd_inb(ahd, SCSISEQ_TEMPLATE) & (ENSELI|ENRSELI|ENAUTOATNP));
94- /* Ensure that no DMA operations are in progress */
95 ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
96- ahd_outb(ahd, SCBHCNT, 0);
97- ahd_outb(ahd, CCSCBCTL, CCSCBRESET);
98 ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
99 ahd_unpause(ahd);
100 }
101@@ -371,31 +376,119 @@
102 u_int next_scbid;
103
104 saved_modes = ahd_save_modes(ahd);
105- ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
106+
107+ /*
108+ * Flush the good status FIFO for completed packetized commands.
109+ */
110+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
111 saved_scbptr = ahd_get_scbptr(ahd);
112+ while ((ahd_inb(ahd, LQISTAT2) & LQIGSAVAIL) != 0) {
113+ u_int fifo_mode;
114+ u_int i;
115+
116+ scbid = ahd_inw(ahd, GSFIFO);
117+ scb = ahd_lookup_scb(ahd, scbid);
118+ if (scb == NULL) {
119+ printf("%s: Warning - GSFIFO SCB %d invalid\n",
120+ ahd_name(ahd), scbid);
121+ continue;
122+ }
123+ /*
124+ * Determine if this transaction is still active in
125+ * any FIFO. If it is, we must flush that FIFO to
126+ * the host before completing the command.
127+ */
128+ fifo_mode = 0;
129+rescan_fifos:
130+ for (i = 0; i < 2; i++) {
131+ /* Toggle to the other mode. */
132+ fifo_mode ^= 1;
133+ ahd_set_modes(ahd, fifo_mode, fifo_mode);
134+
135+ if (ahd_scb_active_in_fifo(ahd, scb) == 0)
136+ continue;
137+
138+ ahd_run_data_fifo(ahd, scb);
139+
140+ /*
141+ * Running this FIFO may cause a CFG4DATA for
142+ * this same transaction to assert in the other
143+ * FIFO or a new snapshot SAVEPTRS interrupt
144+ * in this FIFO. Even running a FIFO may not
145+ * clear the transaction if we are still waiting
146+ * for data to drain to the host. We must loop
147+ * until the transaction is not active in either
148+ * FIFO just to be sure. Reset our loop counter
149+ * so we will visit both FIFOs again before
150+ * declaring this transaction finished. We
151+ * also delay a bit so that status has a chance
152+ * to change before we look at this FIFO again.
153+ */
154+ aic_delay(200);
155+ goto rescan_fifos;
156+ }
157+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
158+ ahd_set_scbptr(ahd, scbid);
159+ if ((ahd_inb_scbram(ahd, SCB_SGPTR) & SG_LIST_NULL) == 0
160+ && ((ahd_inb_scbram(ahd, SCB_SGPTR) & SG_FULL_RESID) != 0
161+ || (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR)
162+ & SG_LIST_NULL) != 0)) {
163+ u_int comp_head;
164+
165+ /*
166+ * The transfer completed with a residual.
167+ * Place this SCB on the complete DMA list
168+ * so that we update our in-core copy of the
169+ * SCB before completing the command.
170+ */
171+ ahd_outb(ahd, SCB_SCSI_STATUS, 0);
172+ ahd_outb(ahd, SCB_SGPTR,
173+ ahd_inb_scbram(ahd, SCB_SGPTR)
174+ | SG_STATUS_VALID);
175+ ahd_outw(ahd, SCB_TAG, SCB_GET_TAG(scb));
176+ comp_head = ahd_inw(ahd, COMPLETE_DMA_SCB_HEAD);
177+ ahd_outw(ahd, SCB_NEXT_COMPLETE, comp_head);
178+ ahd_outw(ahd, COMPLETE_DMA_SCB_HEAD, SCB_GET_TAG(scb));
179+ } else
180+ ahd_complete_scb(ahd, scb);
181+ }
182+ ahd_set_scbptr(ahd, saved_scbptr);
183+
184+ /*
185+ * Setup for command channel portion of flush.
186+ */
187+ ahd_set_modes(ahd, AHD_MODE_CCHAN, AHD_MODE_CCHAN);
188
189 /*
190 * Wait for any inprogress DMA to complete and clear DMA state
191 * if this if for an SCB in the qinfifo.
192 */
193- while ((ccscbctl = ahd_inb(ahd, CCSCBCTL) & (CCARREN|CCSCBEN)) != 0) {
194+ while (((ccscbctl = ahd_inb(ahd, CCSCBCTL)) & (CCARREN|CCSCBEN)) != 0) {
195
196 if ((ccscbctl & (CCSCBDIR|CCARREN)) == (CCSCBDIR|CCARREN)) {
197 if ((ccscbctl & ARRDONE) != 0)
198 break;
199 } else if ((ccscbctl & CCSCBDONE) != 0)
200 break;
201- ahd_delay(200);
202+ aic_delay(200);
203 }
204- if ((ccscbctl & CCSCBDIR) != 0)
205+ /*
206+ * We leave the sequencer to cleanup in the case of DMA's to
207+ * update the qoutfifo. In all other cases (DMA's to the
208+ * chip or a push of an SCB from the COMPLETE_DMA_SCB list),
209+ * we disable the DMA engine so that the sequencer will not
210+ * attempt to handle the DMA completion.
211+ */
212+ if ((ccscbctl & CCSCBDIR) != 0 || (ccscbctl & ARRDONE) != 0)
213 ahd_outb(ahd, CCSCBCTL, ccscbctl & ~(CCARREN|CCSCBEN));
214
215 /*
216- * Complete any SCBs that just finished being
217- * DMA'ed into the qoutfifo.
218+ * Complete any SCBs that just finished
219+ * being DMA'ed into the qoutfifo.
220 */
221 ahd_run_qoutfifo(ahd);
222
223+ saved_scbptr = ahd_get_scbptr(ahd);
224 /*
225 * Manually update/complete any completed SCBs that are waiting to be
226 * DMA'ed back up to the host.
227@@ -438,31 +531,272 @@
228 scbid = next_scbid;
229 }
230 ahd_outw(ahd, COMPLETE_SCB_HEAD, SCB_LIST_NULL);
231- ahd_set_scbptr(ahd, saved_scbptr);
232-
233- /*
234- * Flush the good status FIFO for compelted packetized commands.
235- */
236- ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
237- while ((ahd_inb(ahd, LQISTAT2) & LQIGSAVAIL) != 0) {
238- scbid = (ahd_inb(ahd, GSFIFO+1) << 8)
239- | ahd_inb(ahd, GSFIFO);
240- scb = ahd_lookup_scb(ahd, scbid);
241- if (scb == NULL) {
242- printf("%s: Warning - GSFIFO SCB %d invalid\n",
243- ahd_name(ahd), scbid);
244- continue;
245- }
246- ahd_complete_scb(ahd, scb);
247- }
248
249 /*
250 * Restore state.
251 */
252+ ahd_set_scbptr(ahd, saved_scbptr);
253 ahd_restore_modes(ahd, saved_modes);
254 ahd->flags |= AHD_UPDATE_PEND_CMDS;
255 }
256
257+/*
258+ * Determine if an SCB for a packetized transaction
259+ * is active in a FIFO.
260+ */
261+static int
262+ahd_scb_active_in_fifo(struct ahd_softc *ahd, struct scb *scb)
263+{
264+
265+ /*
266+ * The FIFO is only active for our transaction if
267+ * the SCBPTR matches the SCB's ID and the firmware
268+ * has installed a handler for the FIFO or we have
269+ * a pending SAVEPTRS or CFG4DATA interrupt.
270+ */
271+ if (ahd_get_scbptr(ahd) != SCB_GET_TAG(scb)
272+ || ((ahd_inb(ahd, LONGJMP_ADDR+1) & INVALID_ADDR) != 0
273+ && (ahd_inb(ahd, SEQINTSRC) & (CFG4DATA|SAVEPTRS)) == 0))
274+ return (0);
275+
276+ return (1);
277+}
278+
279+/*
280+ * Run a data fifo to completion for a transaction we know
281+ * has completed across the SCSI bus (good status has been
282+ * received). We are already set to the correct FIFO mode
283+ * on entry to this routine.
284+ *
285+ * This function attempts to operate exactly as the firmware
286+ * would when running this FIFO. Care must be taken to update
287+ * this routine any time the firmware's FIFO algorithm is
288+ * changed.
289+ */
290+static void
291+ahd_run_data_fifo(struct ahd_softc *ahd, struct scb *scb)
292+{
293+ u_int seqintsrc;
294+
295+ seqintsrc = ahd_inb(ahd, SEQINTSRC);
296+ if ((seqintsrc & CFG4DATA) != 0) {
297+ uint32_t datacnt;
298+ uint32_t sgptr;
299+
300+ /*
301+ * Clear full residual flag.
302+ */
303+ sgptr = ahd_inl_scbram(ahd, SCB_SGPTR) & ~SG_FULL_RESID;
304+ ahd_outb(ahd, SCB_SGPTR, sgptr);
305+
306+ /*
307+ * Load datacnt and address.
308+ */
309+ datacnt = ahd_inl_scbram(ahd, SCB_DATACNT);
310+ if ((datacnt & AHD_DMA_LAST_SEG) != 0) {
311+ sgptr |= LAST_SEG;
312+ ahd_outb(ahd, SG_STATE, 0);
313+ } else
314+ ahd_outb(ahd, SG_STATE, LOADING_NEEDED);
315+ ahd_outq(ahd, HADDR, ahd_inq_scbram(ahd, SCB_DATAPTR));
316+ ahd_outl(ahd, HCNT, datacnt & AHD_SG_LEN_MASK);
317+ ahd_outb(ahd, SG_CACHE_PRE, sgptr);
318+ ahd_outb(ahd, DFCNTRL, PRELOADEN|SCSIEN|HDMAEN);
319+
320+ /*
321+ * Initialize Residual Fields.
322+ */
323+ ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, datacnt >> 24);
324+ ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr & SG_PTR_MASK);
325+
326+ /*
327+ * Mark the SCB as having a FIFO in use.
328+ */
329+ ahd_outb(ahd, SCB_FIFO_USE_COUNT,
330+ ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) + 1);
331+
332+ /*
333+ * Install a "fake" handler for this FIFO.
334+ */
335+ ahd_outw(ahd, LONGJMP_ADDR, 0);
336+
337+ /*
338+ * Notify the hardware that we have satisfied
339+ * this sequencer interrupt.
340+ */
341+ ahd_outb(ahd, CLRSEQINTSRC, CLRCFG4DATA);
342+ } else if ((seqintsrc & SAVEPTRS) != 0) {
343+ uint32_t sgptr;
344+ uint32_t resid;
345+
346+ if ((ahd_inb(ahd, LONGJMP_ADDR+1)&INVALID_ADDR) != 0) {
347+ /*
348+ * Snapshot Save Pointers. All that
349+ * is necessary to clear the snapshot
350+ * is a CLRCHN.
351+ */
352+ goto clrchn;
353+ }
354+
355+ /*
356+ * Disable S/G fetch so the DMA engine
357+ * is available to future users.
358+ */
359+ if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0)
360+ ahd_outb(ahd, CCSGCTL, 0);
361+ ahd_outb(ahd, SG_STATE, 0);
362+
363+ /*
364+ * Flush the data FIFO. Strickly only
365+ * necessary for Rev A parts.
366+ */
367+ ahd_outb(ahd, DFCNTRL, ahd_inb(ahd, DFCNTRL) | FIFOFLUSH);
368+
369+ /*
370+ * Calculate residual.
371+ */
372+ sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
373+ resid = ahd_inl(ahd, SHCNT);
374+ resid |= ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT+3) << 24;
375+ ahd_outl(ahd, SCB_RESIDUAL_DATACNT, resid);
376+ if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG) == 0) {
377+ /*
378+ * Must back up to the correct S/G element.
379+ * Typically this just means resetting our
380+ * low byte to the offset in the SG_CACHE,
381+ * but if we wrapped, we have to correct
382+ * the other bytes of the sgptr too.
383+ */
384+ if ((ahd_inb(ahd, SG_CACHE_SHADOW) & 0x80) != 0
385+ && (sgptr & 0x80) == 0)
386+ sgptr -= 0x100;
387+ sgptr &= ~0xFF;
388+ sgptr |= ahd_inb(ahd, SG_CACHE_SHADOW)
389+ & SG_ADDR_MASK;
390+ ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
391+ ahd_outb(ahd, SCB_RESIDUAL_DATACNT + 3, 0);
392+ } else if ((resid & AHD_SG_LEN_MASK) == 0) {
393+ ahd_outb(ahd, SCB_RESIDUAL_SGPTR,
394+ sgptr | SG_LIST_NULL);
395+ }
396+ /*
397+ * Save Pointers.
398+ */
399+ ahd_outq(ahd, SCB_DATAPTR, ahd_inq(ahd, SHADDR));
400+ ahd_outl(ahd, SCB_DATACNT, resid);
401+ ahd_outl(ahd, SCB_SGPTR, sgptr);
402+ ahd_outb(ahd, CLRSEQINTSRC, CLRSAVEPTRS);
403+ ahd_outb(ahd, SEQIMODE,
404+ ahd_inb(ahd, SEQIMODE) | ENSAVEPTRS);
405+ /*
406+ * If the data is to the SCSI bus, we are
407+ * done, otherwise wait for FIFOEMP.
408+ */
409+ if ((ahd_inb(ahd, DFCNTRL) & DIRECTION) != 0)
410+ goto clrchn;
411+ } else if ((ahd_inb(ahd, SG_STATE) & LOADING_NEEDED) != 0) {
412+ uint32_t sgptr;
413+ uint64_t data_addr;
414+ uint32_t data_len;
415+ u_int dfcntrl;
416+
417+ /*
418+ * Disable S/G fetch so the DMA engine
419+ * is available to future users. We won't
420+ * be using the DMA engine to load segments.
421+ */
422+ if ((ahd_inb(ahd, SG_STATE) & FETCH_INPROG) != 0) {
423+ ahd_outb(ahd, CCSGCTL, 0);
424+ ahd_outb(ahd, SG_STATE, LOADING_NEEDED);
425+ }
426+
427+ /*
428+ * Wait for the DMA engine to notice that the
429+ * host transfer is enabled and that there is
430+ * space in the S/G FIFO for new segments before
431+ * loading more segments.
432+ */
433+ if ((ahd_inb(ahd, DFSTATUS) & PRELOAD_AVAIL) != 0
434+ && (ahd_inb(ahd, DFCNTRL) & HDMAENACK) != 0) {
435+
436+ /*
437+ * Determine the offset of the next S/G
438+ * element to load.
439+ */
440+ sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
441+ sgptr &= SG_PTR_MASK;
442+ if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) {
443+ struct ahd_dma64_seg *sg;
444+
445+ sg = ahd_sg_bus_to_virt(ahd, scb, sgptr);
446+ data_addr = sg->addr;
447+ data_len = sg->len;
448+ sgptr += sizeof(*sg);
449+ } else {
450+ struct ahd_dma_seg *sg;
451+
452+ sg = ahd_sg_bus_to_virt(ahd, scb, sgptr);
453+ data_addr = sg->len & AHD_SG_HIGH_ADDR_MASK;
454+ data_addr <<= 8;
455+ data_addr |= sg->addr;
456+ data_len = sg->len;
457+ sgptr += sizeof(*sg);
458+ }
459+
460+ /*
461+ * Update residual information.
462+ */
463+ ahd_outb(ahd, SCB_RESIDUAL_DATACNT+3, data_len >> 24);
464+ ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
465+
466+ /*
467+ * Load the S/G.
468+ */
469+ if (data_len & AHD_DMA_LAST_SEG) {
470+ sgptr |= LAST_SEG;
471+ ahd_outb(ahd, SG_STATE, 0);
472+ }
473+ ahd_outq(ahd, HADDR, data_addr);
474+ ahd_outl(ahd, HCNT, data_len & AHD_SG_LEN_MASK);
475+ ahd_outb(ahd, SG_CACHE_PRE, sgptr & 0xFF);
476+
477+ /*
478+ * Advertise the segment to the hardware.
479+ */
480+ dfcntrl = ahd_inb(ahd, DFCNTRL)|PRELOADEN|HDMAEN;
481+ if ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0) {
482+ /*
483+ * Use SCSIENWRDIS so that SCSIEN
484+ * is never modified by this
485+ * operation.
486+ */
487+ dfcntrl |= SCSIENWRDIS;
488+ }
489+ ahd_outb(ahd, DFCNTRL, dfcntrl);
490+ }
491+ } else if ((ahd_inb(ahd, SG_CACHE_SHADOW) & LAST_SEG_DONE) != 0) {
492+
493+ /*
494+ * Transfer completed to the end of SG list
495+ * and has flushed to the host.
496+ */
497+ ahd_outb(ahd, SCB_SGPTR,
498+ ahd_inb_scbram(ahd, SCB_SGPTR) | SG_LIST_NULL);
499+ goto clrchn;
500+ } else if ((ahd_inb(ahd, DFSTATUS) & FIFOEMP) != 0) {
501+clrchn:
502+ /*
503+ * Clear any handler for this FIFO, decrement
504+ * the FIFO use count for the SCB, and release
505+ * the FIFO.
506+ */
507+ ahd_outb(ahd, LONGJMP_ADDR + 1, INVALID_ADDR);
508+ ahd_outb(ahd, SCB_FIFO_USE_COUNT,
509+ ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT) - 1);
510+ ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
511+ }
512+}
513+
514 void
515 ahd_run_qoutfifo(struct ahd_softc *ahd)
516 {
517@@ -476,7 +810,7 @@
518 while ((ahd->qoutfifo[ahd->qoutfifonext]
519 & QOUTFIFO_ENTRY_VALID_LE) == ahd->qoutfifonext_valid_tag) {
520
521- scb_index = ahd_le16toh(ahd->qoutfifo[ahd->qoutfifonext]
522+ scb_index = aic_le16toh(ahd->qoutfifo[ahd->qoutfifonext]
523 & ~QOUTFIFO_ENTRY_VALID_LE);
524 scb = ahd_lookup_scb(ahd, scb_index);
525 if (scb == NULL) {
526@@ -556,26 +890,6 @@
527 ahd_name(ahd), seqintcode);
528 #endif
529 switch (seqintcode) {
530- case BAD_SCB_STATUS:
531- {
532- struct scb *scb;
533- u_int scbid;
534- int cmds_pending;
535-
536- scbid = ahd_get_scbptr(ahd);
537- scb = ahd_lookup_scb(ahd, scbid);
538- if (scb != NULL) {
539- ahd_complete_scb(ahd, scb);
540- } else {
541- printf("%s: WARNING no command for scb %d "
542- "(bad status)\n", ahd_name(ahd), scbid);
543- ahd_dump_card_state(ahd);
544- }
545- cmds_pending = ahd_inw(ahd, CMDS_PENDING);
546- if (cmds_pending > 0)
547- ahd_outw(ahd, CMDS_PENDING, cmds_pending - 1);
548- break;
549- }
550 case ENTERING_NONPACK:
551 {
552 struct scb *scb;
553@@ -589,7 +903,7 @@
554 /*
555 * Somehow need to know if this
556 * is from a selection or reselection.
557- * From that, we can termine target
558+ * From that, we can determine target
559 * ID so we at least have an I_T nexus.
560 */
561 } else {
562@@ -740,11 +1054,11 @@
563 ahd_outb(ahd, SAVED_LUN, 0);
564 ahd_outb(ahd, SEQ_FLAGS, 0);
565 ahd_assert_atn(ahd);
566- scb->flags &= ~(SCB_PACKETIZED);
567+ scb->flags &= ~SCB_PACKETIZED;
568 scb->flags |= SCB_ABORT|SCB_CMDPHASE_ABORT;
569 ahd_freeze_devq(ahd, scb);
570- ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
571- ahd_freeze_scb(scb);
572+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
573+ aic_freeze_scb(scb);
574
575 /*
576 * Allow the sequencer to continue with
577@@ -796,7 +1110,8 @@
578 * attempt to complete this bogus SCB.
579 */
580 ahd_outb(ahd, SCB_CONTROL,
581- ahd_inb(ahd, SCB_CONTROL) & ~STATUS_RCVD);
582+ ahd_inb_scbram(ahd, SCB_CONTROL)
583+ & ~STATUS_RCVD);
584 }
585 break;
586 }
587@@ -991,7 +1306,7 @@
588 "NumSGs = %d.\n",
589 ahd_inb(ahd, SEQ_FLAGS) & DPHASE
590 ? "Have" : "Haven't",
591- ahd_get_transfer_length(scb), scb->sg_count);
592+ aic_get_transfer_length(scb), scb->sg_count);
593 ahd_dump_sglist(scb);
594 }
595 #endif
596@@ -1001,8 +1316,8 @@
597 * target does a command complete.
598 */
599 ahd_freeze_devq(ahd, scb);
600- ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
601- ahd_freeze_scb(scb);
602+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
603+ aic_freeze_scb(scb);
604 break;
605 }
606 case MKMSG_FAILED:
607@@ -1029,7 +1344,7 @@
608 ROLE_INITIATOR, /*status*/0,
609 SEARCH_REMOVE);
610 ahd_outb(ahd, SCB_CONTROL,
611- ahd_inb(ahd, SCB_CONTROL) & ~MK_MESSAGE);
612+ ahd_inb_scbram(ahd, SCB_CONTROL) & ~MK_MESSAGE);
613 break;
614 }
615 case TASKMGMT_FUNC_COMPLETE:
616@@ -1263,7 +1578,7 @@
617 */
618 ahd_scb_devinfo(ahd, &devinfo, scb);
619 ahd_force_renegotiation(ahd, &devinfo);
620- ahd_set_transaction_status(scb, CAM_SEL_TIMEOUT);
621+ aic_set_transaction_status(scb, CAM_SEL_TIMEOUT);
622 ahd_freeze_devq(ahd, scb);
623 }
624 ahd_outb(ahd, CLRINT, CLRSCSIINT);
625@@ -1710,8 +2025,8 @@
626 }
627 scb->crc_retry_count++;
628 } else {
629- ahd_set_transaction_status(scb, CAM_UNCOR_PARITY);
630- ahd_freeze_scb(scb);
631+ aic_set_transaction_status(scb, CAM_UNCOR_PARITY);
632+ aic_freeze_scb(scb);
633 ahd_freeze_devq(ahd, scb);
634 }
635 /* Return unpausing the sequencer. */
636@@ -1853,7 +2168,7 @@
637 && ahd_match_scb(ahd, scb, target, 'A',
638 CAM_LUN_WILDCARD, SCB_LIST_NULL,
639 ROLE_INITIATOR))
640- ahd_set_transaction_status(scb, CAM_REQ_CMP);
641+ aic_set_transaction_status(scb, CAM_REQ_CMP);
642 #endif
643 ahd_handle_devreset(ahd, &devinfo, CAM_LUN_WILDCARD,
644 CAM_BDR_SENT, "Bus Device Reset",
645@@ -1944,8 +2259,8 @@
646 && ((ahd->msg_flags & MSG_FLAG_EXPECT_PPR_BUSFREE) != 0)) {
647
648 ahd_freeze_devq(ahd, scb);
649- ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
650- ahd_freeze_scb(scb);
651+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
652+ aic_freeze_scb(scb);
653 if ((ahd->msg_flags & MSG_FLAG_IU_REQ_CHANGED) != 0) {
654 ahd_abort_scbs(ahd, SCB_GET_TARGET(ahd, scb),
655 SCB_GET_CHANNEL(ahd, scb),
656@@ -1989,8 +2304,7 @@
657 "PRGMCNT == 0x%x\n",
658 ahd_lookup_phase_entry(lastphase)->phasemsg,
659 aborted,
660- ahd_inb(ahd, PRGMCNT)
661- | (ahd_inb(ahd, PRGMCNT+1) << 8));
662+ ahd_inw(ahd, PRGMCNT));
663 ahd_dump_card_state(ahd);
664 }
665 /* Always restart the sequencer. */
666@@ -2034,7 +2348,7 @@
667 printf("No SCB found during protocol violation\n");
668 goto proto_violation_reset;
669 } else {
670- ahd_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
671+ aic_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
672 if ((seq_flags & NO_CDB_SENT) != 0) {
673 ahd_print_path(ahd, scb);
674 printf("No or incomplete CDB sent to device.\n");
675@@ -2153,8 +2467,7 @@
676 u_int i;
677
678 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
679- seqaddr = ahd_inb(ahd, CURADDR)
680- | (ahd_inb(ahd, CURADDR+1) << 8);
681+ seqaddr = ahd_inw(ahd, CURADDR);
682
683 cs = ahd->critical_sections;
684 for (i = 0; i < ahd->num_critical_sections; i++, cs++) {
685@@ -2198,8 +2511,14 @@
686 ahd_outb(ahd, LQOMODE0, 0);
687 ahd_outb(ahd, LQOMODE1, 0);
688 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
689- simode1 = ahd_inb(ahd, SIMODE1);
690- ahd_outb(ahd, SIMODE1, ENBUSFREE);
691+ simode1 = ahd_inb(ahd, SIMODE1);
692+ /*
693+ * We don't clear ENBUSFREE. Unfortunately
694+ * we cannot re-enable busfree detection within
695+ * the current connection, so we must leave it
696+ * on while single stepping.
697+ */
698+ ahd_outb(ahd, SIMODE1, simode1 & ENBUSFREE);
699 ahd_outb(ahd, SEQCTL0, ahd_inb(ahd, SEQCTL0) | STEP);
700 stepping = TRUE;
701 }
702@@ -2207,9 +2526,8 @@
703 ahd_outb(ahd, CLRINT, CLRSCSIINT);
704 ahd_set_modes(ahd, ahd->saved_src_mode, ahd->saved_dst_mode);
705 ahd_outb(ahd, HCNTRL, ahd->unpause);
706- do {
707- ahd_delay(200);
708- } while (!ahd_is_paused(ahd));
709+ while (!ahd_is_paused(ahd))
710+ aic_delay(200);
711 ahd_update_modes(ahd);
712 }
713 if (stepping) {
714@@ -2285,10 +2603,10 @@
715 for (i = 0; i < sizeof(hscb->shared_data.idata.cdb); i++)
716 printf("%#02x", hscb->shared_data.idata.cdb[i]);
717 printf(" dataptr:%#x%x datacnt:%#x sgptr:%#x tag:%#x\n",
718- (uint32_t)((ahd_le64toh(hscb->dataptr) >> 32) & 0xFFFFFFFF),
719- (uint32_t)(ahd_le64toh(hscb->dataptr) & 0xFFFFFFFF),
720- ahd_le32toh(hscb->datacnt),
721- ahd_le32toh(hscb->sgptr),
722+ (uint32_t)((aic_le64toh(hscb->dataptr) >> 32) & 0xFFFFFFFF),
723+ (uint32_t)(aic_le64toh(hscb->dataptr) & 0xFFFFFFFF),
724+ aic_le32toh(hscb->datacnt),
725+ aic_le32toh(hscb->sgptr),
726 SCB_GET_TAG(scb));
727 ahd_dump_sglist(scb);
728 }
729@@ -2307,8 +2625,8 @@
730 uint64_t addr;
731 uint32_t len;
732
733- addr = ahd_le64toh(sg_list[i].addr);
734- len = ahd_le32toh(sg_list[i].len);
735+ addr = aic_le64toh(sg_list[i].addr);
736+ len = aic_le32toh(sg_list[i].len);
737 printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
738 i,
739 (uint32_t)((addr >> 32) & 0xFFFFFFFF),
740@@ -2324,11 +2642,11 @@
741 for (i = 0; i < scb->sg_count; i++) {
742 uint32_t len;
743
744- len = ahd_le32toh(sg_list[i].len);
745+ len = aic_le32toh(sg_list[i].len);
746 printf("sg[%d] - Addr 0x%x%x : Length %d%s\n",
747 i,
748- (len >> 24) & SG_HIGH_ADDR_BITS,
749- ahd_le32toh(sg_list[i].addr),
750+ (len & AHD_SG_HIGH_ADDR_MASK) >> 24,
751+ aic_le32toh(sg_list[i].addr),
752 len & AHD_SG_LEN_MASK,
753 len & AHD_DMA_LAST_SEG ? " Last" : "");
754 }
755@@ -2870,14 +3188,25 @@
756 iocell_opts[AHD_PRECOMP_SLEW_INDEX] &= ~AHD_PRECOMP_MASK;
757
758 if ((ahd->features & AHD_NEW_IOCELL_OPTS) != 0
759- && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0) {
760+ && (ppr_opts & MSG_EXT_PPR_DT_REQ) != 0
761+ && (ppr_opts & MSG_EXT_PPR_IU_REQ) == 0) {
762 /*
763 * Slow down our CRC interval to be
764- * compatible with devices that can't
765- * handle a CRC at full speed.
766+ * compatible with non-packetized
767+ * U160 devices that can't handle a
768+ * CRC at full speed.
769 */
770 con_opts |= ENSLOWCRC;
771 }
772+
773+ if ((ahd->bugs & AHD_PACED_NEGTABLE_BUG) != 0) {
774+ /*
775+ * On H2A4, revert to a slower slewrate
776+ * on non-paced transfers.
777+ */
778+ iocell_opts[AHD_PRECOMP_SLEW_INDEX] &=
779+ ~AHD_SLEWRATE_MASK;
780+ }
781 }
782
783 ahd_outb(ahd, ANNEXCOL, AHD_ANNEXCOL_PRECOMP_SLEW);
784@@ -2915,7 +3244,7 @@
785 {
786 struct scb *pending_scb;
787 int pending_scb_count;
788- int i;
789+ u_int scb_tag;
790 int paused;
791 u_int saved_scbptr;
792 ahd_mode_state saved_modes;
793@@ -2973,17 +3302,14 @@
794 ahd_outb(ahd, SCSISEQ0, ahd_inb(ahd, SCSISEQ0) & ~ENSELO);
795 saved_scbptr = ahd_get_scbptr(ahd);
796 /* Ensure that the hscbs down on the card match the new information */
797- for (i = 0; i < ahd->scb_data.maxhscbs; i++) {
798+ for (scb_tag = 0; scb_tag < ahd->scb_data.maxhscbs; scb_tag++) {
799 struct hardware_scb *pending_hscb;
800 u_int control;
801- u_int scb_tag;
802
803- ahd_set_scbptr(ahd, i);
804- scb_tag = i;
805 pending_scb = ahd_lookup_scb(ahd, scb_tag);
806 if (pending_scb == NULL)
807 continue;
808-
809+ ahd_set_scbptr(ahd, scb_tag);
810 pending_hscb = pending_scb->hscb;
811 control = ahd_inb_scbram(ahd, SCB_CONTROL);
812 control &= ~MK_MESSAGE;
813@@ -3198,7 +3524,7 @@
814 devinfo->target_mask);
815 panic("SCB = %d, SCB Control = %x:%x, MSG_OUT = %x "
816 "SCB flags = %x", SCB_GET_TAG(scb), scb->hscb->control,
817- ahd_inb(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
818+ ahd_inb_scbram(ahd, SCB_CONTROL), ahd_inb(ahd, MSG_OUT),
819 scb->flags);
820 }
821
822@@ -3737,8 +4063,13 @@
823 if ((ahd->msg_flags & MSG_FLAG_PACKETIZED) != 0) {
824 printf("%s: Returning to Idle Loop\n",
825 ahd_name(ahd));
826- ahd_outb(ahd, LASTPHASE, P_BUSFREE);
827 ahd_clear_msg_state(ahd);
828+
829+ /*
830+ * Perform the equivalent of a clear_target_state.
831+ */
832+ ahd_outb(ahd, LASTPHASE, P_BUSFREE);
833+ ahd_outb(ahd, SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT);
834 ahd_outb(ahd, SEQCTL0, FASTMODE|SEQRESET);
835 } else {
836 ahd_clear_msg_state(ahd);
837@@ -4346,7 +4677,7 @@
838 ahd_outb(ahd, SCB_CONTROL,
839 ahd_inb_scbram(ahd, SCB_CONTROL) & mask);
840 scb->hscb->control &= mask;
841- ahd_set_transaction_tag(scb, /*enabled*/FALSE,
842+ aic_set_transaction_tag(scb, /*enabled*/FALSE,
843 /*type*/MSG_SIMPLE_TASK);
844 ahd_outb(ahd, MSG_OUT, MSG_IDENTIFYFLAG);
845 ahd_assert_atn(ahd);
846@@ -4404,7 +4735,7 @@
847 * Perhaps add datadir to some spare bits in the hscb?
848 */
849 if ((ahd_inb(ahd, SEQ_FLAGS) & DPHASE) == 0
850- || ahd_get_transfer_dir(scb) != CAM_DIR_IN) {
851+ || aic_get_transfer_dir(scb) != CAM_DIR_IN) {
852 /*
853 * Ignore the message if we haven't
854 * seen an appropriate data phase yet.
855@@ -4421,7 +4752,8 @@
856
857 sgptr = ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR);
858 if ((sgptr & SG_LIST_NULL) != 0
859- && (ahd_inb(ahd, SCB_TASK_ATTRIBUTE) & SCB_XFERLEN_ODD) != 0) {
860+ && (ahd_inb_scbram(ahd, SCB_TASK_ATTRIBUTE)
861+ & SCB_XFERLEN_ODD) != 0) {
862 /*
863 * If the residual occurred on the last
864 * transfer and the transfer request was
865@@ -4458,18 +4790,18 @@
866 * to load so we must go back one.
867 */
868 sg--;
869- sglen = ahd_le32toh(sg->len) & AHD_SG_LEN_MASK;
870+ sglen = aic_le32toh(sg->len) & AHD_SG_LEN_MASK;
871 if (sg != scb->sg_list
872 && sglen < (data_cnt & AHD_SG_LEN_MASK)) {
873
874 sg--;
875- sglen = ahd_le32toh(sg->len);
876+ sglen = aic_le32toh(sg->len);
877 /*
878 * Preserve High Address and SG_LIST
879 * bits while setting the count to 1.
880 */
881 data_cnt = 1|(sglen&(~AHD_SG_LEN_MASK));
882- data_addr = ahd_le64toh(sg->addr)
883+ data_addr = aic_le64toh(sg->addr)
884 + (sglen & AHD_SG_LEN_MASK)
885 - 1;
886
887@@ -4491,18 +4823,18 @@
888 * to load so we must go back one.
889 */
890 sg--;
891- sglen = ahd_le32toh(sg->len) & AHD_SG_LEN_MASK;
892+ sglen = aic_le32toh(sg->len) & AHD_SG_LEN_MASK;
893 if (sg != scb->sg_list
894 && sglen < (data_cnt & AHD_SG_LEN_MASK)) {
895
896 sg--;
897- sglen = ahd_le32toh(sg->len);
898+ sglen = aic_le32toh(sg->len);
899 /*
900 * Preserve High Address and SG_LIST
901 * bits while setting the count to 1.
902 */
903 data_cnt = 1|(sglen&(~AHD_SG_LEN_MASK));
904- data_addr = ahd_le32toh(sg->addr)
905+ data_addr = aic_le32toh(sg->addr)
906 + (sglen & AHD_SG_LEN_MASK)
907 - 1;
908
909@@ -4522,7 +4854,8 @@
910 * correct for subsequent data transfers.
911 */
912 ahd_outb(ahd, SCB_TASK_ATTRIBUTE,
913- ahd_inb(ahd, SCB_TASK_ATTRIBUTE) ^ SCB_XFERLEN_ODD);
914+ ahd_inb_scbram(ahd, SCB_TASK_ATTRIBUTE)
915+ ^ SCB_XFERLEN_ODD);
916
917 ahd_outl(ahd, SCB_RESIDUAL_SGPTR, sgptr);
918 ahd_outl(ahd, SCB_RESIDUAL_DATACNT, data_cnt);
919@@ -4562,9 +4895,8 @@
920 */
921 ahd_outb(ahd, DFFSXFRCTL, CLRCHN);
922 wait = 1000;
923- do {
924- ahd_delay(100);
925- } while (--wait && !(ahd_inb(ahd, MDFFSTAT) & FIFOFREE));
926+ while (--wait && !(ahd_inb(ahd, MDFFSTAT) & FIFOFREE))
927+ aic_delay(100);
928 if (wait == 0) {
929 ahd_print_path(ahd, scb);
930 printf("ahd_reinitialize_dataptrs: Forcing FIFO free.\n");
931@@ -4580,10 +4912,7 @@
932 * Determine initial values for data_addr and data_cnt
933 * for resuming the data phase.
934 */
935- sgptr = (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 3) << 24)
936- | (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 2) << 16)
937- | (ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR + 1) << 8)
938- | ahd_inb_scbram(ahd, SCB_RESIDUAL_SGPTR);
939+ sgptr = ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR);
940 sgptr &= SG_PTR_MASK;
941
942 resid = (ahd_inb_scbram(ahd, SCB_RESIDUAL_DATACNT + 2) << 16)
943@@ -4598,13 +4927,10 @@
944 /* The residual sg_ptr always points to the next sg */
945 sg--;
946
947- dataptr = ahd_le64toh(sg->addr)
948- + (ahd_le32toh(sg->len) & AHD_SG_LEN_MASK)
949+ dataptr = aic_le64toh(sg->addr)
950+ + (aic_le32toh(sg->len) & AHD_SG_LEN_MASK)
951 - resid;
952- ahd_outb(ahd, HADDR + 7, dataptr >> 56);
953- ahd_outb(ahd, HADDR + 6, dataptr >> 48);
954- ahd_outb(ahd, HADDR + 5, dataptr >> 40);
955- ahd_outb(ahd, HADDR + 4, dataptr >> 32);
956+ ahd_outl(ahd, HADDR + 4, dataptr >> 32);
957 } else {
958 struct ahd_dma_seg *sg;
959
960@@ -4613,16 +4939,13 @@
961 /* The residual sg_ptr always points to the next sg */
962 sg--;
963
964- dataptr = ahd_le32toh(sg->addr)
965- + (ahd_le32toh(sg->len) & AHD_SG_LEN_MASK)
966+ dataptr = aic_le32toh(sg->addr)
967+ + (aic_le32toh(sg->len) & AHD_SG_LEN_MASK)
968 - resid;
969 ahd_outb(ahd, HADDR + 4,
970- (ahd_le32toh(sg->len) & ~AHD_SG_LEN_MASK) >> 24);
971+ (aic_le32toh(sg->len) & ~AHD_SG_LEN_MASK) >> 24);
972 }
973- ahd_outb(ahd, HADDR + 3, dataptr >> 24);
974- ahd_outb(ahd, HADDR + 2, dataptr >> 16);
975- ahd_outb(ahd, HADDR + 1, dataptr >> 8);
976- ahd_outb(ahd, HADDR, dataptr);
977+ ahd_outl(ahd, HADDR, dataptr);
978 ahd_outb(ahd, HCNT + 2, resid >> 16);
979 ahd_outb(ahd, HCNT + 1, resid >> 8);
980 ahd_outb(ahd, HCNT, resid);
981@@ -4816,8 +5139,8 @@
982 ahd->bugs = AHD_BUGNONE;
983 ahd->flags = AHD_SPCHK_ENB_A|AHD_RESET_BUS_A|AHD_TERM_ENB_A
984 | AHD_EXTENDED_TRANS_A|AHD_STPWLEVEL_A;
985- ahd_timer_init(&ahd->reset_timer);
986- ahd_timer_init(&ahd->stat_timer);
987+ aic_timer_init(&ahd->reset_timer);
988+ aic_timer_init(&ahd->stat_timer);
989 ahd->int_coalescing_timer = AHD_INT_COALESCING_TIMER_DEFAULT;
990 ahd->int_coalescing_maxcmds = AHD_INT_COALESCING_MAXCMDS_DEFAULT;
991 ahd->int_coalescing_mincmds = AHD_INT_COALESCING_MINCMDS_DEFAULT;
992@@ -4853,24 +5176,24 @@
993 {
994 struct ahd_softc *list_ahd;
995
996-#if AHD_PCI_CONFIG > 0
997+#if AIC_PCI_CONFIG > 0
998 /*
999 * Second Function PCI devices need to inherit some
1000 * settings from function 0.
1001 */
1002 if ((ahd->features & AHD_MULTI_FUNC) != 0) {
1003 TAILQ_FOREACH(list_ahd, &ahd_tailq, links) {
1004- ahd_dev_softc_t list_pci;
1005- ahd_dev_softc_t pci;
1006+ aic_dev_softc_t list_pci;
1007+ aic_dev_softc_t pci;
1008
1009 list_pci = list_ahd->dev_softc;
1010 pci = ahd->dev_softc;
1011- if (ahd_get_pci_slot(list_pci) == ahd_get_pci_slot(pci)
1012- && ahd_get_pci_bus(list_pci) == ahd_get_pci_bus(pci)) {
1013+ if (aic_get_pci_slot(list_pci) == aic_get_pci_slot(pci)
1014+ && aic_get_pci_bus(list_pci) == aic_get_pci_bus(pci)) {
1015 struct ahd_softc *master;
1016 struct ahd_softc *slave;
1017
1018- if (ahd_get_pci_function(list_pci) == 0) {
1019+ if (aic_get_pci_function(list_pci) == 0) {
1020 master = list_ahd;
1021 slave = ahd;
1022 } else {
1023@@ -4935,27 +5258,27 @@
1024 {
1025 int i;
1026
1027+ ahd_terminate_recovery_thread(ahd);
1028 switch (ahd->init_level) {
1029 default:
1030 case 5:
1031 ahd_shutdown(ahd);
1032- TAILQ_REMOVE(&ahd_tailq, ahd, links);
1033 /* FALLTHROUGH */
1034 case 4:
1035- ahd_dmamap_unload(ahd, ahd->shared_data_dmat,
1036- ahd->shared_data_dmamap);
1037+ aic_dmamap_unload(ahd, ahd->shared_data_dmat,
1038+ ahd->shared_data_map.dmamap);
1039 /* FALLTHROUGH */
1040 case 3:
1041- ahd_dmamem_free(ahd, ahd->shared_data_dmat, ahd->qoutfifo,
1042- ahd->shared_data_dmamap);
1043- ahd_dmamap_destroy(ahd, ahd->shared_data_dmat,
1044- ahd->shared_data_dmamap);
1045+ aic_dmamem_free(ahd, ahd->shared_data_dmat, ahd->qoutfifo,
1046+ ahd->shared_data_map.dmamap);
1047+ aic_dmamap_destroy(ahd, ahd->shared_data_dmat,
1048+ ahd->shared_data_map.dmamap);
1049 /* FALLTHROUGH */
1050 case 2:
1051- ahd_dma_tag_destroy(ahd, ahd->shared_data_dmat);
1052+ aic_dma_tag_destroy(ahd, ahd->shared_data_dmat);
1053 case 1:
1054 #ifndef __linux__
1055- ahd_dma_tag_destroy(ahd, ahd->buffer_dmat);
1056+ aic_dma_tag_destroy(ahd, ahd->buffer_dmat);
1057 #endif
1058 break;
1059 case 0:
1060@@ -4963,7 +5286,7 @@
1061 }
1062
1063 #ifndef __linux__
1064- ahd_dma_tag_destroy(ahd, ahd->parent_dmat);
1065+ aic_dma_tag_destroy(ahd, ahd->parent_dmat);
1066 #endif
1067 ahd_platform_free(ahd);
1068 ahd_fini_scbdata(ahd);
1069@@ -5016,8 +5339,8 @@
1070 /*
1071 * Stop periodic timer callbacks.
1072 */
1073- ahd_timer_stop(&ahd->reset_timer);
1074- ahd_timer_stop(&ahd->stat_timer);
1075+ aic_timer_stop(&ahd->reset_timer);
1076+ aic_timer_stop(&ahd->stat_timer);
1077
1078 /* This will reset most registers to 0, but not all */
1079 ahd_reset(ahd, /*reinit*/FALSE);
1080@@ -5049,7 +5372,7 @@
1081 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
1082 sxfrctl1 = ahd_inb(ahd, SXFRCTL1);
1083
1084- cmd = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
1085+ cmd = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
1086 if ((ahd->bugs & AHD_PCIX_CHIPRST_BUG) != 0) {
1087 uint32_t mod_cmd;
1088
1089@@ -5063,7 +5386,7 @@
1090 * PERR and SERR responses during the CHIPRST.
1091 */
1092 mod_cmd = cmd & ~(PCIM_CMD_PERRESPEN|PCIM_CMD_SERRESPEN);
1093- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
1094+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
1095 mod_cmd, /*bytes*/2);
1096 }
1097 ahd_outb(ahd, HCNTRL, CHIPRST | ahd->pause);
1098@@ -5076,7 +5399,7 @@
1099 */
1100 wait = 1000;
1101 do {
1102- ahd_delay(1000);
1103+ aic_delay(1000);
1104 } while (--wait && !(ahd_inb(ahd, HCNTRL) & CHIPRSTACK));
1105
1106 if (wait == 0) {
1107@@ -5090,9 +5413,9 @@
1108 * Clear any latched PCI error status and restore
1109 * previous SERR and PERR response enables.
1110 */
1111- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
1112+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
1113 0xFF, /*bytes*/1);
1114- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
1115+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
1116 cmd, /*bytes*/2);
1117 }
1118
1119@@ -5219,7 +5542,7 @@
1120 */
1121
1122 /* DMA tag for our hardware scb structures */
1123- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1124+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1125 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
1126 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
1127 /*highaddr*/BUS_SPACE_MAXADDR,
1128@@ -5233,7 +5556,7 @@
1129 scb_data->init_level++;
1130
1131 /* DMA tag for our S/G structures. */
1132- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/8,
1133+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/8,
1134 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
1135 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
1136 /*highaddr*/BUS_SPACE_MAXADDR,
1137@@ -5252,7 +5575,7 @@
1138 scb_data->init_level++;
1139
1140 /* DMA tag for our sense buffers. We allocate in page sized chunks */
1141- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1142+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1143 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
1144 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
1145 /*highaddr*/BUS_SPACE_MAXADDR,
1146@@ -5340,13 +5663,13 @@
1147
1148 while ((sns_map = SLIST_FIRST(&scb_data->sense_maps)) != NULL) {
1149 SLIST_REMOVE_HEAD(&scb_data->sense_maps, links);
1150- ahd_dmamap_unload(ahd, scb_data->sense_dmat,
1151+ aic_dmamap_unload(ahd, scb_data->sense_dmat,
1152 sns_map->dmamap);
1153- ahd_dmamem_free(ahd, scb_data->sense_dmat,
1154+ aic_dmamem_free(ahd, scb_data->sense_dmat,
1155 sns_map->vaddr, sns_map->dmamap);
1156 free(sns_map, M_DEVBUF);
1157 }
1158- ahd_dma_tag_destroy(ahd, scb_data->sense_dmat);
1159+ aic_dma_tag_destroy(ahd, scb_data->sense_dmat);
1160 /* FALLTHROUGH */
1161 }
1162 case 6:
1163@@ -5355,13 +5678,13 @@
1164
1165 while ((sg_map = SLIST_FIRST(&scb_data->sg_maps)) != NULL) {
1166 SLIST_REMOVE_HEAD(&scb_data->sg_maps, links);
1167- ahd_dmamap_unload(ahd, scb_data->sg_dmat,
1168+ aic_dmamap_unload(ahd, scb_data->sg_dmat,
1169 sg_map->dmamap);
1170- ahd_dmamem_free(ahd, scb_data->sg_dmat,
1171+ aic_dmamem_free(ahd, scb_data->sg_dmat,
1172 sg_map->vaddr, sg_map->dmamap);
1173 free(sg_map, M_DEVBUF);
1174 }
1175- ahd_dma_tag_destroy(ahd, scb_data->sg_dmat);
1176+ aic_dma_tag_destroy(ahd, scb_data->sg_dmat);
1177 /* FALLTHROUGH */
1178 }
1179 case 5:
1180@@ -5370,13 +5693,13 @@
1181
1182 while ((hscb_map = SLIST_FIRST(&scb_data->hscb_maps)) != NULL) {
1183 SLIST_REMOVE_HEAD(&scb_data->hscb_maps, links);
1184- ahd_dmamap_unload(ahd, scb_data->hscb_dmat,
1185+ aic_dmamap_unload(ahd, scb_data->hscb_dmat,
1186 hscb_map->dmamap);
1187- ahd_dmamem_free(ahd, scb_data->hscb_dmat,
1188+ aic_dmamem_free(ahd, scb_data->hscb_dmat,
1189 hscb_map->vaddr, hscb_map->dmamap);
1190 free(hscb_map, M_DEVBUF);
1191 }
1192- ahd_dma_tag_destroy(ahd, scb_data->hscb_dmat);
1193+ aic_dma_tag_destroy(ahd, scb_data->hscb_dmat);
1194 /* FALLTHROUGH */
1195 }
1196 case 4:
1197@@ -5407,6 +5730,7 @@
1198 printf("%s: Setting up iocell workaround\n", ahd_name(ahd));
1199 #endif
1200 ahd_restore_modes(ahd, saved_modes);
1201+ ahd->flags &= ~AHD_HAD_FIRST_SEL;
1202 }
1203
1204 static void
1205@@ -5415,6 +5739,8 @@
1206 ahd_mode_state saved_modes;
1207 u_int sblkctl;
1208
1209+ if ((ahd->flags & AHD_HAD_FIRST_SEL) != 0)
1210+ return;
1211 saved_modes = ahd_save_modes(ahd);
1212 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
1213 sblkctl = ahd_inb(ahd, SBLKCTL);
1214@@ -5434,6 +5760,7 @@
1215 ahd_outb(ahd, SIMODE0, ahd_inb(ahd, SIMODE0) & ~(ENSELDO|ENSELDI));
1216 ahd_outb(ahd, CLRINT, CLRSCSIINT);
1217 ahd_restore_modes(ahd, saved_modes);
1218+ ahd->flags |= AHD_HAD_FIRST_SEL;
1219 }
1220
1221 /*************************** SCB Management ***********************************/
1222@@ -5577,7 +5904,7 @@
1223 scb, links.le);
1224 }
1225
1226- ahd_platform_scb_free(ahd, scb);
1227+ aic_platform_scb_free(ahd, scb);
1228 }
1229
1230 void
1231@@ -5608,7 +5935,7 @@
1232 offset = (PAGE_SIZE / sizeof(*hscb)) - scb_data->scbs_left;
1233 hscb_map = SLIST_FIRST(&scb_data->hscb_maps);
1234 hscb = &((struct hardware_scb *)hscb_map->vaddr)[offset];
1235- hscb_busaddr = hscb_map->physaddr + (offset * sizeof(*hscb));
1236+ hscb_busaddr = hscb_map->busaddr + (offset * sizeof(*hscb));
1237 } else {
1238 hscb_map = malloc(sizeof(*hscb_map), M_DEVBUF, M_NOWAIT);
1239
1240@@ -5616,7 +5943,7 @@
1241 return;
1242
1243 /* Allocate the next batch of hardware SCBs */
1244- if (ahd_dmamem_alloc(ahd, scb_data->hscb_dmat,
1245+ if (aic_dmamem_alloc(ahd, scb_data->hscb_dmat,
1246 (void **)&hscb_map->vaddr,
1247 BUS_DMA_NOWAIT, &hscb_map->dmamap) != 0) {
1248 free(hscb_map, M_DEVBUF);
1249@@ -5625,12 +5952,12 @@
1250
1251 SLIST_INSERT_HEAD(&scb_data->hscb_maps, hscb_map, links);
1252
1253- ahd_dmamap_load(ahd, scb_data->hscb_dmat, hscb_map->dmamap,
1254+ aic_dmamap_load(ahd, scb_data->hscb_dmat, hscb_map->dmamap,
1255 hscb_map->vaddr, PAGE_SIZE, ahd_dmamap_cb,
1256- &hscb_map->physaddr, /*flags*/0);
1257+ &hscb_map->busaddr, /*flags*/0);
1258
1259 hscb = (struct hardware_scb *)hscb_map->vaddr;
1260- hscb_busaddr = hscb_map->physaddr;
1261+ hscb_busaddr = hscb_map->busaddr;
1262 scb_data->scbs_left = PAGE_SIZE / sizeof(*hscb);
1263 }
1264
1265@@ -5641,7 +5968,7 @@
1266 - scb_data->sgs_left) * ahd_sglist_size(ahd);
1267 sg_map = SLIST_FIRST(&scb_data->sg_maps);
1268 segs = sg_map->vaddr + offset;
1269- sg_busaddr = sg_map->physaddr + offset;
1270+ sg_busaddr = sg_map->busaddr + offset;
1271 } else {
1272 sg_map = malloc(sizeof(*sg_map), M_DEVBUF, M_NOWAIT);
1273
1274@@ -5649,7 +5976,7 @@
1275 return;
1276
1277 /* Allocate the next batch of S/G lists */
1278- if (ahd_dmamem_alloc(ahd, scb_data->sg_dmat,
1279+ if (aic_dmamem_alloc(ahd, scb_data->sg_dmat,
1280 (void **)&sg_map->vaddr,
1281 BUS_DMA_NOWAIT, &sg_map->dmamap) != 0) {
1282 free(sg_map, M_DEVBUF);
1283@@ -5658,12 +5985,12 @@
1284
1285 SLIST_INSERT_HEAD(&scb_data->sg_maps, sg_map, links);
1286
1287- ahd_dmamap_load(ahd, scb_data->sg_dmat, sg_map->dmamap,
1288+ aic_dmamap_load(ahd, scb_data->sg_dmat, sg_map->dmamap,
1289 sg_map->vaddr, ahd_sglist_allocsize(ahd),
1290- ahd_dmamap_cb, &sg_map->physaddr, /*flags*/0);
1291+ ahd_dmamap_cb, &sg_map->busaddr, /*flags*/0);
1292
1293 segs = sg_map->vaddr;
1294- sg_busaddr = sg_map->physaddr;
1295+ sg_busaddr = sg_map->busaddr;
1296 scb_data->sgs_left =
1297 ahd_sglist_allocsize(ahd) / ahd_sglist_size(ahd);
1298 #ifdef AHD_DEBUG
1299@@ -5678,7 +6005,7 @@
1300 offset = PAGE_SIZE - (AHD_SENSE_BUFSIZE * scb_data->sense_left);
1301 sense_map = SLIST_FIRST(&scb_data->sense_maps);
1302 sense_data = sense_map->vaddr + offset;
1303- sense_busaddr = sense_map->physaddr + offset;
1304+ sense_busaddr = sense_map->busaddr + offset;
1305 } else {
1306 sense_map = malloc(sizeof(*sense_map), M_DEVBUF, M_NOWAIT);
1307
1308@@ -5686,7 +6013,7 @@
1309 return;
1310
1311 /* Allocate the next batch of sense buffers */
1312- if (ahd_dmamem_alloc(ahd, scb_data->sense_dmat,
1313+ if (aic_dmamem_alloc(ahd, scb_data->sense_dmat,
1314 (void **)&sense_map->vaddr,
1315 BUS_DMA_NOWAIT, &sense_map->dmamap) != 0) {
1316 free(sense_map, M_DEVBUF);
1317@@ -5695,12 +6022,12 @@
1318
1319 SLIST_INSERT_HEAD(&scb_data->sense_maps, sense_map, links);
1320
1321- ahd_dmamap_load(ahd, scb_data->sense_dmat, sense_map->dmamap,
1322+ aic_dmamap_load(ahd, scb_data->sense_dmat, sense_map->dmamap,
1323 sense_map->vaddr, PAGE_SIZE, ahd_dmamap_cb,
1324- &sense_map->physaddr, /*flags*/0);
1325+ &sense_map->busaddr, /*flags*/0);
1326
1327 sense_data = sense_map->vaddr;
1328- sense_busaddr = sense_map->physaddr;
1329+ sense_busaddr = sense_map->busaddr;
1330 scb_data->sense_left = PAGE_SIZE / AHD_SENSE_BUFSIZE;
1331 #ifdef AHD_DEBUG
1332 if (ahd_debug & AHD_SHOW_MEMORY)
1333@@ -5741,7 +6068,7 @@
1334 next_scb->sense_busaddr = sense_busaddr;
1335 memset(hscb, 0, sizeof(*hscb));
1336 next_scb->hscb = hscb;
1337- hscb->hscb_busaddr = ahd_htole32(hscb_busaddr);
1338+ hscb->hscb_busaddr = aic_htole32(hscb_busaddr);
1339
1340 /*
1341 * The sequencer always starts with the second entry.
1342@@ -5756,7 +6083,7 @@
1343 next_scb->ahd_softc = ahd;
1344 next_scb->flags = SCB_FLAG_NONE;
1345 #ifndef __linux__
1346- error = ahd_dmamap_create(ahd, ahd->buffer_dmat, /*flags*/0,
1347+ error = aic_dmamap_create(ahd, ahd->buffer_dmat, /*flags*/0,
1348 &next_scb->dmamap);
1349 if (error != 0) {
1350 free(next_scb, M_DEVBUF);
1351@@ -5764,7 +6091,7 @@
1352 break;
1353 }
1354 #endif
1355- next_scb->hscb->tag = ahd_htole16(scb_data->numscbs);
1356+ next_scb->hscb->tag = aic_htole16(scb_data->numscbs);
1357 col_tag = scb_data->numscbs ^ 0x100;
1358 next_scb->col_scb = ahd_find_scb_by_tag(ahd, col_tag);
1359 if (next_scb->col_scb != NULL)
1360@@ -5824,7 +6151,6 @@
1361 int
1362 ahd_init(struct ahd_softc *ahd)
1363 {
1364- uint8_t *base_vaddr;
1365 uint8_t *next_vaddr;
1366 bus_addr_t next_baddr;
1367 size_t driver_data_size;
1368@@ -5867,7 +6193,7 @@
1369
1370 #ifndef __linux__
1371 /* DMA tag for mapping buffers into device visible space. */
1372- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1373+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1374 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
1375 /*lowaddr*/ahd->flags & AHD_39BIT_ADDRESSING
1376 ? (bus_addr_t)0x7FFFFFFFFFULL
1377@@ -5898,7 +6224,7 @@
1378 driver_data_size += AHD_TMODE_CMDS * sizeof(struct target_cmd);
1379 if ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0)
1380 driver_data_size += PKT_OVERRUN_BUFSIZE;
1381- if (ahd_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1382+ if (aic_dma_tag_create(ahd, ahd->parent_dmat, /*alignment*/1,
1383 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
1384 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
1385 /*highaddr*/BUS_SPACE_MAXADDR,
1386@@ -5913,21 +6239,24 @@
1387 ahd->init_level++;
1388
1389 /* Allocation of driver data */
1390- if (ahd_dmamem_alloc(ahd, ahd->shared_data_dmat,
1391- (void **)&base_vaddr,
1392- BUS_DMA_NOWAIT, &ahd->shared_data_dmamap) != 0) {
1393+ if (aic_dmamem_alloc(ahd, ahd->shared_data_dmat,
1394+ (void **)&ahd->shared_data_map.vaddr,
1395+ BUS_DMA_NOWAIT,
1396+ &ahd->shared_data_map.dmamap) != 0) {
1397 return (ENOMEM);
1398 }
1399
1400 ahd->init_level++;
1401
1402 /* And permanently map it in */
1403- ahd_dmamap_load(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap,
1404- base_vaddr, driver_data_size, ahd_dmamap_cb,
1405- &ahd->shared_data_busaddr, /*flags*/0);
1406- ahd->qoutfifo = (uint16_t *)base_vaddr;
1407+ aic_dmamap_load(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
1408+ ahd->shared_data_map.vaddr, driver_data_size,
1409+ ahd_dmamap_cb, &ahd->shared_data_map.busaddr,
1410+ /*flags*/0);
1411+ ahd->qoutfifo = (uint16_t *)ahd->shared_data_map.vaddr;
1412 next_vaddr = (uint8_t *)&ahd->qoutfifo[AHD_QOUT_SIZE];
1413- next_baddr = ahd->shared_data_busaddr + AHD_QOUT_SIZE*sizeof(uint16_t);
1414+ next_baddr = ahd->shared_data_map.busaddr
1415+ + AHD_QOUT_SIZE*sizeof(uint16_t);
1416 if ((ahd->features & AHD_TARGETMODE) != 0) {
1417 ahd->targetcmds = (struct target_cmd *)next_vaddr;
1418 next_vaddr += AHD_TMODE_CMDS * sizeof(struct target_cmd);
1419@@ -5948,7 +6277,8 @@
1420 * specially from the DMA safe memory chunk used for the QOUTFIFO.
1421 */
1422 ahd->next_queued_hscb = (struct hardware_scb *)next_vaddr;
1423- ahd->next_queued_hscb->hscb_busaddr = ahd_htole32(next_baddr);
1424+ ahd->next_queued_hscb_map = &ahd->shared_data_map;
1425+ ahd->next_queued_hscb->hscb_busaddr = aic_htole32(next_baddr);
1426
1427 ahd->init_level++;
1428
1429@@ -6039,7 +6369,7 @@
1430 }
1431 init_done:
1432 ahd_restart(ahd);
1433- ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
1434+ aic_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
1435 ahd_stat_timer, ahd);
1436 return (0);
1437 }
1438@@ -6100,7 +6430,7 @@
1439 for (wait = 10000;
1440 (ahd_inb(ahd, SBLKCTL) & (ENAB40|ENAB20)) == 0 && wait;
1441 wait--)
1442- ahd_delay(100);
1443+ aic_delay(100);
1444
1445 /* Clear any false bus resets due to the transceivers settling */
1446 ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
1447@@ -6240,6 +6570,7 @@
1448 ahd_outb(ahd, CLRSINT3, NTRAMPERR|OSRAMPERR);
1449 ahd_outb(ahd, CLRINT, CLRSCSIINT);
1450
1451+#if NEEDS_MORE_TESTING
1452 /*
1453 * Always enable abort on incoming L_Qs if this feature is
1454 * supported. We use this to catch invalid SCB references.
1455@@ -6247,6 +6578,7 @@
1456 if ((ahd->bugs & AHD_ABORT_LQI_BUG) == 0)
1457 ahd_outb(ahd, LQCTL1, ABORTPENDING);
1458 else
1459+#endif
1460 ahd_outb(ahd, LQCTL1, 0);
1461
1462 /* All of our queues are empty */
1463@@ -6296,15 +6628,9 @@
1464 /*
1465 * Tell the sequencer where it can find our arrays in memory.
1466 */
1467- busaddr = ahd->shared_data_busaddr;
1468- ahd_outb(ahd, SHARED_DATA_ADDR, busaddr & 0xFF);
1469- ahd_outb(ahd, SHARED_DATA_ADDR + 1, (busaddr >> 8) & 0xFF);
1470- ahd_outb(ahd, SHARED_DATA_ADDR + 2, (busaddr >> 16) & 0xFF);
1471- ahd_outb(ahd, SHARED_DATA_ADDR + 3, (busaddr >> 24) & 0xFF);
1472- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR, busaddr & 0xFF);
1473- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 1, (busaddr >> 8) & 0xFF);
1474- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 2, (busaddr >> 16) & 0xFF);
1475- ahd_outb(ahd, QOUTFIFO_NEXT_ADDR + 3, (busaddr >> 24) & 0xFF);
1476+ busaddr = ahd->shared_data_map.busaddr;
1477+ ahd_outl(ahd, SHARED_DATA_ADDR, busaddr);
1478+ ahd_outl(ahd, QOUTFIFO_NEXT_ADDR, busaddr);
1479
1480 /*
1481 * Setup the allowed SCSI Sequences based on operational mode.
1482@@ -6352,11 +6678,8 @@
1483 /*
1484 * Tell the sequencer which SCB will be the next one it receives.
1485 */
1486- busaddr = ahd_le32toh(ahd->next_queued_hscb->hscb_busaddr);
1487- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF);
1488- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
1489- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
1490- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
1491+ busaddr = aic_le32toh(ahd->next_queued_hscb->hscb_busaddr);
1492+ ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr);
1493
1494 /*
1495 * Default to coalescing disabled.
1496@@ -6677,6 +7000,12 @@
1497 struct scb *waiting_scb;
1498
1499 ahd_unpause(ahd);
1500+ /*
1501+ * Give the sequencer some time to service
1502+ * any active selections.
1503+ */
1504+ aic_delay(200);
1505+
1506 ahd_intr(ahd);
1507 ahd_pause(ahd);
1508 ahd_clear_critical_section(ahd);
1509@@ -6888,11 +7217,8 @@
1510 if (prev_scb == NULL) {
1511 uint32_t busaddr;
1512
1513- busaddr = ahd_le32toh(scb->hscb->hscb_busaddr);
1514- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF);
1515- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
1516- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
1517- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
1518+ busaddr = aic_le32toh(scb->hscb->hscb_busaddr);
1519+ ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr);
1520 } else {
1521 prev_scb->hscb->next_hscb_busaddr = scb->hscb->hscb_busaddr;
1522 ahd_sync_scb(ahd, prev_scb,
1523@@ -6998,11 +7324,8 @@
1524 * for removal will be re-added to the queue as we go.
1525 */
1526 ahd->qinfifonext = qinstart;
1527- busaddr = ahd_le32toh(ahd->next_queued_hscb->hscb_busaddr);
1528- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 0, busaddr & 0xFF);
1529- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 1, (busaddr >> 8) & 0xFF);
1530- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 2, (busaddr >> 16) & 0xFF);
1531- ahd_outb(ahd, NEXT_QUEUED_SCB_ADDR + 3, (busaddr >> 24) & 0xFF);
1532+ busaddr = aic_le32toh(ahd->next_queued_hscb->hscb_busaddr);
1533+ ahd_outl(ahd, NEXT_QUEUED_SCB_ADDR, busaddr);
1534
1535 while (qinpos != qintail) {
1536 scb = ahd_lookup_scb(ahd, ahd->qinfifo[qinpos]);
1537@@ -7023,13 +7346,13 @@
1538 cam_status ostat;
1539 cam_status cstat;
1540
1541- ostat = ahd_get_transaction_status(scb);
1542+ ostat = aic_get_transaction_status(scb);
1543 if (ostat == CAM_REQ_INPROG)
1544- ahd_set_transaction_status(scb,
1545+ aic_set_transaction_status(scb,
1546 status);
1547- cstat = ahd_get_transaction_status(scb);
1548+ cstat = aic_get_transaction_status(scb);
1549 if (cstat != CAM_REQ_CMP)
1550- ahd_freeze_scb(scb);
1551+ aic_freeze_scb(scb);
1552 if ((scb->flags & SCB_ACTIVE) == 0)
1553 printf("Inactive SCB in qinfifo\n");
1554 ahd_done(ahd, scb);
1555@@ -7165,12 +7488,12 @@
1556 cam_status ostat;
1557 cam_status cstat;
1558
1559- ostat = ahd_get_transaction_status(scb);
1560+ ostat = aic_get_transaction_status(scb);
1561 if (ostat == CAM_REQ_INPROG)
1562- ahd_set_transaction_status(scb, status);
1563- cstat = ahd_get_transaction_status(scb);
1564+ aic_set_transaction_status(scb, status);
1565+ cstat = aic_get_transaction_status(scb);
1566 if (cstat != CAM_REQ_CMP)
1567- ahd_freeze_scb(scb);
1568+ aic_freeze_scb(scb);
1569 if ((scb->flags & SCB_ACTIVE) == 0)
1570 printf("Inactive SCB in Waiting List\n");
1571 ahd_done(ahd, scb);
1572@@ -7361,11 +7684,11 @@
1573 if (ahd_match_scb(ahd, scbp, target, channel, lun, tag, role)) {
1574 cam_status ostat;
1575
1576- ostat = ahd_get_transaction_status(scbp);
1577+ ostat = aic_get_transaction_status(scbp);
1578 if (ostat == CAM_REQ_INPROG)
1579- ahd_set_transaction_status(scbp, status);
1580- if (ahd_get_transaction_status(scbp) != CAM_REQ_CMP)
1581- ahd_freeze_scb(scbp);
1582+ aic_set_transaction_status(scbp, status);
1583+ if (aic_get_transaction_status(scbp) != CAM_REQ_CMP)
1584+ aic_freeze_scb(scbp);
1585 if ((scbp->flags & SCB_ACTIVE) == 0)
1586 printf("Inactive SCB on pending list\n");
1587 ahd_done(ahd, scbp);
1588@@ -7387,9 +7710,12 @@
1589 ahd_outb(ahd, SIMODE1, ahd_inb(ahd, SIMODE1) & ~ENSCSIRST);
1590 scsiseq = ahd_inb(ahd, SCSISEQ0) & ~(ENSELO|ENARBO|SCSIRSTO);
1591 ahd_outb(ahd, SCSISEQ0, scsiseq | SCSIRSTO);
1592- ahd_delay(AHD_BUSRESET_DELAY);
1593+ ahd_flush_device_writes(ahd);
1594+ aic_delay(AHD_BUSRESET_DELAY);
1595 /* Turn off the bus reset */
1596 ahd_outb(ahd, SCSISEQ0, scsiseq);
1597+ ahd_flush_device_writes(ahd);
1598+ aic_delay(AHD_BUSRESET_DELAY);
1599 if ((ahd->bugs & AHD_SCSIRST_BUG) != 0) {
1600 /*
1601 * 2A Razor #474
1602@@ -7397,7 +7723,6 @@
1603 * SCSI bus resets that we initiate, so
1604 * we must reset the chip.
1605 */
1606- ahd_delay(AHD_BUSRESET_DELAY);
1607 ahd_reset(ahd, /*reinit*/TRUE);
1608 ahd_intr_enable(ahd, /*enable*/TRUE);
1609 AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
1610@@ -7458,7 +7783,7 @@
1611 ahd_outb(ahd, DFCNTRL,
1612 ahd_inb(ahd, DFCNTRL) & ~(SCSIEN|HDMAEN));
1613 while ((ahd_inb(ahd, DFCNTRL) & HDMAENACK) != 0)
1614- ahd_delay(10);
1615+ aic_delay(10);
1616 /*
1617 * Set CURRFIFO to the now inactive channel.
1618 */
1619@@ -7471,7 +7796,7 @@
1620 */
1621 ahd_clear_msg_state(ahd);
1622 ahd_outb(ahd, SIMODE1,
1623- ahd_inb(ahd, SIMODE1) & ~(ENBUSFREE|ENSCSIRST|ENBUSFREE));
1624+ ahd_inb(ahd, SIMODE1) & ~(ENBUSFREE|ENSCSIRST));
1625
1626 if (initiate_reset)
1627 ahd_reset_current_bus(ahd);
1628@@ -7553,8 +7878,8 @@
1629 */
1630 if ((ahd->flags & AHD_RESET_POLL_ACTIVE) == 0) {
1631 ahd->flags |= AHD_RESET_POLL_ACTIVE;
1632- ahd_freeze_simq(ahd);
1633- ahd_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd);
1634+ aic_freeze_simq(ahd);
1635+ aic_timer_reset(&ahd->reset_timer, 0, ahd_reset_poll, ahd);
1636 }
1637 return (found);
1638 }
1639@@ -7582,7 +7907,7 @@
1640 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
1641 ahd_outb(ahd, CLRSINT1, CLRSCSIRSTI);
1642 if ((ahd_inb(ahd, SSTAT1) & SCSIRSTI) != 0) {
1643- ahd_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US,
1644+ aic_timer_reset(&ahd->reset_timer, AHD_RESET_POLL_US,
1645 ahd_reset_poll, ahd);
1646 ahd_unpause(ahd);
1647 ahd_unlock(ahd, &s);
1648@@ -7597,7 +7922,7 @@
1649 ahd_unpause(ahd);
1650 ahd->flags &= ~AHD_RESET_POLL_ACTIVE;
1651 ahd_unlock(ahd, &s);
1652- ahd_release_simq(ahd);
1653+ aic_release_simq(ahd);
1654 ahd_list_unlock(&l);
1655 }
1656
1657@@ -7640,7 +7965,7 @@
1658 ahd->cmdcmplt_bucket = (ahd->cmdcmplt_bucket+1) & (AHD_STAT_BUCKETS-1);
1659 ahd->cmdcmplt_total -= ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket];
1660 ahd->cmdcmplt_counts[ahd->cmdcmplt_bucket] = 0;
1661- ahd_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
1662+ aic_timer_reset(&ahd->stat_timer, AHD_STAT_UPDATE_US,
1663 ahd_stat_timer, ahd);
1664 ahd_unlock(ahd, &s);
1665 ahd_list_unlock(&l);
1666@@ -7661,8 +7986,9 @@
1667 void
1668 ahd_handle_scsi_status(struct ahd_softc *ahd, struct scb *scb)
1669 {
1670- struct hardware_scb *hscb;
1671- u_int qfreeze_cnt;
1672+ struct hardware_scb *hscb;
1673+ u_int qfreeze_cnt;
1674+ int paused;
1675
1676 /*
1677 * The sequencer freezes its select-out queue
1678@@ -7672,9 +7998,16 @@
1679 */
1680 hscb = scb->hscb;
1681
1682+ if (ahd_is_paused(ahd)) {
1683+ paused = 1;
1684+ } else {
1685+ paused = 0;
1686+ ahd_pause(ahd);
1687+ }
1688+
1689 /* Freeze the queue until the client sees the error. */
1690 ahd_freeze_devq(ahd, scb);
1691- ahd_freeze_scb(scb);
1692+ aic_freeze_scb(scb);
1693 qfreeze_cnt = ahd_inw(ahd, QFREEZE_COUNT);
1694 if (qfreeze_cnt == 0) {
1695 printf("%s: Bad status with 0 qfreeze count!\n", ahd_name(ahd));
1696@@ -7686,6 +8019,9 @@
1697 ahd_outb(ahd, SEQ_FLAGS2,
1698 ahd_inb(ahd, SEQ_FLAGS2) & ~SELECTOUT_QFROZEN);
1699
1700+ if (paused == 0)
1701+ ahd_unpause(ahd);
1702+
1703 /* Don't want to clobber the original sense code */
1704 if ((scb->flags & SCB_SENSE) != 0) {
1705 /*
1706@@ -7693,12 +8029,12 @@
1707 * a normal command completion.
1708 */
1709 scb->flags &= ~SCB_SENSE;
1710- ahd_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
1711+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
1712 ahd_done(ahd, scb);
1713 return;
1714 }
1715- ahd_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
1716- ahd_set_scsi_status(scb, hscb->shared_data.istatus.scsi_status);
1717+ aic_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
1718+ aic_set_scsi_status(scb, hscb->shared_data.istatus.scsi_status);
1719 switch (hscb->shared_data.istatus.scsi_status) {
1720 case STATUS_PKT_SENSE:
1721 {
1722@@ -7706,7 +8042,7 @@
1723
1724 ahd_sync_sense(ahd, scb, BUS_DMASYNC_POSTREAD);
1725 siu = (struct scsi_status_iu_header *)scb->sense_data;
1726- ahd_set_scsi_status(scb, siu->status);
1727+ aic_set_scsi_status(scb, siu->status);
1728 #ifdef AHD_DEBUG
1729 if ((ahd_debug & AHD_SHOW_SENSE) != 0) {
1730 ahd_print_path(ahd, scb);
1731@@ -7747,7 +8083,7 @@
1732 }
1733 }
1734 if (siu->status == SCSI_STATUS_OK)
1735- ahd_set_transaction_status(scb,
1736+ aic_set_transaction_status(scb,
1737 CAM_REQ_CMP_ERR);
1738 }
1739 if ((siu->flags & SIU_SNSVALID) != 0) {
1740@@ -7777,7 +8113,7 @@
1741 }
1742 #endif
1743
1744- if (ahd_perform_autosense(scb) == 0)
1745+ if (aic_perform_autosense(scb) == 0)
1746 break;
1747
1748 ahd_compile_devinfo(&devinfo, SCB_GET_OUR_ID(scb),
1749@@ -7805,7 +8141,7 @@
1750 #endif
1751 scb->sg_count = 0;
1752 sg = ahd_sg_setup(ahd, scb, sg, ahd_get_sense_bufaddr(ahd, scb),
1753- ahd_get_sense_bufsize(ahd, scb),
1754+ aic_get_sense_bufsize(ahd, scb),
1755 /*last*/TRUE);
1756 sc->opcode = REQUEST_SENSE;
1757 sc->byte2 = 0;
1758@@ -7814,7 +8150,7 @@
1759 sc->byte2 = SCB_GET_LUN(scb) << 5;
1760 sc->unused[0] = 0;
1761 sc->unused[1] = 0;
1762- sc->length = ahd_get_sense_bufsize(ahd, scb);
1763+ sc->length = aic_get_sense_bufsize(ahd, scb);
1764 sc->control = 0;
1765
1766 /*
1767@@ -7834,7 +8170,7 @@
1768 * errors will be reported before any data
1769 * phases occur.
1770 */
1771- if (ahd_get_residual(scb) == ahd_get_transfer_length(scb)) {
1772+ if (aic_get_residual(scb) == aic_get_transfer_length(scb)) {
1773 ahd_update_neg_request(ahd, &devinfo,
1774 tstate, targ_info,
1775 AHD_NEG_IF_NON_ASYNC);
1776@@ -7853,7 +8189,7 @@
1777 * Ensure we have enough time to actually
1778 * retrieve the sense.
1779 */
1780- ahd_scb_timer_reset(scb, 5 * 1000000);
1781+ aic_scb_timer_reset(scb, 5 * 1000000);
1782 break;
1783 }
1784 case SCSI_STATUS_OK:
1785@@ -7895,7 +8231,7 @@
1786 */
1787
1788 hscb = scb->hscb;
1789- sgptr = ahd_le32toh(hscb->sgptr);
1790+ sgptr = aic_le32toh(hscb->sgptr);
1791 if ((sgptr & SG_STATUS_VALID) == 0)
1792 /* Case 1 */
1793 return;
1794@@ -7912,10 +8248,10 @@
1795 * regardless of the role for this SCB.
1796 */
1797 spkt = &hscb->shared_data.istatus;
1798- resid_sgptr = ahd_le32toh(spkt->residual_sgptr);
1799+ resid_sgptr = aic_le32toh(spkt->residual_sgptr);
1800 if ((sgptr & SG_FULL_RESID) != 0) {
1801 /* Case 3 */
1802- resid = ahd_get_transfer_length(scb);
1803+ resid = aic_get_transfer_length(scb);
1804 } else if ((resid_sgptr & SG_LIST_NULL) != 0) {
1805 /* Case 4 */
1806 return;
1807@@ -7924,8 +8260,8 @@
1808 printf("data overrun detected Tag == 0x%x.\n",
1809 SCB_GET_TAG(scb));
1810 ahd_freeze_devq(ahd, scb);
1811- ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
1812- ahd_freeze_scb(scb);
1813+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
1814+ aic_freeze_scb(scb);
1815 return;
1816 } else if ((resid_sgptr & ~SG_PTR_MASK) != 0) {
1817 panic("Bogus resid sgptr value 0x%x\n", resid_sgptr);
1818@@ -7937,7 +8273,7 @@
1819 * Remainder of the SG where the transfer
1820 * stopped.
1821 */
1822- resid = ahd_le32toh(spkt->residual_datacnt) & AHD_SG_LEN_MASK;
1823+ resid = aic_le32toh(spkt->residual_datacnt) & AHD_SG_LEN_MASK;
1824 sg = ahd_sg_bus_to_virt(ahd, scb, resid_sgptr & SG_PTR_MASK);
1825
1826 /* The residual sg_ptr always points to the next sg */
1827@@ -7948,15 +8284,15 @@
1828 * SG segments that are after the SG where
1829 * the transfer stopped.
1830 */
1831- while ((ahd_le32toh(sg->len) & AHD_DMA_LAST_SEG) == 0) {
1832+ while ((aic_le32toh(sg->len) & AHD_DMA_LAST_SEG) == 0) {
1833 sg++;
1834- resid += ahd_le32toh(sg->len) & AHD_SG_LEN_MASK;
1835+ resid += aic_le32toh(sg->len) & AHD_SG_LEN_MASK;
1836 }
1837 }
1838 if ((scb->flags & SCB_SENSE) == 0)
1839- ahd_set_residual(scb, resid);
1840+ aic_set_residual(scb, resid);
1841 else
1842- ahd_set_sense_residual(scb, resid);
1843+ aic_set_sense_residual(scb, resid);
1844
1845 #ifdef AHD_DEBUG
1846 if ((ahd_debug & AHD_SHOW_MISC) != 0) {
1847@@ -8068,8 +8404,7 @@
1848 max_prog = 2048;
1849
1850 ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
1851- ahd_outb(ahd, PRGMCNT, 0);
1852- ahd_outb(ahd, PRGMCNT+1, 0);
1853+ ahd_outw(ahd, PRGMCNT, 0);
1854 for (i = 0; i < max_prog; i++) {
1855 uint8_t ins_bytes[4];
1856
1857@@ -8184,8 +8519,7 @@
1858 downloaded = 0;
1859 skip_addr = 0;
1860 ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS|FASTMODE|LOADRAM);
1861- ahd_outb(ahd, PRGMCNT, 0);
1862- ahd_outb(ahd, PRGMCNT+1, 0);
1863+ ahd_outw(ahd, PRGMCNT, 0);
1864
1865 for (i = 0; i < sizeof(seqprog)/4; i++) {
1866 if (ahd_check_patch(ahd, &cur_patch, i, &skip_addr) == 0) {
1867@@ -8314,7 +8648,7 @@
1868 /*
1869 * The firmware is always compiled into a little endian format.
1870 */
1871- instr.integer = ahd_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
1872+ instr.integer = aic_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
1873
1874 fmt1_ins = &instr.format1;
1875 fmt3_ins = NULL;
1876@@ -8362,7 +8696,7 @@
1877 instr.format1.parity = 1;
1878
1879 /* The sequencer is a little endian cpu */
1880- instr.integer = ahd_htole32(instr.integer);
1881+ instr.integer = aic_htole32(instr.integer);
1882 ahd_outsb(ahd, SEQRAM, instr.bytes, 4);
1883 break;
1884 }
1885@@ -8488,11 +8822,15 @@
1886 printf(">>>>>>>>>>>>>>>>>> Dump Card State Begins <<<<<<<<<<<<<<<<<\n"
1887 "%s: Dumping Card State at program address 0x%x Mode 0x%x\n",
1888 ahd_name(ahd),
1889- ahd_inb(ahd, CURADDR) | (ahd_inb(ahd, CURADDR+1) << 8),
1890+ ahd_inw(ahd, CURADDR),
1891 ahd_build_mode_state(ahd, ahd->saved_src_mode,
1892 ahd->saved_dst_mode));
1893 if (paused)
1894 printf("Card was paused\n");
1895+
1896+ if (ahd_check_cmdcmpltqueues(ahd))
1897+ printf("Completions are pending\n");
1898+
1899 /*
1900 * Mode independent registers.
1901 */
1902@@ -8542,10 +8880,12 @@
1903 if (i++ > AHD_SCB_MAX)
1904 break;
1905 cur_col = printf("\n%3d FIFO_USE[0x%x] ", SCB_GET_TAG(scb),
1906- ahd_inb(ahd, SCB_FIFO_USE_COUNT));
1907+ ahd_inb_scbram(ahd, SCB_FIFO_USE_COUNT));
1908 ahd_set_scbptr(ahd, SCB_GET_TAG(scb));
1909- ahd_scb_control_print(ahd_inb(ahd, SCB_CONTROL), &cur_col, 60);
1910- ahd_scb_scsiid_print(ahd_inb(ahd, SCB_SCSIID), &cur_col, 60);
1911+ ahd_scb_control_print(ahd_inb_scbram(ahd, SCB_CONTROL),
1912+ &cur_col, 60);
1913+ ahd_scb_scsiid_print(ahd_inb_scbram(ahd, SCB_SCSIID),
1914+ &cur_col, 60);
1915 }
1916 printf("\nTotal %d\n", i);
1917
1918@@ -8574,7 +8914,7 @@
1919 while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
1920 ahd_set_scbptr(ahd, scb_index);
1921 printf("%d ", scb_index);
1922- scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
1923+ scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
1924 }
1925 printf("\n");
1926
1927@@ -8584,7 +8924,7 @@
1928 while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
1929 ahd_set_scbptr(ahd, scb_index);
1930 printf("%d ", scb_index);
1931- scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
1932+ scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
1933 }
1934 printf("\n");
1935
1936@@ -8595,7 +8935,7 @@
1937 while (!SCBID_IS_NULL(scb_index) && i++ < AHD_SCB_MAX) {
1938 ahd_set_scbptr(ahd, scb_index);
1939 printf("%d ", scb_index);
1940- scb_index = ahd_inw(ahd, SCB_NEXT_COMPLETE);
1941+ scb_index = ahd_inw_scbram(ahd, SCB_NEXT_COMPLETE);
1942 }
1943 printf("\n");
1944 ahd_set_scbptr(ahd, saved_scb_index);
1945@@ -8674,15 +9014,16 @@
1946 ahd_name(ahd), ahd_inw(ahd, REG0), ahd_inw(ahd, SINDEX),
1947 ahd_inw(ahd, DINDEX));
1948 printf("%s: SCBPTR == 0x%x, SCB_NEXT == 0x%x, SCB_NEXT2 == 0x%x\n",
1949- ahd_name(ahd), ahd_get_scbptr(ahd), ahd_inw(ahd, SCB_NEXT),
1950- ahd_inw(ahd, SCB_NEXT2));
1951+ ahd_name(ahd), ahd_get_scbptr(ahd),
1952+ ahd_inw_scbram(ahd, SCB_NEXT),
1953+ ahd_inw_scbram(ahd, SCB_NEXT2));
1954 printf("CDB %x %x %x %x %x %x\n",
1955- ahd_inb(ahd, SCB_CDB_STORE),
1956- ahd_inb(ahd, SCB_CDB_STORE+1),
1957- ahd_inb(ahd, SCB_CDB_STORE+2),
1958- ahd_inb(ahd, SCB_CDB_STORE+3),
1959- ahd_inb(ahd, SCB_CDB_STORE+4),
1960- ahd_inb(ahd, SCB_CDB_STORE+5));
1961+ ahd_inb_scbram(ahd, SCB_CDB_STORE),
1962+ ahd_inb_scbram(ahd, SCB_CDB_STORE+1),
1963+ ahd_inb_scbram(ahd, SCB_CDB_STORE+2),
1964+ ahd_inb_scbram(ahd, SCB_CDB_STORE+3),
1965+ ahd_inb_scbram(ahd, SCB_CDB_STORE+4),
1966+ ahd_inb_scbram(ahd, SCB_CDB_STORE+5));
1967 printf("STACK:");
1968 for (i = 0; i < ahd->stack_size; i++) {
1969 ahd->saved_stack[i] =
1970@@ -8714,16 +9055,292 @@
1971 ahd_set_scbptr(ahd, i);
1972 printf("%3d", i);
1973 printf("(CTRL 0x%x ID 0x%x N 0x%x N2 0x%x SG 0x%x, RSG 0x%x)\n",
1974- ahd_inb(ahd, SCB_CONTROL),
1975- ahd_inb(ahd, SCB_SCSIID), ahd_inw(ahd, SCB_NEXT),
1976- ahd_inw(ahd, SCB_NEXT2), ahd_inl(ahd, SCB_SGPTR),
1977- ahd_inl(ahd, SCB_RESIDUAL_SGPTR));
1978+ ahd_inb_scbram(ahd, SCB_CONTROL),
1979+ ahd_inb_scbram(ahd, SCB_SCSIID),
1980+ ahd_inw_scbram(ahd, SCB_NEXT),
1981+ ahd_inw_scbram(ahd, SCB_NEXT2),
1982+ ahd_inl_scbram(ahd, SCB_SGPTR),
1983+ ahd_inl_scbram(ahd, SCB_RESIDUAL_SGPTR));
1984 }
1985 printf("\n");
1986 ahd_set_scbptr(ahd, saved_scb_index);
1987 ahd_restore_modes(ahd, saved_modes);
1988 }
1989
1990+
1991+/*************************** Timeout Handling *********************************/
1992+void
1993+ahd_timeout(struct scb *scb)
1994+{
1995+ struct ahd_softc *ahd;
1996+
1997+ ahd = scb->ahd_softc;
1998+ if ((scb->flags & SCB_ACTIVE) != 0) {
1999+ if ((scb->flags & SCB_TIMEDOUT) == 0) {
2000+ LIST_INSERT_HEAD(&ahd->timedout_scbs, scb,
2001+ timedout_links);
2002+ scb->flags |= SCB_TIMEDOUT;
2003+ }
2004+ ahd_wakeup_recovery_thread(ahd);
2005+ }
2006+}
2007+
2008+/*
2009+ * ahd_recover_commands determines if any of the commands that have currently
2010+ * timedout are the root cause for this timeout. Innocent commands are given
2011+ * a new timeout while we wait for the command executing on the bus to timeout.
2012+ * This routine is invoked from a thread context so we are allowed to sleep.
2013+ * Our lock is not held on entry.
2014+ */
2015+void
2016+ahd_recover_commands(struct ahd_softc *ahd)
2017+{
2018+ struct scb *scb;
2019+ struct scb *active_scb;
2020+ long s;
2021+ int found;
2022+ int was_paused;
2023+ u_int active_scbptr;
2024+ u_int last_phase;
2025+
2026+ ahd_lock(ahd, &s);
2027+
2028+ /*
2029+ * Pause the controller and manually flush any
2030+ * commands that have just completed but that our
2031+ * interrupt handler has yet to see.
2032+ */
2033+ was_paused = ahd_is_paused(ahd);
2034+ ahd_pause_and_flushwork(ahd);
2035+
2036+ if (LIST_EMPTY(&ahd->timedout_scbs) != 0) {
2037+ /*
2038+ * The timedout commands have already
2039+ * completed. This typically means
2040+ * that either the timeout value was on
2041+ * the hairy edge of what the device
2042+ * requires or - more likely - interrupts
2043+ * are not happening.
2044+ */
2045+ printf("%s: Timedout SCBs already complete. "
2046+ "Interrupts may not be functioning.\n", ahd_name(ahd));
2047+ ahd_unpause(ahd);
2048+ ahd_unlock(ahd, &s);
2049+ return;
2050+ }
2051+
2052+ printf("%s: Recovery Initiated - Card was %spaused\n", ahd_name(ahd),
2053+ was_paused ? "" : "not ");
2054+ ahd_dump_card_state(ahd);
2055+
2056+ /*
2057+ * Determine identity of SCB acting on the bus.
2058+ * This test only catches non-packetized transactions.
2059+ * Due to the fleeting nature of packetized operations,
2060+ * we can't easily determine that a packetized operation
2061+ * is on the bus.
2062+ */
2063+ ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
2064+ last_phase = ahd_inb(ahd, LASTPHASE);
2065+ active_scbptr = ahd_get_scbptr(ahd);
2066+ active_scb = NULL;
2067+ if (last_phase != P_BUSFREE
2068+ || (ahd_inb(ahd, SEQ_FLAGS) & NOT_IDENTIFIED) == 0)
2069+ active_scb = ahd_lookup_scb(ahd, active_scbptr);
2070+
2071+ while ((scb = LIST_FIRST(&ahd->timedout_scbs)) != NULL) {
2072+ int target;
2073+ int lun;
2074+ char channel;
2075+
2076+ target = SCB_GET_TARGET(ahd, scb);
2077+ channel = SCB_GET_CHANNEL(ahd, scb);
2078+ lun = SCB_GET_LUN(scb);
2079+
2080+ ahd_print_path(ahd, scb);
2081+ printf("SCB 0x%x - timed out\n", scb->hscb->tag);
2082+
2083+ if (scb->flags & (SCB_DEVICE_RESET|SCB_ABORT)) {
2084+ /*
2085+ * Been down this road before.
2086+ * Do a full bus reset.
2087+ */
2088+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
2089+bus_reset:
2090+ found = ahd_reset_channel(ahd, channel,
2091+ /*Initiate Reset*/TRUE);
2092+ printf("%s: Issued Channel %c Bus Reset. "
2093+ "%d SCBs aborted\n", ahd_name(ahd), channel,
2094+ found);
2095+ continue;
2096+ }
2097+
2098+ /*
2099+ * Remove the command from the timedout list in
2100+ * preparation for requeing it.
2101+ */
2102+ LIST_REMOVE(scb, timedout_links);
2103+ scb->flags &= ~SCB_TIMEDOUT;
2104+
2105+ if (active_scb != NULL) {
2106+
2107+ if (active_scb != scb) {
2108+ /*
2109+ * If the active SCB is not us, assume that
2110+ * the active SCB has a longer timeout than
2111+ * the timedout SCB, and wait for the active
2112+ * SCB to timeout.
2113+ */
2114+ ahd_other_scb_timeout(ahd, scb, active_scb);
2115+ continue;
2116+ }
2117+
2118+ /*
2119+ * We're active on the bus, so assert ATN
2120+ * and hope that the target responds.
2121+ */
2122+ ahd_set_recoveryscb(ahd, active_scb);
2123+ active_scb->flags |= SCB_RECOVERY_SCB|SCB_DEVICE_RESET;
2124+ ahd_outb(ahd, MSG_OUT, HOST_MSG);
2125+ ahd_outb(ahd, SCSISIGO, last_phase|ATNO);
2126+ ahd_print_path(ahd, active_scb);
2127+ printf("BDR message in message buffer\n");
2128+ aic_scb_timer_reset(scb, 2 * 1000000);
2129+ break;
2130+ } else if (last_phase != P_BUSFREE
2131+ && ahd_inb(ahd, SCSIPHASE) == 0) {
2132+ /*
2133+ * SCB is not identified, there
2134+ * is no pending REQ, and the sequencer
2135+ * has not seen a busfree. Looks like
2136+ * a stuck connection waiting to
2137+ * go busfree. Reset the bus.
2138+ */
2139+ printf("%s: Connection stuck awaiting busfree or "
2140+ "Identify Msg.\n", ahd_name(ahd));
2141+ goto bus_reset;
2142+ } else if (ahd_search_qinfifo(ahd, target, channel, lun,
2143+ scb->hscb->tag, ROLE_INITIATOR,
2144+ /*status*/0, SEARCH_COUNT) > 0) {
2145+
2146+ /*
2147+ * We haven't even gone out on the bus
2148+ * yet, so the timeout must be due to
2149+ * some other command. Reset the timer
2150+ * and go on.
2151+ */
2152+ ahd_other_scb_timeout(ahd, scb, scb);
2153+ } else {
2154+ /*
2155+ * This SCB is for a disconnected transaction
2156+ * and we haven't found a better candidate on
2157+ * the bus to explain this timeout.
2158+ */
2159+ ahd_set_recoveryscb(ahd, scb);
2160+
2161+ /*
2162+ * Actually re-queue this SCB in an attempt
2163+ * to select the device before it reconnects.
2164+ * In either case (selection or reselection),
2165+ * we will now issue a target reset to the
2166+ * timed-out device.
2167+ *
2168+ * Set the MK_MESSAGE control bit indicating
2169+ * that we desire to send a message. We
2170+ * also set the disconnected flag since
2171+ * in the paging case there is no guarantee
2172+ * that our SCB control byte matches the
2173+ * version on the card. We don't want the
2174+ * sequencer to abort the command thinking
2175+ * an unsolicited reselection occurred.
2176+ */
2177+ scb->flags |= SCB_DEVICE_RESET;
2178+ scb->hscb->cdb_len = 0;
2179+ scb->hscb->task_attribute = 0;
2180+ scb->hscb->task_management = SIU_TASKMGMT_ABORT_TASK;
2181+
2182+ ahd_set_scbptr(ahd, SCB_GET_TAG(scb));
2183+ if ((scb->flags & SCB_PACKETIZED) != 0) {
2184+ /*
2185+ * Mark the SCB has having an outstanding
2186+ * task management function. Should the command
2187+ * complete normally before the task management
2188+ * function can be sent, the host will be
2189+ * notified to abort our requeued SCB.
2190+ */
2191+ ahd_outb(ahd, SCB_TASK_MANAGEMENT,
2192+ scb->hscb->task_management);
2193+ } else {
2194+ /*
2195+ * If non-packetized, set the MK_MESSAGE control
2196+ * bit indicating that we desire to send a
2197+ * message. We also set the disconnected flag
2198+ * since there is no guarantee that our SCB
2199+ * control byte matches the version on the
2200+ * card. We don't want the sequencer to abort
2201+ * the command thinking an unsolicited
2202+ * reselection occurred.
2203+ */
2204+ scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
2205+
2206+ /*
2207+ * The sequencer will never re-reference the
2208+ * in-core SCB. To make sure we are notified
2209+ * during reslection, set the MK_MESSAGE flag in
2210+ * the card's copy of the SCB.
2211+ */
2212+ ahd_outb(ahd, SCB_CONTROL,
2213+ ahd_inb(ahd, SCB_CONTROL)|MK_MESSAGE);
2214+ }
2215+
2216+ /*
2217+ * Clear out any entries in the QINFIFO first
2218+ * so we are the next SCB for this target
2219+ * to run.
2220+ */
2221+ ahd_search_qinfifo(ahd, target, channel, lun,
2222+ SCB_LIST_NULL, ROLE_INITIATOR,
2223+ CAM_REQUEUE_REQ, SEARCH_COMPLETE);
2224+ ahd_qinfifo_requeue_tail(ahd, scb);
2225+ ahd_set_scbptr(ahd, active_scbptr);
2226+ ahd_print_path(ahd, scb);
2227+ printf("Queuing a BDR SCB\n");
2228+ aic_scb_timer_reset(scb, 2 * 1000000);
2229+ break;
2230+ }
2231+ }
2232+
2233+ /*
2234+ * Any remaining SCBs were not the "culprit", so remove
2235+ * them from the timeout list. The timer for these commands
2236+ * will be reset once the recovery SCB completes.
2237+ */
2238+ while ((scb = LIST_FIRST(&ahd->timedout_scbs)) != NULL) {
2239+
2240+ LIST_REMOVE(scb, timedout_links);
2241+ scb->flags &= ~SCB_TIMEDOUT;
2242+ }
2243+
2244+ ahd_unpause(ahd);
2245+ ahd_unlock(ahd, &s);
2246+}
2247+
2248+static void
2249+ahd_other_scb_timeout(struct ahd_softc *ahd, struct scb *scb,
2250+ struct scb *other_scb)
2251+{
2252+ u_int newtimeout;
2253+
2254+ ahd_print_path(ahd, scb);
2255+ printf("Other SCB Timeout%s",
2256+ (scb->flags & SCB_OTHERTCL_TIMEOUT) != 0
2257+ ? " again\n" : "\n");
2258+ scb->flags |= SCB_OTHERTCL_TIMEOUT;
2259+ newtimeout = MAX(aic_get_timeout(other_scb),
2260+ aic_get_timeout(scb));
2261+ aic_scb_timer_reset(scb, newtimeout);
2262+}
2263+
2264 /**************************** Flexport Logic **********************************/
2265 /*
2266 * Read count 16bit words from 16bit word address start_addr from the
2267@@ -8830,9 +9447,9 @@
2268 {
2269 int cnt;
2270
2271- cnt = 20;
2272+ cnt = 5000;
2273 while ((ahd_inb(ahd, SEESTAT) & (SEEARBACK|SEEBUSY)) != 0 && --cnt)
2274- ahd_delay(5);
2275+ aic_delay(5);
2276
2277 if (cnt == 0)
2278 return (ETIMEDOUT);
2279@@ -8974,7 +9591,7 @@
2280 AHD_ASSERT_MODES(ahd, AHD_MODE_SCSI_MSK, AHD_MODE_SCSI_MSK);
2281 cnt = 1000000 * 2 / 5;
2282 while ((ahd_inb(ahd, BRDCTL) & FLXARBACK) == 0 && --cnt)
2283- ahd_delay(5);
2284+ aic_delay(5);
2285
2286 if (cnt == 0)
2287 return (ETIMEDOUT);
2288@@ -9176,13 +9793,9 @@
2289 if ((ahd->features & AHD_MULTI_TID) != 0) {
2290 u_int targid_mask;
2291
2292- targid_mask = ahd_inb(ahd, TARGID)
2293- | (ahd_inb(ahd, TARGID + 1) << 8);
2294-
2295+ targid_mask = ahd_inw(ahd, TARGID);
2296 targid_mask |= target_mask;
2297- ahd_outb(ahd, TARGID, targid_mask);
2298- ahd_outb(ahd, TARGID+1, (targid_mask >> 8));
2299-
2300+ ahd_outw(ahd, TARGID, targid_mask);
2301 ahd_update_scsiid(ahd, targid_mask);
2302 } else {
2303 u_int our_id;
2304@@ -9296,14 +9909,9 @@
2305 if (ahd->features & AHD_MULTI_TID) {
2306 u_int targid_mask;
2307
2308- targid_mask = ahd_inb(ahd, TARGID)
2309- | (ahd_inb(ahd, TARGID + 1)
2310- << 8);
2311-
2312+ targid_mask = ahd_inw(ahd, TARGID);
2313 targid_mask &= ~target_mask;
2314- ahd_outb(ahd, TARGID, targid_mask);
2315- ahd_outb(ahd, TARGID+1,
2316- (targid_mask >> 8));
2317+ ahd_outw(ahd, TARGID, targid_mask);
2318 ahd_update_scsiid(ahd, targid_mask);
2319 }
2320 }
2321diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx.h linux-2.4.24/drivers/scsi/aic7xxx/aic79xx.h
2322--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx.h 2004-01-08 11:57:43.067993795 +0100
2323+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx.h 2003-12-22 22:46:59.000000000 +0100
2324@@ -37,7 +37,7 @@
2325 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2326 * POSSIBILITY OF SUCH DAMAGES.
2327 *
2328- * $Id$
2329+ * $Id$
2330 *
2331 * $FreeBSD$
2332 */
2333@@ -74,9 +74,9 @@
2334 #define ALL_TARGETS_MASK 0xFFFF
2335 #define INITIATOR_WILDCARD (~0)
2336 #define SCB_LIST_NULL 0xFF00
2337-#define SCB_LIST_NULL_LE (ahd_htole16(SCB_LIST_NULL))
2338+#define SCB_LIST_NULL_LE (aic_htole16(SCB_LIST_NULL))
2339 #define QOUTFIFO_ENTRY_VALID 0x8000
2340-#define QOUTFIFO_ENTRY_VALID_LE (ahd_htole16(0x8000))
2341+#define QOUTFIFO_ENTRY_VALID_LE (aic_htole16(0x8000))
2342 #define SCBID_IS_NULL(scbid) (((scbid) & 0xFF00 ) == SCB_LIST_NULL)
2343
2344 #define SCSIID_TARGET(ahd, scsiid) \
2345@@ -118,7 +118,7 @@
2346 ((lun) | ((target) << 8))
2347
2348 #define SCB_GET_TAG(scb) \
2349- ahd_le16toh(scb->hscb->tag)
2350+ aic_le16toh(scb->hscb->tag)
2351
2352 #ifndef AHD_TARGET_MODE
2353 #undef AHD_TMODE_ENABLE
2354@@ -229,8 +229,10 @@
2355 AHD_RTI = 0x04000,/* Retained Training Support */
2356 AHD_NEW_IOCELL_OPTS = 0x08000,/* More Signal knobs in the IOCELL */
2357 AHD_NEW_DFCNTRL_OPTS = 0x10000,/* SCSIENWRDIS bit */
2358+ AHD_FAST_CDB_DELIVERY = 0x20000,/* CDB acks released to Output Sync */
2359 AHD_REMOVABLE = 0x00000,/* Hot-Swap supported - None so far*/
2360 AHD_AIC7901_FE = AHD_FENONE,
2361+ AHD_AIC7901A_FE = AHD_FENONE,
2362 AHD_AIC7902_FE = AHD_MULTI_FUNC
2363 } ahd_feature;
2364
2365@@ -372,7 +374,9 @@
2366 AHD_HP_BOARD = 0x100000,
2367 AHD_RESET_POLL_ACTIVE = 0x200000,
2368 AHD_UPDATE_PEND_CMDS = 0x400000,
2369- AHD_RUNNING_QOUTFIFO = 0x800000
2370+ AHD_RUNNING_QOUTFIFO = 0x800000,
2371+ AHD_HAD_FIRST_SEL = 0x1000000,
2372+ AHD_SHUTDOWN_RECOVERY = 0x2000000 /* Terminate recovery thread. */
2373 } ahd_flag;
2374
2375 /************************* Hardware SCB Definition ***************************/
2376@@ -546,7 +550,7 @@
2377
2378 struct map_node {
2379 bus_dmamap_t dmamap;
2380- bus_addr_t physaddr;
2381+ bus_addr_t busaddr;
2382 uint8_t *vaddr;
2383 SLIST_ENTRY(map_node) links;
2384 };
2385@@ -588,12 +592,16 @@
2386 SCB_PKT_SENSE = 0x02000,
2387 SCB_CMDPHASE_ABORT = 0x04000,
2388 SCB_ON_COL_LIST = 0x08000,
2389- SCB_SILENT = 0x10000 /*
2390+ SCB_SILENT = 0x10000,/*
2391 * Be quiet about transmission type
2392 * errors. They are expected and we
2393 * don't want to upset the user. This
2394 * flag is typically used during DV.
2395 */
2396+ SCB_TIMEDOUT = 0x20000/*
2397+ * SCB has timed out and is on the
2398+ * timedout list.
2399+ */
2400 } scb_flag;
2401
2402 struct scb {
2403@@ -610,8 +618,9 @@
2404 } links2;
2405 #define pending_links links2.le
2406 #define collision_links links2.le
2407+ LIST_ENTRY(scb) timedout_links;
2408 struct scb *col_scb;
2409- ahd_io_ctx_t io_ctx;
2410+ aic_io_ctx_t io_ctx;
2411 struct ahd_softc *ahd_softc;
2412 scb_flag flags;
2413 #ifndef __linux__
2414@@ -1059,6 +1068,7 @@
2415 struct scb_data scb_data;
2416
2417 struct hardware_scb *next_queued_hscb;
2418+ struct map_node *next_queued_hscb_map;
2419
2420 /*
2421 * SCBs that have been sent to the controller
2422@@ -1066,6 +1076,11 @@
2423 LIST_HEAD(, scb) pending_scbs;
2424
2425 /*
2426+ * SCBs whose timeout routine has been called.
2427+ */
2428+ LIST_HEAD(, scb) timedout_scbs;
2429+
2430+ /*
2431 * Current register window mode information.
2432 */
2433 ahd_mode dst_mode;
2434@@ -1086,7 +1101,7 @@
2435 /*
2436 * Platform specific device information.
2437 */
2438- ahd_dev_softc_t dev_softc;
2439+ aic_dev_softc_t dev_softc;
2440
2441 /*
2442 * Bus specific device information.
2443@@ -1116,8 +1131,8 @@
2444 /*
2445 * Timer handles for timer driven callbacks.
2446 */
2447- ahd_timer_t reset_timer;
2448- ahd_timer_t stat_timer;
2449+ aic_timer_t reset_timer;
2450+ aic_timer_t stat_timer;
2451
2452 /*
2453 * Statistics.
2454@@ -1194,8 +1209,7 @@
2455 */
2456 bus_dma_tag_t parent_dmat;
2457 bus_dma_tag_t shared_data_dmat;
2458- bus_dmamap_t shared_data_dmamap;
2459- bus_addr_t shared_data_busaddr;
2460+ struct map_node shared_data_map;
2461
2462 /* Information saved through suspend/resume cycles */
2463 struct ahd_suspend_state suspend_state;
2464@@ -1296,9 +1310,9 @@
2465 };
2466
2467 /****************************** PCI Structures ********************************/
2468-#define AHD_PCI_IOADDR0 PCIR_MAPS /* I/O BAR*/
2469-#define AHD_PCI_MEMADDR (PCIR_MAPS + 4) /* Memory BAR */
2470-#define AHD_PCI_IOADDR1 (PCIR_MAPS + 12)/* Second I/O BAR */
2471+#define AHD_PCI_IOADDR0 PCIR_BAR(0) /* I/O BAR*/
2472+#define AHD_PCI_MEMADDR PCIR_BAR(1) /* Memory BAR */
2473+#define AHD_PCI_IOADDR1 PCIR_BAR(3) /* Second I/O BAR */
2474
2475 typedef int (ahd_device_setup_t)(struct ahd_softc *);
2476
2477@@ -1338,7 +1352,7 @@
2478 }
2479
2480 /***************************** PCI Front End *********************************/
2481-struct ahd_pci_identity *ahd_find_pci_device(ahd_dev_softc_t);
2482+struct ahd_pci_identity *ahd_find_pci_device(aic_dev_softc_t);
2483 int ahd_pci_config(struct ahd_softc *,
2484 struct ahd_pci_identity *);
2485 int ahd_pci_test_register_access(struct ahd_softc *);
2486@@ -1430,6 +1444,8 @@
2487 struct scb *scb);
2488 void ahd_calc_residual(struct ahd_softc *ahd,
2489 struct scb *scb);
2490+void ahd_timeout(struct scb *scb);
2491+void ahd_recover_commands(struct ahd_softc *ahd);
2492 /*************************** Utility Functions ********************************/
2493 struct ahd_phase_table_entry*
2494 ahd_lookup_phase_entry(int phase);
2495diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_inline.h linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_inline.h
2496--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_inline.h 2004-01-08 11:57:43.058995655 +0100
2497+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_inline.h 2003-12-22 22:46:59.000000000 +0100
2498@@ -37,7 +37,7 @@
2499 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2500 * POSSIBILITY OF SUCH DAMAGES.
2501 *
2502- * $Id$
2503+ * $Id$
2504 *
2505 * $FreeBSD$
2506 */
2507@@ -250,15 +250,15 @@
2508 struct ahd_dma64_seg *sg;
2509
2510 sg = (struct ahd_dma64_seg *)sgptr;
2511- sg->addr = ahd_htole64(addr);
2512- sg->len = ahd_htole32(len | (last ? AHD_DMA_LAST_SEG : 0));
2513+ sg->addr = aic_htole64(addr);
2514+ sg->len = aic_htole32(len | (last ? AHD_DMA_LAST_SEG : 0));
2515 return (sg + 1);
2516 } else {
2517 struct ahd_dma_seg *sg;
2518
2519 sg = (struct ahd_dma_seg *)sgptr;
2520- sg->addr = ahd_htole32(addr & 0xFFFFFFFF);
2521- sg->len = ahd_htole32(len | ((addr >> 8) & 0x7F000000)
2522+ sg->addr = aic_htole32(addr & 0xFFFFFFFF);
2523+ sg->len = aic_htole32(len | ((addr >> 8) & 0x7F000000)
2524 | (last ? AHD_DMA_LAST_SEG : 0));
2525 return (sg + 1);
2526 }
2527@@ -273,7 +273,7 @@
2528 /* XXX what about ACA?? It is type 4, but TAG_TYPE == 0x3. */
2529 scb->hscb->task_attribute = scb->hscb->control & SCB_TAG_TYPE;
2530 } else {
2531- if (ahd_get_transfer_length(scb) & 0x01)
2532+ if (aic_get_transfer_length(scb) & 0x01)
2533 scb->hscb->task_attribute = SCB_XFERLEN_ODD;
2534 else
2535 scb->hscb->task_attribute = 0;
2536@@ -282,7 +282,7 @@
2537 if (scb->hscb->cdb_len <= MAX_CDB_LEN_WITH_SENSE_ADDR
2538 || (scb->hscb->cdb_len & SCB_CDB_LEN_PTR) != 0)
2539 scb->hscb->shared_data.idata.cdb_plus_saddr.sense_addr =
2540- ahd_htole32(scb->sense_busaddr);
2541+ aic_htole32(scb->sense_busaddr);
2542 }
2543
2544 static __inline void
2545@@ -308,8 +308,8 @@
2546 if ((ahd->flags & AHD_39BIT_ADDRESSING) != 0) {
2547 uint64_t high_addr;
2548
2549- high_addr = ahd_le32toh(sg->len) & 0x7F000000;
2550- scb->hscb->dataptr |= ahd_htole64(high_addr << 8);
2551+ high_addr = aic_le32toh(sg->len) & 0x7F000000;
2552+ scb->hscb->dataptr |= aic_htole64(high_addr << 8);
2553 }
2554 scb->hscb->datacnt = sg->len;
2555 }
2556@@ -319,13 +319,13 @@
2557 * sequencer will clear as soon as a data transfer
2558 * occurs.
2559 */
2560- scb->hscb->sgptr = ahd_htole32(scb->sg_list_busaddr|SG_FULL_RESID);
2561+ scb->hscb->sgptr = aic_htole32(scb->sg_list_busaddr|SG_FULL_RESID);
2562 }
2563
2564 static __inline void
2565 ahd_setup_noxfer_scb(struct ahd_softc *ahd, struct scb *scb)
2566 {
2567- scb->hscb->sgptr = ahd_htole32(SG_LIST_NULL);
2568+ scb->hscb->sgptr = aic_htole32(SG_LIST_NULL);
2569 scb->hscb->dataptr = 0;
2570 scb->hscb->datacnt = 0;
2571 }
2572@@ -383,7 +383,7 @@
2573 static __inline void
2574 ahd_sync_scb(struct ahd_softc *ahd, struct scb *scb, int op)
2575 {
2576- ahd_dmamap_sync(ahd, ahd->scb_data.hscb_dmat,
2577+ aic_dmamap_sync(ahd, ahd->scb_data.hscb_dmat,
2578 scb->hscb_map->dmamap,
2579 /*offset*/(uint8_t*)scb->hscb - scb->hscb_map->vaddr,
2580 /*len*/sizeof(*scb->hscb), op);
2581@@ -395,7 +395,7 @@
2582 if (scb->sg_count == 0)
2583 return;
2584
2585- ahd_dmamap_sync(ahd, ahd->scb_data.sg_dmat,
2586+ aic_dmamap_sync(ahd, ahd->scb_data.sg_dmat,
2587 scb->sg_map->dmamap,
2588 /*offset*/scb->sg_list_busaddr - ahd_sg_size(ahd),
2589 /*len*/ahd_sg_size(ahd) * scb->sg_count, op);
2590@@ -404,7 +404,7 @@
2591 static __inline void
2592 ahd_sync_sense(struct ahd_softc *ahd, struct scb *scb, int op)
2593 {
2594- ahd_dmamap_sync(ahd, ahd->scb_data.sense_dmat,
2595+ aic_dmamap_sync(ahd, ahd->scb_data.sense_dmat,
2596 scb->sense_map->dmamap,
2597 /*offset*/scb->sense_busaddr,
2598 /*len*/AHD_SENSE_BUFSIZE, op);
2599@@ -455,6 +455,8 @@
2600 static __inline u_int ahd_inw_scbram(struct ahd_softc *ahd, u_int offset);
2601 static __inline uint32_t
2602 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset);
2603+static __inline uint64_t
2604+ ahd_inq_scbram(struct ahd_softc *ahd, u_int offset);
2605 static __inline void ahd_swap_with_next_hscb(struct ahd_softc *ahd,
2606 struct scb *scb);
2607 static __inline void ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb);
2608@@ -470,7 +472,7 @@
2609 {
2610 uint32_t sgptr;
2611
2612- sgptr = ahd_le32toh(scb->hscb->sgptr);
2613+ sgptr = aic_le32toh(scb->hscb->sgptr);
2614 if ((sgptr & SG_STATUS_VALID) != 0)
2615 ahd_handle_scb_status(ahd, scb);
2616 else
2617@@ -486,7 +488,7 @@
2618 {
2619 uint32_t sgptr;
2620
2621- sgptr = ahd_le32toh(scb->hscb->sgptr);
2622+ sgptr = aic_le32toh(scb->hscb->sgptr);
2623 if ((sgptr & SG_STATUS_VALID) != 0)
2624 ahd_calc_residual(ahd, scb);
2625 }
2626@@ -520,12 +522,21 @@
2627 static __inline uint16_t
2628 ahd_inw(struct ahd_softc *ahd, u_int port)
2629 {
2630+ /*
2631+ * Read high byte first as some registers increment
2632+ * or have other side effects when the low byte is
2633+ * read.
2634+ */
2635 return ((ahd_inb(ahd, port+1) << 8) | ahd_inb(ahd, port));
2636 }
2637
2638 static __inline void
2639 ahd_outw(struct ahd_softc *ahd, u_int port, u_int value)
2640 {
2641+ /*
2642+ * Write low byte first to accomodate registers
2643+ * such as PRGMCNT where the order maters.
2644+ */
2645 ahd_outb(ahd, port, value & 0xFF);
2646 ahd_outb(ahd, port+1, (value >> 8) & 0xFF);
2647 }
2648@@ -697,10 +708,15 @@
2649 static __inline uint32_t
2650 ahd_inl_scbram(struct ahd_softc *ahd, u_int offset)
2651 {
2652- return (ahd_inb_scbram(ahd, offset)
2653- | (ahd_inb_scbram(ahd, offset+1) << 8)
2654- | (ahd_inb_scbram(ahd, offset+2) << 16)
2655- | (ahd_inb_scbram(ahd, offset+3) << 24));
2656+ return (ahd_inw_scbram(ahd, offset)
2657+ | (ahd_inw_scbram(ahd, offset+2) << 16));
2658+}
2659+
2660+static __inline uint64_t
2661+ahd_inq_scbram(struct ahd_softc *ahd, u_int offset)
2662+{
2663+ return (ahd_inl_scbram(ahd, offset)
2664+ | ((uint64_t)ahd_inl_scbram(ahd, offset+4)) << 32);
2665 }
2666
2667 static __inline struct scb *
2668@@ -720,7 +736,8 @@
2669 static __inline void
2670 ahd_swap_with_next_hscb(struct ahd_softc *ahd, struct scb *scb)
2671 {
2672- struct hardware_scb *q_hscb;
2673+ struct hardware_scb *q_hscb;
2674+ struct map_node *q_hscb_map;
2675 uint32_t saved_hscb_busaddr;
2676
2677 /*
2678@@ -736,6 +753,7 @@
2679 * locate the correct SCB by SCB_TAG.
2680 */
2681 q_hscb = ahd->next_queued_hscb;
2682+ q_hscb_map = ahd->next_queued_hscb_map;
2683 saved_hscb_busaddr = q_hscb->hscb_busaddr;
2684 memcpy(q_hscb, scb->hscb, sizeof(*scb->hscb));
2685 q_hscb->hscb_busaddr = saved_hscb_busaddr;
2686@@ -743,7 +761,9 @@
2687
2688 /* Now swap HSCB pointers. */
2689 ahd->next_queued_hscb = scb->hscb;
2690+ ahd->next_queued_hscb_map = scb->hscb_map;
2691 scb->hscb = q_hscb;
2692+ scb->hscb_map = q_hscb_map;
2693
2694 /* Now define the mapping from tag to SCB in the scbindex */
2695 ahd->scb_data.scbindex[SCB_GET_TAG(scb)] = scb;
2696@@ -783,13 +803,13 @@
2697 if ((ahd_debug & AHD_SHOW_QUEUE) != 0) {
2698 uint64_t host_dataptr;
2699
2700- host_dataptr = ahd_le64toh(scb->hscb->dataptr);
2701+ host_dataptr = aic_le64toh(scb->hscb->dataptr);
2702 printf("%s: Queueing SCB 0x%x bus addr 0x%x - 0x%x%x/0x%x\n",
2703 ahd_name(ahd),
2704- SCB_GET_TAG(scb), ahd_le32toh(scb->hscb->hscb_busaddr),
2705+ SCB_GET_TAG(scb), aic_le32toh(scb->hscb->hscb_busaddr),
2706 (u_int)((host_dataptr >> 32) & 0xFFFFFFFF),
2707 (u_int)(host_dataptr & 0xFFFFFFFF),
2708- ahd_le32toh(scb->hscb->datacnt));
2709+ aic_le32toh(scb->hscb->datacnt));
2710 }
2711 #endif
2712 /* Tell the adapter about the newly queued SCB */
2713@@ -817,8 +837,8 @@
2714 static __inline void
2715 ahd_sync_qoutfifo(struct ahd_softc *ahd, int op)
2716 {
2717- ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap,
2718- /*offset*/0, /*len*/AHC_SCB_MAX * sizeof(uint16_t), op);
2719+ aic_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
2720+ /*offset*/0, /*len*/AHD_SCB_MAX * sizeof(uint16_t), op);
2721 }
2722
2723 static __inline void
2724@@ -826,8 +846,8 @@
2725 {
2726 #ifdef AHD_TARGET_MODE
2727 if ((ahd->flags & AHD_TARGETROLE) != 0) {
2728- ahd_dmamap_sync(ahd, ahd->shared_data_dmat,
2729- ahd->shared_data_dmamap,
2730+ aic_dmamap_sync(ahd, ahd->shared_data_dmat,
2731+ ahd->shared_data_map.dmamap,
2732 ahd_targetcmd_offset(ahd, 0),
2733 sizeof(struct target_cmd) * AHD_TMODE_CMDS,
2734 op);
2735@@ -847,7 +867,7 @@
2736 u_int retval;
2737
2738 retval = 0;
2739- ahd_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_dmamap,
2740+ aic_dmamap_sync(ahd, ahd->shared_data_dmat, ahd->shared_data_map.dmamap,
2741 /*offset*/ahd->qoutfifonext, /*len*/2,
2742 BUS_DMASYNC_POSTREAD);
2743 if ((ahd->qoutfifo[ahd->qoutfifonext]
2744@@ -856,8 +876,8 @@
2745 #ifdef AHD_TARGET_MODE
2746 if ((ahd->flags & AHD_TARGETROLE) != 0
2747 && (ahd->flags & AHD_TQINFIFO_BLOCKED) == 0) {
2748- ahd_dmamap_sync(ahd, ahd->shared_data_dmat,
2749- ahd->shared_data_dmamap,
2750+ aic_dmamap_sync(ahd, ahd->shared_data_dmat,
2751+ ahd->shared_data_map.dmamap,
2752 ahd_targetcmd_offset(ahd, ahd->tqinfifofnext),
2753 /*len*/sizeof(struct target_cmd),
2754 BUS_DMASYNC_POSTREAD);
2755diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_osm.c linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_osm.c
2756--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_osm.c 2004-01-08 11:57:43.057995862 +0100
2757+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_osm.c 2003-12-22 22:46:59.000000000 +0100
2758@@ -1,7 +1,7 @@
2759 /*
2760 * Adaptec AIC79xx device driver for Linux.
2761 *
2762- * $Id$
2763+ * $Id$
2764 *
2765 * --------------------------------------------------------------------------
2766 * Copyright (c) 1994-2000 Justin T. Gibbs.
2767@@ -62,6 +62,16 @@
2768
2769 #include <linux/mm.h> /* For fetching system memory size */
2770
2771+/************************* Magic SysReq Support *******************************/
2772+static struct aic_sysrq_key_op ahd_sysrq_op =
2773+{
2774+ aic_sysrq_handler,
2775+ "aic79xxstatedump",
2776+ "Dump aic79xx controller information to Console"
2777+};
2778+
2779+static int ahd_sysrq_key;
2780+
2781 /*
2782 * Lock protecting manipulation of the ahd softc list.
2783 */
2784@@ -425,7 +435,7 @@
2785 static char dummy_buffer[60] = "Please don't trounce on me insmod!!\n";
2786
2787 MODULE_AUTHOR("Maintainer: Justin T. Gibbs <gibbs@scsiguy.com>");
2788-MODULE_DESCRIPTION("Adaptec Aic77XX/78XX SCSI Host Bus Adapter driver");
2789+MODULE_DESCRIPTION("Adaptec Aic790X U320 SCSI Host Bus Adapter driver");
2790 #ifdef MODULE_LICENSE
2791 MODULE_LICENSE("Dual BSD/GPL");
2792 #endif
2793@@ -466,7 +476,7 @@
2794 #endif
2795
2796 static void ahd_linux_handle_scsi_status(struct ahd_softc *,
2797- struct ahd_linux_device *,
2798+ struct aic_linux_device *,
2799 struct scb *);
2800 static void ahd_linux_queue_cmd_complete(struct ahd_softc *ahd,
2801 Scsi_Cmnd *cmd);
2802@@ -478,21 +488,20 @@
2803 static void ahd_linux_size_nseg(void);
2804 static void ahd_linux_thread_run_complete_queue(struct ahd_softc *ahd);
2805 static void ahd_linux_start_dv(struct ahd_softc *ahd);
2806-static void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
2807 static int ahd_linux_dv_thread(void *data);
2808 static void ahd_linux_kill_dv_thread(struct ahd_softc *ahd);
2809 static void ahd_linux_dv_target(struct ahd_softc *ahd, u_int target);
2810 static void ahd_linux_dv_transition(struct ahd_softc *ahd,
2811 struct scsi_cmnd *cmd,
2812 struct ahd_devinfo *devinfo,
2813- struct ahd_linux_target *targ);
2814+ struct aic_linux_target *targ);
2815 static void ahd_linux_dv_fill_cmd(struct ahd_softc *ahd,
2816 struct scsi_cmnd *cmd,
2817 struct ahd_devinfo *devinfo);
2818 static void ahd_linux_dv_inq(struct ahd_softc *ahd,
2819 struct scsi_cmnd *cmd,
2820 struct ahd_devinfo *devinfo,
2821- struct ahd_linux_target *targ,
2822+ struct aic_linux_target *targ,
2823 u_int request_length);
2824 static void ahd_linux_dv_tur(struct ahd_softc *ahd,
2825 struct scsi_cmnd *cmd,
2826@@ -500,19 +509,19 @@
2827 static void ahd_linux_dv_rebd(struct ahd_softc *ahd,
2828 struct scsi_cmnd *cmd,
2829 struct ahd_devinfo *devinfo,
2830- struct ahd_linux_target *targ);
2831+ struct aic_linux_target *targ);
2832 static void ahd_linux_dv_web(struct ahd_softc *ahd,
2833 struct scsi_cmnd *cmd,
2834 struct ahd_devinfo *devinfo,
2835- struct ahd_linux_target *targ);
2836+ struct aic_linux_target *targ);
2837 static void ahd_linux_dv_reb(struct ahd_softc *ahd,
2838 struct scsi_cmnd *cmd,
2839 struct ahd_devinfo *devinfo,
2840- struct ahd_linux_target *targ);
2841+ struct aic_linux_target *targ);
2842 static void ahd_linux_dv_su(struct ahd_softc *ahd,
2843 struct scsi_cmnd *cmd,
2844 struct ahd_devinfo *devinfo,
2845- struct ahd_linux_target *targ);
2846+ struct aic_linux_target *targ);
2847 static __inline int
2848 ahd_linux_dv_fallback(struct ahd_softc *ahd,
2849 struct ahd_devinfo *devinfo);
2850@@ -520,103 +529,57 @@
2851 struct ahd_devinfo *devinfo);
2852 static __inline int ahd_linux_dv_fallback(struct ahd_softc *ahd,
2853 struct ahd_devinfo *devinfo);
2854-static void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
2855-static void ahd_linux_generate_dv_pattern(struct ahd_linux_target *targ);
2856+static void ahd_linux_generate_dv_pattern(struct aic_linux_target *targ);
2857 static u_int ahd_linux_user_tagdepth(struct ahd_softc *ahd,
2858 struct ahd_devinfo *devinfo);
2859 static u_int ahd_linux_user_dv_setting(struct ahd_softc *ahd);
2860 static void ahd_linux_setup_user_rd_strm_settings(struct ahd_softc *ahd);
2861-static void ahd_linux_device_queue_depth(struct ahd_softc *ahd,
2862- struct ahd_linux_device *dev);
2863-static struct ahd_linux_target* ahd_linux_alloc_target(struct ahd_softc*,
2864+static void aic_linux_device_queue_depth(struct ahd_softc *ahd,
2865+ struct aic_linux_device *dev);
2866+static struct aic_linux_target* ahd_linux_alloc_target(struct ahd_softc*,
2867 u_int, u_int);
2868 static void ahd_linux_free_target(struct ahd_softc*,
2869- struct ahd_linux_target*);
2870-static struct ahd_linux_device* ahd_linux_alloc_device(struct ahd_softc*,
2871- struct ahd_linux_target*,
2872+ struct aic_linux_target*);
2873+static struct aic_linux_device* ahd_linux_alloc_device(struct ahd_softc*,
2874+ struct aic_linux_target*,
2875 u_int);
2876 static void ahd_linux_free_device(struct ahd_softc*,
2877- struct ahd_linux_device*);
2878-static void ahd_linux_run_device_queue(struct ahd_softc*,
2879- struct ahd_linux_device*);
2880+ struct aic_linux_device*);
2881 static void ahd_linux_setup_tag_info_global(char *p);
2882 static aic_option_callback_t ahd_linux_setup_tag_info;
2883 static aic_option_callback_t ahd_linux_setup_rd_strm_info;
2884 static aic_option_callback_t ahd_linux_setup_dv;
2885 static aic_option_callback_t ahd_linux_setup_iocell_info;
2886 static int ahd_linux_next_unit(void);
2887-static void ahd_runq_tasklet(unsigned long data);
2888 static int aic79xx_setup(char *c);
2889
2890 /****************************** Inlines ***************************************/
2891 static __inline void ahd_schedule_completeq(struct ahd_softc *ahd);
2892-static __inline void ahd_schedule_runq(struct ahd_softc *ahd);
2893-static __inline void ahd_setup_runq_tasklet(struct ahd_softc *ahd);
2894-static __inline void ahd_teardown_runq_tasklet(struct ahd_softc *ahd);
2895-static __inline struct ahd_linux_device*
2896+static __inline struct aic_linux_device*
2897 ahd_linux_get_device(struct ahd_softc *ahd, u_int channel,
2898 u_int target, u_int lun, int alloc);
2899-static struct ahd_cmd *ahd_linux_run_complete_queue(struct ahd_softc *ahd);
2900-static __inline void ahd_linux_check_device_queue(struct ahd_softc *ahd,
2901- struct ahd_linux_device *dev);
2902-static __inline struct ahd_linux_device *
2903- ahd_linux_next_device_to_run(struct ahd_softc *ahd);
2904-static __inline void ahd_linux_run_device_queues(struct ahd_softc *ahd);
2905 static __inline void ahd_linux_unmap_scb(struct ahd_softc*, struct scb*);
2906-
2907-static __inline int ahd_linux_map_seg(struct ahd_softc *ahd, struct scb *scb,
2908- struct ahd_dma_seg *sg,
2909- bus_addr_t addr, bus_size_t len);
2910+static __inline struct ahd_dma_seg*
2911+ ahd_linux_sg_setup(struct ahd_softc *ahd, struct scb *scb,
2912+ struct ahd_dma_seg *sg, bus_addr_t addr,
2913+ bus_size_t len, int last_seg);
2914
2915 static __inline void
2916 ahd_schedule_completeq(struct ahd_softc *ahd)
2917 {
2918- if ((ahd->platform_data->flags & AHD_RUN_CMPLT_Q_TIMER) == 0) {
2919- ahd->platform_data->flags |= AHD_RUN_CMPLT_Q_TIMER;
2920+ if ((ahd->platform_data->flags & AIC_RUN_CMPLT_Q_TIMER) == 0) {
2921+ ahd->platform_data->flags |= AIC_RUN_CMPLT_Q_TIMER;
2922 ahd->platform_data->completeq_timer.expires = jiffies;
2923 add_timer(&ahd->platform_data->completeq_timer);
2924 }
2925 }
2926
2927-/*
2928- * Must be called with our lock held.
2929- */
2930-static __inline void
2931-ahd_schedule_runq(struct ahd_softc *ahd)
2932-{
2933-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
2934- tasklet_schedule(&ahd->platform_data->runq_tasklet);
2935-#else
2936- /*
2937- * Tasklets are not available, so run inline.
2938- */
2939- ahd_runq_tasklet((unsigned long)ahd);
2940-#endif
2941-}
2942-
2943-static __inline
2944-void ahd_setup_runq_tasklet(struct ahd_softc *ahd)
2945-{
2946-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
2947- tasklet_init(&ahd->platform_data->runq_tasklet, ahd_runq_tasklet,
2948- (unsigned long)ahd);
2949-#endif
2950-}
2951-
2952-static __inline void
2953-ahd_teardown_runq_tasklet(struct ahd_softc *ahd)
2954-{
2955-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
2956- tasklet_kill(&ahd->platform_data->runq_tasklet);
2957-#endif
2958-}
2959-
2960-static __inline struct ahd_linux_device*
2961+static __inline struct aic_linux_device*
2962 ahd_linux_get_device(struct ahd_softc *ahd, u_int channel, u_int target,
2963 u_int lun, int alloc)
2964 {
2965- struct ahd_linux_target *targ;
2966- struct ahd_linux_device *dev;
2967+ struct aic_linux_target *targ;
2968+ struct aic_linux_device *dev;
2969 u_int target_offset;
2970
2971 target_offset = target;
2972@@ -638,10 +601,10 @@
2973 }
2974
2975 #define AHD_LINUX_MAX_RETURNED_ERRORS 4
2976-static struct ahd_cmd *
2977+static struct aic_cmd *
2978 ahd_linux_run_complete_queue(struct ahd_softc *ahd)
2979 {
2980- struct ahd_cmd *acmd;
2981+ struct aic_cmd *acmd;
2982 u_long done_flags;
2983 int with_errors;
2984
2985@@ -666,7 +629,7 @@
2986 acmd, acmd_links.tqe);
2987 cmd = &acmd_scsi_cmd(acmd);
2988 cmd->host_scribble = NULL;
2989- if (ahd_cmd_get_transaction_status(cmd) != DID_OK
2990+ if (aic_cmd_get_transaction_status(cmd) != DID_OK
2991 || (cmd->result & 0xFF) != SCSI_STATUS_OK)
2992 with_errors++;
2993
2994@@ -677,46 +640,6 @@
2995 }
2996
2997 static __inline void
2998-ahd_linux_check_device_queue(struct ahd_softc *ahd,
2999- struct ahd_linux_device *dev)
3000-{
3001- if ((dev->flags & AHD_DEV_FREEZE_TIL_EMPTY) != 0
3002- && dev->active == 0) {
3003- dev->flags &= ~AHD_DEV_FREEZE_TIL_EMPTY;
3004- dev->qfrozen--;
3005- }
3006-
3007- if (TAILQ_FIRST(&dev->busyq) == NULL
3008- || dev->openings == 0 || dev->qfrozen != 0)
3009- return;
3010-
3011- ahd_linux_run_device_queue(ahd, dev);
3012-}
3013-
3014-static __inline struct ahd_linux_device *
3015-ahd_linux_next_device_to_run(struct ahd_softc *ahd)
3016-{
3017-
3018- if ((ahd->flags & AHD_RESOURCE_SHORTAGE) != 0
3019- || (ahd->platform_data->qfrozen != 0
3020- && AHD_DV_SIMQ_FROZEN(ahd) == 0))
3021- return (NULL);
3022- return (TAILQ_FIRST(&ahd->platform_data->device_runq));
3023-}
3024-
3025-static __inline void
3026-ahd_linux_run_device_queues(struct ahd_softc *ahd)
3027-{
3028- struct ahd_linux_device *dev;
3029-
3030- while ((dev = ahd_linux_next_device_to_run(ahd)) != NULL) {
3031- TAILQ_REMOVE(&ahd->platform_data->device_runq, dev, links);
3032- dev->flags &= ~AHD_DEV_ON_RUN_LIST;
3033- ahd_linux_check_device_queue(ahd, dev);
3034- }
3035-}
3036-
3037-static __inline void
3038 ahd_linux_unmap_scb(struct ahd_softc *ahd, struct scb *scb)
3039 {
3040 Scsi_Cmnd *cmd;
3041@@ -729,34 +652,22 @@
3042 struct scatterlist *sg;
3043
3044 sg = (struct scatterlist *)cmd->request_buffer;
3045- pci_unmap_sg(ahd->dev_softc, sg, cmd->use_sg, direction);
3046+ aic_unmap_sg(ahd, sg, cmd->use_sg, direction);
3047 } else if (cmd->request_bufflen != 0) {
3048- pci_unmap_single(ahd->dev_softc,
3049+ aic_unmap_single(ahd,
3050 scb->platform_data->buf_busaddr,
3051 cmd->request_bufflen, direction);
3052 }
3053 }
3054
3055-static __inline int
3056-ahd_linux_map_seg(struct ahd_softc *ahd, struct scb *scb,
3057- struct ahd_dma_seg *sg, bus_addr_t addr, bus_size_t len)
3058+static __inline struct ahd_dma_seg*
3059+ahd_linux_sg_setup(struct ahd_softc *ahd, struct scb *scb,
3060+ struct ahd_dma_seg *sg, bus_addr_t addr,
3061+ bus_size_t len, int last_seg)
3062 {
3063- int consumed;
3064-
3065- if ((scb->sg_count + 1) > AHD_NSEG)
3066- panic("Too few segs for dma mapping. "
3067- "Increase AHD_NSEG\n");
3068-
3069- consumed = 1;
3070- sg->addr = ahd_htole32(addr & 0xFFFFFFFF);
3071+ sg = ahd_sg_setup(ahd, scb, sg, addr, len, last_seg);
3072 scb->platform_data->xfer_len += len;
3073-
3074- if (sizeof(bus_addr_t) > 4
3075- && (ahd->flags & AHD_39BIT_ADDRESSING) != 0)
3076- len |= (addr >> 8) & AHD_SG_HIGH_ADDR_MASK;
3077-
3078- sg->len = ahd_htole32(len);
3079- return (consumed);
3080+ return (sg);
3081 }
3082
3083 /******************************** Macros **************************************/
3084@@ -797,7 +708,7 @@
3085 * number of segments needed for the current transfer. Since the code that
3086 * sizes the SCSI malloc pool does not take into consideration fragmentation
3087 * of the pool, executing transactions numbering just a fraction of our
3088- * concurrent transaction limit with SG list lengths aproaching AHC_NSEG will
3089+ * concurrent transaction limit with SG list lengths aproaching AHD_NSEG will
3090 * quickly depleat the SCSI malloc pool of usable space. Unfortunately, the
3091 * mid-layer does not properly handle this scsi malloc failures for the S/G
3092 * array and the result can be a lockup of the I/O subsystem. We try to size
3093@@ -848,6 +759,165 @@
3094 #endif
3095 }
3096
3097+/************************** Error Recovery ************************************/
3098+static int ahd_linux_recovery_thread(void *arg);
3099+
3100+static int
3101+ahd_linux_recovery_thread(void *arg)
3102+{
3103+ struct ahd_softc *ahd;
3104+ u_long s;
3105+
3106+ ahd = (struct ahd_softc *)arg;
3107+
3108+ /*
3109+ * Complete thread creation.
3110+ */
3111+ lock_kernel();
3112+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,60)
3113+ /*
3114+ * Don't care about any signals.
3115+ */
3116+ siginitsetinv(&current->blocked, 0);
3117+
3118+ daemonize();
3119+ sprintf(current->comm, "ahd_recovery_%d", ahd->unit);
3120+#else
3121+ daemonize("ahd_recovery_%d", ahd->unit);
3122+#endif
3123+ unlock_kernel();
3124+
3125+ while (1) {
3126+
3127+ /*
3128+ * Use down_interruptible() rather than down() to
3129+ * avoid inclusion in the load average.
3130+ */
3131+ down_interruptible(&ahd->platform_data->recovery_sem);
3132+
3133+ ahd_lock(ahd, &s);
3134+ if ((ahd->flags & AHD_SHUTDOWN_RECOVERY) != 0) {
3135+ ahd_unlock(ahd, &s);
3136+ break;
3137+ }
3138+
3139+ /*
3140+ * Don't bother the recovery handler if the
3141+ * list has been cleared by a previous run
3142+ * of the handler. This can happen when
3143+ * several SCBs timeout before our handler
3144+ * can run causing our semaphore to be up'ed
3145+ * repeatedly. The extra calls need to be
3146+ * avoided so that the recovery handler doesn't
3147+ * confuse this case with timeouts occuring
3148+ * due to interrupts failing to function.
3149+ */
3150+ if (LIST_EMPTY(&ahd->timedout_scbs) != 0) {
3151+ ahd_unlock(ahd, &s);
3152+ continue;
3153+ }
3154+
3155+ ahd_unlock(ahd, &s);
3156+ ahd_recover_commands(ahd);
3157+
3158+ /*
3159+ * Process any pent up completions.
3160+ */
3161+ ahd_lock(ahd, &s);
3162+ aic_schedule_runq(ahd);
3163+ ahd_linux_run_complete_queue(ahd);
3164+ ahd_unlock(ahd, &s);
3165+ }
3166+ up(&ahd->platform_data->recovery_ending_sem);
3167+ return(0);
3168+}
3169+
3170+int
3171+ahd_spawn_recovery_thread(struct ahd_softc *ahd)
3172+{
3173+ ahd->platform_data->recovery_pid =
3174+ kernel_thread(ahd_linux_recovery_thread, ahd, 0);
3175+
3176+ if (ahd->platform_data->recovery_pid < 0)
3177+ return (-ahd->platform_data->recovery_pid);
3178+
3179+ return (0);
3180+}
3181+
3182+void
3183+ahd_terminate_recovery_thread(struct ahd_softc *ahd)
3184+{
3185+ u_long s;
3186+
3187+ ahd_lock(ahd, &s);
3188+ if (ahd->platform_data->recovery_pid != 0) {
3189+ ahd->flags |= AHD_SHUTDOWN_RECOVERY;
3190+ ahd_unlock(ahd, &s);
3191+ up(&ahd->platform_data->recovery_sem);
3192+
3193+ /*
3194+ * Use the recovery_ending_sem as an indicator that
3195+ * the dv thread is exiting. Note that the dv
3196+ * thread must still return after performing
3197+ * the up on our semaphore before it has
3198+ * completely exited this module. Unfortunately,
3199+ * there seems to be no easy way to wait for the
3200+ * exit of a thread for which you are not the
3201+ * parent (dv threads are parented by init).
3202+ * Cross your fingers...
3203+ */
3204+ down(&ahd->platform_data->recovery_ending_sem);
3205+
3206+ /*
3207+ * Mark the recovery thread as already dead. This
3208+ * avoids attempting to kill it a second time.
3209+ * This is necessary because we must kill the
3210+ * our threads before calling ahd_free() in the
3211+ * module shutdown case to avoid bogus locking
3212+ * in the SCSI mid-layer, but when ahd_free() is
3213+ * called without killing the DV thread in the
3214+ * instance detach case, so ahd_platform_free()
3215+ * calls us again to verify that the DV thread
3216+ * is dead.
3217+ */
3218+ ahd->platform_data->recovery_pid = 0;
3219+ } else {
3220+ ahd_unlock(ahd, &s);
3221+ }
3222+}
3223+
3224+void
3225+ahd_set_recoveryscb(struct ahd_softc *ahd, struct scb *scb)
3226+{
3227+ if ((scb->flags & SCB_RECOVERY_SCB) == 0) {
3228+ struct scb *list_scb;
3229+
3230+ scb->flags |= SCB_RECOVERY_SCB;
3231+
3232+ /*
3233+ * Take all queued, but not sent SCBs out of the equation.
3234+ * Also ensure that no new commands are queued to us while we
3235+ * try to fix this problem.
3236+ */
3237+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) == 0) {
3238+ aic_freeze_simq(ahd);
3239+ scb->platform_data->flags |= AIC_RELEASE_SIMQ;
3240+ }
3241+
3242+ /*
3243+ * Go through all of our pending SCBs and remove
3244+ * any scheduled timeouts for them. We will reschedule
3245+ * them after we've successfully fixed this problem.
3246+ */
3247+ LIST_FOREACH(list_scb, &ahd->pending_scbs, pending_links) {
3248+
3249+ scsi_delete_timer(list_scb->io_ctx);
3250+ list_scb->platform_data->flags &= ~AIC_TIMEOUT_ACTIVE;
3251+ }
3252+ }
3253+}
3254+
3255+/********************** Host Template Entry Points ****************************/
3256 /*
3257 * Try to detect an Adaptec 79XX controller.
3258 */
3259@@ -870,7 +940,7 @@
3260 * that some of our hacks^H^H^H^H^Hassumptions aren't
3261 * violated.
3262 */
3263- if (offsetof(struct ahd_cmd_internal, end)
3264+ if (offsetof(struct aic_cmd_internal, end)
3265 > offsetof(struct scsi_cmnd, host_scribble)) {
3266 printf("ahd_linux_detect: SCSI data structures changed.\n");
3267 printf("ahd_linux_detect: Unable to attach\n");
3268@@ -938,7 +1008,6 @@
3269 struct ahd_softc *ahd;
3270 u_long l;
3271
3272- ahd_list_lock(&l);
3273 if (host != NULL) {
3274
3275 /*
3276@@ -946,17 +1015,20 @@
3277 * the free directly, but check our
3278 * list for extra sanity.
3279 */
3280+ ahd_list_lock(&l);
3281 ahd = ahd_find_softc(*(struct ahd_softc **)host->hostdata);
3282 if (ahd != NULL) {
3283 u_long s;
3284
3285+ TAILQ_REMOVE(&ahd_tailq, ahd, links);
3286+ ahd_list_unlock(&l);
3287 ahd_lock(ahd, &s);
3288 ahd_intr_enable(ahd, FALSE);
3289 ahd_unlock(ahd, &s);
3290 ahd_free(ahd);
3291- }
3292+ } else
3293+ ahd_list_unlock(&l);
3294 }
3295- ahd_list_unlock(&l);
3296 return (0);
3297 }
3298 #endif
3299@@ -996,7 +1068,7 @@
3300 ahd_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
3301 {
3302 struct ahd_softc *ahd;
3303- struct ahd_linux_device *dev;
3304+ struct aic_linux_device *dev;
3305 u_long flags;
3306
3307 ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
3308@@ -1015,9 +1087,9 @@
3309 * perform DV.
3310 */
3311 if (ahd->platform_data->qfrozen != 0
3312- && AHD_DV_CMD(cmd) == 0) {
3313+ && AIC_DV_CMD(cmd) == 0) {
3314
3315- ahd_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
3316+ aic_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
3317 ahd_linux_queue_cmd_complete(ahd, cmd);
3318 ahd_schedule_completeq(ahd);
3319 ahd_midlayer_entrypoint_unlock(ahd, &flags);
3320@@ -1027,7 +1099,8 @@
3321 cmd->device->id, cmd->device->lun,
3322 /*alloc*/TRUE);
3323 if (dev == NULL) {
3324- ahd_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
3325+
3326+ aic_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
3327 ahd_linux_queue_cmd_complete(ahd, cmd);
3328 ahd_schedule_completeq(ahd);
3329 ahd_midlayer_entrypoint_unlock(ahd, &flags);
3330@@ -1035,14 +1108,30 @@
3331 ahd_name(ahd));
3332 return (0);
3333 }
3334- if (cmd->cmd_len > MAX_CDB_LEN)
3335- return (-EINVAL);
3336+
3337+ if (cmd->cmd_len > MAX_CDB_LEN) {
3338+
3339+ aic_cmd_set_transaction_status(cmd, CAM_REQ_INVALID);
3340+ ahd_linux_queue_cmd_complete(ahd, cmd);
3341+ ahd_schedule_completeq(ahd);
3342+ ahd_midlayer_entrypoint_unlock(ahd, &flags);
3343+ printf("%s: aic79xx_linux_queue -"
3344+ "CDB length of %d exceeds max!\n",
3345+ ahd_name(ahd), cmd->cmd_len);
3346+ return (0);
3347+ }
3348+
3349+ /*
3350+ * We perform our own timeout handling.
3351+ */
3352+ scsi_delete_timer(cmd);
3353+
3354 cmd->result = CAM_REQ_INPROG << 16;
3355- TAILQ_INSERT_TAIL(&dev->busyq, (struct ahd_cmd *)cmd, acmd_links.tqe);
3356- if ((dev->flags & AHD_DEV_ON_RUN_LIST) == 0) {
3357+ TAILQ_INSERT_TAIL(&dev->busyq, (struct aic_cmd *)cmd, acmd_links.tqe);
3358+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
3359 TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq, dev, links);
3360- dev->flags |= AHD_DEV_ON_RUN_LIST;
3361- ahd_linux_run_device_queues(ahd);
3362+ dev->flags |= AIC_DEV_ON_RUN_LIST;
3363+ aic_linux_run_device_queues(ahd);
3364 }
3365 ahd_midlayer_entrypoint_unlock(ahd, &flags);
3366 return (0);
3367@@ -1064,7 +1153,7 @@
3368 ahd_linux_slave_configure(Scsi_Device *device)
3369 {
3370 struct ahd_softc *ahd;
3371- struct ahd_linux_device *dev;
3372+ struct aic_linux_device *dev;
3373 u_long flags;
3374
3375 ahd = *((struct ahd_softc **)device->host->hostdata);
3376@@ -1080,10 +1169,10 @@
3377 device->id, device->lun,
3378 /*alloc*/TRUE);
3379 if (dev != NULL) {
3380- dev->flags &= ~AHD_DEV_UNCONFIGURED;
3381- dev->flags |= AHD_DEV_SLAVE_CONFIGURED;
3382+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
3383+ dev->flags |= AIC_DEV_SLAVE_CONFIGURED;
3384 dev->scsi_device = device;
3385- ahd_linux_device_queue_depth(ahd, dev);
3386+ aic_linux_device_queue_depth(ahd, dev);
3387 }
3388 ahd_midlayer_entrypoint_unlock(ahd, &flags);
3389 return (0);
3390@@ -1093,7 +1182,7 @@
3391 ahd_linux_slave_destroy(Scsi_Device *device)
3392 {
3393 struct ahd_softc *ahd;
3394- struct ahd_linux_device *dev;
3395+ struct aic_linux_device *dev;
3396 u_long flags;
3397
3398 ahd = *((struct ahd_softc **)device->host->hostdata);
3399@@ -1112,11 +1201,10 @@
3400 * the refcounting process.
3401 */
3402 if (dev != NULL
3403- && (dev->flags & AHD_DEV_SLAVE_CONFIGURED) != 0) {
3404- dev->flags |= AHD_DEV_UNCONFIGURED;
3405+ && (dev->flags & AIC_DEV_SLAVE_CONFIGURED) != 0) {
3406+ dev->flags |= AIC_DEV_UNCONFIGURED;
3407 if (TAILQ_EMPTY(&dev->busyq)
3408- && dev->active == 0
3409- && (dev->flags & AHD_DEV_TIMER_ACTIVE) == 0)
3410+ && dev->active == 0)
3411 ahd_linux_free_device(ahd, dev);
3412 }
3413 ahd_midlayer_entrypoint_unlock(ahd, &flags);
3414@@ -1156,7 +1244,7 @@
3415 continue;
3416
3417 if (device->host == host) {
3418- struct ahd_linux_device *dev;
3419+ struct aic_linux_device *dev;
3420
3421 /*
3422 * Since Linux has attached to the device, configure
3423@@ -1167,13 +1255,13 @@
3424 device->id, device->lun,
3425 /*alloc*/TRUE);
3426 if (dev != NULL) {
3427- dev->flags &= ~AHD_DEV_UNCONFIGURED;
3428+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
3429 dev->scsi_device = device;
3430- ahd_linux_device_queue_depth(ahd, dev);
3431+ aic_linux_device_queue_depth(ahd, dev);
3432 device->queue_depth = dev->openings
3433 + dev->active;
3434- if ((dev->flags & (AHD_DEV_Q_BASIC
3435- | AHD_DEV_Q_TAGGED)) == 0) {
3436+ if ((dev->flags & (AIC_DEV_Q_BASIC
3437+ | AIC_DEV_Q_TAGGED)) == 0) {
3438 /*
3439 * We allow the OS to queue 2 untagged
3440 * transactions to us at any time even
3441@@ -1262,9 +1350,9 @@
3442 ahd_linux_abort(Scsi_Cmnd *cmd)
3443 {
3444 struct ahd_softc *ahd;
3445- struct ahd_cmd *acmd;
3446- struct ahd_cmd *list_acmd;
3447- struct ahd_linux_device *dev;
3448+ struct aic_cmd *acmd;
3449+ struct aic_cmd *list_acmd;
3450+ struct aic_linux_device *dev;
3451 struct scb *pending_scb;
3452 u_long s;
3453 u_int saved_scbptr;
3454@@ -1282,7 +1370,7 @@
3455 paused = FALSE;
3456 wait = FALSE;
3457 ahd = *(struct ahd_softc **)cmd->device->host->hostdata;
3458- acmd = (struct ahd_cmd *)cmd;
3459+ acmd = (struct aic_cmd *)cmd;
3460
3461 printf("%s:%d:%d:%d: Attempting to abort cmd %p:",
3462 ahd_name(ahd), cmd->device->channel, cmd->device->id,
3463@@ -1341,6 +1429,17 @@
3464 cmd->device->lun);
3465 TAILQ_REMOVE(&dev->busyq, list_acmd, acmd_links.tqe);
3466 cmd->result = DID_ABORT << 16;
3467+ /*
3468+ * The completion handler believes that
3469+ * commands without active timers running
3470+ * have lost the race of completing before
3471+ * their timer expires. Since commands in
3472+ * our busy queues do not have timers running,
3473+ * appease the mid-layer by adding a timer
3474+ * now. This timer will be immediately
3475+ * canceled by the midlayer.
3476+ */
3477+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
3478 ahd_linux_queue_cmd_complete(ahd, cmd);
3479 retval = SUCCESS;
3480 goto done;
3481@@ -1516,7 +1615,7 @@
3482 struct timer_list timer;
3483 int ret;
3484
3485- pending_scb->platform_data->flags |= AHD_SCB_UP_EH_SEM;
3486+ pending_scb->platform_data->flags |= AIC_SCB_UP_EH_SEM;
3487 spin_unlock_irq(&ahd->platform_data->spin_lock);
3488 init_timer(&timer);
3489 timer.data = (u_long)pending_scb;
3490@@ -1533,7 +1632,7 @@
3491 }
3492 spin_lock_irq(&ahd->platform_data->spin_lock);
3493 }
3494- ahd_schedule_runq(ahd);
3495+ aic_schedule_runq(ahd);
3496 ahd_linux_run_complete_queue(ahd);
3497 ahd_midlayer_entrypoint_unlock(ahd, &s);
3498 return (retval);
3499@@ -1554,7 +1653,7 @@
3500 {
3501 struct ahd_softc *ahd;
3502 struct scsi_cmnd *recovery_cmd;
3503- struct ahd_linux_device *dev;
3504+ struct aic_linux_device *dev;
3505 struct ahd_initiator_tinfo *tinfo;
3506 struct ahd_tmode_tstate *tstate;
3507 struct scb *scb;
3508@@ -1592,9 +1691,11 @@
3509 recovery_cmd->host_scribble = (char *)scb;
3510 scb->io_ctx = recovery_cmd;
3511 scb->platform_data->dev = dev;
3512+ scb->platform_data->flags = 0;
3513 scb->sg_count = 0;
3514- ahd_set_residual(scb, 0);
3515- ahd_set_sense_residual(scb, 0);
3516+ aic_set_residual(scb, 0);
3517+ aic_set_sense_residual(scb, 0);
3518+ scb->platform_data->xfer_len = 0;
3519 hscb = scb->hscb;
3520 hscb->control = 0;
3521 hscb->scsiid = BUILD_SCSIID(ahd, cmd);
3522@@ -1613,7 +1714,7 @@
3523 LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links);
3524 ahd_queue_scb(ahd, scb);
3525
3526- scb->platform_data->flags |= AHD_SCB_UP_EH_SEM;
3527+ scb->platform_data->flags |= AIC_SCB_UP_EH_SEM;
3528 spin_unlock_irq(&ahd->platform_data->spin_lock);
3529 init_timer(&timer);
3530 timer.data = (u_long)scb;
3531@@ -1629,7 +1730,7 @@
3532 retval = FAILED;
3533 }
3534 spin_lock_irq(&ahd->platform_data->spin_lock);
3535- ahd_schedule_runq(ahd);
3536+ aic_schedule_runq(ahd);
3537 ahd_linux_run_complete_queue(ahd);
3538 ahd_midlayer_entrypoint_unlock(ahd, &s);
3539 printf("%s: Device reset returning 0x%x\n", ahd_name(ahd), retval);
3540@@ -1665,213 +1766,8 @@
3541 return (SUCCESS);
3542 }
3543
3544-Scsi_Host_Template aic79xx_driver_template = {
3545- .module = THIS_MODULE,
3546- .name = "aic79xx",
3547- .proc_info = ahd_linux_proc_info,
3548- .info = ahd_linux_info,
3549- .queuecommand = ahd_linux_queue,
3550- .eh_abort_handler = ahd_linux_abort,
3551- .eh_device_reset_handler = ahd_linux_dev_reset,
3552- .eh_bus_reset_handler = ahd_linux_bus_reset,
3553-#if defined(__i386__)
3554- .bios_param = ahd_linux_biosparam,
3555-#endif
3556- .can_queue = AHD_MAX_QUEUE,
3557- .this_id = -1,
3558- .cmd_per_lun = 2,
3559- .use_clustering = ENABLE_CLUSTERING,
3560-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
3561- /*
3562- * We can only map 16MB per-SG
3563- * so create a sector limit of
3564- * "16MB" in 2K sectors.
3565- */
3566- .max_sectors = 8192,
3567-#endif
3568-#if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3569-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
3570-/* Assume RedHat Distribution with its different HIGHIO conventions. */
3571- .can_dma_32 = 1,
3572- .single_sg_okay = 1,
3573-#else
3574- .highmem_io = 1,
3575-#endif
3576-#endif
3577-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3578- .slave_alloc = ahd_linux_slave_alloc,
3579- .slave_configure = ahd_linux_slave_configure,
3580- .slave_destroy = ahd_linux_slave_destroy,
3581-#else
3582- .detect = ahd_linux_detect,
3583- .release = ahd_linux_release,
3584- .select_queue_depths = ahd_linux_select_queue_depth,
3585- .use_new_eh_code = 1,
3586-#endif
3587-};
3588-
3589-/**************************** Tasklet Handler *********************************/
3590-
3591-/*
3592- * In 2.4.X and above, this routine is called from a tasklet,
3593- * so we must re-acquire our lock prior to executing this code.
3594- * In all prior kernels, ahd_schedule_runq() calls this routine
3595- * directly and ahd_schedule_runq() is called with our lock held.
3596- */
3597-static void
3598-ahd_runq_tasklet(unsigned long data)
3599-{
3600- struct ahd_softc* ahd;
3601- struct ahd_linux_device *dev;
3602-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
3603- u_long flags;
3604-#endif
3605-
3606- ahd = (struct ahd_softc *)data;
3607-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
3608- ahd_lock(ahd, &flags);
3609-#endif
3610- while ((dev = ahd_linux_next_device_to_run(ahd)) != NULL) {
3611-
3612- TAILQ_REMOVE(&ahd->platform_data->device_runq, dev, links);
3613- dev->flags &= ~AHD_DEV_ON_RUN_LIST;
3614- ahd_linux_check_device_queue(ahd, dev);
3615-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
3616- /* Yeild to our interrupt handler */
3617- ahd_unlock(ahd, &flags);
3618- ahd_lock(ahd, &flags);
3619-#endif
3620- }
3621-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
3622- ahd_unlock(ahd, &flags);
3623-#endif
3624-}
3625-
3626-/******************************** Bus DMA *************************************/
3627-int
3628-ahd_dma_tag_create(struct ahd_softc *ahd, bus_dma_tag_t parent,
3629- bus_size_t alignment, bus_size_t boundary,
3630- bus_addr_t lowaddr, bus_addr_t highaddr,
3631- bus_dma_filter_t *filter, void *filterarg,
3632- bus_size_t maxsize, int nsegments,
3633- bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
3634-{
3635- bus_dma_tag_t dmat;
3636-
3637- dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
3638- if (dmat == NULL)
3639- return (ENOMEM);
3640-
3641- /*
3642- * Linux is very simplistic about DMA memory. For now don't
3643- * maintain all specification information. Once Linux supplies
3644- * better facilities for doing these operations, or the
3645- * needs of this particular driver change, we might need to do
3646- * more here.
3647- */
3648- dmat->alignment = alignment;
3649- dmat->boundary = boundary;
3650- dmat->maxsize = maxsize;
3651- *ret_tag = dmat;
3652- return (0);
3653-}
3654-
3655-void
3656-ahd_dma_tag_destroy(struct ahd_softc *ahd, bus_dma_tag_t dmat)
3657-{
3658- free(dmat, M_DEVBUF);
3659-}
3660-
3661-int
3662-ahd_dmamem_alloc(struct ahd_softc *ahd, bus_dma_tag_t dmat, void** vaddr,
3663- int flags, bus_dmamap_t *mapp)
3664-{
3665- bus_dmamap_t map;
3666-
3667-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
3668- map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
3669- if (map == NULL)
3670- return (ENOMEM);
3671- /*
3672- * Although we can dma data above 4GB, our
3673- * "consistent" memory is below 4GB for
3674- * space efficiency reasons (only need a 4byte
3675- * address). For this reason, we have to reset
3676- * our dma mask when doing allocations.
3677- */
3678- if (ahd->dev_softc != NULL)
3679- ahd_pci_set_dma_mask(ahd->dev_softc, 0xFFFFFFFF);
3680- *vaddr = pci_alloc_consistent(ahd->dev_softc,
3681- dmat->maxsize, &map->bus_addr);
3682- if (ahd->dev_softc != NULL)
3683- ahd_pci_set_dma_mask(ahd->dev_softc,
3684- ahd->platform_data->hw_dma_mask);
3685-#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
3686- /*
3687- * At least in 2.2.14, malloc is a slab allocator so all
3688- * allocations are aligned. We assume for these kernel versions
3689- * that all allocations will be bellow 4Gig, physically contiguous,
3690- * and accessible via DMA by the controller.
3691- */
3692- map = NULL; /* No additional information to store */
3693- *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT);
3694-#endif
3695- if (*vaddr == NULL)
3696- return (ENOMEM);
3697- *mapp = map;
3698- return(0);
3699-}
3700-
3701-void
3702-ahd_dmamem_free(struct ahd_softc *ahd, bus_dma_tag_t dmat,
3703- void* vaddr, bus_dmamap_t map)
3704-{
3705-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
3706- pci_free_consistent(ahd->dev_softc, dmat->maxsize,
3707- vaddr, map->bus_addr);
3708-#else
3709- free(vaddr, M_DEVBUF);
3710-#endif
3711-}
3712-
3713-int
3714-ahd_dmamap_load(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map,
3715- void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
3716- void *cb_arg, int flags)
3717-{
3718- /*
3719- * Assume for now that this will only be used during
3720- * initialization and not for per-transaction buffer mapping.
3721- */
3722- bus_dma_segment_t stack_sg;
3723-
3724-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
3725- stack_sg.ds_addr = map->bus_addr;
3726-#else
3727-#define VIRT_TO_BUS(a) (uint32_t)virt_to_bus((void *)(a))
3728- stack_sg.ds_addr = VIRT_TO_BUS(buf);
3729-#endif
3730- stack_sg.ds_len = dmat->maxsize;
3731- cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
3732- return (0);
3733-}
3734-
3735-void
3736-ahd_dmamap_destroy(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map)
3737-{
3738- /*
3739- * The map may is NULL in our < 2.3.X implementation.
3740- */
3741- if (map != NULL)
3742- free(map, M_DEVBUF);
3743-}
3744-
3745-int
3746-ahd_dmamap_unload(struct ahd_softc *ahd, bus_dma_tag_t dmat, bus_dmamap_t map)
3747-{
3748- /* Nothing to do */
3749- return (0);
3750-}
3751+Scsi_Host_Template aic79xx_driver_template =
3752+ AIC_TEMPLATE_INITIALIZER("aic79xx", /*max_sectors*/8192);
3753
3754 /********************* Platform Dependent Functions ***************************/
3755 /*
3756@@ -1907,19 +1803,19 @@
3757
3758 /* Still equal. Sort by bus/slot/func. */
3759 if (aic79xx_reverse_scan != 0)
3760- value = ahd_get_pci_bus(lahd->dev_softc)
3761- - ahd_get_pci_bus(rahd->dev_softc);
3762+ value = aic_get_pci_bus(lahd->dev_softc)
3763+ - aic_get_pci_bus(rahd->dev_softc);
3764 else
3765- value = ahd_get_pci_bus(rahd->dev_softc)
3766- - ahd_get_pci_bus(lahd->dev_softc);
3767+ value = aic_get_pci_bus(rahd->dev_softc)
3768+ - aic_get_pci_bus(lahd->dev_softc);
3769 if (value != 0)
3770 return (value);
3771 if (aic79xx_reverse_scan != 0)
3772- value = ahd_get_pci_slot(lahd->dev_softc)
3773- - ahd_get_pci_slot(rahd->dev_softc);
3774+ value = aic_get_pci_slot(lahd->dev_softc)
3775+ - aic_get_pci_slot(rahd->dev_softc);
3776 else
3777- value = ahd_get_pci_slot(rahd->dev_softc)
3778- - ahd_get_pci_slot(lahd->dev_softc);
3779+ value = aic_get_pci_slot(rahd->dev_softc)
3780+ - aic_get_pci_slot(lahd->dev_softc);
3781 if (value != 0)
3782 return (value);
3783
3784@@ -2096,9 +1992,16 @@
3785 char *new_name;
3786 u_long s;
3787 u_long target;
3788+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3789+ int error;
3790+#endif
3791
3792 template->name = ahd->description;
3793+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3794+ host = scsi_host_alloc(template, sizeof(struct ahd_softc *));
3795+#else
3796 host = scsi_register(template, sizeof(struct ahd_softc *));
3797+#endif
3798 if (host == NULL)
3799 return (ENOMEM);
3800
3801@@ -2107,8 +2010,12 @@
3802 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3803 scsi_assign_lock(host, &ahd->platform_data->spin_lock);
3804 #elif AHD_SCSI_HAS_HOST_LOCK != 0
3805+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)
3806+ host->host_lock = &ahd->platform_data->spin_lock;
3807+#else
3808 host->lock = &ahd->platform_data->spin_lock;
3809 #endif
3810+#endif
3811 ahd->platform_data->host = host;
3812 host->can_queue = AHD_MAX_QUEUE;
3813 host->cmd_per_lun = 2;
3814@@ -2134,13 +2041,20 @@
3815 ahd_linux_setup_user_rd_strm_settings(ahd);
3816 ahd_linux_initialize_scsi_bus(ahd);
3817 ahd_unlock(ahd, &s);
3818+ ahd_sysrq_key = aic_install_sysrq(&ahd_sysrq_op);
3819+ ahd_spawn_recovery_thread(ahd);
3820+ if (ahd->platform_data->recovery_pid < 0) {
3821+ printf("%s: Failed to create recovery thread, error= %d\n",
3822+ ahd_name(ahd), ahd->platform_data->recovery_pid);
3823+ return (-ahd->platform_data->recovery_pid);
3824+ }
3825 ahd->platform_data->dv_pid = kernel_thread(ahd_linux_dv_thread, ahd, 0);
3826- ahd_lock(ahd, &s);
3827 if (ahd->platform_data->dv_pid < 0) {
3828 printf("%s: Failed to create DV thread, error= %d\n",
3829 ahd_name(ahd), ahd->platform_data->dv_pid);
3830 return (-ahd->platform_data->dv_pid);
3831 }
3832+ ahd_lock(ahd, &s);
3833 /*
3834 * Initially allocate *all* of our linux target objects
3835 * so that the DV thread will scan them all in parallel
3836@@ -2160,7 +2074,7 @@
3837 * It is expected that either an external application
3838 * or a modified kernel will be used to probe this
3839 * ID if it is appropriate. To accommodate these
3840- * installations, ahc_linux_alloc_target() will allocate
3841+ * installations, ahd_linux_alloc_target() will allocate
3842 * for our ID if asked to do so.
3843 */
3844 if (target == ahd->our_id)
3845@@ -2173,7 +2087,10 @@
3846 ahd_unlock(ahd, &s);
3847
3848 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3849- scsi_add_host(host, &ahd->dev_softc->dev);
3850+ error = scsi_add_host(host, ahd->dev_softc);
3851+ if (error != 0)
3852+ return (-error);
3853+ scsi_scan_host(host);
3854 #endif
3855 return (0);
3856 }
3857@@ -2248,17 +2165,6 @@
3858 ahd_update_neg_request(ahd, &devinfo, tstate,
3859 tinfo, AHD_NEG_ALWAYS);
3860 }
3861- /* Give the bus some time to recover */
3862- if ((ahd->flags & AHD_RESET_BUS_A) != 0) {
3863- ahd_freeze_simq(ahd);
3864- init_timer(&ahd->platform_data->reset_timer);
3865- ahd->platform_data->reset_timer.data = (u_long)ahd;
3866- ahd->platform_data->reset_timer.expires =
3867- jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
3868- ahd->platform_data->reset_timer.function =
3869- (ahd_linux_callback_t *)ahd_release_simq;
3870- add_timer(&ahd->platform_data->reset_timer);
3871- }
3872 }
3873
3874 int
3875@@ -2271,24 +2177,32 @@
3876 memset(ahd->platform_data, 0, sizeof(struct ahd_platform_data));
3877 TAILQ_INIT(&ahd->platform_data->completeq);
3878 TAILQ_INIT(&ahd->platform_data->device_runq);
3879- ahd->platform_data->irq = AHD_LINUX_NOIRQ;
3880+ ahd->platform_data->irq = AIC_LINUX_NOIRQ;
3881 ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
3882 ahd_lockinit(ahd);
3883 ahd_done_lockinit(ahd);
3884+ init_timer(&ahd->platform_data->bus_settle_timer);
3885+ ahd->platform_data->bus_settle_timer.data = (u_long)ahd;
3886+ ahd->platform_data->bus_settle_timer.function =
3887+ (aic_linux_callback_t *)aic_bus_settle_complete;
3888 init_timer(&ahd->platform_data->completeq_timer);
3889 ahd->platform_data->completeq_timer.data = (u_long)ahd;
3890 ahd->platform_data->completeq_timer.function =
3891- (ahd_linux_callback_t *)ahd_linux_thread_run_complete_queue;
3892+ (aic_linux_callback_t *)ahd_linux_thread_run_complete_queue;
3893 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
3894 init_MUTEX_LOCKED(&ahd->platform_data->eh_sem);
3895 init_MUTEX_LOCKED(&ahd->platform_data->dv_sem);
3896 init_MUTEX_LOCKED(&ahd->platform_data->dv_cmd_sem);
3897+ init_MUTEX_LOCKED(&ahd->platform_data->recovery_sem);
3898+ init_MUTEX_LOCKED(&ahd->platform_data->recovery_ending_sem);
3899 #else
3900 ahd->platform_data->eh_sem = MUTEX_LOCKED;
3901 ahd->platform_data->dv_sem = MUTEX_LOCKED;
3902 ahd->platform_data->dv_cmd_sem = MUTEX_LOCKED;
3903+ ahd->platform_data->recovery_sem = MUTEX_LOCKED;
3904+ ahd->platform_data->recovery_ending_sem = MUTEX_LOCKED;
3905 #endif
3906- ahd_setup_runq_tasklet(ahd);
3907+ aic_setup_tasklets(ahd);
3908 ahd->seltime = (aic79xx_seltime & 0x3) << 4;
3909 return (0);
3910 }
3911@@ -2296,19 +2210,22 @@
3912 void
3913 ahd_platform_free(struct ahd_softc *ahd)
3914 {
3915- struct ahd_linux_target *targ;
3916- struct ahd_linux_device *dev;
3917+ struct aic_linux_target *targ;
3918+ struct aic_linux_device *dev;
3919 int i, j;
3920
3921+ aic_remove_sysrq(ahd_sysrq_key, &ahd_sysrq_op);
3922 if (ahd->platform_data != NULL) {
3923 del_timer_sync(&ahd->platform_data->completeq_timer);
3924 ahd_linux_kill_dv_thread(ahd);
3925- ahd_teardown_runq_tasklet(ahd);
3926+ aic_teardown_tasklets(ahd);
3927 if (ahd->platform_data->host != NULL) {
3928 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
3929 scsi_remove_host(ahd->platform_data->host);
3930-#endif
3931+ scsi_host_put(ahd->platform_data->host);
3932+#else
3933 scsi_unregister(ahd->platform_data->host);
3934+#endif
3935 }
3936
3937 /* destroy all of the device and target objects */
3938@@ -2322,6 +2239,7 @@
3939 if (targ->devices[j] == NULL)
3940 continue;
3941 dev = targ->devices[j];
3942+ del_timer_sync(&dev->timer);
3943 ahd_linux_free_device(ahd, dev);
3944 }
3945 /*
3946@@ -2332,7 +2250,7 @@
3947 }
3948 }
3949
3950- if (ahd->platform_data->irq != AHD_LINUX_NOIRQ)
3951+ if (ahd->platform_data->irq != AIC_LINUX_NOIRQ)
3952 free_irq(ahd->platform_data->irq, ahd);
3953 if (ahd->tags[0] == BUS_SPACE_PIO
3954 && ahd->bshs[0].ioport != 0)
3955@@ -2400,7 +2318,7 @@
3956 ahd_platform_set_tags(struct ahd_softc *ahd, struct ahd_devinfo *devinfo,
3957 ahd_queue_alg alg)
3958 {
3959- struct ahd_linux_device *dev;
3960+ struct aic_linux_device *dev;
3961 int was_queuing;
3962 int now_queuing;
3963
3964@@ -2409,27 +2327,27 @@
3965 devinfo->lun, /*alloc*/FALSE);
3966 if (dev == NULL)
3967 return;
3968- was_queuing = dev->flags & (AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED);
3969+ was_queuing = dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED);
3970 switch (alg) {
3971 default:
3972 case AHD_QUEUE_NONE:
3973 now_queuing = 0;
3974 break;
3975 case AHD_QUEUE_BASIC:
3976- now_queuing = AHD_DEV_Q_BASIC;
3977+ now_queuing = AIC_DEV_Q_BASIC;
3978 break;
3979 case AHD_QUEUE_TAGGED:
3980- now_queuing = AHD_DEV_Q_TAGGED;
3981+ now_queuing = AIC_DEV_Q_TAGGED;
3982 break;
3983 }
3984- if ((dev->flags & AHD_DEV_FREEZE_TIL_EMPTY) == 0
3985+ if ((dev->flags & AIC_DEV_FREEZE_TIL_EMPTY) == 0
3986 && (was_queuing != now_queuing)
3987 && (dev->active != 0)) {
3988- dev->flags |= AHD_DEV_FREEZE_TIL_EMPTY;
3989+ dev->flags |= AIC_DEV_FREEZE_TIL_EMPTY;
3990 dev->qfrozen++;
3991 }
3992
3993- dev->flags &= ~(AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED|AHD_DEV_PERIODIC_OTAG);
3994+ dev->flags &= ~(AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED|AIC_DEV_PERIODIC_OTAG);
3995 if (now_queuing) {
3996 u_int usertags;
3997
3998@@ -2449,11 +2367,11 @@
3999 */
4000 dev->openings = 1;
4001 } else if (alg == AHD_QUEUE_TAGGED) {
4002- dev->flags |= AHD_DEV_Q_TAGGED;
4003+ dev->flags |= AIC_DEV_Q_TAGGED;
4004 if (aic79xx_periodic_otag != 0)
4005- dev->flags |= AHD_DEV_PERIODIC_OTAG;
4006+ dev->flags |= AIC_DEV_PERIODIC_OTAG;
4007 } else
4008- dev->flags |= AHD_DEV_Q_BASIC;
4009+ dev->flags |= AIC_DEV_Q_BASIC;
4010 } else {
4011 /* We can only have one opening. */
4012 dev->maxtags = 0;
4013@@ -2461,13 +2379,13 @@
4014 }
4015 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
4016 if (dev->scsi_device != NULL) {
4017- switch ((dev->flags & (AHD_DEV_Q_BASIC|AHD_DEV_Q_TAGGED))) {
4018- case AHD_DEV_Q_BASIC:
4019+ switch ((dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED))) {
4020+ case AIC_DEV_Q_BASIC:
4021 scsi_adjust_queue_depth(dev->scsi_device,
4022 MSG_SIMPLE_TASK,
4023 dev->openings + dev->active);
4024 break;
4025- case AHD_DEV_Q_TAGGED:
4026+ case AIC_DEV_Q_TAGGED:
4027 scsi_adjust_queue_depth(dev->scsi_device,
4028 MSG_ORDERED_TASK,
4029 dev->openings + dev->active);
4030@@ -2520,9 +2438,9 @@
4031 for (; targ < maxtarg; targ++) {
4032
4033 for (; clun < maxlun; clun++) {
4034- struct ahd_linux_device *dev;
4035- struct ahd_busyq *busyq;
4036- struct ahd_cmd *acmd;
4037+ struct aic_linux_device *dev;
4038+ struct aic_busyq *busyq;
4039+ struct aic_cmd *acmd;
4040
4041 dev = ahd_linux_get_device(ahd, /*chan*/0, targ,
4042 clun, /*alloc*/FALSE);
4043@@ -2538,6 +2456,18 @@
4044 acmd_links.tqe);
4045 count++;
4046 cmd->result = status << 16;
4047+ /*
4048+ * The completion handler believes that
4049+ * commands without active timers running
4050+ * have lost the race of completing before
4051+ * their timer expires. Since commands in
4052+ * our busy queues do not have timers running,
4053+ * appease the mid-layer by adding a timer
4054+ * now. This timer will be immediately
4055+ * canceled by the midlayer.
4056+ */
4057+ scsi_add_timer(cmd, 60*HZ,
4058+ aic_linux_midlayer_timeout);
4059 ahd_linux_queue_cmd_complete(ahd, cmd);
4060 }
4061 }
4062@@ -2553,7 +2483,7 @@
4063
4064 ahd_lock(ahd, &flags);
4065 del_timer(&ahd->platform_data->completeq_timer);
4066- ahd->platform_data->flags &= ~AHD_RUN_CMPLT_Q_TIMER;
4067+ ahd->platform_data->flags &= ~AIC_RUN_CMPLT_Q_TIMER;
4068 ahd_linux_run_complete_queue(ahd);
4069 ahd_unlock(ahd, &flags);
4070 }
4071@@ -2566,14 +2496,23 @@
4072 * Freeze the simq and signal ahd_linux_queue to not let any
4073 * more commands through
4074 */
4075- if ((ahd->platform_data->flags & AHD_DV_ACTIVE) == 0) {
4076+ if ((ahd->platform_data->flags & AIC_DV_ACTIVE) == 0) {
4077 #ifdef AHD_DEBUG
4078 if (ahd_debug & AHD_SHOW_DV)
4079 printf("%s: Starting DV\n", ahd_name(ahd));
4080 #endif
4081
4082- ahd->platform_data->flags |= AHD_DV_ACTIVE;
4083- ahd_freeze_simq(ahd);
4084+ ahd->platform_data->flags |= AIC_DV_ACTIVE;
4085+
4086+ /*
4087+ * Prevent upper layer from sending any
4088+ * commands to us.
4089+ */
4090+ aic_freeze_simq(ahd);
4091+ scsi_block_requests(ahd->platform_data->host);
4092+ ahd_platform_abort_scbs(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS,
4093+ CAM_LUN_WILDCARD, SCB_LIST_NULL,
4094+ ROLE_INITIATOR, CAM_REQUEUE_REQ);
4095
4096 /* Wake up the DV kthread */
4097 up(&ahd->platform_data->dv_sem);
4098@@ -2612,6 +2551,7 @@
4099 unlock_kernel();
4100
4101 while (1) {
4102+
4103 /*
4104 * Use down_interruptible() rather than down() to
4105 * avoid inclusion in the load average.
4106@@ -2620,7 +2560,7 @@
4107
4108 /* Check to see if we've been signaled to exit */
4109 ahd_lock(ahd, &s);
4110- if ((ahd->platform_data->flags & AHD_DV_SHUTDOWN) != 0) {
4111+ if ((ahd->platform_data->flags & AIC_DV_SHUTDOWN) != 0) {
4112 ahd_unlock(ahd, &s);
4113 break;
4114 }
4115@@ -2637,7 +2577,7 @@
4116 */
4117 ahd_lock(ahd, &s);
4118 while (LIST_FIRST(&ahd->pending_scbs) != NULL) {
4119- ahd->platform_data->flags |= AHD_DV_WAIT_SIMQ_EMPTY;
4120+ ahd->platform_data->flags |= AIC_DV_WAIT_SIMQ_EMPTY;
4121 ahd_unlock(ahd, &s);
4122 down_interruptible(&ahd->platform_data->dv_sem);
4123 ahd_lock(ahd, &s);
4124@@ -2647,8 +2587,8 @@
4125 * Wait for the SIMQ to be released so that DV is the
4126 * only reason the queue is frozen.
4127 */
4128- while (AHD_DV_SIMQ_FROZEN(ahd) == 0) {
4129- ahd->platform_data->flags |= AHD_DV_WAIT_SIMQ_RELEASE;
4130+ while (AIC_DV_SIMQ_FROZEN(ahd) == 0) {
4131+ ahd->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
4132 ahd_unlock(ahd, &s);
4133 down_interruptible(&ahd->platform_data->dv_sem);
4134 ahd_lock(ahd, &s);
4135@@ -2659,14 +2599,17 @@
4136 ahd_linux_dv_target(ahd, target);
4137
4138 ahd_lock(ahd, &s);
4139- ahd->platform_data->flags &= ~AHD_DV_ACTIVE;
4140- ahd_unlock(ahd, &s);
4141+ ahd->platform_data->flags &= ~AIC_DV_ACTIVE;
4142
4143 /*
4144 * Release the SIMQ so that normal commands are
4145 * allowed to continue on the bus.
4146 */
4147- ahd_release_simq(ahd);
4148+ aic_release_simq_locked(ahd);
4149+
4150+ ahd_unlock(ahd, &s);
4151+
4152+ scsi_unblock_requests(ahd->platform_data->host);
4153 }
4154 up(&ahd->platform_data->eh_sem);
4155 return (0);
4156@@ -2679,7 +2622,7 @@
4157
4158 ahd_lock(ahd, &s);
4159 if (ahd->platform_data->dv_pid != 0) {
4160- ahd->platform_data->flags |= AHD_DV_SHUTDOWN;
4161+ ahd->platform_data->flags |= AIC_DV_SHUTDOWN;
4162 ahd_unlock(ahd, &s);
4163 up(&ahd->platform_data->dv_sem);
4164
4165@@ -2699,10 +2642,10 @@
4166 /*
4167 * Mark the dv thread as already dead. This
4168 * avoids attempting to kill it a second time.
4169- * This is necessary because we must kill the
4170- * DV thread before calling ahd_free() in the
4171+ * This is necessary because we must kill our
4172+ * threads before calling ahd_free() in the
4173 * module shutdown case to avoid bogus locking
4174- * in the SCSI mid-layer, but we ahd_free() is
4175+ * in the SCSI mid-layer, but when ahd_free() is
4176 * called without killing the DV thread in the
4177 * instance detach case, so ahd_platform_free()
4178 * calls us again to verify that the DV thread
4179@@ -2722,10 +2665,10 @@
4180 ahd_set_dv_state(ahd, targ, newstate, __LINE__)
4181
4182 static __inline void
4183-ahd_set_dv_state(struct ahd_softc *ahd, struct ahd_linux_target *targ,
4184- ahd_dv_state newstate, u_int line)
4185+ahd_set_dv_state(struct ahd_softc *ahd, struct aic_linux_target *targ,
4186+ aic_dv_state newstate, u_int line)
4187 {
4188- ahd_dv_state oldstate;
4189+ aic_dv_state oldstate;
4190
4191 oldstate = targ->dv_state;
4192 #ifdef AHD_DEBUG
4193@@ -2745,7 +2688,7 @@
4194 ahd_linux_dv_target(struct ahd_softc *ahd, u_int target_offset)
4195 {
4196 struct ahd_devinfo devinfo;
4197- struct ahd_linux_target *targ;
4198+ struct aic_linux_target *targ;
4199 struct scsi_cmnd *cmd;
4200 struct scsi_device *scsi_dev;
4201 struct scsi_sense_data *sense;
4202@@ -2759,7 +2702,7 @@
4203 echo_size = 0;
4204 ahd_lock(ahd, &s);
4205 targ = ahd->platform_data->targets[target_offset];
4206- if (targ == NULL || (targ->flags & AHD_DV_REQUIRED) == 0) {
4207+ if (targ == NULL || (targ->flags & AIC_DV_REQUIRED) == 0) {
4208 ahd_unlock(ahd, &s);
4209 return;
4210 }
4211@@ -2782,14 +2725,14 @@
4212 scsi_dev->channel = devinfo.channel - 'A';
4213 ahd->platform_data->dv_scsi_dev = scsi_dev;
4214
4215- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_INQ_SHORT_ASYNC);
4216+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_INQ_SHORT_ASYNC);
4217
4218- while (targ->dv_state != AHD_DV_STATE_EXIT) {
4219+ while (targ->dv_state != AIC_DV_STATE_EXIT) {
4220 timeout = AHD_LINUX_DV_TIMEOUT;
4221 switch (targ->dv_state) {
4222- case AHD_DV_STATE_INQ_SHORT_ASYNC:
4223- case AHD_DV_STATE_INQ_ASYNC:
4224- case AHD_DV_STATE_INQ_ASYNC_VERIFY:
4225+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
4226+ case AIC_DV_STATE_INQ_ASYNC:
4227+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
4228 /*
4229 * Set things to async narrow to reduce the
4230 * chance that the INQ will fail.
4231@@ -2801,36 +2744,36 @@
4232 AHD_TRANS_GOAL, /*paused*/FALSE);
4233 ahd_unlock(ahd, &s);
4234 timeout = 10 * HZ;
4235- targ->flags &= ~AHD_INQ_VALID;
4236+ targ->flags &= ~AIC_INQ_VALID;
4237 /* FALLTHROUGH */
4238- case AHD_DV_STATE_INQ_VERIFY:
4239+ case AIC_DV_STATE_INQ_VERIFY:
4240 {
4241 u_int inq_len;
4242
4243- if (targ->dv_state == AHD_DV_STATE_INQ_SHORT_ASYNC)
4244+ if (targ->dv_state == AIC_DV_STATE_INQ_SHORT_ASYNC)
4245 inq_len = AHD_LINUX_DV_INQ_SHORT_LEN;
4246 else
4247 inq_len = targ->inq_data->additional_length + 5;
4248 ahd_linux_dv_inq(ahd, cmd, &devinfo, targ, inq_len);
4249 break;
4250 }
4251- case AHD_DV_STATE_TUR:
4252- case AHD_DV_STATE_BUSY:
4253+ case AIC_DV_STATE_TUR:
4254+ case AIC_DV_STATE_BUSY:
4255 timeout = 5 * HZ;
4256 ahd_linux_dv_tur(ahd, cmd, &devinfo);
4257 break;
4258- case AHD_DV_STATE_REBD:
4259+ case AIC_DV_STATE_REBD:
4260 ahd_linux_dv_rebd(ahd, cmd, &devinfo, targ);
4261 break;
4262- case AHD_DV_STATE_WEB:
4263+ case AIC_DV_STATE_WEB:
4264 ahd_linux_dv_web(ahd, cmd, &devinfo, targ);
4265 break;
4266
4267- case AHD_DV_STATE_REB:
4268+ case AIC_DV_STATE_REB:
4269 ahd_linux_dv_reb(ahd, cmd, &devinfo, targ);
4270 break;
4271
4272- case AHD_DV_STATE_SU:
4273+ case AIC_DV_STATE_SU:
4274 ahd_linux_dv_su(ahd, cmd, &devinfo, targ);
4275 timeout = 50 * HZ;
4276 break;
4277@@ -2842,8 +2785,6 @@
4278 }
4279
4280 /* Queue the command and wait for it to complete */
4281- /* Abuse eh_timeout in the scsi_cmnd struct for our purposes */
4282- init_timer(&cmd->eh_timeout);
4283 #ifdef AHD_DEBUG
4284 if ((ahd_debug & AHD_SHOW_MESSAGES) != 0)
4285 /*
4286@@ -2853,7 +2794,9 @@
4287 */
4288 timeout += HZ;
4289 #endif
4290- scsi_add_timer(cmd, timeout, ahd_linux_dv_timeout);
4291+ init_timer(&cmd->eh_timeout);
4292+ cmd->timeout_per_command = timeout;
4293+
4294 /*
4295 * In 2.5.X, it is assumed that all calls from the
4296 * "midlayer" (which we are emulating) will have the
4297@@ -2872,13 +2815,14 @@
4298 spin_unlock_irqrestore(&io_request_lock, s);
4299 #endif
4300 down_interruptible(&ahd->platform_data->dv_cmd_sem);
4301+
4302 /*
4303 * Wait for the SIMQ to be released so that DV is the
4304 * only reason the queue is frozen.
4305 */
4306 ahd_lock(ahd, &s);
4307- while (AHD_DV_SIMQ_FROZEN(ahd) == 0) {
4308- ahd->platform_data->flags |= AHD_DV_WAIT_SIMQ_RELEASE;
4309+ while (AIC_DV_SIMQ_FROZEN(ahd) == 0) {
4310+ ahd->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
4311 ahd_unlock(ahd, &s);
4312 down_interruptible(&ahd->platform_data->dv_sem);
4313 ahd_lock(ahd, &s);
4314@@ -2889,7 +2833,7 @@
4315 }
4316
4317 out:
4318- if ((targ->flags & AHD_INQ_VALID) != 0
4319+ if ((targ->flags & AIC_INQ_VALID) != 0
4320 && ahd_linux_get_device(ahd, devinfo.channel - 'A',
4321 devinfo.target, devinfo.lun,
4322 /*alloc*/FALSE) == NULL) {
4323@@ -2900,7 +2844,7 @@
4324 * parameters found in the inquiry string.
4325 */
4326 ahd_linux_filter_inquiry(ahd, &devinfo);
4327- if ((targ->flags & (AHD_BASIC_DV|AHD_ENHANCED_DV)) != 0) {
4328+ if ((targ->flags & (AIC_BASIC_DV|AIC_ENHANCED_DV)) != 0) {
4329 ahd_print_devinfo(ahd, &devinfo);
4330 printf("DV failed to configure device. "
4331 "Please file a bug report against "
4332@@ -2925,7 +2869,7 @@
4333 free(targ->dv_buffer1, M_DEVBUF);
4334 targ->dv_buffer1 = NULL;
4335 }
4336- targ->flags &= ~AHD_DV_REQUIRED;
4337+ targ->flags &= ~AIC_DV_REQUIRED;
4338 if (targ->refcount == 0)
4339 ahd_linux_free_target(ahd, targ);
4340 ahd_unlock(ahd, &s);
4341@@ -2934,13 +2878,13 @@
4342 static void
4343 ahd_linux_dv_transition(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
4344 struct ahd_devinfo *devinfo,
4345- struct ahd_linux_target *targ)
4346+ struct aic_linux_target *targ)
4347 {
4348 u_int32_t status;
4349
4350 status = aic_error_action(cmd, targ->inq_data,
4351- ahd_cmd_get_transaction_status(cmd),
4352- ahd_cmd_get_scsi_status(cmd));
4353+ aic_cmd_get_transaction_status(cmd),
4354+ aic_cmd_get_scsi_status(cmd));
4355
4356
4357 #ifdef AHD_DEBUG
4358@@ -2953,8 +2897,8 @@
4359 #endif
4360
4361 switch (targ->dv_state) {
4362- case AHD_DV_STATE_INQ_SHORT_ASYNC:
4363- case AHD_DV_STATE_INQ_ASYNC:
4364+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
4365+ case AIC_DV_STATE_INQ_ASYNC:
4366 switch (status & SS_MASK) {
4367 case SS_NOP:
4368 {
4369@@ -2963,21 +2907,21 @@
4370 }
4371 case SS_INQ_REFRESH:
4372 AHD_SET_DV_STATE(ahd, targ,
4373- AHD_DV_STATE_INQ_SHORT_ASYNC);
4374+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4375 break;
4376 case SS_TUR:
4377 case SS_RETRY:
4378 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4379- if (ahd_cmd_get_transaction_status(cmd)
4380+ if (aic_cmd_get_transaction_status(cmd)
4381 == CAM_REQUEUE_REQ)
4382 targ->dv_state_retry--;
4383 if ((status & SS_ERRMASK) == EBUSY)
4384- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
4385+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
4386 if (targ->dv_state_retry < 10)
4387 break;
4388 /* FALLTHROUGH */
4389 default:
4390- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4391+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4392 #ifdef AHD_DEBUG
4393 if (ahd_debug & AHD_SHOW_DV) {
4394 ahd_print_devinfo(ahd, devinfo);
4395@@ -2987,7 +2931,7 @@
4396 break;
4397 }
4398 break;
4399- case AHD_DV_STATE_INQ_ASYNC_VERIFY:
4400+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
4401 switch (status & SS_MASK) {
4402 case SS_NOP:
4403 {
4404@@ -3001,12 +2945,12 @@
4405 * Try from the top again.
4406 */
4407 AHD_SET_DV_STATE(ahd, targ,
4408- AHD_DV_STATE_INQ_SHORT_ASYNC);
4409+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4410 break;
4411 }
4412
4413 AHD_SET_DV_STATE(ahd, targ, targ->dv_state+1);
4414- targ->flags |= AHD_INQ_VALID;
4415+ targ->flags |= AIC_INQ_VALID;
4416 if (ahd_linux_user_dv_setting(ahd) == 0)
4417 break;
4418
4419@@ -3019,33 +2963,33 @@
4420 default:
4421 case SID_SPI_CLOCK_ST:
4422 /* Assume only basic DV is supported. */
4423- targ->flags |= AHD_BASIC_DV;
4424+ targ->flags |= AIC_BASIC_DV;
4425 break;
4426 case SID_SPI_CLOCK_DT:
4427 case SID_SPI_CLOCK_DT_ST:
4428- targ->flags |= AHD_ENHANCED_DV;
4429+ targ->flags |= AIC_ENHANCED_DV;
4430 break;
4431 }
4432 break;
4433 }
4434 case SS_INQ_REFRESH:
4435 AHD_SET_DV_STATE(ahd, targ,
4436- AHD_DV_STATE_INQ_SHORT_ASYNC);
4437+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4438 break;
4439 case SS_TUR:
4440 case SS_RETRY:
4441 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4442- if (ahd_cmd_get_transaction_status(cmd)
4443+ if (aic_cmd_get_transaction_status(cmd)
4444 == CAM_REQUEUE_REQ)
4445 targ->dv_state_retry--;
4446
4447 if ((status & SS_ERRMASK) == EBUSY)
4448- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
4449+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
4450 if (targ->dv_state_retry < 10)
4451 break;
4452 /* FALLTHROUGH */
4453 default:
4454- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4455+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4456 #ifdef AHD_DEBUG
4457 if (ahd_debug & AHD_SHOW_DV) {
4458 ahd_print_devinfo(ahd, devinfo);
4459@@ -3055,14 +2999,14 @@
4460 break;
4461 }
4462 break;
4463- case AHD_DV_STATE_INQ_VERIFY:
4464+ case AIC_DV_STATE_INQ_VERIFY:
4465 switch (status & SS_MASK) {
4466 case SS_NOP:
4467 {
4468
4469 if (memcmp(targ->inq_data, targ->dv_buffer,
4470 AHD_LINUX_DV_INQ_LEN) == 0) {
4471- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4472+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4473 break;
4474 }
4475
4476@@ -3084,7 +3028,7 @@
4477 #endif
4478
4479 if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
4480- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4481+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4482 break;
4483 }
4484 /*
4485@@ -3097,18 +3041,18 @@
4486 }
4487 case SS_INQ_REFRESH:
4488 AHD_SET_DV_STATE(ahd, targ,
4489- AHD_DV_STATE_INQ_SHORT_ASYNC);
4490+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4491 break;
4492 case SS_TUR:
4493 case SS_RETRY:
4494 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4495- if (ahd_cmd_get_transaction_status(cmd)
4496+ if (aic_cmd_get_transaction_status(cmd)
4497 == CAM_REQUEUE_REQ) {
4498 targ->dv_state_retry--;
4499 } else if ((status & SSQ_FALLBACK) != 0) {
4500 if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
4501 AHD_SET_DV_STATE(ahd, targ,
4502- AHD_DV_STATE_EXIT);
4503+ AIC_DV_STATE_EXIT);
4504 break;
4505 }
4506 /*
4507@@ -3117,12 +3061,12 @@
4508 */
4509 targ->dv_state_retry = 0;
4510 } else if ((status & SS_ERRMASK) == EBUSY)
4511- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
4512+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
4513 if (targ->dv_state_retry < 10)
4514 break;
4515 /* FALLTHROUGH */
4516 default:
4517- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4518+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4519 #ifdef AHD_DEBUG
4520 if (ahd_debug & AHD_SHOW_DV) {
4521 ahd_print_devinfo(ahd, devinfo);
4522@@ -3133,33 +3077,33 @@
4523 }
4524 break;
4525
4526- case AHD_DV_STATE_TUR:
4527+ case AIC_DV_STATE_TUR:
4528 switch (status & SS_MASK) {
4529 case SS_NOP:
4530- if ((targ->flags & AHD_BASIC_DV) != 0) {
4531+ if ((targ->flags & AIC_BASIC_DV) != 0) {
4532 ahd_linux_filter_inquiry(ahd, devinfo);
4533 AHD_SET_DV_STATE(ahd, targ,
4534- AHD_DV_STATE_INQ_VERIFY);
4535- } else if ((targ->flags & AHD_ENHANCED_DV) != 0) {
4536- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_REBD);
4537+ AIC_DV_STATE_INQ_VERIFY);
4538+ } else if ((targ->flags & AIC_ENHANCED_DV) != 0) {
4539+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_REBD);
4540 } else {
4541- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4542+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4543 }
4544 break;
4545 case SS_RETRY:
4546 case SS_TUR:
4547 if ((status & SS_ERRMASK) == EBUSY) {
4548- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_BUSY);
4549+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_BUSY);
4550 break;
4551 }
4552 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4553- if (ahd_cmd_get_transaction_status(cmd)
4554+ if (aic_cmd_get_transaction_status(cmd)
4555 == CAM_REQUEUE_REQ) {
4556 targ->dv_state_retry--;
4557 } else if ((status & SSQ_FALLBACK) != 0) {
4558 if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
4559 AHD_SET_DV_STATE(ahd, targ,
4560- AHD_DV_STATE_EXIT);
4561+ AIC_DV_STATE_EXIT);
4562 break;
4563 }
4564 /*
4565@@ -3175,7 +3119,7 @@
4566 printf("DV TUR reties exhausted\n");
4567 }
4568 #endif
4569- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4570+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4571 break;
4572 }
4573 if (status & SSQ_DELAY)
4574@@ -3183,25 +3127,25 @@
4575
4576 break;
4577 case SS_START:
4578- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_SU);
4579+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_SU);
4580 break;
4581 case SS_INQ_REFRESH:
4582 AHD_SET_DV_STATE(ahd, targ,
4583- AHD_DV_STATE_INQ_SHORT_ASYNC);
4584+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4585 break;
4586 default:
4587- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4588+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4589 break;
4590 }
4591 break;
4592
4593- case AHD_DV_STATE_REBD:
4594+ case AIC_DV_STATE_REBD:
4595 switch (status & SS_MASK) {
4596 case SS_NOP:
4597 {
4598 uint32_t echo_size;
4599
4600- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_WEB);
4601+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_WEB);
4602 echo_size = scsi_3btoul(&targ->dv_buffer[1]);
4603 echo_size &= 0x1FFF;
4604 #ifdef AHD_DEBUG
4605@@ -3211,7 +3155,17 @@
4606 }
4607 #endif
4608 if (echo_size == 0) {
4609- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4610+ /*
4611+ * Fall back to basic DV.
4612+ */
4613+ if (bootverbose) {
4614+ ahd_print_devinfo(ahd, devinfo);
4615+ printf("Echo Buffer unavailable. "
4616+ "Performing basic DV.\n");
4617+ }
4618+ targ->flags &= ~AIC_ENHANCED_DV;
4619+ targ->flags |= AIC_BASIC_DV;
4620+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_TUR);
4621 break;
4622 }
4623
4624@@ -3226,11 +3180,11 @@
4625 }
4626 case SS_INQ_REFRESH:
4627 AHD_SET_DV_STATE(ahd, targ,
4628- AHD_DV_STATE_INQ_SHORT_ASYNC);
4629+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4630 break;
4631 case SS_RETRY:
4632 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4633- if (ahd_cmd_get_transaction_status(cmd)
4634+ if (aic_cmd_get_transaction_status(cmd)
4635 == CAM_REQUEUE_REQ)
4636 targ->dv_state_retry--;
4637 if (targ->dv_state_retry <= 10)
4638@@ -3249,30 +3203,30 @@
4639 * and try level 1 DV.
4640 */
4641 ahd_linux_filter_inquiry(ahd, devinfo);
4642- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_INQ_VERIFY);
4643+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_INQ_VERIFY);
4644 targ->dv_echo_size = 0;
4645 break;
4646 }
4647 break;
4648
4649- case AHD_DV_STATE_WEB:
4650+ case AIC_DV_STATE_WEB:
4651 switch (status & SS_MASK) {
4652 case SS_NOP:
4653- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_REB);
4654+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_REB);
4655 break;
4656 case SS_INQ_REFRESH:
4657 AHD_SET_DV_STATE(ahd, targ,
4658- AHD_DV_STATE_INQ_SHORT_ASYNC);
4659+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4660 break;
4661 case SS_RETRY:
4662 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4663- if (ahd_cmd_get_transaction_status(cmd)
4664+ if (aic_cmd_get_transaction_status(cmd)
4665 == CAM_REQUEUE_REQ) {
4666 targ->dv_state_retry--;
4667 } else if ((status & SSQ_FALLBACK) != 0) {
4668 if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
4669 AHD_SET_DV_STATE(ahd, targ,
4670- AHD_DV_STATE_EXIT);
4671+ AIC_DV_STATE_EXIT);
4672 break;
4673 }
4674 /*
4675@@ -3291,22 +3245,22 @@
4676 }
4677 #endif
4678 default:
4679- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4680+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4681 break;
4682 }
4683 break;
4684
4685- case AHD_DV_STATE_REB:
4686+ case AIC_DV_STATE_REB:
4687 switch (status & SS_MASK) {
4688 case SS_NOP:
4689 if (memcmp(targ->dv_buffer, targ->dv_buffer1,
4690 targ->dv_echo_size) != 0) {
4691 if (ahd_linux_dv_fallback(ahd, devinfo) != 0)
4692 AHD_SET_DV_STATE(ahd, targ,
4693- AHD_DV_STATE_EXIT);
4694+ AIC_DV_STATE_EXIT);
4695 else
4696 AHD_SET_DV_STATE(ahd, targ,
4697- AHD_DV_STATE_WEB);
4698+ AIC_DV_STATE_WEB);
4699 break;
4700 }
4701
4702@@ -3318,24 +3272,24 @@
4703 free(targ->dv_buffer1, M_DEVBUF);
4704 targ->dv_buffer1 = NULL;
4705 }
4706- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4707+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4708 break;
4709 case SS_INQ_REFRESH:
4710 AHD_SET_DV_STATE(ahd, targ,
4711- AHD_DV_STATE_INQ_SHORT_ASYNC);
4712+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4713 break;
4714 case SS_RETRY:
4715 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4716- if (ahd_cmd_get_transaction_status(cmd)
4717+ if (aic_cmd_get_transaction_status(cmd)
4718 == CAM_REQUEUE_REQ) {
4719 targ->dv_state_retry--;
4720 } else if ((status & SSQ_FALLBACK) != 0) {
4721 if (ahd_linux_dv_fallback(ahd, devinfo) != 0) {
4722 AHD_SET_DV_STATE(ahd, targ,
4723- AHD_DV_STATE_EXIT);
4724+ AIC_DV_STATE_EXIT);
4725 break;
4726 }
4727- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_WEB);
4728+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_WEB);
4729 }
4730 if (targ->dv_state_retry <= 10) {
4731 if ((status & (SSQ_DELAY_RANDOM|SSQ_DELAY))!= 0)
4732@@ -3350,35 +3304,35 @@
4733 #endif
4734 /* FALLTHROUGH */
4735 default:
4736- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4737+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4738 break;
4739 }
4740 break;
4741
4742- case AHD_DV_STATE_SU:
4743+ case AIC_DV_STATE_SU:
4744 switch (status & SS_MASK) {
4745 case SS_NOP:
4746 case SS_INQ_REFRESH:
4747 AHD_SET_DV_STATE(ahd, targ,
4748- AHD_DV_STATE_INQ_SHORT_ASYNC);
4749+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4750 break;
4751 default:
4752- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4753+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4754 break;
4755 }
4756 break;
4757
4758- case AHD_DV_STATE_BUSY:
4759+ case AIC_DV_STATE_BUSY:
4760 switch (status & SS_MASK) {
4761 case SS_NOP:
4762 case SS_INQ_REFRESH:
4763 AHD_SET_DV_STATE(ahd, targ,
4764- AHD_DV_STATE_INQ_SHORT_ASYNC);
4765+ AIC_DV_STATE_INQ_SHORT_ASYNC);
4766 break;
4767 case SS_TUR:
4768 case SS_RETRY:
4769 AHD_SET_DV_STATE(ahd, targ, targ->dv_state);
4770- if (ahd_cmd_get_transaction_status(cmd)
4771+ if (aic_cmd_get_transaction_status(cmd)
4772 == CAM_REQUEUE_REQ) {
4773 targ->dv_state_retry--;
4774 } else if (targ->dv_state_retry < 60) {
4775@@ -3391,11 +3345,11 @@
4776 printf("DV BUSY reties exhausted\n");
4777 }
4778 #endif
4779- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4780+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4781 }
4782 break;
4783 default:
4784- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4785+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4786 break;
4787 }
4788 break;
4789@@ -3403,7 +3357,7 @@
4790 default:
4791 printf("%s: Invalid DV completion state %d\n", ahd_name(ahd),
4792 targ->dv_state);
4793- AHD_SET_DV_STATE(ahd, targ, AHD_DV_STATE_EXIT);
4794+ AHD_SET_DV_STATE(ahd, targ, AIC_DV_STATE_EXIT);
4795 break;
4796 }
4797 }
4798@@ -3423,7 +3377,7 @@
4799 */
4800 static void
4801 ahd_linux_dv_inq(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
4802- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ,
4803+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ,
4804 u_int request_length)
4805 {
4806
4807@@ -3436,7 +3390,7 @@
4808 if (targ->inq_data == NULL)
4809 targ->inq_data = malloc(AHD_LINUX_DV_INQ_LEN,
4810 M_DEVBUF, M_WAITOK);
4811- if (targ->dv_state > AHD_DV_STATE_INQ_ASYNC) {
4812+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC) {
4813 if (targ->dv_buffer != NULL)
4814 free(targ->dv_buffer, M_DEVBUF);
4815 targ->dv_buffer = malloc(AHD_LINUX_DV_INQ_LEN,
4816@@ -3449,7 +3403,7 @@
4817 cmd->cmnd[0] = INQUIRY;
4818 cmd->cmnd[4] = request_length;
4819 cmd->request_bufflen = request_length;
4820- if (targ->dv_state > AHD_DV_STATE_INQ_ASYNC)
4821+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC)
4822 cmd->request_buffer = targ->dv_buffer;
4823 else
4824 cmd->request_buffer = targ->inq_data;
4825@@ -3478,7 +3432,7 @@
4826
4827 static void
4828 ahd_linux_dv_rebd(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
4829- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ)
4830+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ)
4831 {
4832
4833 #ifdef AHD_DEBUG
4834@@ -3503,7 +3457,7 @@
4835
4836 static void
4837 ahd_linux_dv_web(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
4838- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ)
4839+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ)
4840 {
4841
4842 #ifdef AHD_DEBUG
4843@@ -3525,7 +3479,7 @@
4844
4845 static void
4846 ahd_linux_dv_reb(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
4847- struct ahd_devinfo *devinfo, struct ahd_linux_target *targ)
4848+ struct ahd_devinfo *devinfo, struct aic_linux_target *targ)
4849 {
4850
4851 #ifdef AHD_DEBUG
4852@@ -3548,7 +3502,7 @@
4853 static void
4854 ahd_linux_dv_su(struct ahd_softc *ahd, struct scsi_cmnd *cmd,
4855 struct ahd_devinfo *devinfo,
4856- struct ahd_linux_target *targ)
4857+ struct aic_linux_target *targ)
4858 {
4859 u_int le;
4860
4861@@ -3583,7 +3537,7 @@
4862 static int
4863 ahd_linux_fallback(struct ahd_softc *ahd, struct ahd_devinfo *devinfo)
4864 {
4865- struct ahd_linux_target *targ;
4866+ struct aic_linux_target *targ;
4867 struct ahd_initiator_tinfo *tinfo;
4868 struct ahd_transinfo *goal;
4869 struct ahd_tmode_tstate *tstate;
4870@@ -3754,7 +3708,7 @@
4871 return (0);
4872 }
4873
4874-static void
4875+void
4876 ahd_linux_dv_timeout(struct scsi_cmnd *cmd)
4877 {
4878 struct ahd_softc *ahd;
4879@@ -3788,29 +3742,18 @@
4880 * error code.
4881 */
4882 if ((scb->flags & SCB_SENSE) != 0)
4883- ahd_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
4884+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
4885 else
4886- ahd_set_transaction_status(scb, CAM_CMD_TIMEOUT);
4887+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
4888 ahd_reset_channel(ahd, cmd->device->channel + 'A', /*initiate*/TRUE);
4889
4890- /*
4891- * Add a minimal bus settle delay for devices that are slow to
4892- * respond after bus resets.
4893- */
4894- ahd_freeze_simq(ahd);
4895- init_timer(&ahd->platform_data->reset_timer);
4896- ahd->platform_data->reset_timer.data = (u_long)ahd;
4897- ahd->platform_data->reset_timer.expires = jiffies + HZ / 2;
4898- ahd->platform_data->reset_timer.function =
4899- (ahd_linux_callback_t *)ahd_release_simq;
4900- add_timer(&ahd->platform_data->reset_timer);
4901- if (ahd_linux_next_device_to_run(ahd) != NULL)
4902- ahd_schedule_runq(ahd);
4903+ if (aic_linux_next_device_to_run(ahd) != NULL)
4904+ aic_schedule_runq(ahd);
4905 ahd_linux_run_complete_queue(ahd);
4906 ahd_unlock(ahd, &flags);
4907 }
4908
4909-static void
4910+void
4911 ahd_linux_dv_complete(struct scsi_cmnd *cmd)
4912 {
4913 struct ahd_softc *ahd;
4914@@ -3832,7 +3775,7 @@
4915 }
4916
4917 static void
4918-ahd_linux_generate_dv_pattern(struct ahd_linux_target *targ)
4919+ahd_linux_generate_dv_pattern(struct aic_linux_target *targ)
4920 {
4921 uint16_t b;
4922 u_int i;
4923@@ -3998,8 +3941,8 @@
4924 * Determines the queue depth for a given device.
4925 */
4926 static void
4927-ahd_linux_device_queue_depth(struct ahd_softc *ahd,
4928- struct ahd_linux_device *dev)
4929+aic_linux_device_queue_depth(struct ahd_softc *ahd,
4930+ struct aic_linux_device *dev)
4931 {
4932 struct ahd_devinfo devinfo;
4933 u_int tags;
4934@@ -4022,10 +3965,10 @@
4935 }
4936 }
4937
4938-static void
4939-ahd_linux_run_device_queue(struct ahd_softc *ahd, struct ahd_linux_device *dev)
4940+void
4941+ahd_linux_run_device_queue(struct ahd_softc *ahd, struct aic_linux_device *dev)
4942 {
4943- struct ahd_cmd *acmd;
4944+ struct aic_cmd *acmd;
4945 struct scsi_cmnd *cmd;
4946 struct scb *scb;
4947 struct hardware_scb *hscb;
4948@@ -4034,7 +3977,7 @@
4949 u_int col_idx;
4950 uint16_t mask;
4951
4952- if ((dev->flags & AHD_DEV_ON_RUN_LIST) != 0)
4953+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) != 0)
4954 panic("running device on run list");
4955
4956 while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
4957@@ -4045,11 +3988,11 @@
4958 * running is because the whole controller Q is frozen.
4959 */
4960 if (ahd->platform_data->qfrozen != 0
4961- && AHD_DV_SIMQ_FROZEN(ahd) == 0) {
4962+ && AIC_DV_SIMQ_FROZEN(ahd) == 0) {
4963
4964 TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq,
4965 dev, links);
4966- dev->flags |= AHD_DEV_ON_RUN_LIST;
4967+ dev->flags |= AIC_DEV_ON_RUN_LIST;
4968 return;
4969 }
4970
4971@@ -4060,7 +4003,7 @@
4972 */
4973 tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id,
4974 cmd->device->id, &tstate);
4975- if ((dev->flags & (AHD_DEV_Q_TAGGED|AHD_DEV_Q_BASIC)) == 0
4976+ if ((dev->flags & (AIC_DEV_Q_TAGGED|AIC_DEV_Q_BASIC)) == 0
4977 || (tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ) != 0) {
4978 col_idx = AHD_NEVER_COL_IDX;
4979 } else {
4980@@ -4070,13 +4013,14 @@
4981 if ((scb = ahd_get_scb(ahd, col_idx)) == NULL) {
4982 TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq,
4983 dev, links);
4984- dev->flags |= AHD_DEV_ON_RUN_LIST;
4985+ dev->flags |= AIC_DEV_ON_RUN_LIST;
4986 ahd->flags |= AHD_RESOURCE_SHORTAGE;
4987 return;
4988 }
4989 TAILQ_REMOVE(&dev->busyq, acmd, acmd_links.tqe);
4990 scb->io_ctx = cmd;
4991 scb->platform_data->dev = dev;
4992+ scb->platform_data->flags = 0;
4993 hscb = scb->hscb;
4994 cmd->host_scribble = (char *)scb;
4995
4996@@ -4092,7 +4036,7 @@
4997 if ((ahd->user_discenable & mask) != 0)
4998 hscb->control |= DISCENB;
4999
5000- if (AHD_DV_CMD(cmd) != 0)
5001+ if (AIC_DV_CMD(cmd) != 0)
5002 scb->flags |= SCB_SILENT;
5003
5004 if ((tinfo->curr.ppr_options & MSG_EXT_PPR_IU_REQ) != 0)
5005@@ -4103,7 +4047,7 @@
5006 scb->hscb->control |= MK_MESSAGE;
5007 }
5008
5009- if ((dev->flags & (AHD_DEV_Q_TAGGED|AHD_DEV_Q_BASIC)) != 0) {
5010+ if ((dev->flags & (AIC_DEV_Q_TAGGED|AIC_DEV_Q_BASIC)) != 0) {
5011 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
5012 int msg_bytes;
5013 uint8_t tag_msgs[2];
5014@@ -4115,8 +4059,8 @@
5015 dev->commands_since_idle_or_otag = 0;
5016 } else
5017 #endif
5018- if (dev->commands_since_idle_or_otag == AHD_OTAG_THRESH
5019- && (dev->flags & AHD_DEV_Q_TAGGED) != 0) {
5020+ if (dev->commands_since_idle_or_otag == AIC_OTAG_THRESH
5021+ && (dev->flags & AIC_DEV_Q_TAGGED) != 0) {
5022 hscb->control |= MSG_ORDERED_TASK;
5023 dev->commands_since_idle_or_otag = 0;
5024 } else {
5025@@ -4128,8 +4072,9 @@
5026 memcpy(hscb->shared_data.idata.cdb, cmd->cmnd, hscb->cdb_len);
5027
5028 scb->sg_count = 0;
5029- ahd_set_residual(scb, 0);
5030- ahd_set_sense_residual(scb, 0);
5031+ aic_set_residual(scb, 0);
5032+ aic_set_sense_residual(scb, 0);
5033+ scb->platform_data->xfer_len = 0;
5034 if (cmd->use_sg != 0) {
5035 void *sg;
5036 struct scatterlist *cur_seg;
5037@@ -4138,18 +4083,15 @@
5038
5039 cur_seg = (struct scatterlist *)cmd->request_buffer;
5040 dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
5041- nseg = pci_map_sg(ahd->dev_softc, cur_seg,
5042- cmd->use_sg, dir);
5043- scb->platform_data->xfer_len = 0;
5044+ nseg = aic_map_sg(ahd, cur_seg, cmd->use_sg, dir);
5045 for (sg = scb->sg_list; nseg > 0; nseg--, cur_seg++) {
5046 bus_addr_t addr;
5047 bus_size_t len;
5048
5049 addr = sg_dma_address(cur_seg);
5050 len = sg_dma_len(cur_seg);
5051- scb->platform_data->xfer_len += len;
5052- sg = ahd_sg_setup(ahd, scb, sg, addr, len,
5053- /*last*/nseg == 1);
5054+ sg = ahd_linux_sg_setup(ahd, scb, sg, addr, len,
5055+ /*last*/nseg == 1);
5056 }
5057 } else if (cmd->request_bufflen != 0) {
5058 void *sg;
5059@@ -4158,13 +4100,13 @@
5060
5061 sg = scb->sg_list;
5062 dir = scsi_to_pci_dma_dir(cmd->sc_data_direction);
5063- addr = pci_map_single(ahd->dev_softc,
5064+ addr = aic_map_single(ahd,
5065 cmd->request_buffer,
5066 cmd->request_bufflen, dir);
5067- scb->platform_data->xfer_len = cmd->request_bufflen;
5068 scb->platform_data->buf_busaddr = addr;
5069- sg = ahd_sg_setup(ahd, scb, sg, addr,
5070- cmd->request_bufflen, /*last*/TRUE);
5071+ sg = ahd_linux_sg_setup(ahd, scb, sg, addr,
5072+ cmd->request_bufflen,
5073+ /*last*/TRUE);
5074 }
5075
5076 LIST_INSERT_HEAD(&ahd->pending_scbs, scb, pending_links);
5077@@ -4180,9 +4122,10 @@
5078 dev->target->cmds_since_error = 0;
5079 }
5080
5081- if ((dev->flags & AHD_DEV_PERIODIC_OTAG) != 0)
5082+ if ((dev->flags & AIC_DEV_PERIODIC_OTAG) != 0)
5083 dev->commands_since_idle_or_otag++;
5084 scb->flags |= SCB_ACTIVE;
5085+ aic_scb_timer_start(scb);
5086 ahd_queue_scb(ahd, scb);
5087 }
5088 }
5089@@ -4200,8 +4143,8 @@
5090 ahd = (struct ahd_softc *) dev_id;
5091 ahd_lock(ahd, &flags);
5092 ours = ahd_intr(ahd);
5093- if (ahd_linux_next_device_to_run(ahd) != NULL)
5094- ahd_schedule_runq(ahd);
5095+ if (aic_linux_next_device_to_run(ahd) != NULL)
5096+ aic_schedule_runq(ahd);
5097 ahd_linux_run_complete_queue(ahd);
5098 ahd_unlock(ahd, &flags);
5099 return IRQ_RETVAL(ours);
5100@@ -4215,10 +4158,10 @@
5101 ;
5102 }
5103
5104-static struct ahd_linux_target*
5105+static struct aic_linux_target*
5106 ahd_linux_alloc_target(struct ahd_softc *ahd, u_int channel, u_int target)
5107 {
5108- struct ahd_linux_target *targ;
5109+ struct aic_linux_target *targ;
5110
5111 targ = malloc(sizeof(*targ), M_DEVBUF, M_NOWAIT);
5112 if (targ == NULL)
5113@@ -4226,14 +4169,14 @@
5114 memset(targ, 0, sizeof(*targ));
5115 targ->channel = channel;
5116 targ->target = target;
5117- targ->ahd = ahd;
5118- targ->flags = AHD_DV_REQUIRED;
5119+ targ->softc = ahd;
5120+ targ->flags = AIC_DV_REQUIRED;
5121 ahd->platform_data->targets[target] = targ;
5122 return (targ);
5123 }
5124
5125 static void
5126-ahd_linux_free_target(struct ahd_softc *ahd, struct ahd_linux_target *targ)
5127+ahd_linux_free_target(struct ahd_softc *ahd, struct aic_linux_target *targ)
5128 {
5129 struct ahd_devinfo devinfo;
5130 struct ahd_initiator_tinfo *tinfo;
5131@@ -4269,11 +4212,11 @@
5132 free(targ, M_DEVBUF);
5133 }
5134
5135-static struct ahd_linux_device*
5136+static struct aic_linux_device*
5137 ahd_linux_alloc_device(struct ahd_softc *ahd,
5138- struct ahd_linux_target *targ, u_int lun)
5139+ struct aic_linux_target *targ, u_int lun)
5140 {
5141- struct ahd_linux_device *dev;
5142+ struct aic_linux_device *dev;
5143
5144 dev = malloc(sizeof(*dev), M_DEVBUG, M_NOWAIT);
5145 if (dev == NULL)
5146@@ -4281,7 +4224,7 @@
5147 memset(dev, 0, sizeof(*dev));
5148 init_timer(&dev->timer);
5149 TAILQ_INIT(&dev->busyq);
5150- dev->flags = AHD_DEV_UNCONFIGURED;
5151+ dev->flags = AIC_DEV_UNCONFIGURED;
5152 dev->lun = lun;
5153 dev->target = targ;
5154
5155@@ -4304,9 +4247,9 @@
5156 }
5157
5158 static void
5159-ahd_linux_free_device(struct ahd_softc *ahd, struct ahd_linux_device *dev)
5160+ahd_linux_free_device(struct ahd_softc *ahd, struct aic_linux_device *dev)
5161 {
5162- struct ahd_linux_target *targ;
5163+ struct aic_linux_target *targ;
5164
5165 del_timer(&dev->timer);
5166 targ = dev->target;
5167@@ -4314,7 +4257,7 @@
5168 free(dev, M_DEVBUF);
5169 targ->refcount--;
5170 if (targ->refcount == 0
5171- && (targ->flags & AHD_DV_REQUIRED) == 0)
5172+ && (targ->flags & AIC_DV_REQUIRED) == 0)
5173 ahd_linux_free_target(ahd, targ);
5174 }
5175
5176@@ -4326,7 +4269,7 @@
5177 case AC_TRANSFER_NEG:
5178 {
5179 char buf[80];
5180- struct ahd_linux_target *targ;
5181+ struct aic_linux_target *targ;
5182 struct info_str info;
5183 struct ahd_initiator_tinfo *tinfo;
5184 struct ahd_tmode_tstate *tstate;
5185@@ -4414,6 +4357,20 @@
5186 channel - 'A');
5187 }
5188 #endif
5189+ /*
5190+ * Add a minimal bus settle delay for devices that are slow to
5191+ * respond after bus resets.
5192+ */
5193+ if ((ahd->platform_data->flags & AIC_BUS_SETTLE_TIMER) == 0) {
5194+ aic_freeze_simq(ahd);
5195+ ahd->platform_data->flags |= AIC_BUS_SETTLE_TIMER;
5196+ ahd->platform_data->bus_settle_timer.expires =
5197+ jiffies + (AIC79XX_RESET_DELAY * HZ)/1000;
5198+ add_timer(&ahd->platform_data->bus_settle_timer);
5199+ } else {
5200+ mod_timer(&ahd->platform_data->bus_settle_timer,
5201+ jiffies + (AIC79XX_RESET_DELAY * HZ)/1000);
5202+ }
5203 break;
5204 default:
5205 panic("ahd_send_async: Unexpected async event");
5206@@ -4427,14 +4384,18 @@
5207 ahd_done(struct ahd_softc *ahd, struct scb *scb)
5208 {
5209 Scsi_Cmnd *cmd;
5210- struct ahd_linux_device *dev;
5211+ struct aic_linux_device *dev;
5212
5213 if ((scb->flags & SCB_ACTIVE) == 0) {
5214 printf("SCB %d done'd twice\n", SCB_GET_TAG(scb));
5215 ahd_dump_card_state(ahd);
5216 panic("Stopping for safety");
5217 }
5218+
5219 LIST_REMOVE(scb, pending_links);
5220+ if ((scb->flags & SCB_TIMEDOUT) != 0)
5221+ LIST_REMOVE(scb, timedout_links);
5222+
5223 cmd = scb->io_ctx;
5224 dev = scb->platform_data->dev;
5225 dev->active--;
5226@@ -4452,11 +4413,11 @@
5227 * the sense buffer looks "sane".
5228 */
5229 cmd->sense_buffer[0] = 0;
5230- if (ahd_get_transaction_status(scb) == CAM_REQ_INPROG) {
5231+ if (aic_get_transaction_status(scb) == CAM_REQ_INPROG) {
5232 uint32_t amount_xferred;
5233
5234 amount_xferred =
5235- ahd_get_transfer_length(scb) - ahd_get_residual(scb);
5236+ aic_get_transfer_length(scb) - aic_get_residual(scb);
5237 if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
5238 #ifdef AHD_DEBUG
5239 if ((ahd_debug & AHD_SHOW_MISC) != 0) {
5240@@ -4464,7 +4425,17 @@
5241 printf("Set CAM_UNCOR_PARITY\n");
5242 }
5243 #endif
5244- ahd_set_transaction_status(scb, CAM_UNCOR_PARITY);
5245+ aic_set_transaction_status(scb, CAM_UNCOR_PARITY);
5246+#ifdef AHD_REPORT_UNDERFLOWS
5247+ /*
5248+ * This code is disabled by default as some
5249+ * clients of the SCSI system do not properly
5250+ * initialize the underflow parameter. This
5251+ * results in spurious termination of commands
5252+ * that complete as expected (e.g. underflow is
5253+ * allowed as command can return variable amounts
5254+ * of data.
5255+ */
5256 } else if (amount_xferred < scb->io_ctx->underflow) {
5257 u_int i;
5258
5259@@ -4476,30 +4447,31 @@
5260 ahd_print_path(ahd, scb);
5261 printf("Saw underflow (%ld of %ld bytes). "
5262 "Treated as error\n",
5263- ahd_get_residual(scb),
5264- ahd_get_transfer_length(scb));
5265- ahd_set_transaction_status(scb, CAM_DATA_RUN_ERR);
5266+ aic_get_residual(scb),
5267+ aic_get_transfer_length(scb));
5268+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
5269+#endif
5270 } else {
5271- ahd_set_transaction_status(scb, CAM_REQ_CMP);
5272+ aic_set_transaction_status(scb, CAM_REQ_CMP);
5273 }
5274- } else if (ahd_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
5275+ } else if (aic_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
5276 ahd_linux_handle_scsi_status(ahd, dev, scb);
5277- } else if (ahd_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
5278- dev->flags |= AHD_DEV_UNCONFIGURED;
5279- if (AHD_DV_CMD(cmd) == FALSE)
5280- dev->target->flags &= ~AHD_DV_REQUIRED;
5281+ } else if (aic_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
5282+ dev->flags |= AIC_DEV_UNCONFIGURED;
5283+ if (AIC_DV_CMD(cmd) == FALSE)
5284+ dev->target->flags &= ~AIC_DV_REQUIRED;
5285 }
5286 /*
5287 * Start DV for devices that require it assuming the first command
5288 * sent does not result in a selection timeout.
5289 */
5290- if (ahd_get_transaction_status(scb) != CAM_SEL_TIMEOUT
5291- && (dev->target->flags & AHD_DV_REQUIRED) != 0)
5292+ if (aic_get_transaction_status(scb) != CAM_SEL_TIMEOUT
5293+ && (dev->target->flags & AIC_DV_REQUIRED) != 0)
5294 ahd_linux_start_dv(ahd);
5295
5296 if (dev->openings == 1
5297- && ahd_get_transaction_status(scb) == CAM_REQ_CMP
5298- && ahd_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
5299+ && aic_get_transaction_status(scb) == CAM_REQ_CMP
5300+ && aic_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
5301 dev->tag_success_count++;
5302 /*
5303 * Some devices deal with temporary internal resource
5304@@ -4508,7 +4480,7 @@
5305 * back to our previous queue depth.
5306 */
5307 if ((dev->openings + dev->active) < dev->maxtags
5308- && dev->tag_success_count > AHD_TAG_SUCCESS_INTERVAL) {
5309+ && dev->tag_success_count > AIC_TAG_SUCCESS_INTERVAL) {
5310 dev->tag_success_count = 0;
5311 dev->openings++;
5312 }
5313@@ -4517,39 +4489,68 @@
5314 dev->commands_since_idle_or_otag = 0;
5315
5316 if (TAILQ_EMPTY(&dev->busyq)) {
5317- if ((dev->flags & AHD_DEV_UNCONFIGURED) != 0
5318- && dev->active == 0
5319- && (dev->flags & AHD_DEV_TIMER_ACTIVE) == 0)
5320+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
5321+ && dev->active == 0)
5322 ahd_linux_free_device(ahd, dev);
5323- } else if ((dev->flags & AHD_DEV_ON_RUN_LIST) == 0) {
5324+ } else if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
5325 TAILQ_INSERT_TAIL(&ahd->platform_data->device_runq, dev, links);
5326- dev->flags |= AHD_DEV_ON_RUN_LIST;
5327+ dev->flags |= AIC_DEV_ON_RUN_LIST;
5328 }
5329
5330 if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
5331 printf("Recovery SCB completes\n");
5332- if (ahd_get_transaction_status(scb) == CAM_BDR_SENT
5333- || ahd_get_transaction_status(scb) == CAM_REQ_ABORTED)
5334- ahd_set_transaction_status(scb, CAM_CMD_TIMEOUT);
5335- if ((scb->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) {
5336- scb->platform_data->flags &= ~AHD_SCB_UP_EH_SEM;
5337+ if (aic_get_transaction_status(scb) == CAM_BDR_SENT
5338+ || aic_get_transaction_status(scb) == CAM_REQ_ABORTED)
5339+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
5340+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
5341+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
5342 up(&ahd->platform_data->eh_sem);
5343+ } else {
5344+ struct scb *list_scb;
5345+
5346+ /*
5347+ * We were able to complete the command successfully,
5348+ * so reinstate the timeouts for all other pending
5349+ * commands.
5350+ */
5351+ LIST_FOREACH(list_scb,
5352+ &ahd->pending_scbs, pending_links) {
5353+
5354+ aic_scb_timer_start(list_scb);
5355+ }
5356 }
5357 }
5358
5359+ if ((scb->platform_data->flags & AIC_TIMEOUT_ACTIVE) == 0) {
5360+ /*
5361+ * The completion handler believes that
5362+ * commands without active timers running
5363+ * have lost the race of completing before
5364+ * their timer expires. Since commands in
5365+ * our busy queues do not have timers running,
5366+ * appease the mid-layer by adding a timer
5367+ * now. This timer will be immediately
5368+ * canceled by the midlayer.
5369+ */
5370+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
5371+ }
5372+
5373+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) != 0)
5374+ aic_release_simq_locked(ahd);
5375+
5376 ahd_free_scb(ahd, scb);
5377 ahd_linux_queue_cmd_complete(ahd, cmd);
5378
5379- if ((ahd->platform_data->flags & AHD_DV_WAIT_SIMQ_EMPTY) != 0
5380+ if ((ahd->platform_data->flags & AIC_DV_WAIT_SIMQ_EMPTY) != 0
5381 && LIST_FIRST(&ahd->pending_scbs) == NULL) {
5382- ahd->platform_data->flags &= ~AHD_DV_WAIT_SIMQ_EMPTY;
5383+ ahd->platform_data->flags &= ~AIC_DV_WAIT_SIMQ_EMPTY;
5384 up(&ahd->platform_data->dv_sem);
5385 }
5386 }
5387
5388 static void
5389 ahd_linux_handle_scsi_status(struct ahd_softc *ahd,
5390- struct ahd_linux_device *dev, struct scb *scb)
5391+ struct aic_linux_device *dev, struct scb *scb)
5392 {
5393 struct ahd_devinfo devinfo;
5394
5395@@ -4569,7 +4570,7 @@
5396 * we don't clobber the device with too many
5397 * commands.
5398 */
5399- switch (ahd_get_scsi_status(scb)) {
5400+ switch (aic_get_scsi_status(scb)) {
5401 default:
5402 break;
5403 case SCSI_STATUS_CHECK_COND:
5404@@ -4583,13 +4584,15 @@
5405 */
5406 cmd = scb->io_ctx;
5407 if ((scb->flags & (SCB_SENSE|SCB_PKT_SENSE)) != 0) {
5408- struct scsi_status_iu_header *siu;
5409- u_int sense_size;
5410- u_int sense_offset;
5411+ struct scsi_status_iu_header *siu;
5412+ struct scsi_sense_data *sense;
5413+ u_int sense_size;
5414+ u_int sense_offset;
5415+ int error_code, sense_key, asc, ascq;
5416
5417 if (scb->flags & SCB_SENSE) {
5418 sense_size = MIN(sizeof(struct scsi_sense_data)
5419- - ahd_get_sense_residual(scb),
5420+ - aic_get_sense_residual(scb),
5421 sizeof(cmd->sense_buffer));
5422 sense_offset = 0;
5423 } else {
5424@@ -4604,10 +4607,10 @@
5425 sense_offset = SIU_SENSE_OFFSET(siu);
5426 }
5427
5428+ sense = (struct scsi_sense_data *)
5429+ (ahd_get_sense_buf(ahd, scb) + sense_offset);
5430 memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
5431- memcpy(cmd->sense_buffer,
5432- ahd_get_sense_buf(ahd, scb)
5433- + sense_offset, sense_size);
5434+ memcpy(cmd->sense_buffer, sense, sense_size);
5435 cmd->result |= (DRIVER_SENSE << 24);
5436
5437 #ifdef AHD_DEBUG
5438@@ -4624,6 +4627,23 @@
5439 printf("\n");
5440 }
5441 #endif
5442+ /*
5443+ * If this is not a DV command and the target
5444+ * provides some status that makes us believe
5445+ * that the target has changed (power on reset,
5446+ * etc.) kick off a DV scan to re-validate the
5447+ * device.
5448+ */
5449+ if (AIC_DV_CMD(cmd) != 0)
5450+ break;
5451+
5452+ scsi_extract_sense(sense, &error_code,
5453+ &sense_key, &asc, &ascq);
5454+ if (error_code == SSD_CURRENT_ERROR
5455+ && sense_key == SSD_KEY_UNIT_ATTENTION
5456+ && asc == 0x29
5457+ && (ascq == 0 || ascq == 1))
5458+ dev->target->flags |= AIC_DV_REQUIRED;
5459 }
5460 break;
5461 }
5462@@ -4663,7 +4683,7 @@
5463 * this device.
5464 */
5465 if (dev->last_queuefull_same_count
5466- == AHD_LOCK_TAGS_COUNT) {
5467+ == AIC_LOCK_TAGS_COUNT) {
5468 dev->maxtags = dev->active;
5469 ahd_print_path(ahd, scb);
5470 printf("Locking max tag count at %d\n",
5471@@ -4673,10 +4693,10 @@
5472 dev->tags_on_last_queuefull = dev->active;
5473 dev->last_queuefull_same_count = 0;
5474 }
5475- ahd_set_transaction_status(scb, CAM_REQUEUE_REQ);
5476- ahd_set_scsi_status(scb, SCSI_STATUS_OK);
5477+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
5478+ aic_set_scsi_status(scb, SCSI_STATUS_OK);
5479 ahd_platform_set_tags(ahd, &devinfo,
5480- (dev->flags & AHD_DEV_Q_BASIC)
5481+ (dev->flags & AIC_DEV_Q_BASIC)
5482 ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED);
5483 break;
5484 }
5485@@ -4686,9 +4706,9 @@
5486 */
5487 dev->openings = 1;
5488 ahd_platform_set_tags(ahd, &devinfo,
5489- (dev->flags & AHD_DEV_Q_BASIC)
5490+ (dev->flags & AIC_DEV_Q_BASIC)
5491 ? AHD_QUEUE_BASIC : AHD_QUEUE_TAGGED);
5492- ahd_set_scsi_status(scb, SCSI_STATUS_BUSY);
5493+ aic_set_scsi_status(scb, SCSI_STATUS_BUSY);
5494 /* FALLTHROUGH */
5495 }
5496 case SCSI_STATUS_BUSY:
5497@@ -4696,13 +4716,13 @@
5498 * Set a short timer to defer sending commands for
5499 * a bit since Linux will not delay in this case.
5500 */
5501- if ((dev->flags & AHD_DEV_TIMER_ACTIVE) != 0) {
5502+ if ((dev->flags & AIC_DEV_TIMER_ACTIVE) != 0) {
5503 printf("%s:%c:%d: Device Timer still active during "
5504 "busy processing\n", ahd_name(ahd),
5505 dev->target->channel, dev->target->target);
5506 break;
5507 }
5508- dev->flags |= AHD_DEV_TIMER_ACTIVE;
5509+ dev->flags |= AIC_DEV_TIMER_ACTIVE;
5510 dev->qfrozen++;
5511 init_timer(&dev->timer);
5512 dev->timer.data = (u_long)dev;
5513@@ -4728,9 +4748,9 @@
5514 * not guarantee the order that aborted commands will be
5515 * returned to us.
5516 */
5517- struct ahd_completeq *completeq;
5518- struct ahd_cmd *list_cmd;
5519- struct ahd_cmd *acmd;
5520+ struct aic_completeq *completeq;
5521+ struct aic_cmd *list_cmd;
5522+ struct aic_cmd *acmd;
5523
5524 /*
5525 * Map CAM error codes into Linux Error codes. We
5526@@ -4738,13 +4758,13 @@
5527 * full error information available when making
5528 * state change decisions.
5529 */
5530- if (AHD_DV_CMD(cmd) == FALSE) {
5531+ if (AIC_DV_CMD(cmd) == FALSE) {
5532 uint32_t status;
5533 u_int new_status;
5534
5535- status = ahd_cmd_get_transaction_status(cmd);
5536+ status = aic_cmd_get_transaction_status(cmd);
5537 if (status != CAM_REQ_CMP) {
5538- struct ahd_linux_device *dev;
5539+ struct aic_linux_device *dev;
5540 struct ahd_devinfo devinfo;
5541 cam_status cam_status;
5542 uint32_t action;
5543@@ -4764,8 +4784,8 @@
5544 dev->target->channel == 0 ? 'A':'B',
5545 ROLE_INITIATOR);
5546
5547- scsi_status = ahd_cmd_get_scsi_status(cmd);
5548- cam_status = ahd_cmd_get_transaction_status(cmd);
5549+ scsi_status = aic_cmd_get_scsi_status(cmd);
5550+ cam_status = aic_cmd_get_transaction_status(cmd);
5551 action = aic_error_action(cmd, dev->target->inq_data,
5552 cam_status, scsi_status);
5553 if ((action & SSQ_FALLBACK) != 0) {
5554@@ -4808,7 +4828,17 @@
5555 new_status = DID_PARITY;
5556 break;
5557 case CAM_CMD_TIMEOUT:
5558- new_status = DID_TIME_OUT;
5559+ /*
5560+ * Returning DID_TIME_OUT will
5561+ * wake up the error recovery
5562+ * thread instead of doing the
5563+ * command retry we desire. Since
5564+ * we have already recovered the
5565+ * command, returning DID_ERROR
5566+ * will cause a retry up to the
5567+ * retry limit for this command.
5568+ */
5569+ new_status = DID_ERROR;
5570 break;
5571 case CAM_UA_ABORT:
5572 case CAM_REQ_CMP_ERR:
5573@@ -4838,7 +4868,7 @@
5574 if (cmd->retries > 0)
5575 cmd->retries--;
5576 new_status = DID_OK;
5577- ahd_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
5578+ aic_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
5579 cmd->result |= (DRIVER_SENSE << 24);
5580 memset(cmd->sense_buffer, 0,
5581 sizeof(cmd->sense_buffer));
5582@@ -4852,12 +4882,12 @@
5583 break;
5584 }
5585
5586- ahd_cmd_set_transaction_status(cmd, new_status);
5587+ aic_cmd_set_transaction_status(cmd, new_status);
5588 }
5589
5590 completeq = &ahd->platform_data->completeq;
5591 list_cmd = TAILQ_FIRST(completeq);
5592- acmd = (struct ahd_cmd *)cmd;
5593+ acmd = (struct aic_cmd *)cmd;
5594 while (list_cmd != NULL
5595 && acmd_scsi_cmd(list_cmd).serial_number
5596 < acmd_scsi_cmd(acmd).serial_number)
5597@@ -4877,7 +4907,7 @@
5598 struct ahd_transinfo *goal;
5599 struct ahd_transinfo *curr;
5600 struct ahd_tmode_tstate *tstate;
5601- struct ahd_linux_device *dev;
5602+ struct aic_linux_device *dev;
5603 u_int width;
5604 u_int period;
5605 u_int offset;
5606@@ -4899,9 +4929,9 @@
5607 sid = (struct scsi_inquiry_data *)dev->target->inq_data;
5608 if (SID_QUAL(sid) == SID_QUAL_LU_CONNECTED) {
5609
5610- dev->flags &= ~AHD_DEV_UNCONFIGURED;
5611+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
5612 } else {
5613- dev->flags |= AHD_DEV_UNCONFIGURED;
5614+ dev->flags |= AIC_DEV_UNCONFIGURED;
5615 return;
5616 }
5617
5618@@ -4967,48 +4997,6 @@
5619 AHD_TRANS_GOAL, /*paused*/FALSE);
5620 }
5621
5622-void
5623-ahd_freeze_simq(struct ahd_softc *ahd)
5624-{
5625- ahd->platform_data->qfrozen++;
5626- if (ahd->platform_data->qfrozen == 1) {
5627- scsi_block_requests(ahd->platform_data->host);
5628- ahd_platform_abort_scbs(ahd, CAM_TARGET_WILDCARD, ALL_CHANNELS,
5629- CAM_LUN_WILDCARD, SCB_LIST_NULL,
5630- ROLE_INITIATOR, CAM_REQUEUE_REQ);
5631- }
5632-}
5633-
5634-void
5635-ahd_release_simq(struct ahd_softc *ahd)
5636-{
5637- u_long s;
5638- int unblock_reqs;
5639-
5640- unblock_reqs = 0;
5641- ahd_lock(ahd, &s);
5642- if (ahd->platform_data->qfrozen > 0)
5643- ahd->platform_data->qfrozen--;
5644- if (ahd->platform_data->qfrozen == 0) {
5645- unblock_reqs = 1;
5646- }
5647- if (AHD_DV_SIMQ_FROZEN(ahd)
5648- && ((ahd->platform_data->flags & AHD_DV_WAIT_SIMQ_RELEASE) != 0)) {
5649- ahd->platform_data->flags &= ~AHD_DV_WAIT_SIMQ_RELEASE;
5650- up(&ahd->platform_data->dv_sem);
5651- }
5652- ahd_schedule_runq(ahd);
5653- ahd_unlock(ahd, &s);
5654- /*
5655- * There is still a race here. The mid-layer
5656- * should keep its own freeze count and use
5657- * a bottom half handler to run the queues
5658- * so we can unblock with our own lock held.
5659- */
5660- if (unblock_reqs)
5661- scsi_unblock_requests(ahd->platform_data->host);
5662-}
5663-
5664 static void
5665 ahd_linux_sem_timeout(u_long arg)
5666 {
5667@@ -5019,8 +5007,8 @@
5668 scb = (struct scb *)arg;
5669 ahd = scb->ahd_softc;
5670 ahd_lock(ahd, &s);
5671- if ((scb->platform_data->flags & AHD_SCB_UP_EH_SEM) != 0) {
5672- scb->platform_data->flags &= ~AHD_SCB_UP_EH_SEM;
5673+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
5674+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
5675 up(&ahd->platform_data->eh_sem);
5676 }
5677 ahd_unlock(ahd, &s);
5678@@ -5029,20 +5017,21 @@
5679 static void
5680 ahd_linux_dev_timed_unfreeze(u_long arg)
5681 {
5682- struct ahd_linux_device *dev;
5683+ struct aic_linux_device *dev;
5684 struct ahd_softc *ahd;
5685 u_long s;
5686
5687- dev = (struct ahd_linux_device *)arg;
5688- ahd = dev->target->ahd;
5689+ dev = (struct aic_linux_device *)arg;
5690+ ahd = dev->target->softc;
5691 ahd_lock(ahd, &s);
5692- dev->flags &= ~AHD_DEV_TIMER_ACTIVE;
5693+ dev->flags &= ~AIC_DEV_TIMER_ACTIVE;
5694 if (dev->qfrozen > 0)
5695 dev->qfrozen--;
5696 if (dev->qfrozen == 0
5697- && (dev->flags & AHD_DEV_ON_RUN_LIST) == 0)
5698+ && (dev->flags & AIC_DEV_ON_RUN_LIST) == 0)
5699 ahd_linux_run_device_queue(ahd, dev);
5700- if ((dev->flags & AHD_DEV_UNCONFIGURED) != 0
5701+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
5702+ && TAILQ_EMPTY(&dev->busyq)
5703 && dev->active == 0)
5704 ahd_linux_free_device(ahd, dev);
5705 ahd_unlock(ahd, &s);
5706@@ -5051,17 +5040,26 @@
5707 void
5708 ahd_platform_dump_card_state(struct ahd_softc *ahd)
5709 {
5710- struct ahd_linux_device *dev;
5711+ struct Scsi_Host *host;
5712+ struct aic_linux_device *dev;
5713 int target;
5714 int maxtarget;
5715 int lun;
5716 int i;
5717
5718+ host = ahd->platform_data->host;
5719+ printf("%s: Host Status: Failed(%d) %s%s%s\n",
5720+ ahd_name(ahd),
5721+ host->host_failed,
5722+ host->eh_active ? "eh_active " : "",
5723+ host->host_blocked ? "host_blocked " : "",
5724+ host->host_self_blocked ? "host_self_blocked " : "");
5725+
5726 maxtarget = (ahd->features & AHD_WIDE) ? 15 : 7;
5727 for (target = 0; target <=maxtarget; target++) {
5728
5729 for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
5730- struct ahd_cmd *acmd;
5731+ struct aic_cmd *acmd;
5732
5733 dev = ahd_linux_get_device(ahd, 0, target,
5734 lun, /*alloc*/FALSE);
5735@@ -5100,20 +5098,18 @@
5736 ahd_linux_exit(void)
5737 {
5738 struct ahd_softc *ahd;
5739- u_long l;
5740
5741 /*
5742- * Shutdown DV threads before going into the SCSI mid-layer.
5743+ * Shutdown our threads before going into the SCSI mid-layer.
5744 * This avoids situations where the mid-layer locks the entire
5745 * kernel so that waiting for our DV threads to exit leads
5746 * to deadlock.
5747 */
5748- ahd_list_lock(&l);
5749 TAILQ_FOREACH(ahd, &ahd_tailq, links) {
5750
5751 ahd_linux_kill_dv_thread(ahd);
5752+ ahd_terminate_recovery_thread(ahd);
5753 }
5754- ahd_list_unlock(&l);
5755 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
5756 /*
5757 * In 2.4 we have to unregister from the PCI core _after_
5758diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_osm.h linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_osm.h
5759--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_osm.h 2004-01-08 11:57:43.054996482 +0100
5760+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_osm.h 2003-12-23 00:32:11.000000000 +0100
5761@@ -36,52 +36,22 @@
5762 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
5763 * POSSIBILITY OF SUCH DAMAGES.
5764 *
5765- * $Id$
5766+ * $Id$
5767 *
5768 */
5769 #ifndef _AIC79XX_LINUX_H_
5770 #define _AIC79XX_LINUX_H_
5771
5772-#include <linux/types.h>
5773-#include <linux/blk.h>
5774-#include <linux/blkdev.h>
5775-#include <linux/delay.h>
5776-#include <linux/ioport.h>
5777-#include <linux/pci.h>
5778-#include <linux/smp_lock.h>
5779 #include <linux/version.h>
5780-#include <linux/module.h>
5781-#include <asm/byteorder.h>
5782-#include <asm/io.h>
5783
5784 #ifndef KERNEL_VERSION
5785 #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
5786 #endif
5787
5788 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
5789-#include <linux/interrupt.h> /* For tasklet support. */
5790 #include <linux/config.h>
5791-#include <linux/slab.h>
5792-#else
5793-#include <linux/malloc.h>
5794 #endif
5795
5796-/* Core SCSI definitions */
5797-#define AIC_LIB_PREFIX ahd
5798-#include "scsi.h"
5799-#include "hosts.h"
5800-
5801-/* Name space conflict with BSD queue macros */
5802-#ifdef LIST_HEAD
5803-#undef LIST_HEAD
5804-#endif
5805-
5806-#include "cam.h"
5807-#include "queue.h"
5808-#include "scsi_message.h"
5809-#include "scsi_iu.h"
5810-#include "aiclib.h"
5811-
5812 /*********************************** Debugging ********************************/
5813 #ifdef CONFIG_AIC79XX_DEBUG_ENABLE
5814 #ifdef CONFIG_AIC79XX_DEBUG_MASK
5815@@ -97,188 +67,27 @@
5816 /* No debugging code. */
5817 #endif
5818
5819-/********************************** Misc Macros *******************************/
5820-#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
5821-#define powerof2(x) ((((x)-1)&(x))==0)
5822-
5823-/************************* Forward Declarations *******************************/
5824-struct ahd_softc;
5825-typedef struct pci_dev *ahd_dev_softc_t;
5826-typedef Scsi_Cmnd *ahd_io_ctx_t;
5827-
5828-/******************************* Byte Order ***********************************/
5829-#define ahd_htobe16(x) cpu_to_be16(x)
5830-#define ahd_htobe32(x) cpu_to_be32(x)
5831-#define ahd_htobe64(x) cpu_to_be64(x)
5832-#define ahd_htole16(x) cpu_to_le16(x)
5833-#define ahd_htole32(x) cpu_to_le32(x)
5834-#define ahd_htole64(x) cpu_to_le64(x)
5835-
5836-#define ahd_be16toh(x) be16_to_cpu(x)
5837-#define ahd_be32toh(x) be32_to_cpu(x)
5838-#define ahd_be64toh(x) be64_to_cpu(x)
5839-#define ahd_le16toh(x) le16_to_cpu(x)
5840-#define ahd_le32toh(x) le32_to_cpu(x)
5841-#define ahd_le64toh(x) le64_to_cpu(x)
5842-
5843-#ifndef LITTLE_ENDIAN
5844-#define LITTLE_ENDIAN 1234
5845-#endif
5846-
5847-#ifndef BIG_ENDIAN
5848-#define BIG_ENDIAN 4321
5849-#endif
5850-
5851-#ifndef BYTE_ORDER
5852-#if defined(__BIG_ENDIAN)
5853-#define BYTE_ORDER BIG_ENDIAN
5854-#endif
5855-#if defined(__LITTLE_ENDIAN)
5856-#define BYTE_ORDER LITTLE_ENDIAN
5857-#endif
5858-#endif /* BYTE_ORDER */
5859-
5860-/************************* Configuration Data *********************************/
5861-extern uint32_t aic79xx_allow_memio;
5862-extern int aic79xx_detect_complete;
5863-extern Scsi_Host_Template aic79xx_driver_template;
5864-
5865-/***************************** Bus Space/DMA **********************************/
5866-
5867-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,17)
5868-typedef dma_addr_t bus_addr_t;
5869-#else
5870-typedef uint32_t bus_addr_t;
5871-#endif
5872-typedef uint32_t bus_size_t;
5873-
5874-typedef enum {
5875- BUS_SPACE_MEMIO,
5876- BUS_SPACE_PIO
5877-} bus_space_tag_t;
5878-
5879-typedef union {
5880- u_long ioport;
5881- volatile uint8_t *maddr;
5882-} bus_space_handle_t;
5883-
5884-typedef struct bus_dma_segment
5885-{
5886- bus_addr_t ds_addr;
5887- bus_size_t ds_len;
5888-} bus_dma_segment_t;
5889-
5890-struct ahd_linux_dma_tag
5891-{
5892- bus_size_t alignment;
5893- bus_size_t boundary;
5894- bus_size_t maxsize;
5895-};
5896-typedef struct ahd_linux_dma_tag* bus_dma_tag_t;
5897-
5898-struct ahd_linux_dmamap
5899-{
5900- bus_addr_t bus_addr;
5901-};
5902-typedef struct ahd_linux_dmamap* bus_dmamap_t;
5903-
5904-typedef int bus_dma_filter_t(void*, bus_addr_t);
5905-typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
5906-
5907-#define BUS_DMA_WAITOK 0x0
5908-#define BUS_DMA_NOWAIT 0x1
5909-#define BUS_DMA_ALLOCNOW 0x2
5910-#define BUS_DMA_LOAD_SEGS 0x4 /*
5911- * Argument is an S/G list not
5912- * a single buffer.
5913- */
5914-
5915-#define BUS_SPACE_MAXADDR 0xFFFFFFFF
5916-#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
5917-#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
5918-
5919-int ahd_dma_tag_create(struct ahd_softc *, bus_dma_tag_t /*parent*/,
5920- bus_size_t /*alignment*/, bus_size_t /*boundary*/,
5921- bus_addr_t /*lowaddr*/, bus_addr_t /*highaddr*/,
5922- bus_dma_filter_t*/*filter*/, void */*filterarg*/,
5923- bus_size_t /*maxsize*/, int /*nsegments*/,
5924- bus_size_t /*maxsegsz*/, int /*flags*/,
5925- bus_dma_tag_t */*dma_tagp*/);
5926-
5927-void ahd_dma_tag_destroy(struct ahd_softc *, bus_dma_tag_t /*tag*/);
5928-
5929-int ahd_dmamem_alloc(struct ahd_softc *, bus_dma_tag_t /*dmat*/,
5930- void** /*vaddr*/, int /*flags*/,
5931- bus_dmamap_t* /*mapp*/);
5932-
5933-void ahd_dmamem_free(struct ahd_softc *, bus_dma_tag_t /*dmat*/,
5934- void* /*vaddr*/, bus_dmamap_t /*map*/);
5935-
5936-void ahd_dmamap_destroy(struct ahd_softc *, bus_dma_tag_t /*tag*/,
5937- bus_dmamap_t /*map*/);
5938-
5939-int ahd_dmamap_load(struct ahd_softc *ahd, bus_dma_tag_t /*dmat*/,
5940- bus_dmamap_t /*map*/, void * /*buf*/,
5941- bus_size_t /*buflen*/, bus_dmamap_callback_t *,
5942- void */*callback_arg*/, int /*flags*/);
5943-
5944-int ahd_dmamap_unload(struct ahd_softc *, bus_dma_tag_t, bus_dmamap_t);
5945-
5946-/*
5947- * Operations performed by ahd_dmamap_sync().
5948- */
5949-#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
5950-#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
5951-#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
5952-#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
5953-
5954-/*
5955- * XXX
5956- * ahd_dmamap_sync is only used on buffers allocated with
5957- * the pci_alloc_consistent() API. Although I'm not sure how
5958- * this works on architectures with a write buffer, Linux does
5959- * not have an API to sync "coherent" memory. Perhaps we need
5960- * to do an mb()?
5961- */
5962-#define ahd_dmamap_sync(ahd, dma_tag, dmamap, offset, len, op)
5963-
5964-/************************** Timer DataStructures ******************************/
5965-typedef struct timer_list ahd_timer_t;
5966-
5967 /********************************** Includes **********************************/
5968+/* Core SCSI definitions */
5969+#define AIC_LIB_PREFIX ahd
5970+#define AIC_CONST_PREFIX AHD
5971+
5972 #ifdef CONFIG_AIC79XX_REG_PRETTY_PRINT
5973 #define AIC_DEBUG_REGISTERS 1
5974 #else
5975 #define AIC_DEBUG_REGISTERS 0
5976 #endif
5977-#include "aic79xx.h"
5978-
5979-/***************************** Timer Facilities *******************************/
5980-#define ahd_timer_init init_timer
5981-#define ahd_timer_stop del_timer_sync
5982-typedef void ahd_linux_callback_t (u_long);
5983-static __inline void ahd_timer_reset(ahd_timer_t *timer, u_int usec,
5984- ahd_callback_t *func, void *arg);
5985-static __inline void ahd_scb_timer_reset(struct scb *scb, u_int usec);
5986-
5987-static __inline void
5988-ahd_timer_reset(ahd_timer_t *timer, u_int usec, ahd_callback_t *func, void *arg)
5989-{
5990- struct ahd_softc *ahd;
5991+#define AIC_CORE_INCLUDE "aic79xx.h"
5992+#include "aiclib.h"
5993
5994- ahd = (struct ahd_softc *)arg;
5995- del_timer(timer);
5996- timer->data = (u_long)arg;
5997- timer->expires = jiffies + (usec * HZ)/1000000;
5998- timer->function = (ahd_linux_callback_t*)func;
5999- add_timer(timer);
6000-}
6001+/************************* Configuration Data *********************************/
6002+extern uint32_t aic79xx_allow_memio;
6003+extern int aic79xx_detect_complete;
6004+extern Scsi_Host_Template aic79xx_driver_template;
6005
6006-static __inline void
6007-ahd_scb_timer_reset(struct scb *scb, u_int usec)
6008-{
6009- mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
6010-}
6011+/***************************** Domain Validation ******************************/
6012+void ahd_linux_dv_complete(Scsi_Cmnd *cmd);
6013+void ahd_linux_dv_timeout(struct scsi_cmnd *cmd);
6014
6015 /***************************** SMP support ************************************/
6016 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
6017@@ -293,193 +102,7 @@
6018 #define AHD_SCSI_HAS_HOST_LOCK 0
6019 #endif
6020
6021-#define AIC79XX_DRIVER_VERSION "1.3.10"
6022-
6023-/**************************** Front End Queues ********************************/
6024-/*
6025- * Data structure used to cast the Linux struct scsi_cmnd to something
6026- * that allows us to use the queue macros. The linux structure has
6027- * plenty of space to hold the links fields as required by the queue
6028- * macros, but the queue macors require them to have the correct type.
6029- */
6030-struct ahd_cmd_internal {
6031- /* Area owned by the Linux scsi layer. */
6032- uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
6033- union {
6034- STAILQ_ENTRY(ahd_cmd) ste;
6035- LIST_ENTRY(ahd_cmd) le;
6036- TAILQ_ENTRY(ahd_cmd) tqe;
6037- } links;
6038- uint32_t end;
6039-};
6040-
6041-struct ahd_cmd {
6042- union {
6043- struct ahd_cmd_internal icmd;
6044- struct scsi_cmnd scsi_cmd;
6045- } un;
6046-};
6047-
6048-#define acmd_icmd(cmd) ((cmd)->un.icmd)
6049-#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
6050-#define acmd_links un.icmd.links
6051-
6052-/*************************** Device Data Structures ***************************/
6053-/*
6054- * A per probed device structure used to deal with some error recovery
6055- * scenarios that the Linux mid-layer code just doesn't know how to
6056- * handle. The structure allocated for a device only becomes persistent
6057- * after a successfully completed inquiry command to the target when
6058- * that inquiry data indicates a lun is present.
6059- */
6060-TAILQ_HEAD(ahd_busyq, ahd_cmd);
6061-typedef enum {
6062- AHD_DEV_UNCONFIGURED = 0x01,
6063- AHD_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
6064- AHD_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */
6065- AHD_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
6066- AHD_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
6067- AHD_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
6068- AHD_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
6069- AHD_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
6070-} ahd_linux_dev_flags;
6071-
6072-struct ahd_linux_target;
6073-struct ahd_linux_device {
6074- TAILQ_ENTRY(ahd_linux_device) links;
6075- struct ahd_busyq busyq;
6076-
6077- /*
6078- * The number of transactions currently
6079- * queued to the device.
6080- */
6081- int active;
6082-
6083- /*
6084- * The currently allowed number of
6085- * transactions that can be queued to
6086- * the device. Must be signed for
6087- * conversion from tagged to untagged
6088- * mode where the device may have more
6089- * than one outstanding active transaction.
6090- */
6091- int openings;
6092-
6093- /*
6094- * A positive count indicates that this
6095- * device's queue is halted.
6096- */
6097- u_int qfrozen;
6098-
6099- /*
6100- * Cumulative command counter.
6101- */
6102- u_long commands_issued;
6103-
6104- /*
6105- * The number of tagged transactions when
6106- * running at our current opening level
6107- * that have been successfully received by
6108- * this device since the last QUEUE FULL.
6109- */
6110- u_int tag_success_count;
6111-#define AHD_TAG_SUCCESS_INTERVAL 50
6112-
6113- ahd_linux_dev_flags flags;
6114-
6115- /*
6116- * Per device timer.
6117- */
6118- struct timer_list timer;
6119-
6120- /*
6121- * The high limit for the tags variable.
6122- */
6123- u_int maxtags;
6124-
6125- /*
6126- * The computed number of tags outstanding
6127- * at the time of the last QUEUE FULL event.
6128- */
6129- u_int tags_on_last_queuefull;
6130-
6131- /*
6132- * How many times we have seen a queue full
6133- * with the same number of tags. This is used
6134- * to stop our adaptive queue depth algorithm
6135- * on devices with a fixed number of tags.
6136- */
6137- u_int last_queuefull_same_count;
6138-#define AHD_LOCK_TAGS_COUNT 50
6139-
6140- /*
6141- * How many transactions have been queued
6142- * without the device going idle. We use
6143- * this statistic to determine when to issue
6144- * an ordered tag to prevent transaction
6145- * starvation. This statistic is only updated
6146- * if the AHD_DEV_PERIODIC_OTAG flag is set
6147- * on this device.
6148- */
6149- u_int commands_since_idle_or_otag;
6150-#define AHD_OTAG_THRESH 500
6151-
6152- int lun;
6153- Scsi_Device *scsi_device;
6154- struct ahd_linux_target *target;
6155-};
6156-
6157-typedef enum {
6158- AHD_DV_REQUIRED = 0x01,
6159- AHD_INQ_VALID = 0x02,
6160- AHD_BASIC_DV = 0x04,
6161- AHD_ENHANCED_DV = 0x08
6162-} ahd_linux_targ_flags;
6163-
6164-/* DV States */
6165-typedef enum {
6166- AHD_DV_STATE_EXIT = 0,
6167- AHD_DV_STATE_INQ_SHORT_ASYNC,
6168- AHD_DV_STATE_INQ_ASYNC,
6169- AHD_DV_STATE_INQ_ASYNC_VERIFY,
6170- AHD_DV_STATE_TUR,
6171- AHD_DV_STATE_REBD,
6172- AHD_DV_STATE_INQ_VERIFY,
6173- AHD_DV_STATE_WEB,
6174- AHD_DV_STATE_REB,
6175- AHD_DV_STATE_SU,
6176- AHD_DV_STATE_BUSY
6177-} ahd_dv_state;
6178-
6179-struct ahd_linux_target {
6180- struct ahd_linux_device *devices[AHD_NUM_LUNS];
6181- int channel;
6182- int target;
6183- int refcount;
6184- struct ahd_transinfo last_tinfo;
6185- struct ahd_softc *ahd;
6186- ahd_linux_targ_flags flags;
6187- struct scsi_inquiry_data *inq_data;
6188- /*
6189- * The next "fallback" period to use for narrow/wide transfers.
6190- */
6191- uint8_t dv_next_narrow_period;
6192- uint8_t dv_next_wide_period;
6193- uint8_t dv_max_width;
6194- uint8_t dv_max_ppr_options;
6195- uint8_t dv_last_ppr_options;
6196- u_int dv_echo_size;
6197- ahd_dv_state dv_state;
6198- u_int dv_state_retry;
6199- uint8_t *dv_buffer;
6200- uint8_t *dv_buffer1;
6201-
6202- /*
6203- * Cumulative counter of errors.
6204- */
6205- u_long errors_detected;
6206- u_long cmds_since_error;
6207-};
6208+#define AIC79XX_DRIVER_VERSION "2.0.5"
6209
6210 /********************* Definitions Required by the Core ***********************/
6211 /*
6212@@ -501,100 +124,21 @@
6213 #define AHD_NSEG 128
6214 #endif
6215
6216-/*
6217- * Per-SCB OSM storage.
6218- */
6219-typedef enum {
6220- AHD_SCB_UP_EH_SEM = 0x1
6221-} ahd_linux_scb_flags;
6222-
6223-struct scb_platform_data {
6224- struct ahd_linux_device *dev;
6225- bus_addr_t buf_busaddr;
6226- uint32_t xfer_len;
6227-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
6228- uint32_t resid; /* Transfer residual */
6229-#endif
6230- uint32_t sense_resid; /* Auto-Sense residual */
6231- ahd_linux_scb_flags flags;
6232-};
6233-
6234-/*
6235- * Define a structure used for each host adapter. All members are
6236- * aligned on a boundary >= the size of the member to honor the
6237- * alignment restrictions of the various platforms supported by
6238- * this driver.
6239- */
6240-typedef enum {
6241- AHD_DV_WAIT_SIMQ_EMPTY = 0x01,
6242- AHD_DV_WAIT_SIMQ_RELEASE = 0x02,
6243- AHD_DV_ACTIVE = 0x04,
6244- AHD_DV_SHUTDOWN = 0x08,
6245- AHD_RUN_CMPLT_Q_TIMER = 0x10
6246-} ahd_linux_softc_flags;
6247-
6248-TAILQ_HEAD(ahd_completeq, ahd_cmd);
6249-
6250-struct ahd_platform_data {
6251- /*
6252- * Fields accessed from interrupt context.
6253- */
6254- struct ahd_linux_target *targets[AHD_NUM_TARGETS];
6255- TAILQ_HEAD(, ahd_linux_device) device_runq;
6256- struct ahd_completeq completeq;
6257-
6258- spinlock_t spin_lock;
6259-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
6260- struct tasklet_struct runq_tasklet;
6261-#endif
6262- u_int qfrozen;
6263- pid_t dv_pid;
6264- struct timer_list completeq_timer;
6265- struct timer_list reset_timer;
6266- struct timer_list stats_timer;
6267- struct semaphore eh_sem;
6268- struct semaphore dv_sem;
6269- struct semaphore dv_cmd_sem; /* XXX This needs to be in
6270- * the target struct
6271- */
6272- struct scsi_device *dv_scsi_dev;
6273- struct Scsi_Host *host; /* pointer to scsi host */
6274-#define AHD_LINUX_NOIRQ ((uint32_t)~0)
6275- uint32_t irq; /* IRQ for this adapter */
6276- uint32_t bios_address;
6277- uint32_t mem_busaddr; /* Mem Base Addr */
6278- bus_addr_t hw_dma_mask;
6279- ahd_linux_softc_flags flags;
6280-};
6281-
6282-/************************** OS Utility Wrappers *******************************/
6283-#define printf printk
6284-#define M_NOWAIT GFP_ATOMIC
6285-#define M_WAITOK 0
6286-#define malloc(size, type, flags) kmalloc(size, flags)
6287-#define free(ptr, type) kfree(ptr)
6288-
6289-static __inline void ahd_delay(long);
6290-static __inline void
6291-ahd_delay(long usec)
6292-{
6293- /*
6294- * udelay on Linux can have problems for
6295- * multi-millisecond waits. Wait at most
6296- * 1024us per call.
6297- */
6298- while (usec > 0) {
6299- udelay(usec % 1024);
6300- usec -= 1024;
6301- }
6302-}
6303-
6304+/************************** Error Recovery ************************************/
6305+static __inline void ahd_wakeup_recovery_thread(struct ahd_softc *ahd);
6306+
6307+static __inline void
6308+ahd_wakeup_recovery_thread(struct ahd_softc *ahd)
6309+{
6310+ up(&ahd->platform_data->recovery_sem);
6311+}
6312+
6313+int ahd_spawn_recovery_thread(struct ahd_softc *ahd);
6314+void ahd_terminate_recovery_thread(struct ahd_softc *ahd);
6315+void ahd_set_recoveryscb(struct ahd_softc *ahd,
6316+ struct scb *scb);
6317
6318 /***************************** Low Level I/O **********************************/
6319-#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
6320-#define MMAPIO
6321-#endif
6322-
6323 static __inline uint8_t ahd_inb(struct ahd_softc * ahd, long port);
6324 static __inline uint16_t ahd_inw_atomic(struct ahd_softc * ahd, long port);
6325 static __inline void ahd_outb(struct ahd_softc * ahd, long port, uint8_t val);
6326@@ -604,21 +148,18 @@
6327 uint8_t *, int count);
6328 static __inline void ahd_insb(struct ahd_softc * ahd, long port,
6329 uint8_t *, int count);
6330+static __inline void ahd_flush_device_writes(struct ahd_softc *);
6331
6332 static __inline uint8_t
6333 ahd_inb(struct ahd_softc * ahd, long port)
6334 {
6335 uint8_t x;
6336-#ifdef MMAPIO
6337
6338 if (ahd->tags[0] == BUS_SPACE_MEMIO) {
6339 x = readb(ahd->bshs[0].maddr + port);
6340 } else {
6341 x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
6342 }
6343-#else
6344- x = inb(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
6345-#endif
6346 mb();
6347 return (x);
6348 }
6349@@ -627,16 +168,12 @@
6350 ahd_inw_atomic(struct ahd_softc * ahd, long port)
6351 {
6352 uint8_t x;
6353-#ifdef MMAPIO
6354
6355 if (ahd->tags[0] == BUS_SPACE_MEMIO) {
6356 x = readw(ahd->bshs[0].maddr + port);
6357 } else {
6358 x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
6359 }
6360-#else
6361- x = inw(ahd->bshs[(port) >> 8].ioport + ((port) & 0xFF));
6362-#endif
6363 mb();
6364 return (x);
6365 }
6366@@ -644,30 +181,22 @@
6367 static __inline void
6368 ahd_outb(struct ahd_softc * ahd, long port, uint8_t val)
6369 {
6370-#ifdef MMAPIO
6371 if (ahd->tags[0] == BUS_SPACE_MEMIO) {
6372 writeb(val, ahd->bshs[0].maddr + port);
6373 } else {
6374 outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
6375 }
6376-#else
6377- outb(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
6378-#endif
6379 mb();
6380 }
6381
6382 static __inline void
6383 ahd_outw_atomic(struct ahd_softc * ahd, long port, uint16_t val)
6384 {
6385-#ifdef MMAPIO
6386 if (ahd->tags[0] == BUS_SPACE_MEMIO) {
6387 writew(val, ahd->bshs[0].maddr + port);
6388 } else {
6389 outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
6390 }
6391-#else
6392- outw(val, ahd->bshs[(port) >> 8].ioport + (port & 0xFF));
6393-#endif
6394 mb();
6395 }
6396
6397@@ -699,6 +228,13 @@
6398 *array++ = ahd_inb(ahd, port);
6399 }
6400
6401+static __inline void
6402+ahd_flush_device_writes(struct ahd_softc *ahd)
6403+{
6404+ /* XXX Is this sufficient for all architectures??? */
6405+ ahd_inb(ahd, INTSTAT);
6406+}
6407+
6408 /**************************** Initialization **********************************/
6409 int ahd_linux_register_host(struct ahd_softc *,
6410 Scsi_Host_Template *);
6411@@ -827,184 +363,16 @@
6412 }
6413
6414 /******************************* PCI Definitions ******************************/
6415-/*
6416- * PCIM_xxx: mask to locate subfield in register
6417- * PCIR_xxx: config register offset
6418- * PCIC_xxx: device class
6419- * PCIS_xxx: device subclass
6420- * PCIP_xxx: device programming interface
6421- * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
6422- * PCID_xxx: device ID
6423- */
6424-#define PCIR_DEVVENDOR 0x00
6425-#define PCIR_VENDOR 0x00
6426-#define PCIR_DEVICE 0x02
6427-#define PCIR_COMMAND 0x04
6428-#define PCIM_CMD_PORTEN 0x0001
6429-#define PCIM_CMD_MEMEN 0x0002
6430-#define PCIM_CMD_BUSMASTEREN 0x0004
6431-#define PCIM_CMD_MWRICEN 0x0010
6432-#define PCIM_CMD_PERRESPEN 0x0040
6433-#define PCIM_CMD_SERRESPEN 0x0100
6434-#define PCIR_STATUS 0x06
6435-#define PCIR_REVID 0x08
6436-#define PCIR_PROGIF 0x09
6437-#define PCIR_SUBCLASS 0x0a
6438-#define PCIR_CLASS 0x0b
6439-#define PCIR_CACHELNSZ 0x0c
6440-#define PCIR_LATTIMER 0x0d
6441-#define PCIR_HEADERTYPE 0x0e
6442-#define PCIM_MFDEV 0x80
6443-#define PCIR_BIST 0x0f
6444-#define PCIR_CAP_PTR 0x34
6445-
6446-/* config registers for header type 0 devices */
6447-#define PCIR_MAPS 0x10
6448-#define PCIR_SUBVEND_0 0x2c
6449-#define PCIR_SUBDEV_0 0x2e
6450-
6451-/****************************** PCI-X definitions *****************************/
6452-#define PCIXR_COMMAND 0x96
6453-#define PCIXR_DEVADDR 0x98
6454-#define PCIXM_DEVADDR_FNUM 0x0003 /* Function Number */
6455-#define PCIXM_DEVADDR_DNUM 0x00F8 /* Device Number */
6456-#define PCIXM_DEVADDR_BNUM 0xFF00 /* Bus Number */
6457-#define PCIXR_STATUS 0x9A
6458-#define PCIXM_STATUS_64BIT 0x0001 /* Active 64bit connection to device. */
6459-#define PCIXM_STATUS_133CAP 0x0002 /* Device is 133MHz capable */
6460-#define PCIXM_STATUS_SCDISC 0x0004 /* Split Completion Discarded */
6461-#define PCIXM_STATUS_UNEXPSC 0x0008 /* Unexpected Split Completion */
6462-#define PCIXM_STATUS_CMPLEXDEV 0x0010 /* Device Complexity (set == bridge) */
6463-#define PCIXM_STATUS_MAXMRDBC 0x0060 /* Maximum Burst Read Count */
6464-#define PCIXM_STATUS_MAXSPLITS 0x0380 /* Maximum Split Transactions */
6465-#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
6466-#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
6467-
6468 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
6469 extern struct pci_driver aic79xx_pci_driver;
6470 #endif
6471
6472-typedef enum
6473-{
6474- AHD_POWER_STATE_D0,
6475- AHD_POWER_STATE_D1,
6476- AHD_POWER_STATE_D2,
6477- AHD_POWER_STATE_D3
6478-} ahd_power_state;
6479-
6480-void ahd_power_state_change(struct ahd_softc *ahd,
6481- ahd_power_state new_state);
6482-
6483 /******************************* PCI Routines *********************************/
6484 int ahd_linux_pci_init(void);
6485 void ahd_linux_pci_exit(void);
6486 int ahd_pci_map_registers(struct ahd_softc *ahd);
6487 int ahd_pci_map_int(struct ahd_softc *ahd);
6488
6489-static __inline uint32_t ahd_pci_read_config(ahd_dev_softc_t pci,
6490- int reg, int width);
6491-
6492-static __inline uint32_t
6493-ahd_pci_read_config(ahd_dev_softc_t pci, int reg, int width)
6494-{
6495- switch (width) {
6496- case 1:
6497- {
6498- uint8_t retval;
6499-
6500- pci_read_config_byte(pci, reg, &retval);
6501- return (retval);
6502- }
6503- case 2:
6504- {
6505- uint16_t retval;
6506- pci_read_config_word(pci, reg, &retval);
6507- return (retval);
6508- }
6509- case 4:
6510- {
6511- uint32_t retval;
6512- pci_read_config_dword(pci, reg, &retval);
6513- return (retval);
6514- }
6515- default:
6516- panic("ahd_pci_read_config: Read size too big");
6517- /* NOTREACHED */
6518- return (0);
6519- }
6520-}
6521-
6522-static __inline void ahd_pci_write_config(ahd_dev_softc_t pci,
6523- int reg, uint32_t value,
6524- int width);
6525-
6526-static __inline void
6527-ahd_pci_write_config(ahd_dev_softc_t pci, int reg, uint32_t value, int width)
6528-{
6529- switch (width) {
6530- case 1:
6531- pci_write_config_byte(pci, reg, value);
6532- break;
6533- case 2:
6534- pci_write_config_word(pci, reg, value);
6535- break;
6536- case 4:
6537- pci_write_config_dword(pci, reg, value);
6538- break;
6539- default:
6540- panic("ahd_pci_write_config: Write size too big");
6541- /* NOTREACHED */
6542- }
6543-}
6544-
6545-static __inline int ahd_get_pci_function(ahd_dev_softc_t);
6546-static __inline int
6547-ahd_get_pci_function(ahd_dev_softc_t pci)
6548-{
6549- return (PCI_FUNC(pci->devfn));
6550-}
6551-
6552-static __inline int ahd_get_pci_slot(ahd_dev_softc_t);
6553-static __inline int
6554-ahd_get_pci_slot(ahd_dev_softc_t pci)
6555-{
6556- return (PCI_SLOT(pci->devfn));
6557-}
6558-
6559-static __inline int ahd_get_pci_bus(ahd_dev_softc_t);
6560-static __inline int
6561-ahd_get_pci_bus(ahd_dev_softc_t pci)
6562-{
6563- return (pci->bus->number);
6564-}
6565-
6566-static __inline void ahd_flush_device_writes(struct ahd_softc *);
6567-static __inline void
6568-ahd_flush_device_writes(struct ahd_softc *ahd)
6569-{
6570- /* XXX Is this sufficient for all architectures??? */
6571- ahd_inb(ahd, INTSTAT);
6572-}
6573-
6574-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0)
6575-#define pci_map_sg(pdev, sg_list, nseg, direction) (nseg)
6576-#define pci_unmap_sg(pdev, sg_list, nseg, direction)
6577-#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
6578-#define sg_dma_len(sg) ((sg)->length)
6579-#define pci_map_single(pdev, buffer, bufflen, direction) \
6580- (VIRT_TO_BUS(buffer))
6581-#define pci_unmap_single(pdev, buffer, buflen, direction)
6582-#endif
6583-
6584-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
6585-#define ahd_pci_set_dma_mask pci_set_dma_mask
6586-#else
6587-/*
6588- * Always "return" 0 for success.
6589- */
6590-#define ahd_pci_set_dma_mask(dev_softc, mask) \
6591- (((dev_softc)->dma_mask = mask) && 0)
6592-#endif
6593 /**************************** Proc FS Support *********************************/
6594 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
6595 int ahd_linux_proc_info(char *, char **, off_t, int, int, int);
6596@@ -1013,203 +381,11 @@
6597 off_t, int, int);
6598 #endif
6599
6600-/*************************** Domain Validation ********************************/
6601-#define AHD_DV_CMD(cmd) ((cmd)->scsi_done == ahd_linux_dv_complete)
6602-#define AHD_DV_SIMQ_FROZEN(ahd) \
6603- ((((ahd)->platform_data->flags & AHD_DV_ACTIVE) != 0) \
6604- && (ahd)->platform_data->qfrozen == 1)
6605-
6606 /*********************** Transaction Access Wrappers **************************/
6607-static __inline void ahd_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
6608-static __inline void ahd_set_transaction_status(struct scb *, uint32_t);
6609-static __inline void ahd_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
6610-static __inline void ahd_set_scsi_status(struct scb *, uint32_t);
6611-static __inline uint32_t ahd_cmd_get_transaction_status(Scsi_Cmnd *cmd);
6612-static __inline uint32_t ahd_get_transaction_status(struct scb *);
6613-static __inline uint32_t ahd_cmd_get_scsi_status(Scsi_Cmnd *cmd);
6614-static __inline uint32_t ahd_get_scsi_status(struct scb *);
6615-static __inline void ahd_set_transaction_tag(struct scb *, int, u_int);
6616-static __inline u_long ahd_get_transfer_length(struct scb *);
6617-static __inline int ahd_get_transfer_dir(struct scb *);
6618-static __inline void ahd_set_residual(struct scb *, u_long);
6619-static __inline void ahd_set_sense_residual(struct scb *scb, u_long resid);
6620-static __inline u_long ahd_get_residual(struct scb *);
6621-static __inline u_long ahd_get_sense_residual(struct scb *);
6622-static __inline int ahd_perform_autosense(struct scb *);
6623-static __inline uint32_t ahd_get_sense_bufsize(struct ahd_softc *,
6624- struct scb *);
6625-static __inline void ahd_notify_xfer_settings_change(struct ahd_softc *,
6626- struct ahd_devinfo *);
6627-static __inline void ahd_platform_scb_free(struct ahd_softc *ahd,
6628- struct scb *scb);
6629-static __inline void ahd_freeze_scb(struct scb *scb);
6630-
6631-static __inline
6632-void ahd_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
6633-{
6634- cmd->result &= ~(CAM_STATUS_MASK << 16);
6635- cmd->result |= status << 16;
6636-}
6637-
6638-static __inline
6639-void ahd_set_transaction_status(struct scb *scb, uint32_t status)
6640-{
6641- ahd_cmd_set_transaction_status(scb->io_ctx,status);
6642-}
6643-
6644-static __inline
6645-void ahd_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
6646-{
6647- cmd->result &= ~0xFFFF;
6648- cmd->result |= status;
6649-}
6650-
6651-static __inline
6652-void ahd_set_scsi_status(struct scb *scb, uint32_t status)
6653-{
6654- ahd_cmd_set_scsi_status(scb->io_ctx, status);
6655-}
6656-
6657-static __inline
6658-uint32_t ahd_cmd_get_transaction_status(Scsi_Cmnd *cmd)
6659-{
6660- return ((cmd->result >> 16) & CAM_STATUS_MASK);
6661-}
6662-
6663-static __inline
6664-uint32_t ahd_get_transaction_status(struct scb *scb)
6665-{
6666- return (ahd_cmd_get_transaction_status(scb->io_ctx));
6667-}
6668-
6669-static __inline
6670-uint32_t ahd_cmd_get_scsi_status(Scsi_Cmnd *cmd)
6671-{
6672- return (cmd->result & 0xFFFF);
6673-}
6674-
6675-static __inline
6676-uint32_t ahd_get_scsi_status(struct scb *scb)
6677-{
6678- return (ahd_cmd_get_scsi_status(scb->io_ctx));
6679-}
6680-
6681-static __inline
6682-void ahd_set_transaction_tag(struct scb *scb, int enabled, u_int type)
6683-{
6684- /*
6685- * Nothing to do for linux as the incoming transaction
6686- * has no concept of tag/non tagged, etc.
6687- */
6688-}
6689-
6690-static __inline
6691-u_long ahd_get_transfer_length(struct scb *scb)
6692-{
6693- return (scb->platform_data->xfer_len);
6694-}
6695-
6696-static __inline
6697-int ahd_get_transfer_dir(struct scb *scb)
6698-{
6699-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40)
6700- return (scb->io_ctx->sc_data_direction);
6701-#else
6702- if (scb->io_ctx->bufflen == 0)
6703- return (CAM_DIR_NONE);
6704-
6705- switch(scb->io_ctx->cmnd[0]) {
6706- case 0x08: /* READ(6) */
6707- case 0x28: /* READ(10) */
6708- case 0xA8: /* READ(12) */
6709- return (CAM_DIR_IN);
6710- case 0x0A: /* WRITE(6) */
6711- case 0x2A: /* WRITE(10) */
6712- case 0xAA: /* WRITE(12) */
6713- return (CAM_DIR_OUT);
6714- default:
6715- return (CAM_DIR_NONE);
6716- }
6717-#endif
6718-}
6719-
6720-static __inline
6721-void ahd_set_residual(struct scb *scb, u_long resid)
6722-{
6723-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
6724- scb->io_ctx->resid = resid;
6725-#else
6726- scb->platform_data->resid = resid;
6727-#endif
6728-}
6729-
6730-static __inline
6731-void ahd_set_sense_residual(struct scb *scb, u_long resid)
6732-{
6733- scb->platform_data->sense_resid = resid;
6734-}
6735-
6736-static __inline
6737-u_long ahd_get_residual(struct scb *scb)
6738-{
6739-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
6740- return (scb->io_ctx->resid);
6741-#else
6742- return (scb->platform_data->resid);
6743-#endif
6744-}
6745-
6746-static __inline
6747-u_long ahd_get_sense_residual(struct scb *scb)
6748-{
6749- return (scb->platform_data->sense_resid);
6750-}
6751-
6752-static __inline
6753-int ahd_perform_autosense(struct scb *scb)
6754-{
6755- /*
6756- * We always perform autosense in Linux.
6757- * On other platforms this is set on a
6758- * per-transaction basis.
6759- */
6760- return (1);
6761-}
6762-
6763-static __inline uint32_t
6764-ahd_get_sense_bufsize(struct ahd_softc *ahd, struct scb *scb)
6765-{
6766- return (sizeof(struct scsi_sense_data));
6767-}
6768-
6769-static __inline void
6770-ahd_notify_xfer_settings_change(struct ahd_softc *ahd,
6771- struct ahd_devinfo *devinfo)
6772-{
6773- /* Nothing to do here for linux */
6774-}
6775-
6776-static __inline void
6777-ahd_platform_scb_free(struct ahd_softc *ahd, struct scb *scb)
6778-{
6779- ahd->flags &= ~AHD_RESOURCE_SHORTAGE;
6780-}
6781-
6782 int ahd_platform_alloc(struct ahd_softc *ahd, void *platform_arg);
6783 void ahd_platform_free(struct ahd_softc *ahd);
6784 void ahd_platform_init(struct ahd_softc *ahd);
6785 void ahd_platform_freeze_devq(struct ahd_softc *ahd, struct scb *scb);
6786-void ahd_freeze_simq(struct ahd_softc *ahd);
6787-void ahd_release_simq(struct ahd_softc *ahd);
6788-
6789-static __inline void
6790-ahd_freeze_scb(struct scb *scb)
6791-{
6792- if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
6793- scb->io_ctx->result |= CAM_DEV_QFRZN << 16;
6794- scb->platform_data->dev->qfrozen++;
6795- }
6796-}
6797
6798 void ahd_platform_set_tags(struct ahd_softc *ahd,
6799 struct ahd_devinfo *devinfo, ahd_queue_alg);
6800@@ -1227,9 +403,9 @@
6801 void ahd_platform_dump_card_state(struct ahd_softc *ahd);
6802
6803 #ifdef CONFIG_PCI
6804-#define AHD_PCI_CONFIG 1
6805+#define AIC_PCI_CONFIG 1
6806 #else
6807-#define AHD_PCI_CONFIG 0
6808+#define AIC_PCI_CONFIG 0
6809 #endif
6810 #define bootverbose aic79xx_verbose
6811 extern uint32_t aic79xx_verbose;
6812diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_osm_pci.c linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_osm_pci.c
6813--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_osm_pci.c 2004-01-08 11:57:43.053996688 +0100
6814+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_osm_pci.c 2003-12-22 22:46:59.000000000 +0100
6815@@ -36,12 +36,18 @@
6816 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
6817 * POSSIBILITY OF SUCH DAMAGES.
6818 *
6819- * $Id$
6820+ * $Id$
6821 */
6822
6823 #include "aic79xx_osm.h"
6824 #include "aic79xx_inline.h"
6825
6826+/*
6827+ * Include aiclib_pci.c as part of our
6828+ * "module dependencies are hard" work around.
6829+ */
6830+#include "aiclib_pci.c"
6831+
6832 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
6833 struct pci_device_id
6834 {
6835@@ -70,10 +76,10 @@
6836 MODULE_DEVICE_TABLE(pci, ahd_linux_pci_id_table);
6837
6838 struct pci_driver aic79xx_pci_driver = {
6839- name: "aic79xx",
6840- probe: ahd_linux_pci_dev_probe,
6841- remove: ahd_linux_pci_dev_remove,
6842- id_table: ahd_linux_pci_id_table
6843+ .name = "aic79xx",
6844+ .probe = ahd_linux_pci_dev_probe,
6845+ .remove = ahd_linux_pci_dev_remove,
6846+ .id_table = ahd_linux_pci_id_table
6847 };
6848
6849 static void
6850@@ -92,12 +98,14 @@
6851 if (ahd != NULL) {
6852 u_long s;
6853
6854+ TAILQ_REMOVE(&ahd_tailq, ahd, links);
6855+ ahd_list_unlock(&l);
6856 ahd_lock(ahd, &s);
6857 ahd_intr_enable(ahd, FALSE);
6858 ahd_unlock(ahd, &s);
6859 ahd_free(ahd);
6860- }
6861- ahd_list_unlock(&l);
6862+ } else
6863+ ahd_list_unlock(&l);
6864 }
6865 #endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
6866
6867@@ -106,7 +114,7 @@
6868 {
6869 char buf[80];
6870 struct ahd_softc *ahd;
6871- ahd_dev_softc_t pci;
6872+ aic_dev_softc_t dev;
6873 struct ahd_pci_identity *entry;
6874 char *name;
6875 int error;
6876@@ -117,7 +125,7 @@
6877 TAILQ_FOREACH(ahd, &ahd_tailq, links) {
6878 struct pci_dev *probed_pdev;
6879
6880- probed_pdev = ahd->dev_softc;
6881+ probed_pdev = aic_pci_dev(ahd);
6882 if (probed_pdev->bus->number == pdev->bus->number
6883 && probed_pdev->devfn == pdev->devfn)
6884 break;
6885@@ -127,8 +135,8 @@
6886 return (-ENODEV);
6887 }
6888
6889- pci = pdev;
6890- entry = ahd_find_pci_device(pci);
6891+ dev = aic_pci_dev_to_dev(pdev);
6892+ entry = ahd_find_pci_device(dev);
6893 if (entry == NULL)
6894 return (-ENODEV);
6895
6896@@ -138,9 +146,9 @@
6897 * common detect routine.
6898 */
6899 sprintf(buf, "ahd_pci:%d:%d:%d",
6900- ahd_get_pci_bus(pci),
6901- ahd_get_pci_slot(pci),
6902- ahd_get_pci_function(pci));
6903+ aic_get_pci_bus(dev),
6904+ aic_get_pci_slot(dev),
6905+ aic_get_pci_function(dev));
6906 name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
6907 if (name == NULL)
6908 return (-ENOMEM);
6909@@ -148,6 +156,7 @@
6910 ahd = ahd_alloc(NULL, name);
6911 if (ahd == NULL)
6912 return (-ENOMEM);
6913+ ahd->dev_softc = dev;
6914 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
6915 if (pci_enable_device(pdev)) {
6916 ahd_free(ahd);
6917@@ -164,20 +173,19 @@
6918 mask_64bit = (bus_addr_t)0xFFFFFFFFFFFFFFFFULL;
6919 mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
6920 if (memsize >= 0x8000000000ULL
6921- && ahd_pci_set_dma_mask(pdev, mask_64bit) == 0) {
6922+ && aic_set_dma_mask(ahd, mask_64bit) == 0) {
6923 ahd->flags |= AHD_64BIT_ADDRESSING;
6924 ahd->platform_data->hw_dma_mask = mask_64bit;
6925 } else if (memsize > 0x80000000
6926- && ahd_pci_set_dma_mask(pdev, mask_39bit) == 0) {
6927+ && aic_set_dma_mask(ahd, mask_39bit) == 0) {
6928 ahd->flags |= AHD_39BIT_ADDRESSING;
6929 ahd->platform_data->hw_dma_mask = mask_39bit;
6930 }
6931 } else {
6932- ahd_pci_set_dma_mask(pdev, 0xFFFFFFFF);
6933+ aic_set_dma_mask(ahd, 0xFFFFFFFF);
6934 ahd->platform_data->hw_dma_mask = 0xFFFFFFFF;
6935 }
6936 #endif
6937- ahd->dev_softc = pci;
6938 error = ahd_pci_config(ahd, entry);
6939 if (error != 0) {
6940 ahd_free(ahd);
6941@@ -216,10 +224,8 @@
6942 pdev = NULL;
6943 class = PCI_CLASS_STORAGE_SCSI << 8;
6944 while ((pdev = pci_find_class(class, pdev)) != NULL) {
6945- ahd_dev_softc_t pci;
6946 int error;
6947
6948- pci = pdev;
6949 error = ahd_linux_pci_dev_probe(pdev, /*pci_devid*/NULL);
6950 if (error == 0)
6951 found++;
6952@@ -238,17 +244,18 @@
6953 ahd_linux_pci_reserve_io_regions(struct ahd_softc *ahd, u_long *base,
6954 u_long *base2)
6955 {
6956+
6957 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
6958- *base = pci_resource_start(ahd->dev_softc, 0);
6959+ *base = pci_resource_start(aic_pci_dev(ahd), 0);
6960 /*
6961 * This is really the 3rd bar and should be at index 2,
6962 * but the Linux PCI code doesn't know how to "count" 64bit
6963 * bars.
6964 */
6965- *base2 = pci_resource_start(ahd->dev_softc, 3);
6966+ *base2 = pci_resource_start(aic_pci_dev(ahd), 3);
6967 #else
6968- *base = ahd_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
6969- *base2 = ahd_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
6970+ *base = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR0, 4);
6971+ *base2 = aic_pci_read_config(ahd->dev_softc, AHD_PCI_IOADDR1, 4);
6972 *base &= PCI_BASE_ADDRESS_IO_MASK;
6973 *base2 &= PCI_BASE_ADDRESS_IO_MASK;
6974 #endif
6975@@ -289,11 +296,11 @@
6976
6977 error = 0;
6978 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
6979- start = pci_resource_start(ahd->dev_softc, 1);
6980+ start = pci_resource_start(aic_pci_dev(ahd), 1);
6981 base_page = start & PAGE_MASK;
6982 base_offset = start - base_page;
6983 #else
6984- start = ahd_pci_read_config(ahd->dev_softc, PCIR_MAPS+4, 4);
6985+ start = aic_pci_read_config(ahd->dev_softc, PCIR_MAPS+4, 4);
6986 base_offset = start & PCI_BASE_ADDRESS_MEM_MASK;
6987 base_page = base_offset & PAGE_MASK;
6988 base_offset -= base_page;
6989@@ -330,11 +337,10 @@
6990 /*
6991 * If its allowed, we prefer memory mapped access.
6992 */
6993- command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, 4);
6994+ command = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, 4);
6995 command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
6996 base = 0;
6997 maddr = NULL;
6998-#ifdef MMAPIO
6999 error = ahd_linux_pci_reserve_mem_region(ahd, &base, &maddr);
7000 if (error == 0) {
7001 ahd->platform_data->mem_busaddr = base;
7002@@ -342,16 +348,16 @@
7003 ahd->bshs[0].maddr = maddr;
7004 ahd->tags[1] = BUS_SPACE_MEMIO;
7005 ahd->bshs[1].maddr = maddr + 0x100;
7006- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
7007+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
7008 command | PCIM_CMD_MEMEN, 4);
7009
7010 if (ahd_pci_test_register_access(ahd) != 0) {
7011
7012 printf("aic79xx: PCI Device %d:%d:%d "
7013 "failed memory mapped test. Using PIO.\n",
7014- ahd_get_pci_bus(ahd->dev_softc),
7015- ahd_get_pci_slot(ahd->dev_softc),
7016- ahd_get_pci_function(ahd->dev_softc));
7017+ aic_get_pci_bus(ahd->dev_softc),
7018+ aic_get_pci_slot(ahd->dev_softc),
7019+ aic_get_pci_function(ahd->dev_softc));
7020 iounmap((void *)((u_long)maddr & PAGE_MASK));
7021 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
7022 release_mem_region(ahd->platform_data->mem_busaddr,
7023@@ -364,12 +370,11 @@
7024 } else if (bootverbose) {
7025 printf("aic79xx: PCI%d:%d:%d MEM region 0x%lx "
7026 "unavailable. Cannot memory map device.\n",
7027- ahd_get_pci_bus(ahd->dev_softc),
7028- ahd_get_pci_slot(ahd->dev_softc),
7029- ahd_get_pci_function(ahd->dev_softc),
7030+ aic_get_pci_bus(ahd->dev_softc),
7031+ aic_get_pci_slot(ahd->dev_softc),
7032+ aic_get_pci_function(ahd->dev_softc),
7033 base);
7034 }
7035-#endif
7036
7037 if (maddr == NULL) {
7038 u_long base2;
7039@@ -384,13 +389,13 @@
7040 } else {
7041 printf("aic79xx: PCI%d:%d:%d IO regions 0x%lx and 0x%lx"
7042 "unavailable. Cannot map device.\n",
7043- ahd_get_pci_bus(ahd->dev_softc),
7044- ahd_get_pci_slot(ahd->dev_softc),
7045- ahd_get_pci_function(ahd->dev_softc),
7046+ aic_get_pci_bus(ahd->dev_softc),
7047+ aic_get_pci_slot(ahd->dev_softc),
7048+ aic_get_pci_function(ahd->dev_softc),
7049 base, base2);
7050 }
7051 }
7052- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, 4);
7053+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, 4);
7054 return (error);
7055 }
7056
7057@@ -399,49 +404,10 @@
7058 {
7059 int error;
7060
7061- error = request_irq(ahd->dev_softc->irq, ahd_linux_isr,
7062+ error = request_irq(aic_pci_dev(ahd)->irq, ahd_linux_isr,
7063 SA_SHIRQ, "aic79xx", ahd);
7064 if (error == 0)
7065- ahd->platform_data->irq = ahd->dev_softc->irq;
7066+ ahd->platform_data->irq = aic_pci_dev(ahd)->irq;
7067
7068 return (-error);
7069 }
7070-
7071-void
7072-ahd_power_state_change(struct ahd_softc *ahd, ahd_power_state new_state)
7073-{
7074-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
7075- pci_set_power_state(ahd->dev_softc, new_state);
7076-#else
7077- uint32_t cap;
7078- u_int cap_offset;
7079-
7080- /*
7081- * Traverse the capability list looking for
7082- * the power management capability.
7083- */
7084- cap = 0;
7085- cap_offset = ahd_pci_read_config(ahd->dev_softc,
7086- PCIR_CAP_PTR, /*bytes*/1);
7087- while (cap_offset != 0) {
7088-
7089- cap = ahd_pci_read_config(ahd->dev_softc,
7090- cap_offset, /*bytes*/4);
7091- if ((cap & 0xFF) == 1
7092- && ((cap >> 16) & 0x3) > 0) {
7093- uint32_t pm_control;
7094-
7095- pm_control = ahd_pci_read_config(ahd->dev_softc,
7096- cap_offset + 4,
7097- /*bytes*/4);
7098- pm_control &= ~0x3;
7099- pm_control |= new_state;
7100- ahd_pci_write_config(ahd->dev_softc,
7101- cap_offset + 4,
7102- pm_control, /*bytes*/2);
7103- break;
7104- }
7105- cap_offset = (cap >> 8) & 0xFF;
7106- }
7107-#endif
7108-}
7109diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_pci.c linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_pci.c
7110--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_pci.c 2004-01-08 11:57:43.051997102 +0100
7111+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_pci.c 2003-12-22 22:46:59.000000000 +0100
7112@@ -75,13 +75,13 @@
7113 #define ID_AHA_29320ALP 0x8017900500449005ull
7114
7115 #define ID_AIC7901A 0x801E9005FFFF9005ull
7116-#define ID_AHA_29320 0x8012900500429005ull
7117-#define ID_AHA_29320B 0x8013900500439005ull
7118 #define ID_AHA_29320LP 0x8014900500449005ull
7119
7120 #define ID_AIC7902 0x801F9005FFFF9005ull
7121 #define ID_AIC7902_B 0x801D9005FFFF9005ull
7122 #define ID_AHA_39320 0x8010900500409005ull
7123+#define ID_AHA_29320 0x8012900500429005ull
7124+#define ID_AHA_29320B 0x8013900500439005ull
7125 #define ID_AHA_39320_B 0x8015900500409005ull
7126 #define ID_AHA_39320A 0x8016900500409005ull
7127 #define ID_AHA_39320D 0x8011900500419005ull
7128@@ -117,6 +117,7 @@
7129 static ahd_device_setup_t ahd_aic7901_setup;
7130 static ahd_device_setup_t ahd_aic7901A_setup;
7131 static ahd_device_setup_t ahd_aic7902_setup;
7132+static ahd_device_setup_t ahd_aic790X_setup;
7133
7134 struct ahd_pci_identity ahd_pci_ident_table [] =
7135 {
7136@@ -135,24 +136,24 @@
7137 },
7138 /* aic7901A based controllers */
7139 {
7140- ID_AHA_29320,
7141+ ID_AHA_29320LP,
7142 ID_ALL_MASK,
7143- "Adaptec 29320 Ultra320 SCSI adapter",
7144+ "Adaptec 29320LP Ultra320 SCSI adapter",
7145 ahd_aic7901A_setup
7146 },
7147+ /* aic7902 based controllers */
7148 {
7149- ID_AHA_29320B,
7150+ ID_AHA_29320,
7151 ID_ALL_MASK,
7152- "Adaptec 29320B Ultra320 SCSI adapter",
7153- ahd_aic7901A_setup
7154+ "Adaptec 29320 Ultra320 SCSI adapter",
7155+ ahd_aic7902_setup
7156 },
7157 {
7158- ID_AHA_29320LP,
7159+ ID_AHA_29320B,
7160 ID_ALL_MASK,
7161- "Adaptec 29320LP Ultra320 SCSI adapter",
7162- ahd_aic7901A_setup
7163+ "Adaptec 29320B Ultra320 SCSI adapter",
7164+ ahd_aic7902_setup
7165 },
7166- /* aic7902 based controllers */
7167 {
7168 ID_AHA_39320,
7169 ID_ALL_MASK,
7170@@ -195,18 +196,6 @@
7171 "Adaptec (HP OEM) 39320D Ultra320 SCSI adapter",
7172 ahd_aic7902_setup
7173 },
7174- {
7175- ID_AHA_29320,
7176- ID_ALL_MASK,
7177- "Adaptec 29320 Ultra320 SCSI adapter",
7178- ahd_aic7902_setup
7179- },
7180- {
7181- ID_AHA_29320B,
7182- ID_ALL_MASK,
7183- "Adaptec 29320B Ultra320 SCSI adapter",
7184- ahd_aic7902_setup
7185- },
7186 /* Generic chip probes for devices we don't know 'exactly' */
7187 {
7188 ID_AIC7901 & ID_DEV_VENDOR_MASK,
7189@@ -274,7 +263,7 @@
7190 static void ahd_pci_split_intr(struct ahd_softc *ahd, u_int intstat);
7191
7192 struct ahd_pci_identity *
7193-ahd_find_pci_device(ahd_dev_softc_t pci)
7194+ahd_find_pci_device(aic_dev_softc_t pci)
7195 {
7196 uint64_t full_id;
7197 uint16_t device;
7198@@ -284,10 +273,10 @@
7199 struct ahd_pci_identity *entry;
7200 u_int i;
7201
7202- vendor = ahd_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
7203- device = ahd_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
7204- subvendor = ahd_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
7205- subdevice = ahd_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
7206+ vendor = aic_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
7207+ device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
7208+ subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
7209+ subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
7210 full_id = ahd_compose_id(device,
7211 vendor,
7212 subdevice,
7213@@ -320,7 +309,7 @@
7214 /*
7215 * Record if this is an HP board.
7216 */
7217- subvendor = ahd_pci_read_config(ahd->dev_softc,
7218+ subvendor = aic_pci_read_config(ahd->dev_softc,
7219 PCIR_SUBVEND_0, /*bytes*/2);
7220 if (subvendor == SUBID_HP)
7221 ahd->flags |= AHD_HP_BOARD;
7222@@ -329,7 +318,7 @@
7223 if (error != 0)
7224 return (error);
7225
7226- devconfig = ahd_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
7227+ devconfig = aic_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
7228 if ((devconfig & PCIXINITPAT) == PCIXINIT_PCI33_66) {
7229 ahd->chip |= AHD_PCI;
7230 /* Disable PCIX workarounds when running in PCI mode. */
7231@@ -339,7 +328,7 @@
7232 }
7233 ahd->bus_description = pci_bus_modes[PCI_BUS_MODES_INDEX(devconfig)];
7234
7235- ahd_power_state_change(ahd, AHD_POWER_STATE_D0);
7236+ aic_power_state_change(ahd, AIC_POWER_STATE_D0);
7237
7238 error = ahd_pci_map_registers(ahd);
7239 if (error != 0)
7240@@ -357,17 +346,17 @@
7241 if (bootverbose)
7242 printf("%s: Enabling 39Bit Addressing\n",
7243 ahd_name(ahd));
7244- devconfig = ahd_pci_read_config(ahd->dev_softc,
7245+ devconfig = aic_pci_read_config(ahd->dev_softc,
7246 DEVCONFIG, /*bytes*/4);
7247 devconfig |= DACEN;
7248- ahd_pci_write_config(ahd->dev_softc, DEVCONFIG,
7249+ aic_pci_write_config(ahd->dev_softc, DEVCONFIG,
7250 devconfig, /*bytes*/4);
7251 }
7252
7253 /* Ensure busmastering is enabled */
7254- command = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
7255+ command = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
7256 command |= PCIM_CMD_BUSMASTEREN;
7257- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
7258+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
7259
7260 error = ahd_softc_init(ahd);
7261 if (error != 0)
7262@@ -380,7 +369,7 @@
7263 return (ENXIO);
7264
7265 ahd->pci_cachesize =
7266- ahd_pci_read_config(ahd->dev_softc, CSIZE_LATTIME,
7267+ aic_pci_read_config(ahd->dev_softc, CSIZE_LATTIME,
7268 /*bytes*/1) & CACHESIZE;
7269 ahd->pci_cachesize *= 4;
7270
7271@@ -430,8 +419,8 @@
7272 * Enable PCI error interrupt status, but suppress NMIs
7273 * generated by SERR raised due to target aborts.
7274 */
7275- cmd = ahd_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
7276- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
7277+ cmd = aic_pci_read_config(ahd->dev_softc, PCIR_COMMAND, /*bytes*/2);
7278+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND,
7279 cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
7280
7281 /*
7282@@ -451,8 +440,10 @@
7283 * or read prefetching could be initiated by the
7284 * CPU or host bridge. Our device does not support
7285 * either, so look for data corruption and/or flaged
7286- * PCI errors.
7287+ * PCI errors. First pause without causing another
7288+ * chip reset.
7289 */
7290+ hcntrl &= ~CHIPRST;
7291 ahd_outb(ahd, HCNTRL, hcntrl|PAUSE);
7292 while (ahd_is_paused(ahd) == 0)
7293 ;
7294@@ -461,9 +452,9 @@
7295 ahd_set_modes(ahd, AHD_MODE_CFG, AHD_MODE_CFG);
7296 targpcistat = ahd_inb(ahd, TARGPCISTAT);
7297 ahd_outb(ahd, TARGPCISTAT, targpcistat);
7298- pci_status1 = ahd_pci_read_config(ahd->dev_softc,
7299+ pci_status1 = aic_pci_read_config(ahd->dev_softc,
7300 PCIR_STATUS + 1, /*bytes*/1);
7301- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
7302+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
7303 pci_status1, /*bytes*/1);
7304 ahd_set_modes(ahd, AHD_MODE_SCSI, AHD_MODE_SCSI);
7305 ahd_outb(ahd, CLRINT, CLRPCIINT);
7306@@ -492,14 +483,14 @@
7307
7308 /* Silently clear any latched errors. */
7309 ahd_outb(ahd, TARGPCISTAT, targpcistat);
7310- pci_status1 = ahd_pci_read_config(ahd->dev_softc,
7311+ pci_status1 = aic_pci_read_config(ahd->dev_softc,
7312 PCIR_STATUS + 1, /*bytes*/1);
7313- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
7314+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
7315 pci_status1, /*bytes*/1);
7316 ahd_outb(ahd, CLRINT, CLRPCIINT);
7317 }
7318 ahd_outb(ahd, SEQCTL0, PERRORDIS|FAILDIS);
7319- ahd_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
7320+ aic_pci_write_config(ahd->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
7321 return (error);
7322 }
7323
7324@@ -648,14 +639,14 @@
7325 uint8_t termctl;
7326 uint32_t devconfig;
7327
7328- devconfig = ahd_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
7329+ devconfig = aic_pci_read_config(ahd->dev_softc, DEVCONFIG, /*bytes*/4);
7330 devconfig &= ~STPWLEVEL;
7331 if ((ahd->flags & AHD_STPWLEVEL_A) != 0)
7332 devconfig |= STPWLEVEL;
7333 if (bootverbose)
7334 printf("%s: STPWLEVEL is %s\n",
7335 ahd_name(ahd), (devconfig & STPWLEVEL) ? "on" : "off");
7336- ahd_pci_write_config(ahd->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
7337+ aic_pci_write_config(ahd->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
7338
7339 /* Make sure current sensing is off. */
7340 if ((ahd->flags & AHD_CURRENT_SENSING) != 0) {
7341@@ -700,6 +691,7 @@
7342 * Now set the termination based on what we found.
7343 */
7344 sxfrctl1 = ahd_inb(ahd, SXFRCTL1) & ~STPWEN;
7345+ ahd->flags &= ~AHD_TERM_ENB_A;
7346 if ((termctl & FLX_TERMCTL_ENPRILOW) != 0) {
7347 ahd->flags |= AHD_TERM_ENB_A;
7348 sxfrctl1 |= STPWEN;
7349@@ -832,9 +824,9 @@
7350 }
7351 }
7352 }
7353- pci_status1 = ahd_pci_read_config(ahd->dev_softc,
7354+ pci_status1 = aic_pci_read_config(ahd->dev_softc,
7355 PCIR_STATUS + 1, /*bytes*/1);
7356- ahd_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
7357+ aic_pci_write_config(ahd->dev_softc, PCIR_STATUS + 1,
7358 pci_status1, /*bytes*/1);
7359 ahd_restore_modes(ahd, saved_modes);
7360 ahd_outb(ahd, CLRINT, CLRPCIINT);
7361@@ -856,7 +848,7 @@
7362 * Check for splits in all modes. Modes 0 and 1
7363 * additionally have SG engine splits to look at.
7364 */
7365- pcix_status = ahd_pci_read_config(ahd->dev_softc, PCIXR_STATUS,
7366+ pcix_status = aic_pci_read_config(ahd->dev_softc, PCIXR_STATUS,
7367 /*bytes*/2);
7368 printf("%s: PCI Split Interrupt - PCI-X status = 0x%x\n",
7369 ahd_name(ahd), pcix_status);
7370@@ -905,7 +897,7 @@
7371 /*
7372 * Clear PCI-X status bits.
7373 */
7374- ahd_pci_write_config(ahd->dev_softc, PCIXR_STATUS,
7375+ aic_pci_write_config(ahd->dev_softc, PCIXR_STATUS,
7376 pcix_status, /*bytes*/2);
7377 ahd_outb(ahd, CLRINT, CLRSPLTINT);
7378 ahd_restore_modes(ahd, saved_modes);
7379@@ -914,44 +906,44 @@
7380 static int
7381 ahd_aic7901_setup(struct ahd_softc *ahd)
7382 {
7383- int error;
7384
7385- error = ahd_aic7902_setup(ahd);
7386- if (error != 0)
7387- return (error);
7388 ahd->chip = AHD_AIC7901;
7389- return (0);
7390+ ahd->features = AHD_AIC7901_FE;
7391+ return (ahd_aic790X_setup(ahd));
7392 }
7393
7394 static int
7395 ahd_aic7901A_setup(struct ahd_softc *ahd)
7396 {
7397- int error;
7398
7399- error = ahd_aic7902_setup(ahd);
7400- if (error != 0)
7401- return (error);
7402 ahd->chip = AHD_AIC7901A;
7403- return (0);
7404+ ahd->features = AHD_AIC7901A_FE;
7405+ return (ahd_aic790X_setup(ahd));
7406 }
7407
7408 static int
7409 ahd_aic7902_setup(struct ahd_softc *ahd)
7410 {
7411- ahd_dev_softc_t pci;
7412+ ahd->chip = AHD_AIC7902;
7413+ ahd->features = AHD_AIC7902_FE;
7414+ return (ahd_aic790X_setup(ahd));
7415+}
7416+
7417+static int
7418+ahd_aic790X_setup(struct ahd_softc *ahd)
7419+{
7420+ aic_dev_softc_t pci;
7421 u_int rev;
7422
7423 pci = ahd->dev_softc;
7424- rev = ahd_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
7425+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
7426 if (rev < ID_AIC7902_PCI_REV_A4) {
7427 printf("%s: Unable to attach to unsupported chip revision %d\n",
7428 ahd_name(ahd), rev);
7429- ahd_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/2);
7430+ aic_pci_write_config(pci, PCIR_COMMAND, 0, /*bytes*/2);
7431 return (ENXIO);
7432 }
7433- ahd->channel = ahd_get_pci_function(pci) + 'A';
7434- ahd->chip = AHD_AIC7902;
7435- ahd->features = AHD_AIC7902_FE;
7436+ ahd->channel = aic_get_pci_function(pci) + 'A';
7437 if (rev < ID_AIC7902_PCI_REV_B0) {
7438 /*
7439 * Enable A series workarounds.
7440@@ -979,9 +971,14 @@
7441 u_int devconfig1;
7442
7443 ahd->features |= AHD_RTI|AHD_NEW_IOCELL_OPTS
7444- | AHD_NEW_DFCNTRL_OPTS;
7445- ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_ABORT_LQI_BUG
7446- | AHD_INTCOLLISION_BUG|AHD_EARLY_REQ_BUG;
7447+ | AHD_NEW_DFCNTRL_OPTS|AHD_FAST_CDB_DELIVERY;
7448+ ahd->bugs |= AHD_LQOOVERRUN_BUG|AHD_EARLY_REQ_BUG;
7449+
7450+ /*
7451+ * Some issues have been resolved in the 7901B.
7452+ */
7453+ if ((ahd->features & AHD_MULTI_FUNC) != 0)
7454+ ahd->bugs |= AHD_INTCOLLISION_BUG|AHD_ABORT_LQI_BUG;
7455
7456 /*
7457 * IO Cell paramter setup.
7458@@ -996,10 +993,10 @@
7459 * XXX - Find out exactly what this does from the hardware
7460 * folks!
7461 */
7462- devconfig1 = ahd_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
7463- ahd_pci_write_config(pci, DEVCONFIG1,
7464+ devconfig1 = aic_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
7465+ aic_pci_write_config(pci, DEVCONFIG1,
7466 devconfig1|PREQDIS, /*bytes*/1);
7467- devconfig1 = ahd_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
7468+ devconfig1 = aic_pci_read_config(pci, DEVCONFIG1, /*bytes*/1);
7469 }
7470
7471 return (0);
7472diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_proc.c linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_proc.c
7473--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_proc.c 2004-01-08 11:57:43.050997308 +0100
7474+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_proc.c 2003-12-22 22:46:59.000000000 +0100
7475@@ -37,7 +37,7 @@
7476 * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
7477 * sym driver.
7478 *
7479- * $Id$
7480+ * $Id$
7481 */
7482 #include "aic79xx_osm.h"
7483 #include "aic79xx_inline.h"
7484@@ -49,7 +49,7 @@
7485 u_int our_id, char channel,
7486 u_int target_id, u_int target_offset);
7487 static void ahd_dump_device_state(struct info_str *info,
7488- struct ahd_linux_device *dev);
7489+ struct aic_linux_device *dev);
7490 static int ahd_proc_write_seeprom(struct ahd_softc *ahd,
7491 char *buffer, int length);
7492
7493@@ -166,7 +166,7 @@
7494 u_int our_id, char channel, u_int target_id,
7495 u_int target_offset)
7496 {
7497- struct ahd_linux_target *targ;
7498+ struct aic_linux_target *targ;
7499 struct ahd_initiator_tinfo *tinfo;
7500 struct ahd_tmode_tstate *tstate;
7501 int lun;
7502@@ -187,7 +187,7 @@
7503 copy_info(info, "\tTransmission Errors %ld\n", targ->errors_detected);
7504
7505 for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
7506- struct ahd_linux_device *dev;
7507+ struct aic_linux_device *dev;
7508
7509 dev = targ->devices[lun];
7510
7511@@ -199,7 +199,7 @@
7512 }
7513
7514 static void
7515-ahd_dump_device_state(struct info_str *info, struct ahd_linux_device *dev)
7516+ahd_dump_device_state(struct info_str *info, struct aic_linux_device *dev)
7517 {
7518 copy_info(info, "\tChannel %c Target %d Lun %d Settings\n",
7519 dev->target->channel + 'A', dev->target->target, dev->lun);
7520diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_reg.h linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_reg.h
7521--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_reg.h 2004-01-08 11:57:43.049997515 +0100
7522+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_reg.h 2003-12-23 00:32:11.000000000 +0100
7523@@ -2,7 +2,7 @@
7524 * DO NOT EDIT - This file is automatically generated
7525 * from the following source files:
7526 *
7527- * $Id$
7528+ * $Id$
7529 * $Id$
7530 */
7531 typedef int (ahd_reg_print_t)(u_int, u_int *, u_int);
7532diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_reg_print.c linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_reg_print.c
7533--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_reg_print.c 2004-01-08 11:57:43.047997928 +0100
7534+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_reg_print.c 2003-12-23 00:32:11.000000000 +0100
7535@@ -2,7 +2,7 @@
7536 * DO NOT EDIT - This file is automatically generated
7537 * from the following source files:
7538 *
7539- * $Id$
7540+ * $Id$
7541 * $Id$
7542 */
7543
7544diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx.seq linux-2.4.24/drivers/scsi/aic7xxx/aic79xx.seq
7545--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx.seq 2004-01-08 11:57:43.064994415 +0100
7546+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx.seq 2003-12-22 22:46:59.000000000 +0100
7547@@ -40,7 +40,7 @@
7548 * $FreeBSD$
7549 */
7550
7551-VERSION = "$Id$"
7552+VERSION = "$Id$"
7553 PATCH_ARG_LIST = "struct ahd_softc *ahd"
7554 PREFIX = "ahd_"
7555
7556@@ -90,6 +90,13 @@
7557 test SSTAT2, NONPACKREQ jz . + 2;
7558 call unexpected_nonpkt_phase_find_ctxt;
7559 if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
7560+ /*
7561+ * On Rev A. hardware, the busy LED is only
7562+ * turned on automaically during selections
7563+ * and re-selections. Make the LED status
7564+ * more useful by forcing it to be on so
7565+ * long as one of our data FIFOs is active.
7566+ */
7567 and A, FIFO0FREE|FIFO1FREE, DFFSTAT;
7568 cmp A, FIFO0FREE|FIFO1FREE jne . + 3;
7569 and SBLKCTL, ~DIAGLEDEN|DIAGLEDON;
7570@@ -101,9 +108,9 @@
7571 call idle_loop_cchan;
7572 jmp idle_loop;
7573
7574-BEGIN_CRITICAL;
7575 idle_loop_gsfifo:
7576 SET_MODE(M_SCSI, M_SCSI)
7577+BEGIN_CRITICAL;
7578 idle_loop_gsfifo_in_scsi_mode:
7579 test LQISTAT2, LQIGSAVAIL jz return;
7580 /*
7581@@ -152,25 +159,28 @@
7582
7583 idle_loop_service_fifos:
7584 SET_MODE(M_DFF0, M_DFF0)
7585+BEGIN_CRITICAL;
7586 test LONGJMP_ADDR[1], INVALID_ADDR jnz idle_loop_next_fifo;
7587 call longjmp;
7588+END_CRITICAL;
7589 idle_loop_next_fifo:
7590 SET_MODE(M_DFF1, M_DFF1)
7591+BEGIN_CRITICAL;
7592 test LONGJMP_ADDR[1], INVALID_ADDR jz longjmp;
7593+END_CRITICAL;
7594 return:
7595 ret;
7596
7597 idle_loop_cchan:
7598 SET_MODE(M_CCHAN, M_CCHAN)
7599 test QOFF_CTLSTA, HS_MAILBOX_ACT jz hs_mailbox_empty;
7600- mov LOCAL_HS_MAILBOX, HS_MAILBOX;
7601 or QOFF_CTLSTA, HS_MAILBOX_ACT;
7602+ mov LOCAL_HS_MAILBOX, HS_MAILBOX;
7603 hs_mailbox_empty:
7604 BEGIN_CRITICAL;
7605 test CCSCBCTL, CCARREN|CCSCBEN jz scbdma_idle;
7606 test CCSCBCTL, CCSCBDIR jnz fetch_new_scb_inprog;
7607 test CCSCBCTL, CCSCBDONE jz return;
7608-END_CRITICAL;
7609 /* FALLTHROUGH */
7610 scbdma_tohost_done:
7611 test CCSCBCTL, CCARREN jz fill_qoutfifo_dmadone;
7612@@ -180,26 +190,18 @@
7613 * bad SCSI status (currently only for underruns), we
7614 * queue the SCB for normal completion. Otherwise, we
7615 * wait until any select-out activity has halted, and
7616- * then notify the host so that the transaction can be
7617- * dealt with.
7618+ * then queue the completion.
7619 */
7620- test SCB_SCSI_STATUS, 0xff jnz scbdma_notify_host;
7621- and CCSCBCTL, ~(CCARREN|CCSCBEN);
7622- bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2;
7623- bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
7624- bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
7625-scbdma_notify_host:
7626+ test SCB_SCSI_STATUS, 0xff jz scbdma_queue_completion;
7627 SET_MODE(M_SCSI, M_SCSI)
7628 test SCSISEQ0, ENSELO jnz return;
7629 test SSTAT0, (SELDO|SELINGO) jnz return;
7630 SET_MODE(M_CCHAN, M_CCHAN)
7631- /*
7632- * Remove SCB and notify host.
7633- */
7634+scbdma_queue_completion:
7635 and CCSCBCTL, ~(CCARREN|CCSCBEN);
7636 bmov COMPLETE_DMA_SCB_HEAD, SCB_NEXT_COMPLETE, 2;
7637- SET_SEQINTCODE(BAD_SCB_STATUS)
7638- ret;
7639+ bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
7640+ bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
7641 fill_qoutfifo_dmadone:
7642 and CCSCBCTL, ~(CCARREN|CCSCBEN);
7643 call qoutfifo_updated;
7644@@ -208,6 +210,7 @@
7645 test QOFF_CTLSTA, SDSCB_ROLLOVR jz return;
7646 bmov QOUTFIFO_NEXT_ADDR, SHARED_DATA_ADDR, 4;
7647 xor QOUTFIFO_ENTRY_VALID_TAG, QOUTFIFO_ENTRY_VALID_TOGGLE ret;
7648+END_CRITICAL;
7649
7650 qoutfifo_updated:
7651 /*
7652@@ -276,7 +279,7 @@
7653 * knows the correct location to store the SCB.
7654 * Set it to zero before processing the SCB.
7655 */
7656- mov SCB_FIFO_USE_COUNT, ALLZEROS;
7657+ clr SCB_FIFO_USE_COUNT;
7658 /* Update the next SCB address to download. */
7659 bmov NEXT_QUEUED_SCB_ADDR, SCB_NEXT_SCB_BUSADDR, 4;
7660 mvi SCB_NEXT[1], SCB_LIST_NULL;
7661@@ -490,14 +493,30 @@
7662 SET_SRC_MODE M_SCSI;
7663 SET_DST_MODE M_SCSI;
7664 select_in:
7665+ if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
7666+ /*
7667+ * On Rev A. hardware, the busy LED is only
7668+ * turned on automaically during selections
7669+ * and re-selections. Make the LED status
7670+ * more useful by forcing it to be on from
7671+ * the point of selection until our idle
7672+ * loop determines that neither of our FIFOs
7673+ * are busy. This handles the non-packetized
7674+ * case nicely as we will not return to the
7675+ * idle loop until the busfree at the end of
7676+ * each transaction.
7677+ */
7678+ or SBLKCTL, DIAGLEDEN|DIAGLEDON;
7679+ }
7680 if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
7681 /*
7682- * This exposes a window whereby a
7683- * busfree just after a selection will
7684- * be missed, but there is no other safe
7685- * way to enable busfree detection if
7686- * the busfreerev function is broken.
7687+ * Test to ensure that the bus has not
7688+ * already gone free prior to clearing
7689+ * any stale busfree status. This avoids
7690+ * a window whereby a busfree just after
7691+ * a selection could be missed.
7692 */
7693+ test SCSISIGI, BSYI jz . + 2;
7694 mvi CLRSINT1,CLRBUSFREE;
7695 or SIMODE1, ENBUSFREE;
7696 }
7697@@ -527,6 +546,21 @@
7698 SET_DST_MODE M_SCSI;
7699 select_out:
7700 BEGIN_CRITICAL;
7701+ if ((ahd->bugs & AHD_FAINT_LED_BUG) != 0) {
7702+ /*
7703+ * On Rev A. hardware, the busy LED is only
7704+ * turned on automaically during selections
7705+ * and re-selections. Make the LED status
7706+ * more useful by forcing it to be on from
7707+ * the point of re-selection until our idle
7708+ * loop determines that neither of our FIFOs
7709+ * are busy. This handles the non-packetized
7710+ * case nicely as we will not return to the
7711+ * idle loop until the busfree at the end of
7712+ * each transaction.
7713+ */
7714+ or SBLKCTL, DIAGLEDEN|DIAGLEDON;
7715+ }
7716 /* Clear out all SCBs that have been successfully sent. */
7717 if ((ahd->bugs & AHD_SENT_SCB_UPDATE_BUG) != 0) {
7718 /*
7719@@ -582,9 +616,6 @@
7720 bmov CURRSCB, SCBPTR, 2;
7721 curscb_ww_done:
7722 } else {
7723- /*
7724- * Untested - Verify with Rev B.
7725- */
7726 bmov SCBPTR, CURRSCB, 2;
7727 }
7728
7729@@ -651,12 +682,13 @@
7730 and SCSISEQ0, ~ENSELO;
7731 if ((ahd->bugs & AHD_BUSFREEREV_BUG) != 0) {
7732 /*
7733- * This exposes a window whereby a
7734- * busfree just after a selection will
7735- * be missed, but there is no other safe
7736- * way to enable busfree detection if
7737- * the busfreerev function is broken.
7738+ * Test to ensure that the bus has not
7739+ * already gone free prior to clearing
7740+ * any stale busfree status. This avoids
7741+ * a window whereby a busfree just after
7742+ * a selection could be missed.
7743 */
7744+ test SCSISIGI, BSYI jz . + 2;
7745 mvi CLRSINT1,CLRBUSFREE;
7746 or SIMODE1, ENBUSFREE;
7747 }
7748@@ -729,13 +761,38 @@
7749 mvi DFCNTRL, SCSIEN;
7750 p_command_xfer:
7751 and SEQ_FLAGS, ~NO_CDB_SENT;
7752- test DFCNTRL, SCSIEN jnz .;
7753+ if ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0) {
7754+ /*
7755+ * To speed up CDB delivery in Rev B, all CDB acks
7756+ * are "released" to the output sync as soon as the
7757+ * command phase starts. There is only one problem
7758+ * with this approach. If the target changes phase
7759+ * before all data are sent, we have left over acks
7760+ * that can go out on the bus in a data phase. Due
7761+ * to other chip contraints, this only happens if
7762+ * the target goes to data-in, but if the acks go
7763+ * out before we can test SDONE, we'll think that
7764+ * the transfer has completed successfully. Work
7765+ * around this by taking advantage of the 400ns or
7766+ * 800ns dead time between command phase and the REQ
7767+ * of the new phase. If the transfer has completed
7768+ * successfully, SCSIEN should fall *long* before we
7769+ * see a phase change. We thus treat any phasemiss
7770+ * that occurs before SCSIEN falls as an incomplete
7771+ * transfer.
7772+ */
7773+ test SSTAT1, PHASEMIS jnz p_command_xfer_failed;
7774+ test DFCNTRL, SCSIEN jnz . - 1;
7775+ } else {
7776+ test DFCNTRL, SCSIEN jnz .;
7777+ }
7778 /*
7779 * DMA Channel automatically disabled.
7780 * Don't allow a data phase if the command
7781 * was not fully transferred.
7782 */
7783 test SSTAT2, SDONE jnz ITloop;
7784+p_command_xfer_failed:
7785 or SEQ_FLAGS, NO_CDB_SENT;
7786 jmp ITloop;
7787
7788@@ -1061,8 +1118,10 @@
7789 test SCB_SGPTR, SG_FULL_RESID jnz upload_scb;/* Never xfered */
7790 test SCB_RESIDUAL_SGPTR, SG_LIST_NULL jz upload_scb;
7791 complete:
7792+BEGIN_CRITICAL;
7793 bmov SCB_NEXT_COMPLETE, COMPLETE_SCB_HEAD, 2;
7794 bmov COMPLETE_SCB_HEAD, SCBPTR, 2 ret;
7795+END_CRITICAL;
7796 bad_status:
7797 cmp SCB_SCSI_STATUS, STATUS_PKT_SENSE je upload_scb;
7798 call freeze_queue;
7799@@ -1073,9 +1132,11 @@
7800 * it on the host.
7801 */
7802 bmov SCB_TAG, SCBPTR, 2;
7803+BEGIN_CRITICAL;
7804 bmov SCB_NEXT_COMPLETE, COMPLETE_DMA_SCB_HEAD, 2;
7805 bmov COMPLETE_DMA_SCB_HEAD, SCBPTR, 2;
7806 or SCB_SGPTR, SG_STATUS_VALID ret;
7807+END_CRITICAL;
7808
7809 /*
7810 * Is it a disconnect message? Set a flag in the SCB to remind us
7811@@ -1122,8 +1183,18 @@
7812 await_busfree_clrchn:
7813 mvi DFFSXFRCTL, CLRCHN;
7814 await_busfree_not_m_dff:
7815- call clear_target_state;
7816+ /* clear target specific flags */
7817+ mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT;
7818 test SSTAT1,REQINIT|BUSFREE jz .;
7819+ /*
7820+ * We only set BUSFREE status once either a new
7821+ * phase has been detected or we are really
7822+ * BUSFREE. This allows the driver to know
7823+ * that we are active on the bus even though
7824+ * no identified transaction exists should a
7825+ * timeout occur while awaiting busfree.
7826+ */
7827+ mvi LASTPHASE, P_BUSFREE;
7828 test SSTAT1, BUSFREE jnz idle_loop;
7829 SET_SEQINTCODE(MISSED_BUSFREE)
7830
7831@@ -1178,11 +1249,6 @@
7832 call allocate_fifo;
7833 jmp mesgin_done;
7834
7835-clear_target_state:
7836- mvi LASTPHASE, P_BUSFREE;
7837- /* clear target specific flags */
7838- mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT ret;
7839-
7840 phase_lock:
7841 if ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0) {
7842 /*
7843@@ -1634,7 +1700,7 @@
7844 * savepointer in the current FIFO. We do this so that
7845 * a pending CTXTDONE or SAVEPTR is visible in the active
7846 * FIFO. This status is the only way we can detect if we
7847- * have lost the race (e.g. host paused us) and our attepts
7848+ * have lost the race (e.g. host paused us) and our attempts
7849 * to disable the channel occurred after all REQs were
7850 * already seen and acked (REQINIT never comes true).
7851 */
7852@@ -1643,7 +1709,7 @@
7853 test DFCNTRL, DIRECTION jz interrupt_return;
7854 and DFCNTRL, ~SCSIEN;
7855 snapshot_wait_data_valid:
7856- test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz snapshot_data_valid;
7857+ test SEQINTSRC, (CTXTDONE|SAVEPTRS) jnz interrupt_return;
7858 test SSTAT1, REQINIT jz snapshot_wait_data_valid;
7859 snapshot_data_valid:
7860 or DFCNTRL, SCSIEN;
7861@@ -1810,7 +1876,6 @@
7862 dec SCB_FIFO_USE_COUNT;
7863 test SCB_CONTROL, STATUS_RCVD jnz pkt_complete_scb_if_fifos_idle;
7864 mvi DFFSXFRCTL, CLRCHN ret;
7865-END_CRITICAL;
7866
7867 /*
7868 * LAST_SEG_DONE status has been seen in the current FIFO.
7869@@ -1819,7 +1884,6 @@
7870 * Check for overrun and see if we can complete this command.
7871 */
7872 pkt_last_seg_done:
7873-BEGIN_CRITICAL;
7874 /*
7875 * Mark transfer as completed.
7876 */
7877@@ -1959,12 +2023,14 @@
7878 test SSTAT0, SELDO jnz return;
7879 mvi SCBPTR[1], SCB_LIST_NULL;
7880 unexpected_nonpkt_phase:
7881- test MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1)) jnz . + 3;
7882+ test MODE_PTR, ~(MK_MODE(M_DFF1, M_DFF1))
7883+ jnz unexpected_nonpkt_mode_cleared;
7884 SET_SRC_MODE M_DFF0;
7885 SET_DST_MODE M_DFF0;
7886 or LONGJMP_ADDR[1], INVALID_ADDR;
7887 dec SCB_FIFO_USE_COUNT;
7888 mvi DFFSXFRCTL, CLRCHN;
7889+unexpected_nonpkt_mode_cleared:
7890 mvi CLRSINT2, CLRNONPACKREQ;
7891 test SCSIPHASE, ~(MSG_IN_PHASE|MSG_OUT_PHASE) jnz illegal_phase;
7892 SET_SEQINTCODE(ENTERING_NONPACK)
7893diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_seq.h linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_seq.h
7894--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic79xx_seq.h 2004-01-08 11:57:43.044998548 +0100
7895+++ linux-2.4.24/drivers/scsi/aic7xxx/aic79xx_seq.h 2003-12-23 00:32:11.000000000 +0100
7896@@ -2,25 +2,25 @@
7897 * DO NOT EDIT - This file is automatically generated
7898 * from the following source files:
7899 *
7900- * $Id$
7901+ * $Id$
7902 * $Id$
7903 */
7904 static uint8_t seqprog[] = {
7905 0xff, 0x02, 0x06, 0x78,
7906- 0x00, 0xea, 0x50, 0x59,
7907+ 0x00, 0xea, 0x46, 0x59,
7908 0x01, 0xea, 0x04, 0x30,
7909 0xff, 0x04, 0x0c, 0x78,
7910- 0x19, 0xea, 0x50, 0x59,
7911+ 0x19, 0xea, 0x46, 0x59,
7912 0x19, 0xea, 0x04, 0x00,
7913- 0x33, 0xea, 0x44, 0x59,
7914+ 0x33, 0xea, 0x3a, 0x59,
7915 0x33, 0xea, 0x00, 0x00,
7916 0x60, 0x3a, 0x1a, 0x68,
7917 0x04, 0x47, 0x1b, 0x68,
7918 0xff, 0x21, 0x1b, 0x70,
7919- 0x40, 0x4b, 0x92, 0x69,
7920- 0x00, 0xe2, 0x54, 0x59,
7921- 0x40, 0x4b, 0x92, 0x69,
7922- 0x20, 0x4b, 0x82, 0x69,
7923+ 0x40, 0x4b, 0x8c, 0x69,
7924+ 0x00, 0xe2, 0x4a, 0x59,
7925+ 0x40, 0x4b, 0x8c, 0x69,
7926+ 0x20, 0x4b, 0x78, 0x69,
7927 0xfc, 0x42, 0x24, 0x78,
7928 0x10, 0x40, 0x24, 0x78,
7929 0x00, 0xe2, 0xc4, 0x5d,
7930@@ -35,7 +35,7 @@
7931 0x00, 0xe2, 0x56, 0x58,
7932 0x00, 0xe2, 0x66, 0x58,
7933 0x00, 0xe2, 0x06, 0x40,
7934- 0x33, 0xea, 0x44, 0x59,
7935+ 0x33, 0xea, 0x3a, 0x59,
7936 0x33, 0xea, 0x00, 0x00,
7937 0x01, 0x52, 0x64, 0x78,
7938 0x02, 0x58, 0x50, 0x31,
7939@@ -43,62 +43,57 @@
7940 0xff, 0x97, 0x4f, 0x78,
7941 0x50, 0x4b, 0x4a, 0x68,
7942 0xbf, 0x3a, 0x74, 0x08,
7943- 0x14, 0xea, 0x50, 0x59,
7944+ 0x14, 0xea, 0x46, 0x59,
7945 0x14, 0xea, 0x04, 0x00,
7946 0x08, 0x92, 0x25, 0x03,
7947 0xff, 0x90, 0x3f, 0x68,
7948- 0x00, 0xe2, 0x56, 0x5b,
7949+ 0x00, 0xe2, 0x58, 0x5b,
7950 0x00, 0xe2, 0x3e, 0x40,
7951- 0x00, 0xea, 0x44, 0x59,
7952+ 0x00, 0xea, 0x3a, 0x59,
7953 0x01, 0xea, 0x00, 0x30,
7954 0x80, 0xf9, 0x5e, 0x68,
7955- 0x00, 0xe2, 0x42, 0x59,
7956- 0x11, 0xea, 0x44, 0x59,
7957+ 0x00, 0xe2, 0x38, 0x59,
7958+ 0x11, 0xea, 0x3a, 0x59,
7959 0x11, 0xea, 0x00, 0x00,
7960- 0x80, 0xf9, 0x42, 0x79,
7961+ 0x80, 0xf9, 0x38, 0x79,
7962 0xff, 0xea, 0xd4, 0x0d,
7963- 0x22, 0xea, 0x44, 0x59,
7964+ 0x22, 0xea, 0x3a, 0x59,
7965 0x22, 0xea, 0x00, 0x00,
7966 0x10, 0x16, 0x70, 0x78,
7967- 0x01, 0x0b, 0xa2, 0x32,
7968 0x10, 0x16, 0x2c, 0x00,
7969- 0x18, 0xad, 0x00, 0x79,
7970- 0x04, 0xad, 0xca, 0x68,
7971+ 0x01, 0x0b, 0xa2, 0x32,
7972+ 0x18, 0xad, 0xf6, 0x78,
7973+ 0x04, 0xad, 0xc0, 0x68,
7974 0x80, 0xad, 0x64, 0x78,
7975- 0x10, 0xad, 0x98, 0x78,
7976- 0xff, 0x88, 0x83, 0x68,
7977- 0xe7, 0xad, 0x5a, 0x09,
7978- 0x02, 0x8c, 0x59, 0x32,
7979- 0x02, 0x28, 0x19, 0x33,
7980- 0x02, 0xa8, 0x50, 0x36,
7981- 0x33, 0xea, 0x44, 0x59,
7982+ 0x10, 0xad, 0x8e, 0x78,
7983+ 0xff, 0x88, 0x87, 0x78,
7984+ 0x33, 0xea, 0x3a, 0x59,
7985 0x33, 0xea, 0x00, 0x00,
7986 0x40, 0x3a, 0x64, 0x68,
7987 0x50, 0x4b, 0x64, 0x68,
7988- 0x22, 0xea, 0x44, 0x59,
7989+ 0x22, 0xea, 0x3a, 0x59,
7990 0x22, 0xea, 0x00, 0x00,
7991 0xe7, 0xad, 0x5a, 0x09,
7992 0x02, 0x8c, 0x59, 0x32,
7993- 0x1a, 0xea, 0x50, 0x59,
7994- 0x1a, 0xea, 0x04, 0x00,
7995- 0xff, 0xea, 0xd4, 0x0d,
7996+ 0x02, 0x28, 0x19, 0x33,
7997+ 0x02, 0xa8, 0x50, 0x36,
7998 0xe7, 0xad, 0x5a, 0x09,
7999- 0x00, 0xe2, 0xa6, 0x58,
8000+ 0x00, 0xe2, 0x9c, 0x58,
8001 0xff, 0xea, 0x56, 0x02,
8002 0x04, 0x7c, 0x78, 0x32,
8003 0x20, 0x16, 0x64, 0x78,
8004 0x04, 0x38, 0x79, 0x32,
8005 0x80, 0x37, 0x6f, 0x16,
8006- 0xff, 0x2d, 0xb5, 0x60,
8007- 0xff, 0x29, 0xb5, 0x60,
8008- 0x40, 0x51, 0xc5, 0x78,
8009- 0xff, 0x4f, 0xb5, 0x68,
8010+ 0xff, 0x2d, 0xab, 0x60,
8011+ 0xff, 0x29, 0xab, 0x60,
8012+ 0x40, 0x51, 0xbb, 0x78,
8013+ 0xff, 0x4f, 0xab, 0x68,
8014 0xff, 0x4d, 0xc1, 0x19,
8015 0x00, 0x4e, 0xd5, 0x19,
8016- 0x00, 0xe2, 0xc4, 0x50,
8017+ 0x00, 0xe2, 0xba, 0x50,
8018 0x01, 0x4c, 0xc1, 0x31,
8019 0x00, 0x50, 0xd5, 0x19,
8020- 0x00, 0xe2, 0xc4, 0x48,
8021+ 0x00, 0xe2, 0xba, 0x48,
8022 0x80, 0x18, 0x64, 0x78,
8023 0x02, 0x4a, 0x1d, 0x30,
8024 0x10, 0xea, 0x18, 0x00,
8025@@ -114,29 +109,29 @@
8026 0x01, 0x4e, 0x9d, 0x1a,
8027 0x00, 0x4f, 0x9f, 0x22,
8028 0x01, 0x94, 0x6d, 0x33,
8029- 0x01, 0xea, 0x20, 0x33,
8030+ 0xff, 0xea, 0x20, 0x0b,
8031 0x04, 0xac, 0x49, 0x32,
8032 0xff, 0xea, 0x5a, 0x03,
8033 0xff, 0xea, 0x5e, 0x03,
8034 0x01, 0x10, 0xd4, 0x31,
8035- 0x10, 0x92, 0xf5, 0x68,
8036+ 0x10, 0x92, 0xeb, 0x68,
8037 0x3d, 0x93, 0xc5, 0x29,
8038 0xfe, 0xe2, 0xc4, 0x09,
8039 0x01, 0xea, 0xc6, 0x01,
8040 0x02, 0xe2, 0xc8, 0x31,
8041 0x02, 0xec, 0x50, 0x31,
8042 0x02, 0xa0, 0xda, 0x31,
8043- 0xff, 0xa9, 0xf4, 0x70,
8044+ 0xff, 0xa9, 0xea, 0x70,
8045 0x02, 0xa0, 0x58, 0x37,
8046- 0xff, 0x21, 0xfd, 0x70,
8047+ 0xff, 0x21, 0xf3, 0x70,
8048 0x02, 0x22, 0x51, 0x31,
8049 0x02, 0xa0, 0x5c, 0x33,
8050 0x02, 0xa0, 0x44, 0x36,
8051 0x02, 0xa0, 0x40, 0x32,
8052 0x02, 0xa0, 0x44, 0x36,
8053- 0x04, 0x47, 0x05, 0x69,
8054- 0x40, 0x16, 0x30, 0x69,
8055- 0xff, 0x2d, 0x35, 0x61,
8056+ 0x04, 0x47, 0xfb, 0x68,
8057+ 0x40, 0x16, 0x26, 0x69,
8058+ 0xff, 0x2d, 0x2b, 0x61,
8059 0xff, 0x29, 0x65, 0x70,
8060 0x01, 0x37, 0xc1, 0x31,
8061 0x02, 0x28, 0x55, 0x32,
8062@@ -149,20 +144,20 @@
8063 0x01, 0x50, 0xa1, 0x1a,
8064 0xff, 0x4e, 0x9d, 0x1a,
8065 0xff, 0x4f, 0x9f, 0x22,
8066- 0xff, 0x8d, 0x29, 0x71,
8067- 0x80, 0xac, 0x28, 0x71,
8068- 0x20, 0x16, 0x28, 0x69,
8069+ 0xff, 0x8d, 0x1f, 0x71,
8070+ 0x80, 0xac, 0x1e, 0x71,
8071+ 0x20, 0x16, 0x1e, 0x69,
8072 0x02, 0x8c, 0x51, 0x31,
8073- 0x00, 0xe2, 0x12, 0x41,
8074+ 0x00, 0xe2, 0x08, 0x41,
8075 0x01, 0xac, 0x08, 0x31,
8076 0x09, 0xea, 0x5a, 0x01,
8077 0x02, 0x8c, 0x51, 0x32,
8078 0xff, 0xea, 0x1a, 0x07,
8079 0x04, 0x24, 0xf9, 0x30,
8080- 0x1d, 0xea, 0x3a, 0x41,
8081+ 0x1d, 0xea, 0x30, 0x41,
8082 0x02, 0x2c, 0x51, 0x31,
8083 0x04, 0xa8, 0xf9, 0x30,
8084- 0x19, 0xea, 0x3a, 0x41,
8085+ 0x19, 0xea, 0x30, 0x41,
8086 0x06, 0xea, 0x08, 0x81,
8087 0x01, 0xe2, 0x5a, 0x35,
8088 0x02, 0xf2, 0xf0, 0x35,
8089@@ -180,25 +175,27 @@
8090 0x02, 0x20, 0xb9, 0x30,
8091 0x02, 0x20, 0x51, 0x31,
8092 0x4c, 0x93, 0xd7, 0x28,
8093- 0x10, 0x92, 0x63, 0x79,
8094+ 0x10, 0x92, 0x59, 0x79,
8095 0x01, 0x6b, 0xc0, 0x30,
8096 0x02, 0x64, 0xc8, 0x00,
8097 0x40, 0x3a, 0x74, 0x04,
8098 0x00, 0xe2, 0x56, 0x58,
8099- 0x33, 0xea, 0x44, 0x59,
8100+ 0x33, 0xea, 0x3a, 0x59,
8101 0x33, 0xea, 0x00, 0x00,
8102 0x30, 0x3f, 0xc0, 0x09,
8103- 0x30, 0xe0, 0x64, 0x61,
8104- 0x20, 0x3f, 0x7a, 0x69,
8105- 0x10, 0x3f, 0x64, 0x79,
8106+ 0x30, 0xe0, 0x5a, 0x61,
8107+ 0x20, 0x3f, 0x70, 0x69,
8108+ 0x10, 0x3f, 0x5a, 0x79,
8109 0x02, 0xea, 0x7e, 0x00,
8110- 0x00, 0xea, 0x44, 0x59,
8111+ 0x00, 0xea, 0x3a, 0x59,
8112 0x01, 0xea, 0x00, 0x30,
8113 0x02, 0x48, 0x51, 0x35,
8114 0x01, 0xea, 0x7e, 0x00,
8115- 0x11, 0xea, 0x44, 0x59,
8116+ 0x11, 0xea, 0x3a, 0x59,
8117 0x11, 0xea, 0x00, 0x00,
8118 0x02, 0x48, 0x51, 0x35,
8119+ 0xc0, 0x4a, 0x94, 0x00,
8120+ 0x04, 0x41, 0x7e, 0x79,
8121 0x08, 0xea, 0x98, 0x00,
8122 0x08, 0x57, 0xae, 0x00,
8123 0x08, 0x3c, 0x78, 0x00,
8124@@ -206,11 +203,12 @@
8125 0x0f, 0x67, 0xc0, 0x09,
8126 0x00, 0x34, 0x69, 0x02,
8127 0x20, 0xea, 0x96, 0x00,
8128- 0x00, 0xe2, 0xf8, 0x41,
8129- 0x40, 0x3a, 0xae, 0x69,
8130+ 0x00, 0xe2, 0xf6, 0x41,
8131+ 0xc0, 0x4a, 0x94, 0x00,
8132+ 0x40, 0x3a, 0xaa, 0x69,
8133 0x02, 0x55, 0x06, 0x68,
8134- 0x02, 0x56, 0xae, 0x69,
8135- 0xff, 0x5b, 0xae, 0x61,
8136+ 0x02, 0x56, 0xaa, 0x69,
8137+ 0xff, 0x5b, 0xaa, 0x61,
8138 0x02, 0x20, 0x51, 0x31,
8139 0x80, 0xea, 0xb2, 0x01,
8140 0x44, 0xea, 0x00, 0x00,
8141@@ -218,39 +216,40 @@
8142 0x33, 0xea, 0x00, 0x00,
8143 0xff, 0xea, 0xb2, 0x09,
8144 0xff, 0xe0, 0xc0, 0x19,
8145- 0xff, 0xe0, 0xb0, 0x79,
8146+ 0xff, 0xe0, 0xac, 0x79,
8147 0x02, 0xac, 0x51, 0x31,
8148- 0x00, 0xe2, 0xa6, 0x41,
8149+ 0x00, 0xe2, 0xa2, 0x41,
8150 0x02, 0x5e, 0x50, 0x31,
8151 0x02, 0xa8, 0xb8, 0x30,
8152 0x02, 0x5c, 0x50, 0x31,
8153- 0xff, 0xad, 0xc1, 0x71,
8154+ 0xff, 0xad, 0xbd, 0x71,
8155 0x02, 0xac, 0x41, 0x31,
8156 0x02, 0x22, 0x51, 0x31,
8157 0x02, 0xa0, 0x5c, 0x33,
8158 0x02, 0xa0, 0x44, 0x32,
8159- 0x00, 0xe2, 0xca, 0x41,
8160- 0x10, 0x92, 0xcb, 0x69,
8161+ 0x00, 0xe2, 0xc6, 0x41,
8162+ 0x10, 0x92, 0xc7, 0x69,
8163 0x3d, 0x93, 0xc9, 0x29,
8164 0x01, 0xe4, 0xc8, 0x01,
8165 0x01, 0xea, 0xca, 0x01,
8166 0xff, 0xea, 0xda, 0x01,
8167 0x02, 0x20, 0x51, 0x31,
8168 0x02, 0xae, 0x41, 0x32,
8169- 0xff, 0x21, 0xd3, 0x61,
8170+ 0xff, 0x21, 0xcf, 0x61,
8171 0xff, 0xea, 0x46, 0x02,
8172 0x02, 0x5c, 0x50, 0x31,
8173 0x40, 0xea, 0x96, 0x00,
8174 0x02, 0x56, 0xcc, 0x6d,
8175 0x01, 0x55, 0xcc, 0x6d,
8176- 0x10, 0x92, 0xdf, 0x79,
8177- 0x10, 0x40, 0xe8, 0x69,
8178- 0x01, 0x56, 0xe8, 0x79,
8179+ 0x10, 0x92, 0xdb, 0x79,
8180+ 0x10, 0x40, 0xe4, 0x69,
8181+ 0x01, 0x56, 0xe4, 0x79,
8182 0xff, 0x97, 0x07, 0x78,
8183- 0x13, 0xea, 0x50, 0x59,
8184+ 0x13, 0xea, 0x46, 0x59,
8185 0x13, 0xea, 0x04, 0x00,
8186 0x00, 0xe2, 0x06, 0x40,
8187 0xbf, 0x3a, 0x74, 0x08,
8188+ 0x04, 0x41, 0xea, 0x79,
8189 0x08, 0xea, 0x98, 0x00,
8190 0x08, 0x57, 0xae, 0x00,
8191 0x01, 0x93, 0x69, 0x32,
8192@@ -261,103 +260,105 @@
8193 0x00, 0xe2, 0xb8, 0x5b,
8194 0x01, 0x36, 0xc1, 0x31,
8195 0x9f, 0xe0, 0x4c, 0x7c,
8196- 0x80, 0xe0, 0x0c, 0x72,
8197- 0xa0, 0xe0, 0x44, 0x72,
8198- 0xc0, 0xe0, 0x3a, 0x72,
8199- 0xe0, 0xe0, 0x74, 0x72,
8200- 0x01, 0xea, 0x50, 0x59,
8201+ 0x80, 0xe0, 0x0a, 0x72,
8202+ 0xa0, 0xe0, 0x46, 0x72,
8203+ 0xc0, 0xe0, 0x3c, 0x72,
8204+ 0xe0, 0xe0, 0x76, 0x72,
8205+ 0x01, 0xea, 0x46, 0x59,
8206 0x01, 0xea, 0x04, 0x00,
8207- 0x00, 0xe2, 0xf8, 0x41,
8208- 0x80, 0x33, 0x13, 0x7a,
8209- 0x03, 0xea, 0x50, 0x59,
8210+ 0x00, 0xe2, 0xf6, 0x41,
8211+ 0x80, 0x33, 0x11, 0x7a,
8212+ 0x03, 0xea, 0x46, 0x59,
8213 0x03, 0xea, 0x04, 0x00,
8214- 0xee, 0x00, 0x1a, 0x6a,
8215+ 0xee, 0x00, 0x18, 0x6a,
8216 0x05, 0xea, 0xb4, 0x00,
8217- 0x33, 0xea, 0x44, 0x59,
8218+ 0x33, 0xea, 0x3a, 0x59,
8219 0x33, 0xea, 0x00, 0x00,
8220 0x02, 0xa8, 0x90, 0x32,
8221- 0x00, 0xe2, 0x6a, 0x59,
8222+ 0x00, 0xe2, 0x60, 0x59,
8223 0xef, 0x96, 0xd5, 0x19,
8224- 0x00, 0xe2, 0x2a, 0x52,
8225+ 0x00, 0xe2, 0x28, 0x52,
8226 0x09, 0x80, 0xe1, 0x30,
8227 0x02, 0xea, 0x36, 0x00,
8228 0xa8, 0xea, 0x32, 0x00,
8229- 0x00, 0xe2, 0x30, 0x42,
8230+ 0x00, 0xe2, 0x2e, 0x42,
8231 0x01, 0x96, 0xd1, 0x30,
8232 0x10, 0x80, 0x89, 0x31,
8233 0x20, 0xea, 0x32, 0x00,
8234 0xbf, 0x33, 0x67, 0x0a,
8235- 0x20, 0x19, 0x32, 0x6a,
8236- 0x02, 0x4d, 0xf8, 0x69,
8237+ 0x10, 0x4c, 0x38, 0x6a,
8238+ 0x20, 0x19, 0x30, 0x6a,
8239+ 0x20, 0x19, 0x34, 0x6a,
8240+ 0x02, 0x4d, 0xf6, 0x69,
8241 0x40, 0x33, 0x67, 0x02,
8242- 0x00, 0xe2, 0xf8, 0x41,
8243- 0x80, 0x33, 0xb5, 0x6a,
8244+ 0x00, 0xe2, 0xf6, 0x41,
8245+ 0x80, 0x33, 0xb7, 0x6a,
8246 0x01, 0x44, 0x10, 0x33,
8247 0x08, 0x92, 0x25, 0x03,
8248- 0x00, 0xe2, 0xf8, 0x41,
8249+ 0x00, 0xe2, 0xf6, 0x41,
8250 0x10, 0xea, 0x80, 0x00,
8251 0x01, 0x31, 0xc5, 0x31,
8252- 0x80, 0xe2, 0x60, 0x62,
8253- 0x10, 0x92, 0x85, 0x6a,
8254+ 0x80, 0xe2, 0x62, 0x62,
8255+ 0x10, 0x92, 0x87, 0x6a,
8256 0xc0, 0x94, 0xc5, 0x01,
8257- 0x40, 0x92, 0x51, 0x6a,
8258+ 0x40, 0x92, 0x53, 0x6a,
8259 0xbf, 0xe2, 0xc4, 0x09,
8260- 0x20, 0x92, 0x65, 0x7a,
8261+ 0x20, 0x92, 0x67, 0x7a,
8262 0x01, 0xe2, 0x88, 0x30,
8263 0x00, 0xe2, 0xb8, 0x5b,
8264- 0xa0, 0x36, 0x6d, 0x62,
8265+ 0xa0, 0x36, 0x6f, 0x62,
8266 0x23, 0x92, 0x89, 0x08,
8267 0x00, 0xe2, 0xb8, 0x5b,
8268- 0xa0, 0x36, 0x6d, 0x62,
8269- 0x00, 0xa8, 0x64, 0x42,
8270- 0xff, 0xe2, 0x64, 0x62,
8271- 0x00, 0xe2, 0x84, 0x42,
8272+ 0xa0, 0x36, 0x6f, 0x62,
8273+ 0x00, 0xa8, 0x66, 0x42,
8274+ 0xff, 0xe2, 0x66, 0x62,
8275+ 0x00, 0xe2, 0x86, 0x42,
8276 0x40, 0xea, 0x98, 0x00,
8277 0x01, 0xe2, 0x88, 0x30,
8278 0x00, 0xe2, 0xb8, 0x5b,
8279- 0xa0, 0x36, 0x43, 0x72,
8280+ 0xa0, 0x36, 0x45, 0x72,
8281 0x40, 0xea, 0x98, 0x00,
8282 0x01, 0x31, 0x89, 0x32,
8283 0x08, 0xea, 0x62, 0x02,
8284- 0x00, 0xe2, 0xf8, 0x41,
8285+ 0x00, 0xe2, 0xf6, 0x41,
8286 0xe0, 0xea, 0xd4, 0x5b,
8287- 0x80, 0xe0, 0xc0, 0x6a,
8288- 0x04, 0xe0, 0x66, 0x73,
8289- 0x02, 0xe0, 0x96, 0x73,
8290- 0x00, 0xea, 0x1e, 0x73,
8291- 0x03, 0xe0, 0xa6, 0x73,
8292- 0x23, 0xe0, 0x96, 0x72,
8293- 0x08, 0xe0, 0xbc, 0x72,
8294+ 0x80, 0xe0, 0xc2, 0x6a,
8295+ 0x04, 0xe0, 0x68, 0x73,
8296+ 0x02, 0xe0, 0x9a, 0x73,
8297+ 0x00, 0xea, 0x20, 0x73,
8298+ 0x03, 0xe0, 0xaa, 0x73,
8299+ 0x23, 0xe0, 0x98, 0x72,
8300+ 0x08, 0xe0, 0xbe, 0x72,
8301 0x00, 0xe2, 0xb8, 0x5b,
8302- 0x07, 0xea, 0x50, 0x59,
8303+ 0x07, 0xea, 0x46, 0x59,
8304 0x07, 0xea, 0x04, 0x00,
8305- 0x08, 0x42, 0xf9, 0x71,
8306- 0x04, 0x42, 0x93, 0x62,
8307+ 0x08, 0x42, 0xf7, 0x71,
8308+ 0x04, 0x42, 0x95, 0x62,
8309 0x01, 0x43, 0x89, 0x30,
8310- 0x00, 0xe2, 0x84, 0x42,
8311+ 0x00, 0xe2, 0x86, 0x42,
8312 0x01, 0x44, 0xd4, 0x31,
8313- 0x00, 0xe2, 0x84, 0x42,
8314+ 0x00, 0xe2, 0x86, 0x42,
8315 0x01, 0x00, 0x60, 0x32,
8316- 0x33, 0xea, 0x44, 0x59,
8317+ 0x33, 0xea, 0x3a, 0x59,
8318 0x33, 0xea, 0x00, 0x00,
8319 0x4c, 0x34, 0xc1, 0x28,
8320 0x01, 0x64, 0xc0, 0x31,
8321- 0x00, 0x30, 0x45, 0x59,
8322+ 0x00, 0x30, 0x3b, 0x59,
8323 0x01, 0x30, 0x01, 0x30,
8324- 0x01, 0xe0, 0xba, 0x7a,
8325+ 0x01, 0xe0, 0xbc, 0x7a,
8326 0xa0, 0xea, 0xca, 0x5b,
8327- 0x01, 0xa0, 0xba, 0x62,
8328- 0x01, 0x84, 0xaf, 0x7a,
8329- 0x01, 0x95, 0xbd, 0x6a,
8330- 0x05, 0xea, 0x50, 0x59,
8331+ 0x01, 0xa0, 0xbc, 0x62,
8332+ 0x01, 0x84, 0xb1, 0x7a,
8333+ 0x01, 0x95, 0xbf, 0x6a,
8334+ 0x05, 0xea, 0x46, 0x59,
8335 0x05, 0xea, 0x04, 0x00,
8336- 0x00, 0xe2, 0xbc, 0x42,
8337- 0x03, 0xea, 0x50, 0x59,
8338+ 0x00, 0xe2, 0xbe, 0x42,
8339+ 0x03, 0xea, 0x46, 0x59,
8340 0x03, 0xea, 0x04, 0x00,
8341- 0x00, 0xe2, 0xbc, 0x42,
8342+ 0x00, 0xe2, 0xbe, 0x42,
8343 0x07, 0xea, 0xdc, 0x5b,
8344 0x01, 0x44, 0xd4, 0x31,
8345- 0x00, 0xe2, 0xf8, 0x41,
8346+ 0x00, 0xe2, 0xf6, 0x41,
8347 0x3f, 0xe0, 0x6a, 0x0a,
8348 0xc0, 0x34, 0xc1, 0x09,
8349 0x00, 0x35, 0x51, 0x01,
8350@@ -368,54 +369,54 @@
8351 0x01, 0xea, 0xc6, 0x01,
8352 0x02, 0xe2, 0xc8, 0x31,
8353 0x02, 0xec, 0x40, 0x31,
8354- 0xff, 0xa1, 0xdc, 0x72,
8355+ 0xff, 0xa1, 0xde, 0x72,
8356 0x02, 0xe8, 0xda, 0x31,
8357 0x02, 0xa0, 0x50, 0x31,
8358- 0x00, 0xe2, 0xfe, 0x42,
8359+ 0x00, 0xe2, 0x00, 0x43,
8360 0x80, 0x33, 0x67, 0x02,
8361 0x01, 0x44, 0xd4, 0x31,
8362 0x00, 0xe2, 0xb8, 0x5b,
8363 0x01, 0x33, 0x67, 0x02,
8364- 0xe0, 0x36, 0x19, 0x63,
8365+ 0xe0, 0x36, 0x1b, 0x63,
8366 0x02, 0x33, 0x67, 0x02,
8367- 0x20, 0x46, 0x12, 0x63,
8368+ 0x20, 0x46, 0x14, 0x63,
8369 0xff, 0xea, 0x52, 0x09,
8370 0xa8, 0xea, 0xca, 0x5b,
8371- 0x04, 0x92, 0xf9, 0x7a,
8372+ 0x04, 0x92, 0xfb, 0x7a,
8373 0x01, 0x34, 0xc1, 0x31,
8374- 0x00, 0x93, 0xf9, 0x62,
8375+ 0x00, 0x93, 0xfb, 0x62,
8376 0x01, 0x35, 0xc1, 0x31,
8377- 0x00, 0x94, 0x03, 0x73,
8378+ 0x00, 0x94, 0x05, 0x73,
8379 0x01, 0xa9, 0x52, 0x11,
8380- 0xff, 0xa9, 0xee, 0x6a,
8381- 0x00, 0xe2, 0x12, 0x43,
8382+ 0xff, 0xa9, 0xf0, 0x6a,
8383+ 0x00, 0xe2, 0x14, 0x43,
8384 0x10, 0x33, 0x67, 0x02,
8385- 0x04, 0x92, 0x13, 0x7b,
8386+ 0x04, 0x92, 0x15, 0x7b,
8387 0xfb, 0x92, 0x25, 0x0b,
8388 0xff, 0xea, 0x66, 0x0a,
8389- 0x01, 0xa4, 0x0d, 0x6b,
8390+ 0x01, 0xa4, 0x0f, 0x6b,
8391 0x02, 0xa8, 0x90, 0x32,
8392- 0x00, 0xe2, 0x6a, 0x59,
8393- 0x10, 0x92, 0xbd, 0x7a,
8394+ 0x00, 0xe2, 0x60, 0x59,
8395+ 0x10, 0x92, 0xbf, 0x7a,
8396 0xff, 0xea, 0xdc, 0x5b,
8397- 0x00, 0xe2, 0xbc, 0x42,
8398- 0x04, 0xea, 0x50, 0x59,
8399+ 0x00, 0xe2, 0xbe, 0x42,
8400+ 0x04, 0xea, 0x46, 0x59,
8401 0x04, 0xea, 0x04, 0x00,
8402- 0x00, 0xe2, 0xbc, 0x42,
8403- 0x04, 0xea, 0x50, 0x59,
8404+ 0x00, 0xe2, 0xbe, 0x42,
8405+ 0x04, 0xea, 0x46, 0x59,
8406 0x04, 0xea, 0x04, 0x00,
8407- 0x00, 0xe2, 0xf8, 0x41,
8408- 0x08, 0x92, 0xb5, 0x7a,
8409- 0xc0, 0x33, 0x29, 0x7b,
8410- 0x80, 0x33, 0xb5, 0x6a,
8411- 0xff, 0x88, 0x29, 0x6b,
8412- 0x40, 0x33, 0xb5, 0x6a,
8413- 0x10, 0x92, 0x2f, 0x7b,
8414- 0x0a, 0xea, 0x50, 0x59,
8415+ 0x00, 0xe2, 0xf6, 0x41,
8416+ 0x08, 0x92, 0xb7, 0x7a,
8417+ 0xc0, 0x33, 0x2b, 0x7b,
8418+ 0x80, 0x33, 0xb7, 0x6a,
8419+ 0xff, 0x88, 0x2b, 0x6b,
8420+ 0x40, 0x33, 0xb7, 0x6a,
8421+ 0x10, 0x92, 0x31, 0x7b,
8422+ 0x0a, 0xea, 0x46, 0x59,
8423 0x0a, 0xea, 0x04, 0x00,
8424- 0x00, 0xe2, 0x4e, 0x5b,
8425- 0x00, 0xe2, 0x82, 0x43,
8426- 0x50, 0x4b, 0x36, 0x6b,
8427+ 0x00, 0xe2, 0x50, 0x5b,
8428+ 0x00, 0xe2, 0x84, 0x43,
8429+ 0x50, 0x4b, 0x38, 0x6b,
8430 0xbf, 0x3a, 0x74, 0x08,
8431 0x01, 0xe0, 0xf4, 0x31,
8432 0xff, 0xea, 0xc0, 0x09,
8433@@ -425,25 +426,25 @@
8434 0x01, 0xfa, 0xc0, 0x35,
8435 0x02, 0xa8, 0x84, 0x32,
8436 0x02, 0xea, 0xb4, 0x00,
8437- 0x33, 0xea, 0x44, 0x59,
8438+ 0x33, 0xea, 0x3a, 0x59,
8439 0x33, 0xea, 0x00, 0x00,
8440 0x02, 0x42, 0x51, 0x31,
8441 0xff, 0x90, 0x65, 0x68,
8442- 0xff, 0x88, 0x5b, 0x6b,
8443- 0x01, 0xa4, 0x57, 0x6b,
8444- 0x02, 0xa4, 0x5f, 0x6b,
8445- 0x01, 0x84, 0x5f, 0x7b,
8446+ 0xff, 0x88, 0x5d, 0x6b,
8447+ 0x01, 0xa4, 0x59, 0x6b,
8448+ 0x02, 0xa4, 0x61, 0x6b,
8449+ 0x01, 0x84, 0x61, 0x7b,
8450 0x02, 0x28, 0x19, 0x33,
8451 0x02, 0xa8, 0x50, 0x36,
8452- 0xff, 0x88, 0x5f, 0x73,
8453- 0x00, 0xe2, 0x32, 0x5b,
8454+ 0xff, 0x88, 0x61, 0x73,
8455+ 0x00, 0xe2, 0x34, 0x5b,
8456 0x02, 0xa8, 0x20, 0x33,
8457 0x02, 0x2c, 0x19, 0x33,
8458 0x02, 0xa8, 0x58, 0x32,
8459 0x04, 0xa4, 0x49, 0x07,
8460- 0xc0, 0x33, 0xb5, 0x6a,
8461+ 0xc0, 0x33, 0xb7, 0x6a,
8462 0x04, 0x92, 0x25, 0x03,
8463- 0x20, 0x92, 0x83, 0x6b,
8464+ 0x20, 0x92, 0x85, 0x6b,
8465 0x02, 0xa8, 0x40, 0x31,
8466 0xc0, 0x34, 0xc1, 0x09,
8467 0x00, 0x35, 0x51, 0x01,
8468@@ -458,30 +459,29 @@
8469 0xf7, 0x57, 0xae, 0x08,
8470 0x08, 0xea, 0x98, 0x00,
8471 0x01, 0x44, 0xd4, 0x31,
8472- 0xee, 0x00, 0x8c, 0x6b,
8473+ 0xee, 0x00, 0x8e, 0x6b,
8474 0x02, 0xea, 0xb4, 0x00,
8475- 0x00, 0xe2, 0xb4, 0x5b,
8476- 0x09, 0x4c, 0x8e, 0x7b,
8477+ 0xc0, 0xea, 0x66, 0x02,
8478+ 0x09, 0x4c, 0x90, 0x7b,
8479+ 0x01, 0xea, 0x6c, 0x02,
8480 0x08, 0x4c, 0x06, 0x68,
8481- 0x0b, 0xea, 0x50, 0x59,
8482+ 0x0b, 0xea, 0x46, 0x59,
8483 0x0b, 0xea, 0x04, 0x00,
8484 0x01, 0x44, 0xd4, 0x31,
8485- 0x20, 0x33, 0xf9, 0x79,
8486- 0x00, 0xe2, 0x9e, 0x5b,
8487- 0x00, 0xe2, 0xf8, 0x41,
8488- 0x01, 0x84, 0xa3, 0x7b,
8489+ 0x20, 0x33, 0xf7, 0x79,
8490+ 0x00, 0xe2, 0xa2, 0x5b,
8491+ 0x00, 0xe2, 0xf6, 0x41,
8492+ 0x01, 0x84, 0xa7, 0x7b,
8493 0x01, 0xa4, 0x49, 0x07,
8494 0x08, 0x60, 0x30, 0x33,
8495 0x08, 0x80, 0x41, 0x37,
8496 0xdf, 0x33, 0x67, 0x0a,
8497- 0xee, 0x00, 0xb0, 0x6b,
8498+ 0xee, 0x00, 0xb4, 0x6b,
8499 0x05, 0xea, 0xb4, 0x00,
8500- 0x33, 0xea, 0x44, 0x59,
8501+ 0x33, 0xea, 0x3a, 0x59,
8502 0x33, 0xea, 0x00, 0x00,
8503- 0x00, 0xe2, 0x6a, 0x59,
8504- 0x00, 0xe2, 0xbc, 0x42,
8505- 0x01, 0xea, 0x6c, 0x02,
8506- 0xc0, 0xea, 0x66, 0x06,
8507+ 0x00, 0xe2, 0x60, 0x59,
8508+ 0x00, 0xe2, 0xbe, 0x42,
8509 0xff, 0x42, 0xc4, 0x6b,
8510 0x01, 0x41, 0xb8, 0x6b,
8511 0x02, 0x41, 0xb8, 0x7b,
8512@@ -495,7 +495,7 @@
8513 0xff, 0x42, 0xcc, 0x7b,
8514 0x04, 0x4c, 0xcc, 0x6b,
8515 0xe0, 0x41, 0x6c, 0x0a,
8516- 0xe0, 0x36, 0xf9, 0x61,
8517+ 0xe0, 0x36, 0xf7, 0x61,
8518 0xff, 0xea, 0xca, 0x09,
8519 0x01, 0xe2, 0xc8, 0x31,
8520 0x01, 0x46, 0xda, 0x35,
8521@@ -553,30 +553,30 @@
8522 0x80, 0x83, 0x45, 0x6c,
8523 0x02, 0xea, 0x4c, 0x05,
8524 0xff, 0xea, 0x4c, 0x0d,
8525- 0x00, 0xe2, 0x3e, 0x59,
8526+ 0x00, 0xe2, 0x34, 0x59,
8527 0x02, 0xa6, 0xe6, 0x6b,
8528 0x80, 0xf9, 0xf2, 0x05,
8529 0xc0, 0x33, 0x53, 0x7c,
8530- 0x03, 0xea, 0x50, 0x59,
8531+ 0x03, 0xea, 0x46, 0x59,
8532 0x03, 0xea, 0x04, 0x00,
8533 0x20, 0x33, 0x77, 0x7c,
8534 0x01, 0x84, 0x5d, 0x6c,
8535- 0x06, 0xea, 0x50, 0x59,
8536+ 0x06, 0xea, 0x46, 0x59,
8537 0x06, 0xea, 0x04, 0x00,
8538 0x00, 0xe2, 0x7a, 0x44,
8539 0x01, 0x00, 0x60, 0x32,
8540 0xee, 0x00, 0x66, 0x6c,
8541 0x05, 0xea, 0xb4, 0x00,
8542- 0x33, 0xea, 0x44, 0x59,
8543+ 0x33, 0xea, 0x3a, 0x59,
8544 0x33, 0xea, 0x00, 0x00,
8545 0x80, 0x3d, 0x7a, 0x00,
8546 0xfc, 0x42, 0x68, 0x7c,
8547 0x7f, 0x3d, 0x7a, 0x08,
8548- 0x00, 0x30, 0x45, 0x59,
8549+ 0x00, 0x30, 0x3b, 0x59,
8550 0x01, 0x30, 0x01, 0x30,
8551- 0x09, 0xea, 0x50, 0x59,
8552+ 0x09, 0xea, 0x46, 0x59,
8553 0x09, 0xea, 0x04, 0x00,
8554- 0x00, 0xe2, 0xf8, 0x41,
8555+ 0x00, 0xe2, 0xf6, 0x41,
8556 0x01, 0xa4, 0x5d, 0x6c,
8557 0x00, 0xe2, 0x30, 0x5c,
8558 0x20, 0x33, 0x67, 0x02,
8559@@ -586,7 +586,7 @@
8560 0x00, 0xe2, 0x56, 0x58,
8561 0x00, 0xe2, 0x66, 0x58,
8562 0x00, 0xe2, 0x3a, 0x58,
8563- 0x00, 0x30, 0x45, 0x59,
8564+ 0x00, 0x30, 0x3b, 0x59,
8565 0x01, 0x30, 0x01, 0x30,
8566 0x20, 0x19, 0x82, 0x6c,
8567 0x00, 0xe2, 0xb2, 0x5c,
8568@@ -601,11 +601,11 @@
8569 0x03, 0x42, 0x4c, 0x6c,
8570 0x00, 0xe2, 0xe0, 0x5b,
8571 0x80, 0xf9, 0xf2, 0x01,
8572- 0x04, 0x33, 0xf9, 0x79,
8573- 0x00, 0xe2, 0xf8, 0x41,
8574+ 0x04, 0x33, 0xf7, 0x79,
8575+ 0x00, 0xe2, 0xf6, 0x41,
8576 0x08, 0x5d, 0xba, 0x6c,
8577 0x00, 0xe2, 0x56, 0x58,
8578- 0x00, 0x30, 0x45, 0x59,
8579+ 0x00, 0x30, 0x3b, 0x59,
8580 0x01, 0x30, 0x01, 0x30,
8581 0x02, 0x1b, 0xaa, 0x7c,
8582 0x08, 0x5d, 0xb8, 0x7c,
8583@@ -619,7 +619,7 @@
8584 0xf8, 0x1b, 0x08, 0x0b,
8585 0xff, 0xea, 0x06, 0x0b,
8586 0x03, 0x68, 0x00, 0x37,
8587- 0x00, 0xe2, 0xc4, 0x58,
8588+ 0x00, 0xe2, 0xba, 0x58,
8589 0x10, 0xea, 0x18, 0x00,
8590 0xf9, 0xd9, 0xb2, 0x0d,
8591 0x01, 0xd9, 0xb2, 0x05,
8592@@ -631,7 +631,7 @@
8593 0x11, 0x00, 0x00, 0x10,
8594 0x04, 0x19, 0x08, 0x7d,
8595 0xdf, 0x19, 0x32, 0x08,
8596- 0x60, 0x5b, 0xe6, 0x6c,
8597+ 0x60, 0x5b, 0x08, 0x6d,
8598 0x01, 0x4c, 0xe2, 0x7c,
8599 0x20, 0x19, 0x32, 0x00,
8600 0x01, 0xd9, 0xb2, 0x05,
8601@@ -641,7 +641,7 @@
8602 0x08, 0x5b, 0x0a, 0x6d,
8603 0x20, 0x5b, 0xfa, 0x6c,
8604 0x02, 0x5b, 0x2a, 0x6d,
8605- 0x0e, 0xea, 0x50, 0x59,
8606+ 0x0e, 0xea, 0x46, 0x59,
8607 0x0e, 0xea, 0x04, 0x00,
8608 0x80, 0xf9, 0xea, 0x6c,
8609 0xdf, 0x5c, 0xb8, 0x08,
8610@@ -651,11 +651,11 @@
8611 0x00, 0xe2, 0x34, 0x5d,
8612 0x01, 0x90, 0x21, 0x1b,
8613 0x01, 0xd9, 0xb2, 0x05,
8614- 0x00, 0xe2, 0x32, 0x5b,
8615+ 0x00, 0xe2, 0x34, 0x5b,
8616 0xf3, 0x96, 0xd5, 0x19,
8617 0x00, 0xe2, 0x18, 0x55,
8618 0x80, 0x96, 0x19, 0x6d,
8619- 0x0f, 0xea, 0x50, 0x59,
8620+ 0x0f, 0xea, 0x46, 0x59,
8621 0x0f, 0xea, 0x04, 0x00,
8622 0x00, 0xe2, 0x20, 0x45,
8623 0x04, 0x8c, 0xe1, 0x30,
8624@@ -663,7 +663,7 @@
8625 0x02, 0xea, 0x36, 0x00,
8626 0xa8, 0xea, 0x32, 0x00,
8627 0xff, 0x97, 0x27, 0x7d,
8628- 0x14, 0xea, 0x50, 0x59,
8629+ 0x14, 0xea, 0x46, 0x59,
8630 0x14, 0xea, 0x04, 0x00,
8631 0x00, 0xe2, 0x96, 0x5d,
8632 0x01, 0xd9, 0xb2, 0x05,
8633@@ -673,14 +673,14 @@
8634 0x00, 0xe2, 0x8e, 0x5d,
8635 0x01, 0xd9, 0xb2, 0x05,
8636 0x02, 0xa6, 0x44, 0x7d,
8637- 0x00, 0xe2, 0x3e, 0x59,
8638+ 0x00, 0xe2, 0x34, 0x59,
8639 0x20, 0x5b, 0x52, 0x6d,
8640 0xfc, 0x42, 0x3e, 0x7d,
8641 0x10, 0x40, 0x40, 0x6d,
8642 0x20, 0x4d, 0x42, 0x7d,
8643 0x08, 0x5d, 0x52, 0x6d,
8644 0x02, 0xa6, 0xe6, 0x6b,
8645- 0x00, 0xe2, 0x3e, 0x59,
8646+ 0x00, 0xe2, 0x34, 0x59,
8647 0x20, 0x5b, 0x52, 0x6d,
8648 0x01, 0x1b, 0x72, 0x6d,
8649 0xfc, 0x42, 0x4e, 0x7d,
8650@@ -690,22 +690,22 @@
8651 0x02, 0x19, 0x32, 0x00,
8652 0x01, 0x5b, 0x40, 0x31,
8653 0x00, 0xe2, 0xb2, 0x5c,
8654- 0x00, 0xe2, 0x9e, 0x5b,
8655+ 0x00, 0xe2, 0xa2, 0x5b,
8656 0x20, 0xea, 0xb6, 0x00,
8657 0x00, 0xe2, 0xe0, 0x5b,
8658 0x20, 0x5c, 0xb8, 0x00,
8659 0x04, 0x19, 0x68, 0x6d,
8660 0x01, 0x1a, 0x68, 0x6d,
8661- 0x00, 0xe2, 0x3e, 0x59,
8662+ 0x00, 0xe2, 0x34, 0x59,
8663 0x01, 0x1a, 0x64, 0x78,
8664 0x80, 0xf9, 0xf2, 0x01,
8665 0x20, 0xa0, 0xcc, 0x7d,
8666 0xff, 0x90, 0x21, 0x1b,
8667- 0x08, 0x92, 0x43, 0x6b,
8668+ 0x08, 0x92, 0x45, 0x6b,
8669 0x02, 0xea, 0xb4, 0x04,
8670 0x01, 0xa4, 0x49, 0x03,
8671 0x40, 0x5b, 0x82, 0x6d,
8672- 0x00, 0xe2, 0x3e, 0x59,
8673+ 0x00, 0xe2, 0x34, 0x59,
8674 0x40, 0x5b, 0x82, 0x6d,
8675 0x04, 0x5d, 0xe6, 0x7d,
8676 0x01, 0x1a, 0xe6, 0x7d,
8677@@ -715,13 +715,13 @@
8678 0x01, 0x1a, 0xe6, 0x7d,
8679 0x80, 0xf9, 0xf2, 0x01,
8680 0xff, 0x90, 0x21, 0x1b,
8681- 0x08, 0x92, 0x43, 0x6b,
8682+ 0x08, 0x92, 0x45, 0x6b,
8683 0x02, 0xea, 0xb4, 0x04,
8684- 0x00, 0xe2, 0x3e, 0x59,
8685+ 0x00, 0xe2, 0x34, 0x59,
8686 0x01, 0x1b, 0x64, 0x78,
8687 0x80, 0xf9, 0xf2, 0x01,
8688 0x02, 0xea, 0xb4, 0x04,
8689- 0x00, 0xe2, 0x3e, 0x59,
8690+ 0x00, 0xe2, 0x34, 0x59,
8691 0x01, 0x1b, 0xaa, 0x6d,
8692 0x40, 0x5b, 0xb8, 0x7d,
8693 0x01, 0x1b, 0xaa, 0x6d,
8694@@ -730,13 +730,13 @@
8695 0x80, 0xf9, 0xf2, 0x01,
8696 0xff, 0xea, 0x10, 0x03,
8697 0x08, 0x92, 0x25, 0x03,
8698- 0x00, 0xe2, 0x42, 0x43,
8699+ 0x00, 0xe2, 0x44, 0x43,
8700 0x01, 0x1a, 0xb4, 0x7d,
8701 0x40, 0x5b, 0xb0, 0x7d,
8702 0x01, 0x1a, 0x9e, 0x6d,
8703 0xfc, 0x42, 0x64, 0x78,
8704 0x01, 0x1a, 0xb8, 0x6d,
8705- 0x10, 0xea, 0x50, 0x59,
8706+ 0x10, 0xea, 0x46, 0x59,
8707 0x10, 0xea, 0x04, 0x00,
8708 0xfc, 0x42, 0x64, 0x78,
8709 0x10, 0x40, 0xbe, 0x6d,
8710@@ -748,26 +748,26 @@
8711 0x30, 0xe0, 0x64, 0x60,
8712 0x40, 0x4b, 0x64, 0x68,
8713 0xff, 0xea, 0x52, 0x01,
8714- 0xee, 0x00, 0xd2, 0x6d,
8715+ 0xee, 0x00, 0xd4, 0x6d,
8716 0x80, 0xf9, 0xf2, 0x01,
8717 0xff, 0x90, 0x21, 0x1b,
8718 0x02, 0xea, 0xb4, 0x00,
8719 0x20, 0xea, 0x9a, 0x00,
8720 0xf3, 0x42, 0xde, 0x6d,
8721- 0x12, 0xea, 0x50, 0x59,
8722+ 0x12, 0xea, 0x46, 0x59,
8723 0x12, 0xea, 0x04, 0x00,
8724- 0x00, 0xe2, 0xf8, 0x41,
8725- 0x0d, 0xea, 0x50, 0x59,
8726+ 0x00, 0xe2, 0xf6, 0x41,
8727+ 0x0d, 0xea, 0x46, 0x59,
8728 0x0d, 0xea, 0x04, 0x00,
8729- 0x00, 0xe2, 0xf8, 0x41,
8730+ 0x00, 0xe2, 0xf6, 0x41,
8731 0x01, 0x90, 0x21, 0x1b,
8732- 0x11, 0xea, 0x50, 0x59,
8733+ 0x11, 0xea, 0x46, 0x59,
8734 0x11, 0xea, 0x04, 0x00,
8735- 0x00, 0xe2, 0x32, 0x5b,
8736+ 0x00, 0xe2, 0x34, 0x5b,
8737 0x08, 0x5a, 0xb4, 0x00,
8738 0x00, 0xe2, 0x0c, 0x5e,
8739 0xa8, 0xea, 0x32, 0x00,
8740- 0x00, 0xe2, 0x3e, 0x59,
8741+ 0x00, 0xe2, 0x34, 0x59,
8742 0x80, 0x1a, 0xfa, 0x7d,
8743 0x00, 0xe2, 0x0c, 0x5e,
8744 0x80, 0x19, 0x32, 0x00,
8745@@ -778,7 +778,7 @@
8746 0x40, 0x5b, 0xcc, 0x7d,
8747 0xff, 0x90, 0x21, 0x1b,
8748 0x80, 0xf9, 0xf2, 0x01,
8749- 0x08, 0x92, 0x43, 0x6b,
8750+ 0x08, 0x92, 0x45, 0x6b,
8751 0x02, 0xea, 0xb4, 0x04,
8752 0x01, 0x38, 0xe1, 0x30,
8753 0x05, 0x39, 0xe3, 0x98,
8754@@ -794,12 +794,20 @@
8755 };
8756
8757 typedef int ahd_patch_func_t (struct ahd_softc *ahd);
8758+static ahd_patch_func_t ahd_patch23_func;
8759+
8760+static int
8761+ahd_patch23_func(struct ahd_softc *ahd)
8762+{
8763+ return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0);
8764+}
8765+
8766 static ahd_patch_func_t ahd_patch22_func;
8767
8768 static int
8769 ahd_patch22_func(struct ahd_softc *ahd)
8770 {
8771- return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) != 0);
8772+ return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0);
8773 }
8774
8775 static ahd_patch_func_t ahd_patch21_func;
8776@@ -807,7 +815,7 @@
8777 static int
8778 ahd_patch21_func(struct ahd_softc *ahd)
8779 {
8780- return ((ahd->bugs & AHD_PKT_BITBUCKET_BUG) == 0);
8781+ return ((ahd->features & AHD_RTI) == 0);
8782 }
8783
8784 static ahd_patch_func_t ahd_patch20_func;
8785@@ -815,7 +823,7 @@
8786 static int
8787 ahd_patch20_func(struct ahd_softc *ahd)
8788 {
8789- return ((ahd->features & AHD_RTI) == 0);
8790+ return ((ahd->flags & AHD_INITIATORROLE) != 0);
8791 }
8792
8793 static ahd_patch_func_t ahd_patch19_func;
8794@@ -823,7 +831,7 @@
8795 static int
8796 ahd_patch19_func(struct ahd_softc *ahd)
8797 {
8798- return ((ahd->flags & AHD_INITIATORROLE) != 0);
8799+ return ((ahd->flags & AHD_TARGETROLE) != 0);
8800 }
8801
8802 static ahd_patch_func_t ahd_patch18_func;
8803@@ -831,7 +839,7 @@
8804 static int
8805 ahd_patch18_func(struct ahd_softc *ahd)
8806 {
8807- return ((ahd->flags & AHD_TARGETROLE) != 0);
8808+ return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0);
8809 }
8810
8811 static ahd_patch_func_t ahd_patch17_func;
8812@@ -839,7 +847,7 @@
8813 static int
8814 ahd_patch17_func(struct ahd_softc *ahd)
8815 {
8816- return ((ahd->bugs & AHD_AUTOFLUSH_BUG) != 0);
8817+ return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0);
8818 }
8819
8820 static ahd_patch_func_t ahd_patch16_func;
8821@@ -847,7 +855,7 @@
8822 static int
8823 ahd_patch16_func(struct ahd_softc *ahd)
8824 {
8825- return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) != 0);
8826+ return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0);
8827 }
8828
8829 static ahd_patch_func_t ahd_patch15_func;
8830@@ -855,7 +863,7 @@
8831 static int
8832 ahd_patch15_func(struct ahd_softc *ahd)
8833 {
8834- return ((ahd->flags & AHD_39BIT_ADDRESSING) != 0);
8835+ return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0);
8836 }
8837
8838 static ahd_patch_func_t ahd_patch14_func;
8839@@ -863,7 +871,7 @@
8840 static int
8841 ahd_patch14_func(struct ahd_softc *ahd)
8842 {
8843- return ((ahd->flags & AHD_64BIT_ADDRESSING) != 0);
8844+ return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0);
8845 }
8846
8847 static ahd_patch_func_t ahd_patch13_func;
8848@@ -871,7 +879,7 @@
8849 static int
8850 ahd_patch13_func(struct ahd_softc *ahd)
8851 {
8852- return ((ahd->features & AHD_NEW_DFCNTRL_OPTS) == 0);
8853+ return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0);
8854 }
8855
8856 static ahd_patch_func_t ahd_patch12_func;
8857@@ -879,7 +887,7 @@
8858 static int
8859 ahd_patch12_func(struct ahd_softc *ahd)
8860 {
8861- return ((ahd->bugs & AHD_REG_SLOW_SETTLE_BUG) != 0);
8862+ return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0);
8863 }
8864
8865 static ahd_patch_func_t ahd_patch11_func;
8866@@ -887,7 +895,7 @@
8867 static int
8868 ahd_patch11_func(struct ahd_softc *ahd)
8869 {
8870- return ((ahd->bugs & AHD_EARLY_REQ_BUG) != 0);
8871+ return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0);
8872 }
8873
8874 static ahd_patch_func_t ahd_patch10_func;
8875@@ -895,7 +903,7 @@
8876 static int
8877 ahd_patch10_func(struct ahd_softc *ahd)
8878 {
8879- return ((ahd->bugs & AHD_BUSFREEREV_BUG) == 0);
8880+ return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0);
8881 }
8882
8883 static ahd_patch_func_t ahd_patch9_func;
8884@@ -903,7 +911,7 @@
8885 static int
8886 ahd_patch9_func(struct ahd_softc *ahd)
8887 {
8888- return ((ahd->flags & AHD_SEQUENCER_DEBUG) != 0);
8889+ return ((ahd->features & AHD_FAST_CDB_DELIVERY) != 0);
8890 }
8891
8892 static ahd_patch_func_t ahd_patch8_func;
8893@@ -1003,73 +1011,75 @@
8894 { ahd_patch0_func, 48, 1, 1 },
8895 { ahd_patch2_func, 51, 1, 2 },
8896 { ahd_patch0_func, 52, 1, 1 },
8897+ { ahd_patch2_func, 61, 1, 2 },
8898+ { ahd_patch0_func, 62, 1, 1 },
8899 { ahd_patch2_func, 65, 1, 2 },
8900 { ahd_patch0_func, 66, 1, 1 },
8901- { ahd_patch2_func, 69, 1, 2 },
8902- { ahd_patch0_func, 70, 1, 1 },
8903- { ahd_patch1_func, 73, 1, 2 },
8904- { ahd_patch0_func, 74, 1, 1 },
8905- { ahd_patch4_func, 107, 1, 1 },
8906- { ahd_patch2_func, 162, 6, 1 },
8907- { ahd_patch1_func, 168, 2, 1 },
8908- { ahd_patch5_func, 170, 1, 1 },
8909- { ahd_patch2_func, 179, 1, 2 },
8910- { ahd_patch0_func, 180, 1, 1 },
8911- { ahd_patch6_func, 181, 2, 2 },
8912- { ahd_patch0_func, 183, 6, 3 },
8913- { ahd_patch2_func, 186, 1, 2 },
8914- { ahd_patch0_func, 187, 1, 1 },
8915- { ahd_patch2_func, 190, 1, 2 },
8916- { ahd_patch0_func, 191, 1, 1 },
8917- { ahd_patch7_func, 193, 2, 1 },
8918- { ahd_patch5_func, 201, 16, 2 },
8919- { ahd_patch0_func, 217, 1, 1 },
8920- { ahd_patch8_func, 237, 2, 1 },
8921- { ahd_patch1_func, 241, 1, 2 },
8922- { ahd_patch0_func, 242, 1, 1 },
8923- { ahd_patch7_func, 245, 2, 1 },
8924- { ahd_patch1_func, 259, 1, 2 },
8925- { ahd_patch0_func, 260, 1, 1 },
8926- { ahd_patch1_func, 263, 1, 2 },
8927- { ahd_patch0_func, 264, 1, 1 },
8928- { ahd_patch2_func, 267, 1, 2 },
8929- { ahd_patch0_func, 268, 1, 1 },
8930- { ahd_patch1_func, 323, 1, 2 },
8931- { ahd_patch0_func, 324, 1, 1 },
8932- { ahd_patch2_func, 332, 1, 2 },
8933- { ahd_patch0_func, 333, 1, 1 },
8934- { ahd_patch2_func, 336, 1, 2 },
8935- { ahd_patch0_func, 337, 1, 1 },
8936- { ahd_patch1_func, 343, 1, 2 },
8937- { ahd_patch0_func, 344, 1, 1 },
8938- { ahd_patch1_func, 346, 1, 2 },
8939- { ahd_patch0_func, 347, 1, 1 },
8940- { ahd_patch9_func, 366, 1, 1 },
8941- { ahd_patch9_func, 369, 1, 1 },
8942- { ahd_patch9_func, 371, 1, 1 },
8943- { ahd_patch9_func, 383, 1, 1 },
8944- { ahd_patch1_func, 393, 1, 2 },
8945- { ahd_patch0_func, 394, 1, 1 },
8946- { ahd_patch1_func, 396, 1, 2 },
8947- { ahd_patch0_func, 397, 1, 1 },
8948- { ahd_patch1_func, 405, 1, 2 },
8949- { ahd_patch0_func, 406, 1, 1 },
8950- { ahd_patch2_func, 419, 1, 2 },
8951- { ahd_patch0_func, 420, 1, 1 },
8952- { ahd_patch10_func, 450, 1, 1 },
8953- { ahd_patch1_func, 457, 1, 2 },
8954- { ahd_patch0_func, 458, 1, 1 },
8955- { ahd_patch2_func, 470, 1, 2 },
8956- { ahd_patch0_func, 471, 1, 1 },
8957- { ahd_patch11_func, 476, 6, 2 },
8958+ { ahd_patch4_func, 102, 1, 1 },
8959+ { ahd_patch2_func, 157, 6, 1 },
8960+ { ahd_patch1_func, 163, 2, 1 },
8961+ { ahd_patch5_func, 165, 1, 1 },
8962+ { ahd_patch2_func, 174, 1, 2 },
8963+ { ahd_patch0_func, 175, 1, 1 },
8964+ { ahd_patch6_func, 176, 2, 2 },
8965+ { ahd_patch0_func, 178, 6, 3 },
8966+ { ahd_patch2_func, 181, 1, 2 },
8967+ { ahd_patch0_func, 182, 1, 1 },
8968+ { ahd_patch2_func, 185, 1, 2 },
8969+ { ahd_patch0_func, 186, 1, 1 },
8970+ { ahd_patch3_func, 188, 1, 1 },
8971+ { ahd_patch7_func, 189, 3, 1 },
8972+ { ahd_patch3_func, 198, 1, 1 },
8973+ { ahd_patch5_func, 199, 16, 2 },
8974+ { ahd_patch0_func, 215, 1, 1 },
8975+ { ahd_patch8_func, 235, 2, 1 },
8976+ { ahd_patch1_func, 239, 1, 2 },
8977+ { ahd_patch0_func, 240, 1, 1 },
8978+ { ahd_patch7_func, 243, 3, 1 },
8979+ { ahd_patch1_func, 258, 1, 2 },
8980+ { ahd_patch0_func, 259, 1, 1 },
8981+ { ahd_patch1_func, 262, 1, 2 },
8982+ { ahd_patch0_func, 263, 1, 1 },
8983+ { ahd_patch2_func, 266, 1, 2 },
8984+ { ahd_patch0_func, 267, 1, 1 },
8985+ { ahd_patch9_func, 280, 2, 2 },
8986+ { ahd_patch0_func, 282, 1, 1 },
8987+ { ahd_patch1_func, 324, 1, 2 },
8988+ { ahd_patch0_func, 325, 1, 1 },
8989+ { ahd_patch2_func, 333, 1, 2 },
8990+ { ahd_patch0_func, 334, 1, 1 },
8991+ { ahd_patch2_func, 337, 1, 2 },
8992+ { ahd_patch0_func, 338, 1, 1 },
8993+ { ahd_patch1_func, 344, 1, 2 },
8994+ { ahd_patch0_func, 345, 1, 1 },
8995+ { ahd_patch1_func, 347, 1, 2 },
8996+ { ahd_patch0_func, 348, 1, 1 },
8997+ { ahd_patch10_func, 367, 1, 1 },
8998+ { ahd_patch10_func, 370, 1, 1 },
8999+ { ahd_patch10_func, 372, 1, 1 },
9000+ { ahd_patch10_func, 384, 1, 1 },
9001+ { ahd_patch1_func, 394, 1, 2 },
9002+ { ahd_patch0_func, 395, 1, 1 },
9003+ { ahd_patch1_func, 397, 1, 2 },
9004+ { ahd_patch0_func, 398, 1, 1 },
9005+ { ahd_patch1_func, 406, 1, 2 },
9006+ { ahd_patch0_func, 407, 1, 1 },
9007+ { ahd_patch2_func, 420, 1, 2 },
9008+ { ahd_patch0_func, 421, 1, 1 },
9009+ { ahd_patch11_func, 451, 1, 1 },
9010+ { ahd_patch1_func, 459, 1, 2 },
9011+ { ahd_patch0_func, 460, 1, 1 },
9012+ { ahd_patch2_func, 472, 1, 2 },
9013+ { ahd_patch0_func, 473, 1, 1 },
9014+ { ahd_patch12_func, 476, 6, 2 },
9015 { ahd_patch0_func, 482, 1, 1 },
9016- { ahd_patch12_func, 505, 1, 1 },
9017- { ahd_patch13_func, 514, 1, 1 },
9018- { ahd_patch14_func, 515, 1, 2 },
9019+ { ahd_patch13_func, 505, 1, 1 },
9020+ { ahd_patch14_func, 514, 1, 1 },
9021+ { ahd_patch15_func, 515, 1, 2 },
9022 { ahd_patch0_func, 516, 1, 1 },
9023- { ahd_patch15_func, 519, 1, 1 },
9024- { ahd_patch14_func, 520, 1, 1 },
9025- { ahd_patch16_func, 531, 1, 2 },
9026+ { ahd_patch16_func, 519, 1, 1 },
9027+ { ahd_patch15_func, 520, 1, 1 },
9028+ { ahd_patch17_func, 531, 1, 2 },
9029 { ahd_patch0_func, 532, 1, 1 },
9030 { ahd_patch1_func, 551, 1, 2 },
9031 { ahd_patch0_func, 552, 1, 1 },
9032@@ -1083,25 +1093,25 @@
9033 { ahd_patch0_func, 569, 1, 1 },
9034 { ahd_patch2_func, 580, 1, 2 },
9035 { ahd_patch0_func, 581, 1, 1 },
9036- { ahd_patch17_func, 585, 1, 1 },
9037- { ahd_patch18_func, 590, 1, 1 },
9038- { ahd_patch19_func, 591, 2, 1 },
9039- { ahd_patch18_func, 595, 1, 2 },
9040+ { ahd_patch18_func, 585, 1, 1 },
9041+ { ahd_patch19_func, 590, 1, 1 },
9042+ { ahd_patch20_func, 591, 2, 1 },
9043+ { ahd_patch19_func, 595, 1, 2 },
9044 { ahd_patch0_func, 596, 1, 1 },
9045 { ahd_patch2_func, 599, 1, 2 },
9046 { ahd_patch0_func, 600, 1, 1 },
9047 { ahd_patch2_func, 615, 1, 2 },
9048 { ahd_patch0_func, 616, 1, 1 },
9049- { ahd_patch20_func, 617, 14, 1 },
9050+ { ahd_patch21_func, 617, 14, 1 },
9051 { ahd_patch1_func, 635, 1, 2 },
9052 { ahd_patch0_func, 636, 1, 1 },
9053- { ahd_patch20_func, 637, 1, 1 },
9054+ { ahd_patch21_func, 637, 1, 1 },
9055 { ahd_patch1_func, 649, 1, 2 },
9056 { ahd_patch0_func, 650, 1, 1 },
9057 { ahd_patch1_func, 657, 1, 2 },
9058 { ahd_patch0_func, 658, 1, 1 },
9059- { ahd_patch17_func, 681, 1, 1 },
9060- { ahd_patch17_func, 719, 1, 1 },
9061+ { ahd_patch18_func, 681, 1, 1 },
9062+ { ahd_patch18_func, 719, 1, 1 },
9063 { ahd_patch1_func, 730, 1, 2 },
9064 { ahd_patch0_func, 731, 1, 1 },
9065 { ahd_patch1_func, 748, 1, 2 },
9066@@ -1110,11 +1120,11 @@
9067 { ahd_patch0_func, 752, 1, 1 },
9068 { ahd_patch1_func, 755, 1, 2 },
9069 { ahd_patch0_func, 756, 1, 1 },
9070- { ahd_patch21_func, 758, 1, 2 },
9071+ { ahd_patch22_func, 758, 1, 2 },
9072 { ahd_patch0_func, 759, 2, 1 },
9073- { ahd_patch22_func, 762, 4, 2 },
9074+ { ahd_patch23_func, 762, 4, 2 },
9075 { ahd_patch0_func, 766, 1, 1 },
9076- { ahd_patch22_func, 774, 11, 1 }
9077+ { ahd_patch23_func, 774, 11, 1 }
9078 };
9079
9080 static struct cs {
9081@@ -1123,15 +1133,18 @@
9082 } critical_sections[] = {
9083 { 11, 12 },
9084 { 13, 14 },
9085- { 29, 42 },
9086- { 56, 59 },
9087- { 101, 128 },
9088- { 129, 157 },
9089- { 159, 162 },
9090- { 170, 178 },
9091- { 201, 250 },
9092- { 681, 697 },
9093- { 697, 711 },
9094+ { 31, 42 },
9095+ { 45, 47 },
9096+ { 49, 50 },
9097+ { 56, 78 },
9098+ { 96, 123 },
9099+ { 124, 152 },
9100+ { 154, 157 },
9101+ { 165, 173 },
9102+ { 198, 249 },
9103+ { 428, 430 },
9104+ { 433, 436 },
9105+ { 681, 711 },
9106 { 721, 725 }
9107 };
9108
9109diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_93cx6.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_93cx6.c
9110--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_93cx6.c 2004-01-08 11:57:43.038999788 +0100
9111+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_93cx6.c 2003-12-22 22:46:59.000000000 +0100
9112@@ -28,9 +28,7 @@
9113 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
9114 * SUCH DAMAGE.
9115 *
9116- * $Id$
9117- *
9118- * $FreeBSD$
9119+ * $Id$
9120 */
9121
9122 /*
9123@@ -64,7 +62,6 @@
9124 * is preceded by an initial zero (leading 0, followed by 16-bits, MSB
9125 * first). The clock cycling from low to high initiates the next data
9126 * bit to be sent from the chip.
9127- *
9128 */
9129
9130 #ifdef __linux__
9131@@ -81,14 +80,22 @@
9132 * Right now, we only have to read the SEEPROM. But we make it easier to
9133 * add other 93Cx6 functions.
9134 */
9135-static struct seeprom_cmd {
9136+struct seeprom_cmd {
9137 uint8_t len;
9138- uint8_t bits[9];
9139-} seeprom_read = {3, {1, 1, 0}};
9140+ uint8_t bits[11];
9141+};
9142
9143+/* Short opcodes for the c46 */
9144 static struct seeprom_cmd seeprom_ewen = {9, {1, 0, 0, 1, 1, 0, 0, 0, 0}};
9145 static struct seeprom_cmd seeprom_ewds = {9, {1, 0, 0, 0, 0, 0, 0, 0, 0}};
9146+
9147+/* Long opcodes for the C56/C66 */
9148+static struct seeprom_cmd seeprom_long_ewen = {11, {1, 0, 0, 1, 1, 0, 0, 0, 0}};
9149+static struct seeprom_cmd seeprom_long_ewds = {11, {1, 0, 0, 0, 0, 0, 0, 0, 0}};
9150+
9151+/* Common opcodes */
9152 static struct seeprom_cmd seeprom_write = {3, {1, 0, 1}};
9153+static struct seeprom_cmd seeprom_read = {3, {1, 1, 0}};
9154
9155 /*
9156 * Wait for the SEERDY to go high; about 800 ns.
9157@@ -222,12 +229,25 @@
9158 ahc_write_seeprom(struct seeprom_descriptor *sd, uint16_t *buf,
9159 u_int start_addr, u_int count)
9160 {
9161+ struct seeprom_cmd *ewen, *ewds;
9162 uint16_t v;
9163 uint8_t temp;
9164 int i, k;
9165
9166 /* Place the chip into write-enable mode */
9167- send_seeprom_cmd(sd, &seeprom_ewen);
9168+ if (sd->sd_chip == C46) {
9169+ ewen = &seeprom_ewen;
9170+ ewds = &seeprom_ewds;
9171+ } else if (sd->sd_chip == C56_66) {
9172+ ewen = &seeprom_long_ewen;
9173+ ewds = &seeprom_long_ewds;
9174+ } else {
9175+ printf("ahc_write_seeprom: unsupported seeprom type %d\n",
9176+ sd->sd_chip);
9177+ return (0);
9178+ }
9179+
9180+ send_seeprom_cmd(sd, ewen);
9181 reset_seeprom(sd);
9182
9183 /* Write all requested data out to the seeprom. */
9184@@ -277,7 +297,7 @@
9185 }
9186
9187 /* Put the chip back into write-protect mode */
9188- send_seeprom_cmd(sd, &seeprom_ewds);
9189+ send_seeprom_cmd(sd, ewds);
9190 reset_seeprom(sd);
9191
9192 return (1);
9193diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_core.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_core.c
9194--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_core.c 2004-01-08 11:57:43.037000201 +0100
9195+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_core.c 2003-12-22 22:46:59.000000000 +0100
9196@@ -37,9 +37,7 @@
9197 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
9198 * POSSIBILITY OF SUCH DAMAGES.
9199 *
9200- * $Id$
9201- *
9202- * $FreeBSD$
9203+ * $Id$
9204 */
9205
9206 #ifdef __linux__
9207@@ -320,7 +320,7 @@
9208 */
9209 modnext = ahc->qoutfifonext & ~0x3;
9210 *((uint32_t *)(&ahc->qoutfifo[modnext])) = 0xFFFFFFFFUL;
9211- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
9212+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
9213 ahc->shared_data_dmamap,
9214 /*offset*/modnext, /*len*/4,
9215 BUS_DMASYNC_PREREAD);
9216@@ -458,14 +458,14 @@
9217 * complete.
9218 */
9219 scb->flags &= ~SCB_SENSE;
9220- ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
9221+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
9222 break;
9223 }
9224- ahc_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
9225+ aic_set_transaction_status(scb, CAM_SCSI_STATUS_ERROR);
9226 /* Freeze the queue until the client sees the error. */
9227 ahc_freeze_devq(ahc, scb);
9228- ahc_freeze_scb(scb);
9229- ahc_set_scsi_status(scb, hscb->shared_data.status.scsi_status);
9230+ aic_freeze_scb(scb);
9231+ aic_set_scsi_status(scb, hscb->shared_data.status.scsi_status);
9232 switch (hscb->shared_data.status.scsi_status) {
9233 case SCSI_STATUS_OK:
9234 printf("%s: Interrupted for staus of 0???\n",
9235@@ -487,7 +487,7 @@
9236 }
9237 #endif
9238
9239- if (ahc_perform_autosense(scb) == 0)
9240+ if (aic_perform_autosense(scb) == 0)
9241 break;
9242
9243 targ_info = ahc_fetch_transinfo(ahc,
9244@@ -509,12 +509,12 @@
9245 }
9246 #endif
9247 sg->addr = ahc_get_sense_bufaddr(ahc, scb);
9248- sg->len = ahc_get_sense_bufsize(ahc, scb);
9249+ sg->len = aic_get_sense_bufsize(ahc, scb);
9250 sg->len |= AHC_DMA_LAST_SEG;
9251
9252 /* Fixup byte order */
9253- sg->addr = ahc_htole32(sg->addr);
9254- sg->len = ahc_htole32(sg->len);
9255+ sg->addr = aic_htole32(sg->addr);
9256+ sg->len = aic_htole32(sg->len);
9257
9258 sc->opcode = REQUEST_SENSE;
9259 sc->byte2 = 0;
9260@@ -543,8 +543,8 @@
9261 * errors will be reported before any data
9262 * phases occur.
9263 */
9264- if (ahc_get_residual(scb)
9265- == ahc_get_transfer_length(scb)) {
9266+ if (aic_get_residual(scb)
9267+ == aic_get_transfer_length(scb)) {
9268 ahc_update_neg_request(ahc, &devinfo,
9269 tstate, targ_info,
9270 AHC_NEG_IF_NON_ASYNC);
9271@@ -558,7 +558,7 @@
9272 hscb->dataptr = sg->addr;
9273 hscb->datacnt = sg->len;
9274 hscb->sgptr = scb->sg_list_phys | SG_FULL_RESID;
9275- hscb->sgptr = ahc_htole32(hscb->sgptr);
9276+ hscb->sgptr = aic_htole32(hscb->sgptr);
9277 scb->sg_count = 1;
9278 scb->flags |= SCB_SENSE;
9279 ahc_qinfifo_requeue_tail(ahc, scb);
9280@@ -567,7 +567,7 @@
9281 * Ensure we have enough time to actually
9282 * retrieve the sense.
9283 */
9284- ahc_scb_timer_reset(scb, 5 * 1000000);
9285+ aic_scb_timer_reset(scb, 5 * 1000000);
9286 break;
9287 }
9288 default:
9289@@ -768,7 +768,7 @@
9290 if ((ahc_inb(ahc, SCSISIGI)
9291 & (CDI|MSGI)) != 0)
9292 break;
9293- ahc_delay(100);
9294+ aic_delay(100);
9295 }
9296 ahc_outb(ahc, SXFRCTL1,
9297 ahc_inb(ahc, SXFRCTL1) & ~BITBUCKET);
9298@@ -782,7 +782,7 @@
9299 scb_index = ahc_inb(ahc, SCB_TAG);
9300 scb = ahc_lookup_scb(ahc, scb_index);
9301 if (scb != NULL)
9302- ahc_set_transaction_status(scb,
9303+ aic_set_transaction_status(scb,
9304 CAM_UNCOR_PARITY);
9305 ahc_reset_channel(ahc, devinfo.channel,
9306 /*init reset*/TRUE);
9307@@ -820,16 +820,16 @@
9308 ahc_print_path(ahc, scb);
9309 printf("%s seen Data Phase. Length = %ld. NumSGs = %d.\n",
9310 ahc_inb(ahc, SEQ_FLAGS) & DPHASE ? "Have" : "Haven't",
9311- ahc_get_transfer_length(scb), scb->sg_count);
9312+ aic_get_transfer_length(scb), scb->sg_count);
9313 if (scb->sg_count > 0) {
9314 for (i = 0; i < scb->sg_count; i++) {
9315
9316 printf("sg[%d] - Addr 0x%x%x : Length %d\n",
9317 i,
9318- (ahc_le32toh(scb->sg_list[i].len) >> 24
9319+ (aic_le32toh(scb->sg_list[i].len) >> 24
9320 & SG_HIGH_ADDR_BITS),
9321- ahc_le32toh(scb->sg_list[i].addr),
9322- ahc_le32toh(scb->sg_list[i].len)
9323+ aic_le32toh(scb->sg_list[i].addr),
9324+ aic_le32toh(scb->sg_list[i].len)
9325 & AHC_SG_LEN_MASK);
9326 }
9327 }
9328@@ -839,12 +839,12 @@
9329 */
9330 ahc_freeze_devq(ahc, scb);
9331 if ((scb->flags & SCB_SENSE) == 0) {
9332- ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
9333+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
9334 } else {
9335 scb->flags &= ~SCB_SENSE;
9336- ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
9337+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
9338 }
9339- ahc_freeze_scb(scb);
9340+ aic_freeze_scb(scb);
9341
9342 if ((ahc->features & AHC_ULTRA2) != 0) {
9343 /*
9344@@ -1188,7 +1188,7 @@
9345 */
9346 ahc_scb_devinfo(ahc, &devinfo, scb);
9347 ahc_force_renegotiation(ahc, &devinfo);
9348- ahc_set_transaction_status(scb, CAM_SEL_TIMEOUT);
9349+ aic_set_transaction_status(scb, CAM_SEL_TIMEOUT);
9350 ahc_freeze_devq(ahc, scb);
9351 }
9352 ahc_outb(ahc, CLRINT, CLRSCSIINT);
9353@@ -1270,7 +1270,7 @@
9354 CAM_LUN_WILDCARD,
9355 SCB_LIST_NULL,
9356 ROLE_INITIATOR)) {
9357- ahc_set_transaction_status(scb, CAM_REQ_CMP);
9358+ aic_set_transaction_status(scb, CAM_REQ_CMP);
9359 }
9360 #endif
9361 ahc_compile_devinfo(&devinfo,
9362@@ -1469,7 +1469,7 @@
9363 * current connection, so we must
9364 * leave it on while single stepping.
9365 */
9366- ahc_outb(ahc, SIMODE1, ENBUSFREE);
9367+ ahc_outb(ahc, SIMODE1, simode1 & ENBUSFREE);
9368 else
9369 ahc_outb(ahc, SIMODE1, 0);
9370 ahc_outb(ahc, CLRINT, CLRSCSIINT);
9371@@ -1482,7 +1482,7 @@
9372 }
9373 ahc_outb(ahc, HCNTRL, ahc->unpause);
9374 while (!ahc_is_paused(ahc))
9375- ahc_delay(200);
9376+ aic_delay(200);
9377 }
9378 if (stepping) {
9379 ahc_outb(ahc, SIMODE0, simode0);
9380@@ -1530,18 +1530,18 @@
9381 for (i = 0; i < sizeof(hscb->shared_data.cdb); i++)
9382 printf("%#02x", hscb->shared_data.cdb[i]);
9383 printf(" dataptr:%#x datacnt:%#x sgptr:%#x tag:%#x\n",
9384- ahc_le32toh(hscb->dataptr),
9385- ahc_le32toh(hscb->datacnt),
9386- ahc_le32toh(hscb->sgptr),
9387+ aic_le32toh(hscb->dataptr),
9388+ aic_le32toh(hscb->datacnt),
9389+ aic_le32toh(hscb->sgptr),
9390 hscb->tag);
9391 if (scb->sg_count > 0) {
9392 for (i = 0; i < scb->sg_count; i++) {
9393 printf("sg[%d] - Addr 0x%x%x : Length %d\n",
9394 i,
9395- (ahc_le32toh(scb->sg_list[i].len) >> 24
9396+ (aic_le32toh(scb->sg_list[i].len) >> 24
9397 & SG_HIGH_ADDR_BITS),
9398- ahc_le32toh(scb->sg_list[i].addr),
9399- ahc_le32toh(scb->sg_list[i].len));
9400+ aic_le32toh(scb->sg_list[i].addr),
9401+ aic_le32toh(scb->sg_list[i].len));
9402 }
9403 }
9404 }
9405@@ -2575,7 +2575,7 @@
9406 printf("No SCB found during protocol violation\n");
9407 goto proto_violation_reset;
9408 } else {
9409- ahc_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
9410+ aic_set_transaction_status(scb, CAM_SEQUENCE_FAIL);
9411 if ((seq_flags & NO_CDB_SENT) != 0) {
9412 ahc_print_path(ahc, scb);
9413 printf("No or incomplete CDB sent to device.\n");
9414@@ -3513,7 +3513,7 @@
9415 ahc_outb(ahc, SCB_CONTROL,
9416 ahc_inb(ahc, SCB_CONTROL) & mask);
9417 scb->hscb->control &= mask;
9418- ahc_set_transaction_tag(scb, /*enabled*/FALSE,
9419+ aic_set_transaction_tag(scb, /*enabled*/FALSE,
9420 /*type*/MSG_SIMPLE_TASK);
9421 ahc_outb(ahc, MSG_OUT, MSG_IDENTIFYFLAG);
9422 ahc_assert_atn(ahc);
9423@@ -3570,7 +3570,7 @@
9424 * Perhaps add datadir to some spare bits in the hscb?
9425 */
9426 if ((ahc_inb(ahc, SEQ_FLAGS) & DPHASE) == 0
9427- || ahc_get_transfer_dir(scb) != CAM_DIR_IN) {
9428+ || aic_get_transfer_dir(scb) != CAM_DIR_IN) {
9429 /*
9430 * Ignore the message if we haven't
9431 * seen an appropriate data phase yet.
9432@@ -3626,18 +3626,18 @@
9433 * to load so we must go back one.
9434 */
9435 sg--;
9436- sglen = ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
9437+ sglen = aic_le32toh(sg->len) & AHC_SG_LEN_MASK;
9438 if (sg != scb->sg_list
9439 && sglen < (data_cnt & AHC_SG_LEN_MASK)) {
9440
9441 sg--;
9442- sglen = ahc_le32toh(sg->len);
9443+ sglen = aic_le32toh(sg->len);
9444 /*
9445 * Preserve High Address and SG_LIST bits
9446 * while setting the count to 1.
9447 */
9448 data_cnt = 1 | (sglen & (~AHC_SG_LEN_MASK));
9449- data_addr = ahc_le32toh(sg->addr)
9450+ data_addr = aic_le32toh(sg->addr)
9451 + (sglen & AHC_SG_LEN_MASK) - 1;
9452
9453 /*
9454@@ -3693,8 +3693,8 @@
9455 | (ahc_inb(ahc, SCB_RESIDUAL_DATACNT + 1) << 8)
9456 | ahc_inb(ahc, SCB_RESIDUAL_DATACNT);
9457
9458- dataptr = ahc_le32toh(sg->addr)
9459- + (ahc_le32toh(sg->len) & AHC_SG_LEN_MASK)
9460+ dataptr = aic_le32toh(sg->addr)
9461+ + (aic_le32toh(sg->len) & AHC_SG_LEN_MASK)
9462 - resid;
9463 if ((ahc->flags & AHC_39BIT_ADDRESSING) != 0) {
9464 u_int dscommand1;
9465@@ -3702,7 +3702,7 @@
9466 dscommand1 = ahc_inb(ahc, DSCOMMAND1);
9467 ahc_outb(ahc, DSCOMMAND1, dscommand1 | HADDLDSEL0);
9468 ahc_outb(ahc, HADDR,
9469- (ahc_le32toh(sg->len) >> 24) & SG_HIGH_ADDR_BITS);
9470+ (aic_le32toh(sg->len) >> 24) & SG_HIGH_ADDR_BITS);
9471 ahc_outb(ahc, DSCOMMAND1, dscommand1);
9472 }
9473 ahc_outb(ahc, HADDR + 3, dataptr >> 24);
9474@@ -3883,7 +3883,7 @@
9475 {
9476 struct ahc_softc *list_ahc;
9477
9478-#if AHC_PCI_CONFIG > 0
9479+#if AIC_PCI_CONFIG > 0
9480 /*
9481 * Second Function PCI devices need to inherit some
9482 * settings from function 0.
9483@@ -3891,17 +3891,17 @@
9484 if ((ahc->chip & AHC_BUS_MASK) == AHC_PCI
9485 && (ahc->features & AHC_MULTI_FUNC) != 0) {
9486 TAILQ_FOREACH(list_ahc, &ahc_tailq, links) {
9487- ahc_dev_softc_t list_pci;
9488- ahc_dev_softc_t pci;
9489+ aic_dev_softc_t list_pci;
9490+ aic_dev_softc_t pci;
9491
9492 list_pci = list_ahc->dev_softc;
9493 pci = ahc->dev_softc;
9494- if (ahc_get_pci_slot(list_pci) == ahc_get_pci_slot(pci)
9495- && ahc_get_pci_bus(list_pci) == ahc_get_pci_bus(pci)) {
9496+ if (aic_get_pci_slot(list_pci) == aic_get_pci_slot(pci)
9497+ && aic_get_pci_bus(list_pci) == aic_get_pci_bus(pci)) {
9498 struct ahc_softc *master;
9499 struct ahc_softc *slave;
9500
9501- if (ahc_get_pci_function(list_pci) == 0) {
9502+ if (aic_get_pci_function(list_pci) == 0) {
9503 master = list_ahc;
9504 slave = ahc;
9505 } else {
9506@@ -3969,27 +3969,27 @@
9507 {
9508 int i;
9509
9510+ ahc_terminate_recovery_thread(ahc);
9511 switch (ahc->init_level) {
9512 default:
9513 case 5:
9514 ahc_shutdown(ahc);
9515- TAILQ_REMOVE(&ahc_tailq, ahc, links);
9516 /* FALLTHROUGH */
9517 case 4:
9518- ahc_dmamap_unload(ahc, ahc->shared_data_dmat,
9519+ aic_dmamap_unload(ahc, ahc->shared_data_dmat,
9520 ahc->shared_data_dmamap);
9521 /* FALLTHROUGH */
9522 case 3:
9523- ahc_dmamem_free(ahc, ahc->shared_data_dmat, ahc->qoutfifo,
9524+ aic_dmamem_free(ahc, ahc->shared_data_dmat, ahc->qoutfifo,
9525 ahc->shared_data_dmamap);
9526- ahc_dmamap_destroy(ahc, ahc->shared_data_dmat,
9527+ aic_dmamap_destroy(ahc, ahc->shared_data_dmat,
9528 ahc->shared_data_dmamap);
9529 /* FALLTHROUGH */
9530 case 2:
9531- ahc_dma_tag_destroy(ahc, ahc->shared_data_dmat);
9532+ aic_dma_tag_destroy(ahc, ahc->shared_data_dmat);
9533 case 1:
9534 #ifndef __linux__
9535- ahc_dma_tag_destroy(ahc, ahc->buffer_dmat);
9536+ aic_dma_tag_destroy(ahc, ahc->buffer_dmat);
9537 #endif
9538 break;
9539 case 0:
9540@@ -3997,7 +3997,7 @@
9541 }
9542
9543 #ifndef __linux__
9544- ahc_dma_tag_destroy(ahc, ahc->parent_dmat);
9545+ aic_dma_tag_destroy(ahc, ahc->parent_dmat);
9546 #endif
9547 ahc_platform_free(ahc);
9548 ahc_fini_scbdata(ahc);
9549@@ -4079,14 +4079,6 @@
9550 * to disturb the integrity of the bus.
9551 */
9552 ahc_pause(ahc);
9553- if ((ahc_inb(ahc, HCNTRL) & CHIPRST) != 0) {
9554- /*
9555- * The chip has not been initialized since
9556- * PCI/EISA/VLB bus reset. Don't trust
9557- * "left over BIOS data".
9558- */
9559- ahc->flags |= AHC_NO_BIOS_INIT;
9560- }
9561 sxfrctl1_b = 0;
9562 if ((ahc->chip & AHC_CHIPID_MASK) == AHC_AIC7770) {
9563 u_int sblkctl;
9564@@ -4112,7 +4104,7 @@
9565 */
9566 wait = 1000;
9567 do {
9568- ahc_delay(1000);
9569+ aic_delay(1000);
9570 } while (--wait && !(ahc_inb(ahc, HCNTRL) & CHIPRSTACK));
9571
9572 if (wait == 0) {
9573@@ -4292,7 +4284,7 @@
9574 */
9575
9576 /* DMA tag for our hardware scb structures */
9577- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9578+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9579 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
9580 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
9581 /*highaddr*/BUS_SPACE_MAXADDR,
9582@@ -4307,7 +4299,7 @@
9583 scb_data->init_level++;
9584
9585 /* Allocation for our hscbs */
9586- if (ahc_dmamem_alloc(ahc, scb_data->hscb_dmat,
9587+ if (aic_dmamem_alloc(ahc, scb_data->hscb_dmat,
9588 (void **)&scb_data->hscbs,
9589 BUS_DMA_NOWAIT, &scb_data->hscb_dmamap) != 0) {
9590 goto error_exit;
9591@@ -4316,7 +4308,7 @@
9592 scb_data->init_level++;
9593
9594 /* And permanently map them */
9595- ahc_dmamap_load(ahc, scb_data->hscb_dmat, scb_data->hscb_dmamap,
9596+ aic_dmamap_load(ahc, scb_data->hscb_dmat, scb_data->hscb_dmamap,
9597 scb_data->hscbs,
9598 AHC_SCB_MAX_ALLOC * sizeof(struct hardware_scb),
9599 ahc_dmamap_cb, &scb_data->hscb_busaddr, /*flags*/0);
9600@@ -4324,7 +4316,7 @@
9601 scb_data->init_level++;
9602
9603 /* DMA tag for our sense buffers */
9604- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9605+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9606 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
9607 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
9608 /*highaddr*/BUS_SPACE_MAXADDR,
9609@@ -4339,7 +4331,7 @@
9610 scb_data->init_level++;
9611
9612 /* Allocate them */
9613- if (ahc_dmamem_alloc(ahc, scb_data->sense_dmat,
9614+ if (aic_dmamem_alloc(ahc, scb_data->sense_dmat,
9615 (void **)&scb_data->sense,
9616 BUS_DMA_NOWAIT, &scb_data->sense_dmamap) != 0) {
9617 goto error_exit;
9618@@ -4348,7 +4340,7 @@
9619 scb_data->init_level++;
9620
9621 /* And permanently map them */
9622- ahc_dmamap_load(ahc, scb_data->sense_dmat, scb_data->sense_dmamap,
9623+ aic_dmamap_load(ahc, scb_data->sense_dmat, scb_data->sense_dmamap,
9624 scb_data->sense,
9625 AHC_SCB_MAX_ALLOC * sizeof(struct scsi_sense_data),
9626 ahc_dmamap_cb, &scb_data->sense_busaddr, /*flags*/0);
9627@@ -4356,7 +4348,7 @@
9628 scb_data->init_level++;
9629
9630 /* DMA tag for our S/G structures. We allocate in page sized chunks */
9631- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/8,
9632+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/8,
9633 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
9634 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
9635 /*highaddr*/BUS_SPACE_MAXADDR,
9636@@ -4413,35 +4405,35 @@
9637
9638 while ((sg_map = SLIST_FIRST(&scb_data->sg_maps))!= NULL) {
9639 SLIST_REMOVE_HEAD(&scb_data->sg_maps, links);
9640- ahc_dmamap_unload(ahc, scb_data->sg_dmat,
9641+ aic_dmamap_unload(ahc, scb_data->sg_dmat,
9642 sg_map->sg_dmamap);
9643- ahc_dmamem_free(ahc, scb_data->sg_dmat,
9644+ aic_dmamem_free(ahc, scb_data->sg_dmat,
9645 sg_map->sg_vaddr,
9646 sg_map->sg_dmamap);
9647 free(sg_map, M_DEVBUF);
9648 }
9649- ahc_dma_tag_destroy(ahc, scb_data->sg_dmat);
9650+ aic_dma_tag_destroy(ahc, scb_data->sg_dmat);
9651 }
9652 case 6:
9653- ahc_dmamap_unload(ahc, scb_data->sense_dmat,
9654+ aic_dmamap_unload(ahc, scb_data->sense_dmat,
9655 scb_data->sense_dmamap);
9656 case 5:
9657- ahc_dmamem_free(ahc, scb_data->sense_dmat, scb_data->sense,
9658+ aic_dmamem_free(ahc, scb_data->sense_dmat, scb_data->sense,
9659 scb_data->sense_dmamap);
9660- ahc_dmamap_destroy(ahc, scb_data->sense_dmat,
9661+ aic_dmamap_destroy(ahc, scb_data->sense_dmat,
9662 scb_data->sense_dmamap);
9663 case 4:
9664- ahc_dma_tag_destroy(ahc, scb_data->sense_dmat);
9665+ aic_dma_tag_destroy(ahc, scb_data->sense_dmat);
9666 case 3:
9667- ahc_dmamap_unload(ahc, scb_data->hscb_dmat,
9668+ aic_dmamap_unload(ahc, scb_data->hscb_dmat,
9669 scb_data->hscb_dmamap);
9670 case 2:
9671- ahc_dmamem_free(ahc, scb_data->hscb_dmat, scb_data->hscbs,
9672+ aic_dmamem_free(ahc, scb_data->hscb_dmat, scb_data->hscbs,
9673 scb_data->hscb_dmamap);
9674- ahc_dmamap_destroy(ahc, scb_data->hscb_dmat,
9675+ aic_dmamap_destroy(ahc, scb_data->hscb_dmat,
9676 scb_data->hscb_dmamap);
9677 case 1:
9678- ahc_dma_tag_destroy(ahc, scb_data->hscb_dmat);
9679+ aic_dma_tag_destroy(ahc, scb_data->hscb_dmat);
9680 break;
9681 case 0:
9682 break;
9683@@ -4474,7 +4466,7 @@
9684 return;
9685
9686 /* Allocate S/G space for the next batch of SCBS */
9687- if (ahc_dmamem_alloc(ahc, scb_data->sg_dmat,
9688+ if (aic_dmamem_alloc(ahc, scb_data->sg_dmat,
9689 (void **)&sg_map->sg_vaddr,
9690 BUS_DMA_NOWAIT, &sg_map->sg_dmamap) != 0) {
9691 free(sg_map, M_DEVBUF);
9692@@ -4483,7 +4475,7 @@
9693
9694 SLIST_INSERT_HEAD(&scb_data->sg_maps, sg_map, links);
9695
9696- ahc_dmamap_load(ahc, scb_data->sg_dmat, sg_map->sg_dmamap,
9697+ aic_dmamap_load(ahc, scb_data->sg_dmat, sg_map->sg_dmamap,
9698 sg_map->sg_vaddr, PAGE_SIZE, ahc_dmamap_cb,
9699 &sg_map->sg_physaddr, /*flags*/0);
9700
9701@@ -4510,9 +4502,9 @@
9702 */
9703 next_scb->sg_list_phys = physaddr + sizeof(struct ahc_dma_seg);
9704 next_scb->ahc_softc = ahc;
9705- next_scb->flags = SCB_FREE;
9706+ next_scb->flags = SCB_FLAG_NONE;
9707 #ifndef __linux__
9708- error = ahc_dmamap_create(ahc, ahc->buffer_dmat, /*flags*/0,
9709+ error = aic_dmamap_create(ahc, ahc->buffer_dmat, /*flags*/0,
9710 &next_scb->dmamap);
9711 if (error != 0)
9712 break;
9713@@ -4747,7 +4739,7 @@
9714 for (wait = 5000;
9715 (ahc_inb(ahc, SBLKCTL) & (ENAB40|ENAB20)) == 0 && wait;
9716 wait--)
9717- ahc_delay(100);
9718+ aic_delay(100);
9719 }
9720 ahc_restart(ahc);
9721 return (0);
9722@@ -4760,6 +4752,7 @@
9723 ahc_init(struct ahc_softc *ahc)
9724 {
9725 int max_targ;
9726+ int error;
9727 u_int i;
9728 u_int scsi_conf;
9729 u_int ultraenb;
9730@@ -4817,7 +4810,7 @@
9731
9732 #ifndef __linux__
9733 /* DMA tag for mapping buffers into device visible space. */
9734- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9735+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9736 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
9737 /*lowaddr*/ahc->flags & AHC_39BIT_ADDRESSING
9738 ? (bus_addr_t)0x7FFFFFFFFFULL
9739@@ -4848,7 +4841,7 @@
9740 if ((ahc->features & AHC_TARGETMODE) != 0)
9741 driver_data_size += AHC_TMODE_CMDS * sizeof(struct target_cmd)
9742 + /*DMA WideOdd Bug Buffer*/1;
9743- if (ahc_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9744+ if (aic_dma_tag_create(ahc, ahc->parent_dmat, /*alignment*/1,
9745 /*boundary*/BUS_SPACE_MAXADDR_32BIT + 1,
9746 /*lowaddr*/BUS_SPACE_MAXADDR_32BIT,
9747 /*highaddr*/BUS_SPACE_MAXADDR,
9748@@ -4863,7 +4856,7 @@
9749 ahc->init_level++;
9750
9751 /* Allocation of driver data */
9752- if (ahc_dmamem_alloc(ahc, ahc->shared_data_dmat,
9753+ if (aic_dmamem_alloc(ahc, ahc->shared_data_dmat,
9754 (void **)&ahc->qoutfifo,
9755 BUS_DMA_NOWAIT, &ahc->shared_data_dmamap) != 0) {
9756 return (ENOMEM);
9757@@ -4872,7 +4865,7 @@
9758 ahc->init_level++;
9759
9760 /* And permanently map it in */
9761- ahc_dmamap_load(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
9762+ aic_dmamap_load(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
9763 ahc->qoutfifo, driver_data_size, ahc_dmamap_cb,
9764 &ahc->shared_data_busaddr, /*flags*/0);
9765
9766@@ -4915,6 +4908,13 @@
9767 }
9768 }
9769
9770+ /*
9771+ * Fire up a recovery thread for this controller.
9772+ */
9773+ error = ahc_spawn_recovery_thread(ahc);
9774+ if (error != 0)
9775+ return (error);
9776+
9777 if (ahc->scb_data->maxhscbs < AHC_SCB_MAX_ALLOC) {
9778 ahc->flags |= AHC_PAGESCBS;
9779 } else {
9780@@ -5112,8 +5112,14 @@
9781 ahc->flags |= AHC_ALL_INTERRUPTS;
9782 paused = FALSE;
9783 do {
9784- if (paused)
9785+ if (paused) {
9786 ahc_unpause(ahc);
9787+ /*
9788+ * Give the sequencer some time to service
9789+ * any active selections.
9790+ */
9791+ aic_delay(200);
9792+ }
9793 ahc_intr(ahc);
9794 ahc_pause(ahc);
9795 paused = TRUE;
9796@@ -5399,12 +5405,12 @@
9797 cam_status ostat;
9798 cam_status cstat;
9799
9800- ostat = ahc_get_transaction_status(scb);
9801+ ostat = aic_get_transaction_status(scb);
9802 if (ostat == CAM_REQ_INPROG)
9803- ahc_set_transaction_status(scb, status);
9804- cstat = ahc_get_transaction_status(scb);
9805+ aic_set_transaction_status(scb, status);
9806+ cstat = aic_get_transaction_status(scb);
9807 if (cstat != CAM_REQ_CMP)
9808- ahc_freeze_scb(scb);
9809+ aic_freeze_scb(scb);
9810 if ((scb->flags & SCB_ACTIVE) == 0)
9811 printf("Inactive SCB in qinfifo\n");
9812 ahc_done(ahc, scb);
9813@@ -5511,13 +5517,13 @@
9814 cam_status ostat;
9815 cam_status cstat;
9816
9817- ostat = ahc_get_transaction_status(scb);
9818+ ostat = aic_get_transaction_status(scb);
9819 if (ostat == CAM_REQ_INPROG)
9820- ahc_set_transaction_status(scb,
9821+ aic_set_transaction_status(scb,
9822 status);
9823- cstat = ahc_get_transaction_status(scb);
9824+ cstat = aic_get_transaction_status(scb);
9825 if (cstat != CAM_REQ_CMP)
9826- ahc_freeze_scb(scb);
9827+ aic_freeze_scb(scb);
9828 if ((scb->flags & SCB_ACTIVE) == 0)
9829 printf("Inactive SCB in Waiting List\n");
9830 ahc_done(ahc, scb);
9831@@ -5539,7 +5545,7 @@
9832 }
9833 ahc_outb(ahc, SCBPTR, curscbptr);
9834
9835- found += ahc_search_untagged_queues(ahc, /*ahc_io_ctx_t*/NULL, target,
9836+ found += ahc_search_untagged_queues(ahc, /*aic_io_ctx_t*/NULL, target,
9837 channel, lun, status, action);
9838
9839 if (action == SEARCH_COMPLETE)
9840@@ -5548,7 +5554,7 @@
9841 }
9842
9843 int
9844-ahc_search_untagged_queues(struct ahc_softc *ahc, ahc_io_ctx_t ctx,
9845+ahc_search_untagged_queues(struct ahc_softc *ahc, aic_io_ctx_t ctx,
9846 int target, char channel, int lun, uint32_t status,
9847 ahc_search_action action)
9848 {
9849@@ -5619,12 +5625,12 @@
9850 cam_status ostat;
9851 cam_status cstat;
9852
9853- ostat = ahc_get_transaction_status(scb);
9854+ ostat = aic_get_transaction_status(scb);
9855 if (ostat == CAM_REQ_INPROG)
9856- ahc_set_transaction_status(scb, status);
9857- cstat = ahc_get_transaction_status(scb);
9858+ aic_set_transaction_status(scb, status);
9859+ cstat = aic_get_transaction_status(scb);
9860 if (cstat != CAM_REQ_CMP)
9861- ahc_freeze_scb(scb);
9862+ aic_freeze_scb(scb);
9863 if ((scb->flags & SCB_ACTIVE) == 0)
9864 printf("Inactive SCB in untaggedQ\n");
9865 ahc_done(ahc, scb);
9866@@ -5923,11 +5929,11 @@
9867 if (ahc_match_scb(ahc, scbp, target, channel, lun, tag, role)) {
9868 cam_status ostat;
9869
9870- ostat = ahc_get_transaction_status(scbp);
9871+ ostat = aic_get_transaction_status(scbp);
9872 if (ostat == CAM_REQ_INPROG)
9873- ahc_set_transaction_status(scbp, status);
9874- if (ahc_get_transaction_status(scbp) != CAM_REQ_CMP)
9875- ahc_freeze_scb(scbp);
9876+ aic_set_transaction_status(scbp, status);
9877+ if (aic_get_transaction_status(scbp) != CAM_REQ_CMP)
9878+ aic_freeze_scb(scbp);
9879 if ((scbp->flags & SCB_ACTIVE) == 0)
9880 printf("Inactive SCB on pending list\n");
9881 ahc_done(ahc, scbp);
9882@@ -5949,7 +5955,7 @@
9883 scsiseq = ahc_inb(ahc, SCSISEQ);
9884 ahc_outb(ahc, SCSISEQ, scsiseq | SCSIRSTO);
9885 ahc_flush_device_writes(ahc);
9886- ahc_delay(AHC_BUSRESET_DELAY);
9887+ aic_delay(AHC_BUSRESET_DELAY);
9888 /* Turn off the bus reset */
9889 ahc_outb(ahc, SCSISEQ, scsiseq & ~SCSIRSTO);
9890
9891@@ -6156,7 +6162,7 @@
9892 */
9893
9894 hscb = scb->hscb;
9895- sgptr = ahc_le32toh(hscb->sgptr);
9896+ sgptr = aic_le32toh(hscb->sgptr);
9897 if ((sgptr & SG_RESID_VALID) == 0)
9898 /* Case 1 */
9899 return;
9900@@ -6167,10 +6173,10 @@
9901 return;
9902
9903 spkt = &hscb->shared_data.status;
9904- resid_sgptr = ahc_le32toh(spkt->residual_sg_ptr);
9905+ resid_sgptr = aic_le32toh(spkt->residual_sg_ptr);
9906 if ((sgptr & SG_FULL_RESID) != 0) {
9907 /* Case 3 */
9908- resid = ahc_get_transfer_length(scb);
9909+ resid = aic_get_transfer_length(scb);
9910 } else if ((resid_sgptr & SG_LIST_NULL) != 0) {
9911 /* Case 4 */
9912 return;
9913@@ -6183,7 +6189,7 @@
9914 * Remainder of the SG where the transfer
9915 * stopped.
9916 */
9917- resid = ahc_le32toh(spkt->residual_datacnt) & AHC_SG_LEN_MASK;
9918+ resid = aic_le32toh(spkt->residual_datacnt) & AHC_SG_LEN_MASK;
9919 sg = ahc_sg_bus_to_virt(scb, resid_sgptr & SG_PTR_MASK);
9920
9921 /* The residual sg_ptr always points to the next sg */
9922@@ -6194,15 +6200,15 @@
9923 * SG segments that are after the SG where
9924 * the transfer stopped.
9925 */
9926- while ((ahc_le32toh(sg->len) & AHC_DMA_LAST_SEG) == 0) {
9927+ while ((aic_le32toh(sg->len) & AHC_DMA_LAST_SEG) == 0) {
9928 sg++;
9929- resid += ahc_le32toh(sg->len) & AHC_SG_LEN_MASK;
9930+ resid += aic_le32toh(sg->len) & AHC_SG_LEN_MASK;
9931 }
9932 }
9933 if ((scb->flags & SCB_SENSE) == 0)
9934- ahc_set_residual(scb, resid);
9935+ aic_set_residual(scb, resid);
9936 else
9937- ahc_set_sense_residual(scb, resid);
9938+ aic_set_sense_residual(scb, resid);
9939
9940 #ifdef AHC_DEBUG
9941 if ((ahc_debug & AHC_SHOW_MISC) != 0) {
9942@@ -6482,7 +6488,7 @@
9943 /*
9944 * The firmware is always compiled into a little endian format.
9945 */
9946- instr.integer = ahc_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
9947+ instr.integer = aic_le32toh(*(uint32_t*)&seqprog[instrptr * 4]);
9948
9949 fmt1_ins = &instr.format1;
9950 fmt3_ins = NULL;
9951@@ -6587,7 +6593,7 @@
9952 }
9953 }
9954 /* The sequencer is a little endian cpu */
9955- instr.integer = ahc_htole32(instr.integer);
9956+ instr.integer = aic_htole32(instr.integer);
9957 ahc_outsb(ahc, SEQRAM, instr.bytes, 4);
9958 break;
9959 default:
9960@@ -6827,6 +6833,324 @@
9961 ahc_unpause(ahc);
9962 }
9963
9964+/*************************** Timeout Handling *********************************/
9965+void
9966+ahc_timeout(struct scb *scb)
9967+{
9968+ struct ahc_softc *ahc;
9969+
9970+ ahc = scb->ahc_softc;
9971+ if ((scb->flags & SCB_ACTIVE) != 0) {
9972+ if ((scb->flags & SCB_TIMEDOUT) == 0) {
9973+ LIST_INSERT_HEAD(&ahc->timedout_scbs, scb,
9974+ timedout_links);
9975+ scb->flags |= SCB_TIMEDOUT;
9976+ }
9977+ ahc_wakeup_recovery_thread(ahc);
9978+ }
9979+}
9980+
9981+/*
9982+ * ahc_recover_commands determines if any of the commands that have currently
9983+ * timedout are the root cause for this timeout. Innocent commands are given
9984+ * a new timeout while we wait for the command executing on the bus to timeout.
9985+ * This routine is invoked from a thread context so we are allowed to sleep.
9986+ * Our lock is not held on entry.
9987+ */
9988+void
9989+ahc_recover_commands(struct ahc_softc *ahc)
9990+{
9991+ struct scb *scb;
9992+ long s;
9993+ int found;
9994+ int restart_needed;
9995+ u_int last_phase;
9996+
9997+ ahc_lock(ahc, &s);
9998+
9999+ /*
10000+ * Pause the controller and manually flush any
10001+ * commands that have just completed but that our
10002+ * interrupt handler has yet to see.
10003+ */
10004+ ahc_pause_and_flushwork(ahc);
10005+
10006+ if (LIST_EMPTY(&ahc->timedout_scbs) != 0) {
10007+ /*
10008+ * The timedout commands have already
10009+ * completed. This typically means
10010+ * that either the timeout value was on
10011+ * the hairy edge of what the device
10012+ * requires or - more likely - interrupts
10013+ * are not happening.
10014+ */
10015+ printf("%s: Timedout SCBs already complete. "
10016+ "Interrupts may not be functioning.\n", ahc_name(ahc));
10017+ ahc_unpause(ahc);
10018+ ahc_unlock(ahc, &s);
10019+ return;
10020+ }
10021+
10022+ restart_needed = 0;
10023+ printf("%s: Recovery Initiated\n", ahc_name(ahc));
10024+ ahc_dump_card_state(ahc);
10025+
10026+ last_phase = ahc_inb(ahc, LASTPHASE);
10027+ while ((scb = LIST_FIRST(&ahc->timedout_scbs)) != NULL) {
10028+ u_int active_scb_index;
10029+ u_int saved_scbptr;
10030+ int target;
10031+ int lun;
10032+ int i;
10033+ char channel;
10034+
10035+ target = SCB_GET_TARGET(ahc, scb);
10036+ channel = SCB_GET_CHANNEL(ahc, scb);
10037+ lun = SCB_GET_LUN(scb);
10038+
10039+ ahc_print_path(ahc, scb);
10040+ printf("SCB 0x%x - timed out\n", scb->hscb->tag);
10041+ if (scb->sg_count > 0) {
10042+ for (i = 0; i < scb->sg_count; i++) {
10043+ printf("sg[%d] - Addr 0x%x : Length %d\n",
10044+ i,
10045+ scb->sg_list[i].addr,
10046+ scb->sg_list[i].len & AHC_SG_LEN_MASK);
10047+ }
10048+ }
10049+ if (scb->flags & (SCB_DEVICE_RESET|SCB_ABORT)) {
10050+ /*
10051+ * Been down this road before.
10052+ * Do a full bus reset.
10053+ */
10054+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
10055+bus_reset:
10056+ found = ahc_reset_channel(ahc, channel,
10057+ /*Initiate Reset*/TRUE);
10058+ printf("%s: Issued Channel %c Bus Reset. "
10059+ "%d SCBs aborted\n", ahc_name(ahc), channel,
10060+ found);
10061+ continue;
10062+ }
10063+
10064+ /*
10065+ * Remove the command from the timedout list in
10066+ * preparation for requeing it.
10067+ */
10068+ LIST_REMOVE(scb, timedout_links);
10069+ scb->flags &= ~SCB_TIMEDOUT;
10070+
10071+ /*
10072+ * If we are a target, transition to bus free and report
10073+ * the timeout.
10074+ *
10075+ * The target/initiator that is holding up the bus may not
10076+ * be the same as the one that triggered this timeout
10077+ * (different commands have different timeout lengths).
10078+ * If the bus is idle and we are actiing as the initiator
10079+ * for this request, queue a BDR message to the timed out
10080+ * target. Otherwise, if the timed out transaction is
10081+ * active:
10082+ * Initiator transaction:
10083+ * Stuff the message buffer with a BDR message and assert
10084+ * ATN in the hopes that the target will let go of the bus
10085+ * and go to the mesgout phase. If this fails, we'll
10086+ * get another timeout 2 seconds later which will attempt
10087+ * a bus reset.
10088+ *
10089+ * Target transaction:
10090+ * Transition to BUS FREE and report the error.
10091+ * It's good to be the target!
10092+ */
10093+ saved_scbptr = ahc_inb(ahc, SCBPTR);
10094+ active_scb_index = ahc_inb(ahc, SCB_TAG);
10095+
10096+ if ((ahc_inb(ahc, SEQ_FLAGS) & NOT_IDENTIFIED) == 0
10097+ && (active_scb_index < ahc->scb_data->numscbs)) {
10098+ struct scb *active_scb;
10099+
10100+ /*
10101+ * If the active SCB is not us, assume that
10102+ * the active SCB has a longer timeout than
10103+ * the timedout SCB, and wait for the active
10104+ * SCB to timeout.
10105+ */
10106+ active_scb = ahc_lookup_scb(ahc, active_scb_index);
10107+ if (active_scb != scb) {
10108+ u_int newtimeout;
10109+
10110+ ahc_print_path(ahc, scb);
10111+ printf("Other SCB Timeout%s",
10112+ (scb->flags & SCB_OTHERTCL_TIMEOUT) != 0
10113+ ? " again\n" : "\n");
10114+ scb->flags |= SCB_OTHERTCL_TIMEOUT;
10115+ newtimeout =
10116+ MAX(aic_get_timeout(active_scb),
10117+ aic_get_timeout(scb));
10118+ aic_scb_timer_reset(scb, newtimeout);
10119+ continue;
10120+ }
10121+
10122+ /* It's us */
10123+ if ((scb->flags & SCB_TARGET_SCB) != 0) {
10124+
10125+ /*
10126+ * Send back any queued up transactions
10127+ * and properly record the error condition.
10128+ */
10129+ ahc_abort_scbs(ahc, SCB_GET_TARGET(ahc, scb),
10130+ SCB_GET_CHANNEL(ahc, scb),
10131+ SCB_GET_LUN(scb),
10132+ scb->hscb->tag,
10133+ ROLE_TARGET,
10134+ CAM_CMD_TIMEOUT);
10135+
10136+ /* Will clear us from the bus */
10137+ restart_needed = 1;
10138+ break;
10139+ }
10140+
10141+ ahc_set_recoveryscb(ahc, active_scb);
10142+ ahc_outb(ahc, MSG_OUT, HOST_MSG);
10143+ ahc_outb(ahc, SCSISIGO, last_phase|ATNO);
10144+ ahc_print_path(ahc, active_scb);
10145+ printf("BDR message in message buffer\n");
10146+ active_scb->flags |= SCB_DEVICE_RESET;
10147+ aic_scb_timer_reset(scb, 2 * 1000000);
10148+ } else if (last_phase != P_BUSFREE
10149+ && (ahc_inb(ahc, SSTAT1) & REQINIT) == 0) {
10150+ /*
10151+ * SCB is not identified, there
10152+ * is no pending REQ, and the sequencer
10153+ * has not seen a busfree. Looks like
10154+ * a stuck connection waiting to
10155+ * go busfree. Reset the bus.
10156+ */
10157+ printf("%s: Connection stuck awaiting busfree or "
10158+ "Identify Msg.\n", ahc_name(ahc));
10159+ goto bus_reset;
10160+ } else {
10161+ int disconnected;
10162+
10163+ if (last_phase != P_BUSFREE
10164+ && (ahc_inb(ahc, SSTAT0) & TARGET) != 0) {
10165+ /* Hung target selection. Goto busfree */
10166+ printf("%s: Hung target selection\n",
10167+ ahc_name(ahc));
10168+ restart_needed = 1;
10169+ break;
10170+ }
10171+
10172+ /* XXX Shouldn't panic. Just punt instead? */
10173+ if ((scb->flags & SCB_TARGET_SCB) != 0)
10174+ panic("Timed-out target SCB but bus idle");
10175+
10176+ if (ahc_search_qinfifo(ahc, target, channel, lun,
10177+ scb->hscb->tag, ROLE_INITIATOR,
10178+ /*status*/0, SEARCH_COUNT) > 0) {
10179+ disconnected = FALSE;
10180+ } else {
10181+ disconnected = TRUE;
10182+ }
10183+
10184+ if (disconnected) {
10185+
10186+ ahc_set_recoveryscb(ahc, scb);
10187+ /*
10188+ * Actually re-queue this SCB in an attempt
10189+ * to select the device before it reconnects.
10190+ * In either case (selection or reselection),
10191+ * we will now issue a target reset to the
10192+ * timed-out device.
10193+ *
10194+ * Set the MK_MESSAGE control bit indicating
10195+ * that we desire to send a message. We
10196+ * also set the disconnected flag since
10197+ * in the paging case there is no guarantee
10198+ * that our SCB control byte matches the
10199+ * version on the card. We don't want the
10200+ * sequencer to abort the command thinking
10201+ * an unsolicited reselection occurred.
10202+ */
10203+ scb->hscb->control |= MK_MESSAGE|DISCONNECTED;
10204+ scb->flags |= SCB_DEVICE_RESET;
10205+
10206+ /*
10207+ * Remove any cached copy of this SCB in the
10208+ * disconnected list in preparation for the
10209+ * queuing of our abort SCB. We use the
10210+ * same element in the SCB, SCB_NEXT, for
10211+ * both the qinfifo and the disconnected list.
10212+ */
10213+ ahc_search_disc_list(ahc, target, channel,
10214+ lun, scb->hscb->tag,
10215+ /*stop_on_first*/TRUE,
10216+ /*remove*/TRUE,
10217+ /*save_state*/FALSE);
10218+
10219+ /*
10220+ * In the non-paging case, the sequencer will
10221+ * never re-reference the in-core SCB.
10222+ * To make sure we are notified during
10223+ * reslection, set the MK_MESSAGE flag in
10224+ * the card's copy of the SCB.
10225+ */
10226+ if ((ahc->flags & AHC_PAGESCBS) == 0) {
10227+ ahc_outb(ahc, SCBPTR, scb->hscb->tag);
10228+ ahc_outb(ahc, SCB_CONTROL,
10229+ ahc_inb(ahc, SCB_CONTROL)
10230+ | MK_MESSAGE);
10231+ }
10232+
10233+ /*
10234+ * Clear out any entries in the QINFIFO first
10235+ * so we are the next SCB for this target
10236+ * to run.
10237+ */
10238+ ahc_search_qinfifo(ahc,
10239+ SCB_GET_TARGET(ahc, scb),
10240+ channel, SCB_GET_LUN(scb),
10241+ SCB_LIST_NULL,
10242+ ROLE_INITIATOR,
10243+ CAM_REQUEUE_REQ,
10244+ SEARCH_COMPLETE);
10245+ ahc_print_path(ahc, scb);
10246+ printf("Queuing a BDR SCB\n");
10247+ ahc_qinfifo_requeue_tail(ahc, scb);
10248+ ahc_outb(ahc, SCBPTR, saved_scbptr);
10249+ aic_scb_timer_reset(scb, 2 * 1000000);
10250+ } else {
10251+ /* Go "immediatly" to the bus reset */
10252+ /* This shouldn't happen */
10253+ ahc_set_recoveryscb(ahc, scb);
10254+ ahc_print_path(ahc, scb);
10255+ printf("SCB %d: Immediate reset. "
10256+ "Flags = 0x%x\n", scb->hscb->tag,
10257+ scb->flags);
10258+ goto bus_reset;
10259+ }
10260+ }
10261+ break;
10262+ }
10263+
10264+ /*
10265+ * Any remaining SCBs were not the "culprit", so remove
10266+ * them from the timeout list. The timer for these commands
10267+ * will be reset once the recovery SCB completes.
10268+ */
10269+ while ((scb = LIST_FIRST(&ahc->timedout_scbs)) != NULL) {
10270+
10271+ LIST_REMOVE(scb, timedout_links);
10272+ scb->flags &= ~SCB_TIMEDOUT;
10273+ }
10274+
10275+ if (restart_needed)
10276+ ahc_restart(ahc);
10277+ else
10278+ ahc_unpause(ahc);
10279+ ahc_unlock(ahc, &s);
10280+}
10281+
10282 /************************* Target Mode ****************************************/
10283 #ifdef AHC_TARGET_MODE
10284 cam_status
10285@@ -7305,7 +7629,7 @@
10286 break;
10287
10288 cmd->cmd_valid = 0;
10289- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
10290+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
10291 ahc->shared_data_dmamap,
10292 ahc_targetcmd_offset(ahc, ahc->tqinfifonext),
10293 sizeof(struct target_cmd),
10294@@ -7442,7 +7766,7 @@
10295 initiator, target, lun, ahc->pending_device);
10296 #endif
10297 ahc->pending_device = lstate;
10298- ahc_freeze_ccb((union ccb *)atio);
10299+ aic_freeze_ccb((union ccb *)atio);
10300 atio->ccb_h.flags |= CAM_DIS_DISCONNECT;
10301 }
10302 xpt_done((union ccb*)atio);
10303diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx.h linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx.h
10304--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx.h 2004-01-08 11:57:43.043998755 +0100
10305+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx.h 2003-12-22 22:46:59.000000000 +0100
10306@@ -37,7 +37,7 @@
10307 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
10308 * POSSIBILITY OF SUCH DAMAGES.
10309 *
10310- * $Id$
10311+ * $Id$
10312 *
10313 * $FreeBSD$
10314 */
10315@@ -243,7 +243,7 @@
10316 */
10317 AHC_AIC7850_FE = AHC_SPIOCAP|AHC_AUTOPAUSE|AHC_TARGETMODE|AHC_ULTRA,
10318 AHC_AIC7860_FE = AHC_AIC7850_FE,
10319- AHC_AIC7870_FE = AHC_TARGETMODE,
10320+ AHC_AIC7870_FE = AHC_TARGETMODE|AHC_AUTOPAUSE,
10321 AHC_AIC7880_FE = AHC_AIC7870_FE|AHC_ULTRA,
10322 /*
10323 * Although we have space for both the initiator and
10324@@ -366,7 +366,8 @@
10325 AHC_SCB_CONFIG_USED = 0x4000000, /* No SEEPROM but SCB2 had info. */
10326 AHC_NO_BIOS_INIT = 0x8000000, /* No BIOS left over settings. */
10327 AHC_DISABLE_PCI_PERR = 0x10000000,
10328- AHC_HAS_TERM_LOGIC = 0x20000000
10329+ AHC_HAS_TERM_LOGIC = 0x20000000,
10330+ AHC_SHUTDOWN_RECOVERY = 0x40000000 /* Terminate recovery thread. */
10331 } ahc_flag;
10332
10333 /************************* Hardware SCB Definition ***************************/
10334@@ -411,6 +412,7 @@
10335 uint8_t initiator_tag; /* Initiator's transaction tag */
10336 };
10337
10338+#define MAX_CDB_LEN 16
10339 struct hardware_scb {
10340 /*0*/ union {
10341 /*
10342@@ -530,7 +532,7 @@
10343 * The current state of this SCB.
10344 */
10345 typedef enum {
10346- SCB_FREE = 0x0000,
10347+ SCB_FLAG_NONE = 0x0000,
10348 SCB_OTHERTCL_TIMEOUT = 0x0002,/*
10349 * Another device was active
10350 * during the first timeout for
10351@@ -560,12 +562,16 @@
10352 * to report the error.
10353 */
10354 SCB_TARGET_SCB = 0x2000,
10355- SCB_SILENT = 0x4000 /*
10356+ SCB_SILENT = 0x4000,/*
10357 * Be quiet about transmission type
10358 * errors. They are expected and we
10359 * don't want to upset the user. This
10360 * flag is typically used during DV.
10361 */
10362+ SCB_TIMEDOUT = 0x8000 /*
10363+ * SCB has timed out and is on the
10364+ * timedout list.
10365+ */
10366 } scb_flag;
10367
10368 struct scb {
10369@@ -575,7 +581,8 @@
10370 TAILQ_ENTRY(scb) tqe;
10371 } links;
10372 LIST_ENTRY(scb) pending_links;
10373- ahc_io_ctx_t io_ctx;
10374+ LIST_ENTRY(scb) timedout_links;
10375+ aic_io_ctx_t io_ctx;
10376 struct ahc_softc *ahc_softc;
10377 scb_flag flags;
10378 #ifndef __linux__
10379@@ -929,6 +936,11 @@
10380 LIST_HEAD(, scb) pending_scbs;
10381
10382 /*
10383+ * SCBs whose timeout routine has been called.
10384+ */
10385+ LIST_HEAD(, scb) timedout_scbs;
10386+
10387+ /*
10388 * Counting lock for deferring the release of additional
10389 * untagged transactions from the untagged_queues. When
10390 * the lock is decremented to 0, all queues in the
10391@@ -958,7 +970,7 @@
10392 /*
10393 * Platform specific device information.
10394 */
10395- ahc_dev_softc_t dev_softc;
10396+ aic_dev_softc_t dev_softc;
10397
10398 /*
10399 * Bus specific device information.
10400@@ -1135,6 +1147,9 @@
10401 };
10402
10403 /****************************** PCI Structures ********************************/
10404+#define AHC_PCI_IOADDR PCIR_BAR(0) /* I/O Address */
10405+#define AHC_PCI_MEMADDR PCIR_BAR(1) /* Mem I/O Address */
10406+
10407 typedef int (ahc_device_setup_t)(struct ahc_softc *);
10408
10409 struct ahc_pci_identity {
10410@@ -1167,7 +1182,7 @@
10411 u_int tcl, u_int busyid);
10412
10413 /***************************** PCI Front End *********************************/
10414-struct ahc_pci_identity *ahc_find_pci_device(ahc_dev_softc_t);
10415+struct ahc_pci_identity *ahc_find_pci_device(aic_dev_softc_t);
10416 int ahc_pci_config(struct ahc_softc *,
10417 struct ahc_pci_identity *);
10418 int ahc_pci_test_register_access(struct ahc_softc *);
10419@@ -1231,7 +1246,7 @@
10420 role_t role, uint32_t status,
10421 ahc_search_action action);
10422 int ahc_search_untagged_queues(struct ahc_softc *ahc,
10423- ahc_io_ctx_t ctx,
10424+ aic_io_ctx_t ctx,
10425 int target, char channel,
10426 int lun, uint32_t status,
10427 ahc_search_action action);
10428@@ -1248,6 +1263,8 @@
10429 void ahc_restart(struct ahc_softc *ahc);
10430 void ahc_calc_residual(struct ahc_softc *ahc,
10431 struct scb *scb);
10432+void ahc_timeout(struct scb *scb);
10433+void ahc_recover_commands(struct ahc_softc *ahc);
10434 /*************************** Utility Functions ********************************/
10435 struct ahc_phase_table_entry*
10436 ahc_lookup_phase_entry(int phase);
10437diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_inline.h linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_inline.h
10438--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_inline.h 2004-01-08 11:57:43.033001028 +0100
10439+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_inline.h 2003-12-22 22:46:59.000000000 +0100
10440@@ -37,7 +37,7 @@
10441 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
10442 * POSSIBILITY OF SUCH DAMAGES.
10443 *
10444- * $Id$
10445+ * $Id$
10446 *
10447 * $FreeBSD$
10448 */
10449@@ -196,7 +196,7 @@
10450 static __inline void
10451 ahc_sync_scb(struct ahc_softc *ahc, struct scb *scb, int op)
10452 {
10453- ahc_dmamap_sync(ahc, ahc->scb_data->hscb_dmat,
10454+ aic_dmamap_sync(ahc, ahc->scb_data->hscb_dmat,
10455 ahc->scb_data->hscb_dmamap,
10456 /*offset*/(scb->hscb - ahc->hscbs) * sizeof(*scb->hscb),
10457 /*len*/sizeof(*scb->hscb), op);
10458@@ -208,7 +208,7 @@
10459 if (scb->sg_count == 0)
10460 return;
10461
10462- ahc_dmamap_sync(ahc, ahc->scb_data->sg_dmat, scb->sg_map->sg_dmamap,
10463+ aic_dmamap_sync(ahc, ahc->scb_data->sg_dmat, scb->sg_map->sg_dmamap,
10464 /*offset*/(scb->sg_list - scb->sg_map->sg_vaddr)
10465 * sizeof(struct ahc_dma_seg),
10466 /*len*/sizeof(struct ahc_dma_seg) * scb->sg_count, op);
10467@@ -272,7 +272,7 @@
10468 {
10469 uint32_t sgptr;
10470
10471- sgptr = ahc_le32toh(scb->hscb->sgptr);
10472+ sgptr = aic_le32toh(scb->hscb->sgptr);
10473 if ((sgptr & SG_RESID_VALID) != 0)
10474 ahc_calc_residual(ahc, scb);
10475 }
10476@@ -383,13 +383,13 @@
10477 hscb = scb->hscb;
10478 /* Clean up for the next user */
10479 ahc->scb_data->scbindex[hscb->tag] = NULL;
10480- scb->flags = SCB_FREE;
10481+ scb->flags = SCB_FLAG_NONE;
10482 hscb->control = 0;
10483
10484 SLIST_INSERT_HEAD(&ahc->scb_data->free_scbs, scb, links.sle);
10485
10486 /* Notify the OSM that a resource is now available. */
10487- ahc_platform_scb_free(ahc, scb);
10488+ aic_platform_scb_free(ahc, scb);
10489 }
10490
10491 static __inline struct scb *
10492@@ -427,7 +427,7 @@
10493 memcpy(q_hscb, scb->hscb, sizeof(*scb->hscb));
10494 if ((scb->flags & SCB_CDB32_PTR) != 0) {
10495 q_hscb->shared_data.cdb_ptr =
10496- ahc_htole32(ahc_hscb_busaddr(ahc, q_hscb->tag)
10497+ aic_htole32(ahc_hscb_busaddr(ahc, q_hscb->tag)
10498 + offsetof(struct hardware_scb, cdb32));
10499 }
10500 q_hscb->tag = saved_tag;
10501@@ -458,7 +458,7 @@
10502 * Setup data "oddness".
10503 */
10504 scb->hscb->lun &= LID;
10505- if (ahc_get_transfer_length(scb) & 0x1)
10506+ if (aic_get_transfer_length(scb) & 0x1)
10507 scb->hscb->lun |= SCB_XFERLEN_ODD;
10508
10509 /*
10510@@ -512,7 +512,7 @@
10511 static __inline void
10512 ahc_sync_qoutfifo(struct ahc_softc *ahc, int op)
10513 {
10514- ahc_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
10515+ aic_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
10516 /*offset*/0, /*len*/256, op);
10517 }
10518
10519@@ -521,7 +521,7 @@
10520 {
10521 #ifdef AHC_TARGET_MODE
10522 if ((ahc->flags & AHC_TARGETROLE) != 0) {
10523- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
10524+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
10525 ahc->shared_data_dmamap,
10526 ahc_targetcmd_offset(ahc, 0),
10527 sizeof(struct target_cmd) * AHC_TMODE_CMDS,
10528@@ -542,7 +542,7 @@
10529 u_int retval;
10530
10531 retval = 0;
10532- ahc_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
10533+ aic_dmamap_sync(ahc, ahc->shared_data_dmat, ahc->shared_data_dmamap,
10534 /*offset*/ahc->qoutfifonext, /*len*/1,
10535 BUS_DMASYNC_POSTREAD);
10536 if (ahc->qoutfifo[ahc->qoutfifonext] != SCB_LIST_NULL)
10537@@ -550,7 +550,7 @@
10538 #ifdef AHC_TARGET_MODE
10539 if ((ahc->flags & AHC_TARGETROLE) != 0
10540 && (ahc->flags & AHC_TQINFIFO_BLOCKED) == 0) {
10541- ahc_dmamap_sync(ahc, ahc->shared_data_dmat,
10542+ aic_dmamap_sync(ahc, ahc->shared_data_dmat,
10543 ahc->shared_data_dmamap,
10544 ahc_targetcmd_offset(ahc, ahc->tqinfifofnext),
10545 /*len*/sizeof(struct target_cmd),
10546@@ -593,7 +593,7 @@
10547 }
10548
10549 if ((intstat & INT_PEND) == 0) {
10550-#if AHC_PCI_CONFIG > 0
10551+#if AIC_PCI_CONFIG > 0
10552 if (ahc->unsolicited_ints > 500) {
10553 ahc->unsolicited_ints = 0;
10554 if ((ahc->chip & AHC_PCI) != 0
10555diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_osm.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_osm.c
10556--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_osm.c 2004-01-08 11:57:43.012005368 +0100
10557+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_osm.c 2003-12-22 22:46:59.000000000 +0100
10558@@ -1,7 +1,7 @@
10559 /*
10560 * Adaptec AIC7xxx device driver for Linux.
10561 *
10562- * $Id$
10563+ * $Id$
10564 *
10565 * Copyright (c) 1994 John Aycock
10566 * The University of Calgary Department of Computer Science.
10567@@ -139,7 +139,16 @@
10568 #endif
10569
10570 #include <linux/mm.h> /* For fetching system memory size */
10571-#include <linux/blk.h> /* For block_size() */
10572+
10573+/************************* Magic SysReq Support *******************************/
10574+static struct aic_sysrq_key_op ahc_sysrq_op =
10575+{
10576+ aic_sysrq_handler,
10577+ "aic7xxxstatedump",
10578+ "Dump aic7xxx controller information to Console"
10579+};
10580+
10581+static int ahc_sysrq_key;
10582
10583 /*
10584 * Lock protecting manipulation of the ahc softc list.
10585@@ -482,35 +491,32 @@
10586 #endif
10587
10588 static void ahc_linux_handle_scsi_status(struct ahc_softc *,
10589- struct ahc_linux_device *,
10590+ struct aic_linux_device *,
10591 struct scb *);
10592 static void ahc_linux_queue_cmd_complete(struct ahc_softc *ahc,
10593 Scsi_Cmnd *cmd);
10594 static void ahc_linux_filter_inquiry(struct ahc_softc*, struct ahc_devinfo*);
10595 static void ahc_linux_sem_timeout(u_long arg);
10596-static void ahc_linux_freeze_simq(struct ahc_softc *ahc);
10597-static void ahc_linux_release_simq(u_long arg);
10598 static void ahc_linux_dev_timed_unfreeze(u_long arg);
10599 static int ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag);
10600 static void ahc_linux_initialize_scsi_bus(struct ahc_softc *ahc);
10601 static void ahc_linux_size_nseg(void);
10602 static void ahc_linux_thread_run_complete_queue(struct ahc_softc *ahc);
10603 static void ahc_linux_start_dv(struct ahc_softc *ahc);
10604-static void ahc_linux_dv_timeout(struct scsi_cmnd *cmd);
10605 static int ahc_linux_dv_thread(void *data);
10606 static void ahc_linux_kill_dv_thread(struct ahc_softc *ahc);
10607 static void ahc_linux_dv_target(struct ahc_softc *ahc, u_int target);
10608 static void ahc_linux_dv_transition(struct ahc_softc *ahc,
10609 struct scsi_cmnd *cmd,
10610 struct ahc_devinfo *devinfo,
10611- struct ahc_linux_target *targ);
10612+ struct aic_linux_target *targ);
10613 static void ahc_linux_dv_fill_cmd(struct ahc_softc *ahc,
10614 struct scsi_cmnd *cmd,
10615 struct ahc_devinfo *devinfo);
10616 static void ahc_linux_dv_inq(struct ahc_softc *ahc,
10617 struct scsi_cmnd *cmd,
10618 struct ahc_devinfo *devinfo,
10619- struct ahc_linux_target *targ,
10620+ struct aic_linux_target *targ,
10621 u_int request_length);
10622 static void ahc_linux_dv_tur(struct ahc_softc *ahc,
10623 struct scsi_cmnd *cmd,
10624@@ -518,58 +524,48 @@
10625 static void ahc_linux_dv_rebd(struct ahc_softc *ahc,
10626 struct scsi_cmnd *cmd,
10627 struct ahc_devinfo *devinfo,
10628- struct ahc_linux_target *targ);
10629+ struct aic_linux_target *targ);
10630 static void ahc_linux_dv_web(struct ahc_softc *ahc,
10631 struct scsi_cmnd *cmd,
10632 struct ahc_devinfo *devinfo,
10633- struct ahc_linux_target *targ);
10634+ struct aic_linux_target *targ);
10635 static void ahc_linux_dv_reb(struct ahc_softc *ahc,
10636 struct scsi_cmnd *cmd,
10637 struct ahc_devinfo *devinfo,
10638- struct ahc_linux_target *targ);
10639+ struct aic_linux_target *targ);
10640 static void ahc_linux_dv_su(struct ahc_softc *ahc,
10641 struct scsi_cmnd *cmd,
10642 struct ahc_devinfo *devinfo,
10643- struct ahc_linux_target *targ);
10644+ struct aic_linux_target *targ);
10645 static int ahc_linux_fallback(struct ahc_softc *ahc,
10646 struct ahc_devinfo *devinfo);
10647-static void ahc_linux_dv_complete(Scsi_Cmnd *cmd);
10648-static void ahc_linux_generate_dv_pattern(struct ahc_linux_target *targ);
10649+static void ahc_linux_generate_dv_pattern(struct aic_linux_target *targ);
10650 static u_int ahc_linux_user_tagdepth(struct ahc_softc *ahc,
10651 struct ahc_devinfo *devinfo);
10652 static u_int ahc_linux_user_dv_setting(struct ahc_softc *ahc);
10653-static void ahc_linux_device_queue_depth(struct ahc_softc *ahc,
10654- struct ahc_linux_device *dev);
10655-static struct ahc_linux_target* ahc_linux_alloc_target(struct ahc_softc*,
10656+static void aic_linux_device_queue_depth(struct ahc_softc *ahc,
10657+ struct aic_linux_device *dev);
10658+static struct aic_linux_target* ahc_linux_alloc_target(struct ahc_softc*,
10659 u_int, u_int);
10660 static void ahc_linux_free_target(struct ahc_softc*,
10661- struct ahc_linux_target*);
10662-static struct ahc_linux_device* ahc_linux_alloc_device(struct ahc_softc*,
10663- struct ahc_linux_target*,
10664+ struct aic_linux_target*);
10665+static struct aic_linux_device* ahc_linux_alloc_device(struct ahc_softc*,
10666+ struct aic_linux_target*,
10667 u_int);
10668 static void ahc_linux_free_device(struct ahc_softc*,
10669- struct ahc_linux_device*);
10670-static void ahc_linux_run_device_queue(struct ahc_softc*,
10671- struct ahc_linux_device*);
10672+ struct aic_linux_device*);
10673 static void ahc_linux_setup_tag_info_global(char *p);
10674 static aic_option_callback_t ahc_linux_setup_tag_info;
10675 static aic_option_callback_t ahc_linux_setup_dv;
10676 static int aic7xxx_setup(char *s);
10677 static int ahc_linux_next_unit(void);
10678-static void ahc_runq_tasklet(unsigned long data);
10679-static struct ahc_cmd *ahc_linux_run_complete_queue(struct ahc_softc *ahc);
10680+static struct aic_cmd *ahc_linux_run_complete_queue(struct ahc_softc *ahc);
10681
10682 /********************************* Inlines ************************************/
10683-static __inline void ahc_schedule_runq(struct ahc_softc *ahc);
10684-static __inline struct ahc_linux_device*
10685+static __inline struct aic_linux_device*
10686 ahc_linux_get_device(struct ahc_softc *ahc, u_int channel,
10687 u_int target, u_int lun, int alloc);
10688 static __inline void ahc_schedule_completeq(struct ahc_softc *ahc);
10689-static __inline void ahc_linux_check_device_queue(struct ahc_softc *ahc,
10690- struct ahc_linux_device *dev);
10691-static __inline struct ahc_linux_device *
10692- ahc_linux_next_device_to_run(struct ahc_softc *ahc);
10693-static __inline void ahc_linux_run_device_queues(struct ahc_softc *ahc);
10694 static __inline void ahc_linux_unmap_scb(struct ahc_softc*, struct scb*);
10695
10696 static __inline int ahc_linux_map_seg(struct ahc_softc *ahc, struct scb *scb,
10697@@ -579,35 +575,19 @@
10698 static __inline void
10699 ahc_schedule_completeq(struct ahc_softc *ahc)
10700 {
10701- if ((ahc->platform_data->flags & AHC_RUN_CMPLT_Q_TIMER) == 0) {
10702- ahc->platform_data->flags |= AHC_RUN_CMPLT_Q_TIMER;
10703+ if ((ahc->platform_data->flags & AIC_RUN_CMPLT_Q_TIMER) == 0) {
10704+ ahc->platform_data->flags |= AIC_RUN_CMPLT_Q_TIMER;
10705 ahc->platform_data->completeq_timer.expires = jiffies;
10706 add_timer(&ahc->platform_data->completeq_timer);
10707 }
10708 }
10709
10710-/*
10711- * Must be called with our lock held.
10712- */
10713-static __inline void
10714-ahc_schedule_runq(struct ahc_softc *ahc)
10715-{
10716-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
10717- tasklet_schedule(&ahc->platform_data->runq_tasklet);
10718-#else
10719- /*
10720- * Tasklets are not available, so run inline.
10721- */
10722- ahc_runq_tasklet((unsigned long)ahc);
10723-#endif
10724-}
10725-
10726-static __inline struct ahc_linux_device*
10727+static __inline struct aic_linux_device*
10728 ahc_linux_get_device(struct ahc_softc *ahc, u_int channel, u_int target,
10729 u_int lun, int alloc)
10730 {
10731- struct ahc_linux_target *targ;
10732- struct ahc_linux_device *dev;
10733+ struct aic_linux_target *targ;
10734+ struct aic_linux_device *dev;
10735 u_int target_offset;
10736
10737 target_offset = target;
10738@@ -629,10 +609,10 @@
10739 }
10740
10741 #define AHC_LINUX_MAX_RETURNED_ERRORS 4
10742-static struct ahc_cmd *
10743+static struct aic_cmd *
10744 ahc_linux_run_complete_queue(struct ahc_softc *ahc)
10745 {
10746- struct ahc_cmd *acmd;
10747+ struct aic_cmd *acmd;
10748 u_long done_flags;
10749 int with_errors;
10750
10751@@ -657,7 +637,7 @@
10752 acmd, acmd_links.tqe);
10753 cmd = &acmd_scsi_cmd(acmd);
10754 cmd->host_scribble = NULL;
10755- if (ahc_cmd_get_transaction_status(cmd) != DID_OK
10756+ if (aic_cmd_get_transaction_status(cmd) != DID_OK
10757 || (cmd->result & 0xFF) != SCSI_STATUS_OK)
10758 with_errors++;
10759
10760@@ -666,47 +646,6 @@
10761 ahc_done_unlock(ahc, &done_flags);
10762 return (acmd);
10763 }
10764-
10765-static __inline void
10766-ahc_linux_check_device_queue(struct ahc_softc *ahc,
10767- struct ahc_linux_device *dev)
10768-{
10769- if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) != 0
10770- && dev->active == 0) {
10771- dev->flags &= ~AHC_DEV_FREEZE_TIL_EMPTY;
10772- dev->qfrozen--;
10773- }
10774-
10775- if (TAILQ_FIRST(&dev->busyq) == NULL
10776- || dev->openings == 0 || dev->qfrozen != 0)
10777- return;
10778-
10779- ahc_linux_run_device_queue(ahc, dev);
10780-}
10781-
10782-static __inline struct ahc_linux_device *
10783-ahc_linux_next_device_to_run(struct ahc_softc *ahc)
10784-{
10785-
10786- if ((ahc->flags & AHC_RESOURCE_SHORTAGE) != 0
10787- || (ahc->platform_data->qfrozen != 0
10788- && AHC_DV_SIMQ_FROZEN(ahc) == 0))
10789- return (NULL);
10790- return (TAILQ_FIRST(&ahc->platform_data->device_runq));
10791-}
10792-
10793-static __inline void
10794-ahc_linux_run_device_queues(struct ahc_softc *ahc)
10795-{
10796- struct ahc_linux_device *dev;
10797-
10798- while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
10799- TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
10800- dev->flags &= ~AHC_DEV_ON_RUN_LIST;
10801- ahc_linux_check_device_queue(ahc, dev);
10802- }
10803-}
10804-
10805 static __inline void
10806 ahc_linux_unmap_scb(struct ahc_softc *ahc, struct scb *scb)
10807 {
10808@@ -718,10 +657,10 @@
10809 struct scatterlist *sg;
10810
10811 sg = (struct scatterlist *)cmd->request_buffer;
10812- pci_unmap_sg(ahc->dev_softc, sg, cmd->use_sg,
10813+ aic_unmap_sg(ahc, sg, cmd->use_sg,
10814 scsi_to_pci_dma_dir(cmd->sc_data_direction));
10815 } else if (cmd->request_bufflen != 0) {
10816- pci_unmap_single(ahc->dev_softc,
10817+ aic_unmap_single(ahc,
10818 scb->platform_data->buf_busaddr,
10819 cmd->request_bufflen,
10820 scsi_to_pci_dma_dir(cmd->sc_data_direction));
10821@@ -739,14 +678,14 @@
10822 "Increase AHC_NSEG\n");
10823
10824 consumed = 1;
10825- sg->addr = ahc_htole32(addr & 0xFFFFFFFF);
10826+ sg->addr = aic_htole32(addr & 0xFFFFFFFF);
10827 scb->platform_data->xfer_len += len;
10828
10829 if (sizeof(bus_addr_t) > 4
10830 && (ahc->flags & AHC_39BIT_ADDRESSING) != 0)
10831 len |= (addr >> 8) & AHC_SG_HIGH_ADDR_MASK;
10832
10833- sg->len = ahc_htole32(len);
10834+ sg->len = aic_htole32(len);
10835 return (consumed);
10836 }
10837
10838@@ -836,6 +775,164 @@
10839 #endif
10840 }
10841
10842+/************************** Error Recovery ************************************/
10843+static int ahc_linux_recovery_thread(void *arg);
10844+
10845+static int
10846+ahc_linux_recovery_thread(void *arg)
10847+{
10848+ struct ahc_softc *ahc;
10849+ u_long s;
10850+
10851+ ahc = (struct ahc_softc *)arg;
10852+
10853+ /*
10854+ * Complete thread creation.
10855+ */
10856+ lock_kernel();
10857+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,60)
10858+ /*
10859+ * Don't care about any signals.
10860+ */
10861+ siginitsetinv(&current->blocked, 0);
10862+
10863+ daemonize();
10864+ sprintf(current->comm, "ahc_recovery_%d", ahc->unit);
10865+#else
10866+ daemonize("ahc_recovery_%d", ahc->unit);
10867+#endif
10868+ unlock_kernel();
10869+
10870+ while (1) {
10871+
10872+ /*
10873+ * Use down_interruptible() rather than down() to
10874+ * avoid inclusion in the load average.
10875+ */
10876+ down_interruptible(&ahc->platform_data->recovery_sem);
10877+
10878+ ahc_lock(ahc, &s);
10879+ if ((ahc->flags & AHC_SHUTDOWN_RECOVERY) != 0) {
10880+ ahc_unlock(ahc, &s);
10881+ break;
10882+ }
10883+
10884+ /*
10885+ * Don't bother the recovery handler if the
10886+ * list has been cleared by a previous run
10887+ * of the handler. This can happen when
10888+ * several SCBs timeout before our handler
10889+ * can run causing our semaphore to be up'ed
10890+ * repeatedly. The extra calls need to be
10891+ * avoided so that the recovery handler doesn't
10892+ * confuse this case with timeouts occuring
10893+ * due to interrupts failing to function.
10894+ */
10895+ if (LIST_EMPTY(&ahc->timedout_scbs) != 0) {
10896+ ahc_unlock(ahc, &s);
10897+ continue;
10898+ }
10899+ ahc_unlock(ahc, &s);
10900+ ahc_recover_commands(ahc);
10901+
10902+ /*
10903+ * Process any pent up completions.
10904+ */
10905+ ahc_lock(ahc, &s);
10906+ aic_schedule_runq(ahc);
10907+ ahc_linux_run_complete_queue(ahc);
10908+ ahc_unlock(ahc, &s);
10909+ }
10910+ up(&ahc->platform_data->recovery_ending_sem);
10911+ return(0);
10912+}
10913+
10914+int
10915+ahc_spawn_recovery_thread(struct ahc_softc *ahc)
10916+{
10917+ ahc->platform_data->recovery_pid =
10918+ kernel_thread(ahc_linux_recovery_thread, ahc, 0);
10919+
10920+ if (ahc->platform_data->recovery_pid < 0)
10921+ return (-ahc->platform_data->recovery_pid);
10922+
10923+ return (0);
10924+}
10925+
10926+void
10927+ahc_terminate_recovery_thread(struct ahc_softc *ahc)
10928+{
10929+ u_long s;
10930+
10931+ ahc_lock(ahc, &s);
10932+ if (ahc->platform_data->recovery_pid != 0) {
10933+ ahc->flags |= AHC_SHUTDOWN_RECOVERY;
10934+ ahc_unlock(ahc, &s);
10935+ up(&ahc->platform_data->recovery_sem);
10936+
10937+ /*
10938+ * Use the recovery_ending_sem as an indicator that
10939+ * the dv thread is exiting. Note that the dv
10940+ * thread must still return after performing
10941+ * the up on our semaphore before it has
10942+ * completely exited this module. Unfortunately,
10943+ * there seems to be no easy way to wait for the
10944+ * exit of a thread for which you are not the
10945+ * parent (dv threads are parented by init).
10946+ * Cross your fingers...
10947+ */
10948+ down(&ahc->platform_data->recovery_ending_sem);
10949+
10950+ /*
10951+ * Mark the recovery thread as already dead. This
10952+ * avoids attempting to kill it a second time.
10953+ * This is necessary because we must kill the
10954+ * our threads before calling ahc_free() in the
10955+ * module shutdown case to avoid bogus locking
10956+ * in the SCSI mid-layer, but when ahc_free() is
10957+ * called without killing the DV thread in the
10958+ * instance detach case, so ahc_platform_free()
10959+ * calls us again to verify that the DV thread
10960+ * is dead.
10961+ */
10962+ ahc->platform_data->recovery_pid = 0;
10963+ } else {
10964+ ahc_unlock(ahc, &s);
10965+ }
10966+}
10967+
10968+void
10969+ahc_set_recoveryscb(struct ahc_softc *ahc, struct scb *scb)
10970+{
10971+ if ((scb->flags & SCB_RECOVERY_SCB) == 0) {
10972+ struct scb *list_scb;
10973+
10974+ scb->flags |= SCB_RECOVERY_SCB;
10975+
10976+ /*
10977+ * Take all queued, but not sent SCBs out of the equation.
10978+ * Also ensure that no new commands are queued to us while we
10979+ * try to fix this problem.
10980+ */
10981+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) == 0) {
10982+ aic_freeze_simq(ahc);
10983+ scb->platform_data->flags |= AIC_RELEASE_SIMQ;
10984+ }
10985+
10986+ /*
10987+ * Go through all of our pending SCBs and remove
10988+ * any scheduled timeouts for them. We will reschedule
10989+ * them after we've successfully fixed this problem.
10990+ */
10991+ LIST_FOREACH(list_scb, &ahc->pending_scbs, pending_links) {
10992+
10993+ scsi_delete_timer(list_scb->io_ctx);
10994+ list_scb->platform_data->flags &= ~AIC_TIMEOUT_ACTIVE;
10995+ }
10996+ }
10997+}
10998+
10999+/************************ Linux Entry Points **********************************/
11000 /*
11001 * Try to detect an Adaptec 7XXX controller.
11002 */
11003@@ -858,7 +955,7 @@
11004 * that some of our hacks^H^H^H^H^Hassumptions aren't
11005 * violated.
11006 */
11007- if (offsetof(struct ahc_cmd_internal, end)
11008+ if (offsetof(struct aic_cmd_internal, end)
11009 > offsetof(struct scsi_cmnd, host_scribble)) {
11010 printf("ahc_linux_detect: SCSI data structures changed.\n");
11011 printf("ahc_linux_detect: Unable to attach\n");
11012@@ -927,7 +1024,6 @@
11013 struct ahc_softc *ahc;
11014 u_long l;
11015
11016- ahc_list_lock(&l);
11017 if (host != NULL) {
11018
11019 /*
11020@@ -935,17 +1031,20 @@
11021 * the free directly, but check our
11022 * list for extra sanity.
11023 */
11024+ ahc_list_lock(&l);
11025 ahc = ahc_find_softc(*(struct ahc_softc **)host->hostdata);
11026 if (ahc != NULL) {
11027 u_long s;
11028
11029+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
11030+ ahc_list_unlock(&l);
11031 ahc_lock(ahc, &s);
11032 ahc_intr_enable(ahc, FALSE);
11033 ahc_unlock(ahc, &s);
11034 ahc_free(ahc);
11035- }
11036+ } else
11037+ ahc_list_unlock(&l);
11038 }
11039- ahc_list_unlock(&l);
11040 return (0);
11041 }
11042 #endif
11043@@ -985,7 +1084,7 @@
11044 ahc_linux_queue(Scsi_Cmnd * cmd, void (*scsi_done) (Scsi_Cmnd *))
11045 {
11046 struct ahc_softc *ahc;
11047- struct ahc_linux_device *dev;
11048+ struct aic_linux_device *dev;
11049 u_long flags;
11050
11051 ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
11052@@ -1004,9 +1103,9 @@
11053 * perform DV.
11054 */
11055 if (ahc->platform_data->qfrozen != 0
11056- && AHC_DV_CMD(cmd) == 0) {
11057+ && AIC_DV_CMD(cmd) == 0) {
11058
11059- ahc_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
11060+ aic_cmd_set_transaction_status(cmd, CAM_REQUEUE_REQ);
11061 ahc_linux_queue_cmd_complete(ahc, cmd);
11062 ahc_schedule_completeq(ahc);
11063 ahc_midlayer_entrypoint_unlock(ahc, &flags);
11064@@ -1015,7 +1114,8 @@
11065 dev = ahc_linux_get_device(ahc, cmd->device->channel, cmd->device->id,
11066 cmd->device->lun, /*alloc*/TRUE);
11067 if (dev == NULL) {
11068- ahc_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
11069+
11070+ aic_cmd_set_transaction_status(cmd, CAM_RESRC_UNAVAIL);
11071 ahc_linux_queue_cmd_complete(ahc, cmd);
11072 ahc_schedule_completeq(ahc);
11073 ahc_midlayer_entrypoint_unlock(ahc, &flags);
11074@@ -1023,12 +1123,30 @@
11075 ahc_name(ahc));
11076 return (0);
11077 }
11078+
11079+ if (cmd->cmd_len > MAX_CDB_LEN) {
11080+
11081+ aic_cmd_set_transaction_status(cmd, CAM_REQ_INVALID);
11082+ ahc_linux_queue_cmd_complete(ahc, cmd);
11083+ ahc_schedule_completeq(ahc);
11084+ ahc_midlayer_entrypoint_unlock(ahc, &flags);
11085+ printf("%s: aic7xxx_linux_queue -"
11086+ "CDB length of %d exceeds max!\n",
11087+ ahc_name(ahc), cmd->cmd_len);
11088+ return (0);
11089+ }
11090+
11091+ /*
11092+ * We perform our own timeout handling.
11093+ */
11094+ scsi_delete_timer(cmd);
11095+
11096 cmd->result = CAM_REQ_INPROG << 16;
11097- TAILQ_INSERT_TAIL(&dev->busyq, (struct ahc_cmd *)cmd, acmd_links.tqe);
11098- if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
11099+ TAILQ_INSERT_TAIL(&dev->busyq, (struct aic_cmd *)cmd, acmd_links.tqe);
11100+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
11101 TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
11102- dev->flags |= AHC_DEV_ON_RUN_LIST;
11103- ahc_linux_run_device_queues(ahc);
11104+ dev->flags |= AIC_DEV_ON_RUN_LIST;
11105+ aic_linux_run_device_queues(ahc);
11106 }
11107 ahc_midlayer_entrypoint_unlock(ahc, &flags);
11108 return (0);
11109@@ -1050,7 +1168,7 @@
11110 ahc_linux_slave_configure(Scsi_Device *device)
11111 {
11112 struct ahc_softc *ahc;
11113- struct ahc_linux_device *dev;
11114+ struct aic_linux_device *dev;
11115 u_long flags;
11116
11117 ahc = *((struct ahc_softc **)device->host->hostdata);
11118@@ -1066,9 +1184,9 @@
11119 device->id, device->lun,
11120 /*alloc*/TRUE);
11121 if (dev != NULL) {
11122- dev->flags &= ~AHC_DEV_UNCONFIGURED;
11123+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
11124 dev->scsi_device = device;
11125- ahc_linux_device_queue_depth(ahc, dev);
11126+ aic_linux_device_queue_depth(ahc, dev);
11127 }
11128 ahc_midlayer_entrypoint_unlock(ahc, &flags);
11129 return (0);
11130@@ -1078,7 +1196,7 @@
11131 ahc_linux_slave_destroy(Scsi_Device *device)
11132 {
11133 struct ahc_softc *ahc;
11134- struct ahc_linux_device *dev;
11135+ struct aic_linux_device *dev;
11136 u_long flags;
11137
11138 ahc = *((struct ahc_softc **)device->host->hostdata);
11139@@ -1096,11 +1214,10 @@
11140 * the refcounting process.
11141 */
11142 if (dev != NULL
11143- && (dev->flags & AHC_DEV_SLAVE_CONFIGURED) != 0) {
11144- dev->flags |= AHC_DEV_UNCONFIGURED;
11145+ && (dev->flags & AIC_DEV_SLAVE_CONFIGURED) != 0) {
11146+ dev->flags |= AIC_DEV_UNCONFIGURED;
11147 if (TAILQ_EMPTY(&dev->busyq)
11148- && dev->active == 0
11149- && (dev->flags & AHC_DEV_TIMER_ACTIVE) == 0)
11150+ && dev->active == 0)
11151 ahc_linux_free_device(ahc, dev);
11152 }
11153 ahc_midlayer_entrypoint_unlock(ahc, &flags);
11154@@ -1139,7 +1256,7 @@
11155 continue;
11156
11157 if (device->host == host) {
11158- struct ahc_linux_device *dev;
11159+ struct aic_linux_device *dev;
11160
11161 /*
11162 * Since Linux has attached to the device, configure
11163@@ -1150,13 +1267,13 @@
11164 device->id, device->lun,
11165 /*alloc*/TRUE);
11166 if (dev != NULL) {
11167- dev->flags &= ~AHC_DEV_UNCONFIGURED;
11168+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
11169 dev->scsi_device = device;
11170- ahc_linux_device_queue_depth(ahc, dev);
11171+ aic_linux_device_queue_depth(ahc, dev);
11172 device->queue_depth = dev->openings
11173 + dev->active;
11174- if ((dev->flags & (AHC_DEV_Q_BASIC
11175- | AHC_DEV_Q_TAGGED)) == 0) {
11176+ if ((dev->flags & (AIC_DEV_Q_BASIC
11177+ | AIC_DEV_Q_TAGGED)) == 0) {
11178 /*
11179 * We allow the OS to queue 2 untagged
11180 * transactions to us at any time even
11181@@ -1294,87 +1411,8 @@
11182 return SUCCESS;
11183 }
11184
11185-Scsi_Host_Template aic7xxx_driver_template = {
11186- .module = THIS_MODULE,
11187- .name = "aic7xxx",
11188- .proc_info = ahc_linux_proc_info,
11189- .info = ahc_linux_info,
11190- .queuecommand = ahc_linux_queue,
11191- .eh_abort_handler = ahc_linux_abort,
11192- .eh_device_reset_handler = ahc_linux_dev_reset,
11193- .eh_bus_reset_handler = ahc_linux_bus_reset,
11194-#if defined(__i386__)
11195- .bios_param = ahc_linux_biosparam,
11196-#endif
11197- .can_queue = AHC_MAX_QUEUE,
11198- .this_id = -1,
11199- .cmd_per_lun = 2,
11200- .use_clustering = ENABLE_CLUSTERING,
11201-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
11202- /*
11203- * We can only map 16MB per-SG
11204- * so create a sector limit of
11205- * "16MB" in 2K sectors.
11206- */
11207- .max_sectors = 8192,
11208-#endif
11209-#if defined CONFIG_HIGHIO || LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11210-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
11211-/* Assume RedHat Distribution with its different HIGHIO conventions. */
11212- .can_dma_32 = 1,
11213- .single_sg_okay = 1,
11214-#else
11215- .highmem_io = 1,
11216-#endif
11217-#endif
11218-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11219- .slave_alloc = ahc_linux_slave_alloc,
11220- .slave_configure = ahc_linux_slave_configure,
11221- .slave_destroy = ahc_linux_slave_destroy,
11222-#else
11223- .detect = ahc_linux_detect,
11224- .release = ahc_linux_release,
11225- .select_queue_depths = ahc_linux_select_queue_depth,
11226- .use_new_eh_code = 1,
11227-#endif
11228-};
11229-
11230-/**************************** Tasklet Handler *********************************/
11231-
11232-/*
11233- * In 2.4.X and above, this routine is called from a tasklet,
11234- * so we must re-acquire our lock prior to executing this code.
11235- * In all prior kernels, ahc_schedule_runq() calls this routine
11236- * directly and ahc_schedule_runq() is called with our lock held.
11237- */
11238-static void
11239-ahc_runq_tasklet(unsigned long data)
11240-{
11241- struct ahc_softc* ahc;
11242- struct ahc_linux_device *dev;
11243-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
11244- u_long flags;
11245-#endif
11246-
11247- ahc = (struct ahc_softc *)data;
11248-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
11249- ahc_lock(ahc, &flags);
11250-#endif
11251- while ((dev = ahc_linux_next_device_to_run(ahc)) != NULL) {
11252-
11253- TAILQ_REMOVE(&ahc->platform_data->device_runq, dev, links);
11254- dev->flags &= ~AHC_DEV_ON_RUN_LIST;
11255- ahc_linux_check_device_queue(ahc, dev);
11256-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
11257- /* Yeild to our interrupt handler */
11258- ahc_unlock(ahc, &flags);
11259- ahc_lock(ahc, &flags);
11260-#endif
11261- }
11262-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
11263- ahc_unlock(ahc, &flags);
11264-#endif
11265-}
11266+Scsi_Host_Template aic7xxx_driver_template =
11267+ AIC_TEMPLATE_INITIALIZER("aic7xxx", /* max_sectors*/8192);
11268
11269 /******************************** Macros **************************************/
11270 #define BUILD_SCSIID(ahc, cmd) \
11271@@ -1382,132 +1420,6 @@
11272 | (((cmd)->device->channel == 0) ? (ahc)->our_id : (ahc)->our_id_b) \
11273 | (((cmd)->device->channel == 0) ? 0 : TWIN_CHNLB))
11274
11275-/******************************** Bus DMA *************************************/
11276-int
11277-ahc_dma_tag_create(struct ahc_softc *ahc, bus_dma_tag_t parent,
11278- bus_size_t alignment, bus_size_t boundary,
11279- bus_addr_t lowaddr, bus_addr_t highaddr,
11280- bus_dma_filter_t *filter, void *filterarg,
11281- bus_size_t maxsize, int nsegments,
11282- bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
11283-{
11284- bus_dma_tag_t dmat;
11285-
11286- dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
11287- if (dmat == NULL)
11288- return (ENOMEM);
11289-
11290- /*
11291- * Linux is very simplistic about DMA memory. For now don't
11292- * maintain all specification information. Once Linux supplies
11293- * better facilities for doing these operations, or the
11294- * needs of this particular driver change, we might need to do
11295- * more here.
11296- */
11297- dmat->alignment = alignment;
11298- dmat->boundary = boundary;
11299- dmat->maxsize = maxsize;
11300- *ret_tag = dmat;
11301- return (0);
11302-}
11303-
11304-void
11305-ahc_dma_tag_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat)
11306-{
11307- free(dmat, M_DEVBUF);
11308-}
11309-
11310-int
11311-ahc_dmamem_alloc(struct ahc_softc *ahc, bus_dma_tag_t dmat, void** vaddr,
11312- int flags, bus_dmamap_t *mapp)
11313-{
11314- bus_dmamap_t map;
11315-
11316-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
11317- map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
11318- if (map == NULL)
11319- return (ENOMEM);
11320- /*
11321- * Although we can dma data above 4GB, our
11322- * "consistent" memory is below 4GB for
11323- * space efficiency reasons (only need a 4byte
11324- * address). For this reason, we have to reset
11325- * our dma mask when doing allocations.
11326- */
11327- if (ahc->dev_softc != NULL)
11328- ahc_pci_set_dma_mask(ahc->dev_softc, 0xFFFFFFFF);
11329- *vaddr = pci_alloc_consistent(ahc->dev_softc,
11330- dmat->maxsize, &map->bus_addr);
11331- if (ahc->dev_softc != NULL)
11332- ahc_pci_set_dma_mask(ahc->dev_softc,
11333- ahc->platform_data->hw_dma_mask);
11334-#else /* LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0) */
11335- /*
11336- * At least in 2.2.14, malloc is a slab allocator so all
11337- * allocations are aligned. We assume for these kernel versions
11338- * that all allocations will be bellow 4Gig, physically contiguous,
11339- * and accessible via DMA by the controller.
11340- */
11341- map = NULL; /* No additional information to store */
11342- *vaddr = malloc(dmat->maxsize, M_DEVBUF, M_NOWAIT);
11343-#endif
11344- if (*vaddr == NULL)
11345- return (ENOMEM);
11346- *mapp = map;
11347- return(0);
11348-}
11349-
11350-void
11351-ahc_dmamem_free(struct ahc_softc *ahc, bus_dma_tag_t dmat,
11352- void* vaddr, bus_dmamap_t map)
11353-{
11354-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
11355- pci_free_consistent(ahc->dev_softc, dmat->maxsize,
11356- vaddr, map->bus_addr);
11357-#else
11358- free(vaddr, M_DEVBUF);
11359-#endif
11360-}
11361-
11362-int
11363-ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map,
11364- void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
11365- void *cb_arg, int flags)
11366-{
11367- /*
11368- * Assume for now that this will only be used during
11369- * initialization and not for per-transaction buffer mapping.
11370- */
11371- bus_dma_segment_t stack_sg;
11372-
11373-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
11374- stack_sg.ds_addr = map->bus_addr;
11375-#else
11376-#define VIRT_TO_BUS(a) (uint32_t)virt_to_bus((void *)(a))
11377- stack_sg.ds_addr = VIRT_TO_BUS(buf);
11378-#endif
11379- stack_sg.ds_len = dmat->maxsize;
11380- cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
11381- return (0);
11382-}
11383-
11384-void
11385-ahc_dmamap_destroy(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
11386-{
11387- /*
11388- * The map may is NULL in our < 2.3.X implementation.
11389- */
11390- if (map != NULL)
11391- free(map, M_DEVBUF);
11392-}
11393-
11394-int
11395-ahc_dmamap_unload(struct ahc_softc *ahc, bus_dma_tag_t dmat, bus_dmamap_t map)
11396-{
11397- /* Nothing to do */
11398- return (0);
11399-}
11400-
11401 /********************* Platform Dependent Functions ***************************/
11402 /*
11403 * Compare "left hand" softc with "right hand" softc, returning:
11404@@ -1558,19 +1470,19 @@
11405 char primary_channel;
11406
11407 if (aic7xxx_reverse_scan != 0)
11408- value = ahc_get_pci_bus(lahc->dev_softc)
11409- - ahc_get_pci_bus(rahc->dev_softc);
11410+ value = aic_get_pci_bus(lahc->dev_softc)
11411+ - aic_get_pci_bus(rahc->dev_softc);
11412 else
11413- value = ahc_get_pci_bus(rahc->dev_softc)
11414- - ahc_get_pci_bus(lahc->dev_softc);
11415+ value = aic_get_pci_bus(rahc->dev_softc)
11416+ - aic_get_pci_bus(lahc->dev_softc);
11417 if (value != 0)
11418 break;
11419 if (aic7xxx_reverse_scan != 0)
11420- value = ahc_get_pci_slot(lahc->dev_softc)
11421- - ahc_get_pci_slot(rahc->dev_softc);
11422+ value = aic_get_pci_slot(lahc->dev_softc)
11423+ - aic_get_pci_slot(rahc->dev_softc);
11424 else
11425- value = ahc_get_pci_slot(rahc->dev_softc)
11426- - ahc_get_pci_slot(lahc->dev_softc);
11427+ value = aic_get_pci_slot(rahc->dev_softc)
11428+ - aic_get_pci_slot(lahc->dev_softc);
11429 if (value != 0)
11430 break;
11431 /*
11432@@ -1730,9 +1642,16 @@
11433 char *new_name;
11434 u_long s;
11435 u_int targ_offset;
11436+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11437+ int error;
11438+#endif
11439
11440 template->name = ahc->description;
11441+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11442+ host = scsi_host_alloc(template, sizeof(struct ahc_softc *));
11443+#else
11444 host = scsi_register(template, sizeof(struct ahc_softc *));
11445+#endif
11446 if (host == NULL)
11447 return (ENOMEM);
11448
11449@@ -1741,8 +1660,12 @@
11450 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11451 scsi_assign_lock(host, &ahc->platform_data->spin_lock);
11452 #elif AHC_SCSI_HAS_HOST_LOCK != 0
11453+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21)
11454+ host->host_lock = &ahc->platform_data->spin_lock;
11455+#else
11456 host->lock = &ahc->platform_data->spin_lock;
11457 #endif
11458+#endif
11459 ahc->platform_data->host = host;
11460 host->can_queue = AHC_MAX_QUEUE;
11461 host->cmd_per_lun = 2;
11462@@ -1767,13 +1690,20 @@
11463 #endif
11464 ahc_linux_initialize_scsi_bus(ahc);
11465 ahc_unlock(ahc, &s);
11466+ ahc_sysrq_key = aic_install_sysrq(&ahc_sysrq_op);
11467+ ahc_spawn_recovery_thread(ahc);
11468+ if (ahc->platform_data->recovery_pid < 0) {
11469+ printf("%s: Failed to create recovery thread, error= %d\n",
11470+ ahc_name(ahc), ahc->platform_data->recovery_pid);
11471+ return (-ahc->platform_data->recovery_pid);
11472+ }
11473 ahc->platform_data->dv_pid = kernel_thread(ahc_linux_dv_thread, ahc, 0);
11474- ahc_lock(ahc, &s);
11475 if (ahc->platform_data->dv_pid < 0) {
11476 printf("%s: Failed to create DV thread, error= %d\n",
11477 ahc_name(ahc), ahc->platform_data->dv_pid);
11478 return (-ahc->platform_data->dv_pid);
11479 }
11480+ ahc_lock(ahc, &s);
11481 /*
11482 * Initially allocate *all* of our linux target objects
11483 * so that the DV thread will scan them all in parallel
11484@@ -1818,7 +1748,10 @@
11485 ahc_unlock(ahc, &s);
11486
11487 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11488- scsi_add_host(host, (ahc->dev_softc ? &ahc->dev_softc->dev : NULL));
11489+ error = scsi_add_host(host, ahc->dev_softc);
11490+ if (error != 0)
11491+ return (-error);
11492+ scsi_scan_host(host);
11493 #endif
11494 return (0);
11495 }
11496@@ -1915,17 +1848,6 @@
11497 ahc_update_neg_request(ahc, &devinfo, tstate,
11498 tinfo, AHC_NEG_ALWAYS);
11499 }
11500- /* Give the bus some time to recover */
11501- if ((ahc->flags & (AHC_RESET_BUS_A|AHC_RESET_BUS_B)) != 0) {
11502- ahc_linux_freeze_simq(ahc);
11503- init_timer(&ahc->platform_data->reset_timer);
11504- ahc->platform_data->reset_timer.data = (u_long)ahc;
11505- ahc->platform_data->reset_timer.expires =
11506- jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
11507- ahc->platform_data->reset_timer.function =
11508- ahc_linux_release_simq;
11509- add_timer(&ahc->platform_data->reset_timer);
11510- }
11511 }
11512
11513 int
11514@@ -1939,27 +1861,32 @@
11515 memset(ahc->platform_data, 0, sizeof(struct ahc_platform_data));
11516 TAILQ_INIT(&ahc->platform_data->completeq);
11517 TAILQ_INIT(&ahc->platform_data->device_runq);
11518- ahc->platform_data->irq = AHC_LINUX_NOIRQ;
11519+ ahc->platform_data->irq = AIC_LINUX_NOIRQ;
11520 ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
11521 ahc_lockinit(ahc);
11522 ahc_done_lockinit(ahc);
11523+ init_timer(&ahc->platform_data->bus_settle_timer);
11524+ ahc->platform_data->bus_settle_timer.data = (u_long)ahc;
11525+ ahc->platform_data->bus_settle_timer.function =
11526+ (aic_linux_callback_t *)aic_bus_settle_complete;
11527 init_timer(&ahc->platform_data->completeq_timer);
11528 ahc->platform_data->completeq_timer.data = (u_long)ahc;
11529 ahc->platform_data->completeq_timer.function =
11530- (ahc_linux_callback_t *)ahc_linux_thread_run_complete_queue;
11531+ (aic_linux_callback_t *)ahc_linux_thread_run_complete_queue;
11532 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
11533 init_MUTEX_LOCKED(&ahc->platform_data->eh_sem);
11534 init_MUTEX_LOCKED(&ahc->platform_data->dv_sem);
11535 init_MUTEX_LOCKED(&ahc->platform_data->dv_cmd_sem);
11536+ init_MUTEX_LOCKED(&ahc->platform_data->recovery_sem);
11537+ init_MUTEX_LOCKED(&ahc->platform_data->recovery_ending_sem);
11538 #else
11539 ahc->platform_data->eh_sem = MUTEX_LOCKED;
11540 ahc->platform_data->dv_sem = MUTEX_LOCKED;
11541 ahc->platform_data->dv_cmd_sem = MUTEX_LOCKED;
11542+ ahc->platform_data->recovery_sem = MUTEX_LOCKED;
11543+ ahc->platform_data->recovery_ending_sem = MUTEX_LOCKED;
11544 #endif
11545-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
11546- tasklet_init(&ahc->platform_data->runq_tasklet, ahc_runq_tasklet,
11547- (unsigned long)ahc);
11548-#endif
11549+ aic_setup_tasklets(ahc);
11550 ahc->seltime = (aic7xxx_seltime & 0x3) << 4;
11551 ahc->seltime_b = (aic7xxx_seltime & 0x3) << 4;
11552 if (aic7xxx_pci_parity == 0)
11553@@ -1971,21 +1898,22 @@
11554 void
11555 ahc_platform_free(struct ahc_softc *ahc)
11556 {
11557- struct ahc_linux_target *targ;
11558- struct ahc_linux_device *dev;
11559+ struct aic_linux_target *targ;
11560+ struct aic_linux_device *dev;
11561 int i, j;
11562
11563+ aic_remove_sysrq(ahc_sysrq_key, &ahc_sysrq_op);
11564 if (ahc->platform_data != NULL) {
11565 del_timer_sync(&ahc->platform_data->completeq_timer);
11566 ahc_linux_kill_dv_thread(ahc);
11567-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
11568- tasklet_kill(&ahc->platform_data->runq_tasklet);
11569-#endif
11570+ aic_teardown_tasklets(ahc);
11571 if (ahc->platform_data->host != NULL) {
11572 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11573 scsi_remove_host(ahc->platform_data->host);
11574-#endif
11575+ scsi_host_put(ahc->platform_data->host);
11576+#else
11577 scsi_unregister(ahc->platform_data->host);
11578+#endif
11579 }
11580
11581 /* destroy all of the device and target objects */
11582@@ -1999,6 +1927,7 @@
11583 if (targ->devices[j] == NULL)
11584 continue;
11585 dev = targ->devices[j];
11586+ del_timer_sync(&dev->timer);
11587 ahc_linux_free_device(ahc, dev);
11588 }
11589 /*
11590@@ -2009,7 +1938,7 @@
11591 }
11592 }
11593
11594- if (ahc->platform_data->irq != AHC_LINUX_NOIRQ)
11595+ if (ahc->platform_data->irq != AIC_LINUX_NOIRQ)
11596 free_irq(ahc->platform_data->irq, ahc);
11597 if (ahc->tag == BUS_SPACE_PIO
11598 && ahc->bsh.ioport != 0)
11599@@ -2054,7 +1983,7 @@
11600 ahc_platform_set_tags(struct ahc_softc *ahc, struct ahc_devinfo *devinfo,
11601 ahc_queue_alg alg)
11602 {
11603- struct ahc_linux_device *dev;
11604+ struct aic_linux_device *dev;
11605 int was_queuing;
11606 int now_queuing;
11607
11608@@ -2063,27 +1992,27 @@
11609 devinfo->lun, /*alloc*/FALSE);
11610 if (dev == NULL)
11611 return;
11612- was_queuing = dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED);
11613+ was_queuing = dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED);
11614 switch (alg) {
11615 default:
11616 case AHC_QUEUE_NONE:
11617 now_queuing = 0;
11618 break;
11619 case AHC_QUEUE_BASIC:
11620- now_queuing = AHC_DEV_Q_BASIC;
11621+ now_queuing = AIC_DEV_Q_BASIC;
11622 break;
11623 case AHC_QUEUE_TAGGED:
11624- now_queuing = AHC_DEV_Q_TAGGED;
11625+ now_queuing = AIC_DEV_Q_TAGGED;
11626 break;
11627 }
11628- if ((dev->flags & AHC_DEV_FREEZE_TIL_EMPTY) == 0
11629+ if ((dev->flags & AIC_DEV_FREEZE_TIL_EMPTY) == 0
11630 && (was_queuing != now_queuing)
11631 && (dev->active != 0)) {
11632- dev->flags |= AHC_DEV_FREEZE_TIL_EMPTY;
11633+ dev->flags |= AIC_DEV_FREEZE_TIL_EMPTY;
11634 dev->qfrozen++;
11635 }
11636
11637- dev->flags &= ~(AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED|AHC_DEV_PERIODIC_OTAG);
11638+ dev->flags &= ~(AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED|AIC_DEV_PERIODIC_OTAG);
11639 if (now_queuing) {
11640 u_int usertags;
11641
11642@@ -2103,11 +2032,11 @@
11643 */
11644 dev->openings = 1;
11645 } else if (alg == AHC_QUEUE_TAGGED) {
11646- dev->flags |= AHC_DEV_Q_TAGGED;
11647+ dev->flags |= AIC_DEV_Q_TAGGED;
11648 if (aic7xxx_periodic_otag != 0)
11649- dev->flags |= AHC_DEV_PERIODIC_OTAG;
11650+ dev->flags |= AIC_DEV_PERIODIC_OTAG;
11651 } else
11652- dev->flags |= AHC_DEV_Q_BASIC;
11653+ dev->flags |= AIC_DEV_Q_BASIC;
11654 } else {
11655 /* We can only have one opening. */
11656 dev->maxtags = 0;
11657@@ -2115,13 +2044,13 @@
11658 }
11659 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
11660 if (dev->scsi_device != NULL) {
11661- switch ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED))) {
11662- case AHC_DEV_Q_BASIC:
11663+ switch ((dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED))) {
11664+ case AIC_DEV_Q_BASIC:
11665 scsi_adjust_queue_depth(dev->scsi_device,
11666 MSG_SIMPLE_TASK,
11667 dev->openings + dev->active);
11668 break;
11669- case AHC_DEV_Q_TAGGED:
11670+ case AIC_DEV_Q_TAGGED:
11671 scsi_adjust_queue_depth(dev->scsi_device,
11672 MSG_ORDERED_TASK,
11673 dev->openings + dev->active);
11674@@ -2185,9 +2114,9 @@
11675 for (; targ < maxtarg; targ++) {
11676
11677 for (; clun < maxlun; clun++) {
11678- struct ahc_linux_device *dev;
11679- struct ahc_busyq *busyq;
11680- struct ahc_cmd *acmd;
11681+ struct aic_linux_device *dev;
11682+ struct aic_busyq *busyq;
11683+ struct aic_cmd *acmd;
11684
11685 dev = ahc_linux_get_device(ahc, chan,
11686 targ, clun,
11687@@ -2204,6 +2133,20 @@
11688 acmd_links.tqe);
11689 count++;
11690 cmd->result = status << 16;
11691+ /*
11692+ * The completion handler believes that
11693+ * commands without active timers
11694+ * running have lost the race of
11695+ * completing before their timer
11696+ * expires. Since commands in our
11697+ * busy queues do not have timers
11698+ * running, appease the mid-layer by
11699+ * adding a timer now. This timer will
11700+ * be immediately canceled by the
11701+ * midlayer.
11702+ */
11703+ scsi_add_timer(cmd, 60*HZ,
11704+ aic_linux_midlayer_timeout);
11705 ahc_linux_queue_cmd_complete(ahc, cmd);
11706 }
11707 }
11708@@ -2220,7 +2163,7 @@
11709
11710 ahc_lock(ahc, &flags);
11711 del_timer(&ahc->platform_data->completeq_timer);
11712- ahc->platform_data->flags &= ~AHC_RUN_CMPLT_Q_TIMER;
11713+ ahc->platform_data->flags &= ~AIC_RUN_CMPLT_Q_TIMER;
11714 ahc_linux_run_complete_queue(ahc);
11715 ahc_unlock(ahc, &flags);
11716 }
11717@@ -2233,14 +2176,23 @@
11718 * Freeze the simq and signal ahc_linux_queue to not let any
11719 * more commands through.
11720 */
11721- if ((ahc->platform_data->flags & AHC_DV_ACTIVE) == 0) {
11722+ if ((ahc->platform_data->flags & AIC_DV_ACTIVE) == 0) {
11723 #ifdef AHC_DEBUG
11724 if (ahc_debug & AHC_SHOW_DV)
11725 printf("%s: Waking DV thread\n", ahc_name(ahc));
11726 #endif
11727
11728- ahc->platform_data->flags |= AHC_DV_ACTIVE;
11729- ahc_linux_freeze_simq(ahc);
11730+ ahc->platform_data->flags |= AIC_DV_ACTIVE;
11731+
11732+ /*
11733+ * Prevent upper layer from sending any
11734+ * commands to us.
11735+ */
11736+ aic_freeze_simq(ahc);
11737+ scsi_block_requests(ahc->platform_data->host);
11738+ ahc_platform_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS,
11739+ CAM_LUN_WILDCARD, SCB_LIST_NULL,
11740+ ROLE_INITIATOR, CAM_REQUEUE_REQ);
11741
11742 /* Wake up the DV kthread */
11743 up(&ahc->platform_data->dv_sem);
11744@@ -2254,7 +2206,7 @@
11745
11746 ahc_lock(ahc, &s);
11747 if (ahc->platform_data->dv_pid != 0) {
11748- ahc->platform_data->flags |= AHC_DV_SHUTDOWN;
11749+ ahc->platform_data->flags |= AIC_DV_SHUTDOWN;
11750 ahc_unlock(ahc, &s);
11751 up(&ahc->platform_data->dv_sem);
11752
11753@@ -2329,7 +2281,7 @@
11754
11755 /* Check to see if we've been signaled to exit */
11756 ahc_lock(ahc, &s);
11757- if ((ahc->platform_data->flags & AHC_DV_SHUTDOWN) != 0) {
11758+ if ((ahc->platform_data->flags & AIC_DV_SHUTDOWN) != 0) {
11759 ahc_unlock(ahc, &s);
11760 break;
11761 }
11762@@ -2346,7 +2298,7 @@
11763 */
11764 ahc_lock(ahc, &s);
11765 while (LIST_FIRST(&ahc->pending_scbs) != NULL) {
11766- ahc->platform_data->flags |= AHC_DV_WAIT_SIMQ_EMPTY;
11767+ ahc->platform_data->flags |= AIC_DV_WAIT_SIMQ_EMPTY;
11768 ahc_unlock(ahc, &s);
11769 down_interruptible(&ahc->platform_data->dv_sem);
11770 ahc_lock(ahc, &s);
11771@@ -2356,8 +2308,8 @@
11772 * Wait for the SIMQ to be released so that DV is the
11773 * only reason the queue is frozen.
11774 */
11775- while (AHC_DV_SIMQ_FROZEN(ahc) == 0) {
11776- ahc->platform_data->flags |= AHC_DV_WAIT_SIMQ_RELEASE;
11777+ while (AIC_DV_SIMQ_FROZEN(ahc) == 0) {
11778+ ahc->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
11779 ahc_unlock(ahc, &s);
11780 down_interruptible(&ahc->platform_data->dv_sem);
11781 ahc_lock(ahc, &s);
11782@@ -2368,14 +2320,16 @@
11783 ahc_linux_dv_target(ahc, target);
11784
11785 ahc_lock(ahc, &s);
11786- ahc->platform_data->flags &= ~AHC_DV_ACTIVE;
11787- ahc_unlock(ahc, &s);
11788+ ahc->platform_data->flags &= ~AIC_DV_ACTIVE;
11789
11790 /*
11791 * Release the SIMQ so that normal commands are
11792 * allowed to continue on the bus.
11793 */
11794- ahc_linux_release_simq((u_long)ahc);
11795+ aic_release_simq_locked(ahc);
11796+ ahc_unlock(ahc, &s);
11797+
11798+ scsi_unblock_requests(ahc->platform_data->host);
11799 }
11800 up(&ahc->platform_data->eh_sem);
11801 return (0);
11802@@ -2389,10 +2343,10 @@
11803 ahc_set_dv_state(ahc, targ, newstate, __LINE__)
11804
11805 static __inline void
11806-ahc_set_dv_state(struct ahc_softc *ahc, struct ahc_linux_target *targ,
11807- ahc_dv_state newstate, u_int line)
11808+ahc_set_dv_state(struct ahc_softc *ahc, struct aic_linux_target *targ,
11809+ aic_dv_state newstate, u_int line)
11810 {
11811- ahc_dv_state oldstate;
11812+ aic_dv_state oldstate;
11813
11814 oldstate = targ->dv_state;
11815 #ifdef AHC_DEBUG
11816@@ -2412,7 +2366,7 @@
11817 ahc_linux_dv_target(struct ahc_softc *ahc, u_int target_offset)
11818 {
11819 struct ahc_devinfo devinfo;
11820- struct ahc_linux_target *targ;
11821+ struct aic_linux_target *targ;
11822 struct scsi_cmnd *cmd;
11823 struct scsi_device *scsi_dev;
11824 struct scsi_sense_data *sense;
11825@@ -2426,7 +2380,7 @@
11826 echo_size = 0;
11827 ahc_lock(ahc, &s);
11828 targ = ahc->platform_data->targets[target_offset];
11829- if (targ == NULL || (targ->flags & AHC_DV_REQUIRED) == 0) {
11830+ if (targ == NULL || (targ->flags & AIC_DV_REQUIRED) == 0) {
11831 ahc_unlock(ahc, &s);
11832 return;
11833 }
11834@@ -2451,14 +2405,14 @@
11835 scsi_dev->channel = devinfo.channel - 'A';
11836 ahc->platform_data->dv_scsi_dev = scsi_dev;
11837
11838- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_INQ_SHORT_ASYNC);
11839+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_INQ_SHORT_ASYNC);
11840
11841- while (targ->dv_state != AHC_DV_STATE_EXIT) {
11842+ while (targ->dv_state != AIC_DV_STATE_EXIT) {
11843 timeout = AHC_LINUX_DV_TIMEOUT;
11844 switch (targ->dv_state) {
11845- case AHC_DV_STATE_INQ_SHORT_ASYNC:
11846- case AHC_DV_STATE_INQ_ASYNC:
11847- case AHC_DV_STATE_INQ_ASYNC_VERIFY:
11848+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
11849+ case AIC_DV_STATE_INQ_ASYNC:
11850+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
11851 /*
11852 * Set things to async narrow to reduce the
11853 * chance that the INQ will fail.
11854@@ -2470,36 +2424,36 @@
11855 AHC_TRANS_GOAL, /*paused*/FALSE);
11856 ahc_unlock(ahc, &s);
11857 timeout = 10 * HZ;
11858- targ->flags &= ~AHC_INQ_VALID;
11859+ targ->flags &= ~AIC_INQ_VALID;
11860 /* FALLTHROUGH */
11861- case AHC_DV_STATE_INQ_VERIFY:
11862+ case AIC_DV_STATE_INQ_VERIFY:
11863 {
11864 u_int inq_len;
11865
11866- if (targ->dv_state == AHC_DV_STATE_INQ_SHORT_ASYNC)
11867+ if (targ->dv_state == AIC_DV_STATE_INQ_SHORT_ASYNC)
11868 inq_len = AHC_LINUX_DV_INQ_SHORT_LEN;
11869 else
11870 inq_len = targ->inq_data->additional_length + 5;
11871 ahc_linux_dv_inq(ahc, cmd, &devinfo, targ, inq_len);
11872 break;
11873 }
11874- case AHC_DV_STATE_TUR:
11875- case AHC_DV_STATE_BUSY:
11876+ case AIC_DV_STATE_TUR:
11877+ case AIC_DV_STATE_BUSY:
11878 timeout = 5 * HZ;
11879 ahc_linux_dv_tur(ahc, cmd, &devinfo);
11880 break;
11881- case AHC_DV_STATE_REBD:
11882+ case AIC_DV_STATE_REBD:
11883 ahc_linux_dv_rebd(ahc, cmd, &devinfo, targ);
11884 break;
11885- case AHC_DV_STATE_WEB:
11886+ case AIC_DV_STATE_WEB:
11887 ahc_linux_dv_web(ahc, cmd, &devinfo, targ);
11888 break;
11889
11890- case AHC_DV_STATE_REB:
11891+ case AIC_DV_STATE_REB:
11892 ahc_linux_dv_reb(ahc, cmd, &devinfo, targ);
11893 break;
11894
11895- case AHC_DV_STATE_SU:
11896+ case AIC_DV_STATE_SU:
11897 ahc_linux_dv_su(ahc, cmd, &devinfo, targ);
11898 timeout = 50 * HZ;
11899 break;
11900@@ -2511,8 +2465,6 @@
11901 }
11902
11903 /* Queue the command and wait for it to complete */
11904- /* Abuse eh_timeout in the scsi_cmnd struct for our purposes */
11905- init_timer(&cmd->eh_timeout);
11906 #ifdef AHC_DEBUG
11907 if ((ahc_debug & AHC_SHOW_MESSAGES) != 0)
11908 /*
11909@@ -2522,7 +2474,9 @@
11910 */
11911 timeout += HZ;
11912 #endif
11913- scsi_add_timer(cmd, timeout, ahc_linux_dv_timeout);
11914+ init_timer(&cmd->eh_timeout);
11915+ cmd->timeout_per_command = timeout;
11916+
11917 /*
11918 * In 2.5.X, it is assumed that all calls from the
11919 * "midlayer" (which we are emulating) will have the
11920@@ -2546,8 +2500,8 @@
11921 * only reason the queue is frozen.
11922 */
11923 ahc_lock(ahc, &s);
11924- while (AHC_DV_SIMQ_FROZEN(ahc) == 0) {
11925- ahc->platform_data->flags |= AHC_DV_WAIT_SIMQ_RELEASE;
11926+ while (AIC_DV_SIMQ_FROZEN(ahc) == 0) {
11927+ ahc->platform_data->flags |= AIC_DV_WAIT_SIMQ_RELEASE;
11928 ahc_unlock(ahc, &s);
11929 down_interruptible(&ahc->platform_data->dv_sem);
11930 ahc_lock(ahc, &s);
11931@@ -2558,7 +2512,7 @@
11932 }
11933
11934 out:
11935- if ((targ->flags & AHC_INQ_VALID) != 0
11936+ if ((targ->flags & AIC_INQ_VALID) != 0
11937 && ahc_linux_get_device(ahc, devinfo.channel - 'A',
11938 devinfo.target, devinfo.lun,
11939 /*alloc*/FALSE) == NULL) {
11940@@ -2569,7 +2523,7 @@
11941 * parameters found in the inquiry string.
11942 */
11943 ahc_linux_filter_inquiry(ahc, &devinfo);
11944- if ((targ->flags & (AHC_BASIC_DV|AHC_ENHANCED_DV)) != 0) {
11945+ if ((targ->flags & (AIC_BASIC_DV|AIC_ENHANCED_DV)) != 0) {
11946 ahc_print_devinfo(ahc, &devinfo);
11947 printf("DV failed to configure device. "
11948 "Please file a bug report against "
11949@@ -2594,7 +2548,7 @@
11950 free(targ->dv_buffer1, M_DEVBUF);
11951 targ->dv_buffer1 = NULL;
11952 }
11953- targ->flags &= ~AHC_DV_REQUIRED;
11954+ targ->flags &= ~AIC_DV_REQUIRED;
11955 if (targ->refcount == 0)
11956 ahc_linux_free_target(ahc, targ);
11957 ahc_unlock(ahc, &s);
11958@@ -2603,13 +2557,13 @@
11959 static void
11960 ahc_linux_dv_transition(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
11961 struct ahc_devinfo *devinfo,
11962- struct ahc_linux_target *targ)
11963+ struct aic_linux_target *targ)
11964 {
11965 u_int32_t status;
11966
11967 status = aic_error_action(cmd, targ->inq_data,
11968- ahc_cmd_get_transaction_status(cmd),
11969- ahc_cmd_get_scsi_status(cmd));
11970+ aic_cmd_get_transaction_status(cmd),
11971+ aic_cmd_get_scsi_status(cmd));
11972
11973 #ifdef AHC_DEBUG
11974 if (ahc_debug & AHC_SHOW_DV) {
11975@@ -2621,8 +2575,8 @@
11976 #endif
11977
11978 switch (targ->dv_state) {
11979- case AHC_DV_STATE_INQ_SHORT_ASYNC:
11980- case AHC_DV_STATE_INQ_ASYNC:
11981+ case AIC_DV_STATE_INQ_SHORT_ASYNC:
11982+ case AIC_DV_STATE_INQ_ASYNC:
11983 switch (status & SS_MASK) {
11984 case SS_NOP:
11985 {
11986@@ -2631,21 +2585,21 @@
11987 }
11988 case SS_INQ_REFRESH:
11989 AHC_SET_DV_STATE(ahc, targ,
11990- AHC_DV_STATE_INQ_SHORT_ASYNC);
11991+ AIC_DV_STATE_INQ_SHORT_ASYNC);
11992 break;
11993 case SS_TUR:
11994 case SS_RETRY:
11995 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
11996- if (ahc_cmd_get_transaction_status(cmd)
11997+ if (aic_cmd_get_transaction_status(cmd)
11998 == CAM_REQUEUE_REQ)
11999 targ->dv_state_retry--;
12000 if ((status & SS_ERRMASK) == EBUSY)
12001- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
12002+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
12003 if (targ->dv_state_retry < 10)
12004 break;
12005 /* FALLTHROUGH */
12006 default:
12007- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12008+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12009 #ifdef AHC_DEBUG
12010 if (ahc_debug & AHC_SHOW_DV) {
12011 ahc_print_devinfo(ahc, devinfo);
12012@@ -2655,7 +2609,7 @@
12013 break;
12014 }
12015 break;
12016- case AHC_DV_STATE_INQ_ASYNC_VERIFY:
12017+ case AIC_DV_STATE_INQ_ASYNC_VERIFY:
12018 switch (status & SS_MASK) {
12019 case SS_NOP:
12020 {
12021@@ -2669,12 +2623,12 @@
12022 * Try from the top again.
12023 */
12024 AHC_SET_DV_STATE(ahc, targ,
12025- AHC_DV_STATE_INQ_SHORT_ASYNC);
12026+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12027 break;
12028 }
12029
12030 AHC_SET_DV_STATE(ahc, targ, targ->dv_state+1);
12031- targ->flags |= AHC_INQ_VALID;
12032+ targ->flags |= AIC_INQ_VALID;
12033 if (ahc_linux_user_dv_setting(ahc) == 0)
12034 break;
12035
12036@@ -2687,33 +2641,33 @@
12037 default:
12038 case SID_SPI_CLOCK_ST:
12039 /* Assume only basic DV is supported. */
12040- targ->flags |= AHC_BASIC_DV;
12041+ targ->flags |= AIC_BASIC_DV;
12042 break;
12043 case SID_SPI_CLOCK_DT:
12044 case SID_SPI_CLOCK_DT_ST:
12045- targ->flags |= AHC_ENHANCED_DV;
12046+ targ->flags |= AIC_ENHANCED_DV;
12047 break;
12048 }
12049 break;
12050 }
12051 case SS_INQ_REFRESH:
12052 AHC_SET_DV_STATE(ahc, targ,
12053- AHC_DV_STATE_INQ_SHORT_ASYNC);
12054+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12055 break;
12056 case SS_TUR:
12057 case SS_RETRY:
12058 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12059- if (ahc_cmd_get_transaction_status(cmd)
12060+ if (aic_cmd_get_transaction_status(cmd)
12061 == CAM_REQUEUE_REQ)
12062 targ->dv_state_retry--;
12063
12064 if ((status & SS_ERRMASK) == EBUSY)
12065- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
12066+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
12067 if (targ->dv_state_retry < 10)
12068 break;
12069 /* FALLTHROUGH */
12070 default:
12071- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12072+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12073 #ifdef AHC_DEBUG
12074 if (ahc_debug & AHC_SHOW_DV) {
12075 ahc_print_devinfo(ahc, devinfo);
12076@@ -2723,14 +2677,14 @@
12077 break;
12078 }
12079 break;
12080- case AHC_DV_STATE_INQ_VERIFY:
12081+ case AIC_DV_STATE_INQ_VERIFY:
12082 switch (status & SS_MASK) {
12083 case SS_NOP:
12084 {
12085
12086 if (memcmp(targ->inq_data, targ->dv_buffer,
12087 AHC_LINUX_DV_INQ_LEN) == 0) {
12088- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12089+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12090 break;
12091 }
12092 #ifdef AHC_DEBUG
12093@@ -2751,7 +2705,7 @@
12094 #endif
12095
12096 if (ahc_linux_fallback(ahc, devinfo) != 0) {
12097- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12098+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12099 break;
12100 }
12101 /*
12102@@ -2764,18 +2718,18 @@
12103 }
12104 case SS_INQ_REFRESH:
12105 AHC_SET_DV_STATE(ahc, targ,
12106- AHC_DV_STATE_INQ_SHORT_ASYNC);
12107+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12108 break;
12109 case SS_TUR:
12110 case SS_RETRY:
12111 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12112- if (ahc_cmd_get_transaction_status(cmd)
12113+ if (aic_cmd_get_transaction_status(cmd)
12114 == CAM_REQUEUE_REQ) {
12115 targ->dv_state_retry--;
12116 } else if ((status & SSQ_FALLBACK) != 0) {
12117 if (ahc_linux_fallback(ahc, devinfo) != 0) {
12118 AHC_SET_DV_STATE(ahc, targ,
12119- AHC_DV_STATE_EXIT);
12120+ AIC_DV_STATE_EXIT);
12121 break;
12122 }
12123 /*
12124@@ -2784,12 +2738,12 @@
12125 */
12126 targ->dv_state_retry = 0;
12127 } else if ((status & SS_ERRMASK) == EBUSY)
12128- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
12129+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
12130 if (targ->dv_state_retry < 10)
12131 break;
12132 /* FALLTHROUGH */
12133 default:
12134- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12135+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12136 #ifdef AHC_DEBUG
12137 if (ahc_debug & AHC_SHOW_DV) {
12138 ahc_print_devinfo(ahc, devinfo);
12139@@ -2800,33 +2754,33 @@
12140 }
12141 break;
12142
12143- case AHC_DV_STATE_TUR:
12144+ case AIC_DV_STATE_TUR:
12145 switch (status & SS_MASK) {
12146 case SS_NOP:
12147- if ((targ->flags & AHC_BASIC_DV) != 0) {
12148+ if ((targ->flags & AIC_BASIC_DV) != 0) {
12149 ahc_linux_filter_inquiry(ahc, devinfo);
12150 AHC_SET_DV_STATE(ahc, targ,
12151- AHC_DV_STATE_INQ_VERIFY);
12152- } else if ((targ->flags & AHC_ENHANCED_DV) != 0) {
12153- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_REBD);
12154+ AIC_DV_STATE_INQ_VERIFY);
12155+ } else if ((targ->flags & AIC_ENHANCED_DV) != 0) {
12156+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_REBD);
12157 } else {
12158- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12159+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12160 }
12161 break;
12162 case SS_RETRY:
12163 case SS_TUR:
12164 if ((status & SS_ERRMASK) == EBUSY) {
12165- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_BUSY);
12166+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_BUSY);
12167 break;
12168 }
12169 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12170- if (ahc_cmd_get_transaction_status(cmd)
12171+ if (aic_cmd_get_transaction_status(cmd)
12172 == CAM_REQUEUE_REQ) {
12173 targ->dv_state_retry--;
12174 } else if ((status & SSQ_FALLBACK) != 0) {
12175 if (ahc_linux_fallback(ahc, devinfo) != 0) {
12176 AHC_SET_DV_STATE(ahc, targ,
12177- AHC_DV_STATE_EXIT);
12178+ AIC_DV_STATE_EXIT);
12179 break;
12180 }
12181 /*
12182@@ -2842,7 +2796,7 @@
12183 printf("DV TUR reties exhausted\n");
12184 }
12185 #endif
12186- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12187+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12188 break;
12189 }
12190 if (status & SSQ_DELAY)
12191@@ -2850,25 +2804,25 @@
12192
12193 break;
12194 case SS_START:
12195- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_SU);
12196+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_SU);
12197 break;
12198 case SS_INQ_REFRESH:
12199 AHC_SET_DV_STATE(ahc, targ,
12200- AHC_DV_STATE_INQ_SHORT_ASYNC);
12201+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12202 break;
12203 default:
12204- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12205+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12206 break;
12207 }
12208 break;
12209
12210- case AHC_DV_STATE_REBD:
12211+ case AIC_DV_STATE_REBD:
12212 switch (status & SS_MASK) {
12213 case SS_NOP:
12214 {
12215 uint32_t echo_size;
12216
12217- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_WEB);
12218+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_WEB);
12219 echo_size = scsi_3btoul(&targ->dv_buffer[1]);
12220 echo_size &= 0x1FFF;
12221 #ifdef AHC_DEBUG
12222@@ -2878,7 +2832,17 @@
12223 }
12224 #endif
12225 if (echo_size == 0) {
12226- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12227+ /*
12228+ * Fall back to basic DV.
12229+ */
12230+ if (bootverbose) {
12231+ ahc_print_devinfo(ahc, devinfo);
12232+ printf("Echo Buffer unavailable. "
12233+ "Performing basic DV.\n");
12234+ }
12235+ targ->flags &= ~AIC_ENHANCED_DV;
12236+ targ->flags |= AIC_BASIC_DV;
12237+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_TUR);
12238 break;
12239 }
12240
12241@@ -2893,11 +2857,11 @@
12242 }
12243 case SS_INQ_REFRESH:
12244 AHC_SET_DV_STATE(ahc, targ,
12245- AHC_DV_STATE_INQ_SHORT_ASYNC);
12246+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12247 break;
12248 case SS_RETRY:
12249 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12250- if (ahc_cmd_get_transaction_status(cmd)
12251+ if (aic_cmd_get_transaction_status(cmd)
12252 == CAM_REQUEUE_REQ)
12253 targ->dv_state_retry--;
12254 if (targ->dv_state_retry <= 10)
12255@@ -2916,30 +2880,30 @@
12256 * and try level 1 DV.
12257 */
12258 ahc_linux_filter_inquiry(ahc, devinfo);
12259- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_INQ_VERIFY);
12260+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_INQ_VERIFY);
12261 targ->dv_echo_size = 0;
12262 break;
12263 }
12264 break;
12265
12266- case AHC_DV_STATE_WEB:
12267+ case AIC_DV_STATE_WEB:
12268 switch (status & SS_MASK) {
12269 case SS_NOP:
12270- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_REB);
12271+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_REB);
12272 break;
12273 case SS_INQ_REFRESH:
12274 AHC_SET_DV_STATE(ahc, targ,
12275- AHC_DV_STATE_INQ_SHORT_ASYNC);
12276+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12277 break;
12278 case SS_RETRY:
12279 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12280- if (ahc_cmd_get_transaction_status(cmd)
12281+ if (aic_cmd_get_transaction_status(cmd)
12282 == CAM_REQUEUE_REQ) {
12283 targ->dv_state_retry--;
12284 } else if ((status & SSQ_FALLBACK) != 0) {
12285 if (ahc_linux_fallback(ahc, devinfo) != 0) {
12286 AHC_SET_DV_STATE(ahc, targ,
12287- AHC_DV_STATE_EXIT);
12288+ AIC_DV_STATE_EXIT);
12289 break;
12290 }
12291 /*
12292@@ -2958,22 +2922,22 @@
12293 }
12294 #endif
12295 default:
12296- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12297+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12298 break;
12299 }
12300 break;
12301
12302- case AHC_DV_STATE_REB:
12303+ case AIC_DV_STATE_REB:
12304 switch (status & SS_MASK) {
12305 case SS_NOP:
12306 if (memcmp(targ->dv_buffer, targ->dv_buffer1,
12307 targ->dv_echo_size) != 0) {
12308 if (ahc_linux_fallback(ahc, devinfo) != 0)
12309 AHC_SET_DV_STATE(ahc, targ,
12310- AHC_DV_STATE_EXIT);
12311+ AIC_DV_STATE_EXIT);
12312 else
12313 AHC_SET_DV_STATE(ahc, targ,
12314- AHC_DV_STATE_WEB);
12315+ AIC_DV_STATE_WEB);
12316 break;
12317 }
12318
12319@@ -2985,24 +2949,24 @@
12320 free(targ->dv_buffer1, M_DEVBUF);
12321 targ->dv_buffer1 = NULL;
12322 }
12323- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12324+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12325 break;
12326 case SS_INQ_REFRESH:
12327 AHC_SET_DV_STATE(ahc, targ,
12328- AHC_DV_STATE_INQ_SHORT_ASYNC);
12329+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12330 break;
12331 case SS_RETRY:
12332 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12333- if (ahc_cmd_get_transaction_status(cmd)
12334+ if (aic_cmd_get_transaction_status(cmd)
12335 == CAM_REQUEUE_REQ) {
12336 targ->dv_state_retry--;
12337 } else if ((status & SSQ_FALLBACK) != 0) {
12338 if (ahc_linux_fallback(ahc, devinfo) != 0) {
12339 AHC_SET_DV_STATE(ahc, targ,
12340- AHC_DV_STATE_EXIT);
12341+ AIC_DV_STATE_EXIT);
12342 break;
12343 }
12344- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_WEB);
12345+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_WEB);
12346 }
12347 if (targ->dv_state_retry <= 10) {
12348 if ((status & (SSQ_DELAY_RANDOM|SSQ_DELAY))!= 0)
12349@@ -3017,35 +2981,35 @@
12350 #endif
12351 /* FALLTHROUGH */
12352 default:
12353- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12354+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12355 break;
12356 }
12357 break;
12358
12359- case AHC_DV_STATE_SU:
12360+ case AIC_DV_STATE_SU:
12361 switch (status & SS_MASK) {
12362 case SS_NOP:
12363 case SS_INQ_REFRESH:
12364 AHC_SET_DV_STATE(ahc, targ,
12365- AHC_DV_STATE_INQ_SHORT_ASYNC);
12366+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12367 break;
12368 default:
12369- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12370+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12371 break;
12372 }
12373 break;
12374
12375- case AHC_DV_STATE_BUSY:
12376+ case AIC_DV_STATE_BUSY:
12377 switch (status & SS_MASK) {
12378 case SS_NOP:
12379 case SS_INQ_REFRESH:
12380 AHC_SET_DV_STATE(ahc, targ,
12381- AHC_DV_STATE_INQ_SHORT_ASYNC);
12382+ AIC_DV_STATE_INQ_SHORT_ASYNC);
12383 break;
12384 case SS_TUR:
12385 case SS_RETRY:
12386 AHC_SET_DV_STATE(ahc, targ, targ->dv_state);
12387- if (ahc_cmd_get_transaction_status(cmd)
12388+ if (aic_cmd_get_transaction_status(cmd)
12389 == CAM_REQUEUE_REQ) {
12390 targ->dv_state_retry--;
12391 } else if (targ->dv_state_retry < 60) {
12392@@ -3058,11 +3022,11 @@
12393 printf("DV BUSY reties exhausted\n");
12394 }
12395 #endif
12396- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12397+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12398 }
12399 break;
12400 default:
12401- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12402+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12403 break;
12404 }
12405 break;
12406@@ -3070,7 +3034,7 @@
12407 default:
12408 printf("%s: Invalid DV completion state %d\n", ahc_name(ahc),
12409 targ->dv_state);
12410- AHC_SET_DV_STATE(ahc, targ, AHC_DV_STATE_EXIT);
12411+ AHC_SET_DV_STATE(ahc, targ, AIC_DV_STATE_EXIT);
12412 break;
12413 }
12414 }
12415@@ -3090,7 +3054,7 @@
12416 */
12417 static void
12418 ahc_linux_dv_inq(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
12419- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ,
12420+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ,
12421 u_int request_length)
12422 {
12423
12424@@ -3103,7 +3067,7 @@
12425 if (targ->inq_data == NULL)
12426 targ->inq_data = malloc(AHC_LINUX_DV_INQ_LEN,
12427 M_DEVBUF, M_WAITOK);
12428- if (targ->dv_state > AHC_DV_STATE_INQ_ASYNC) {
12429+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC) {
12430 if (targ->dv_buffer != NULL)
12431 free(targ->dv_buffer, M_DEVBUF);
12432 targ->dv_buffer = malloc(AHC_LINUX_DV_INQ_LEN,
12433@@ -3116,7 +3080,7 @@
12434 cmd->cmnd[0] = INQUIRY;
12435 cmd->cmnd[4] = request_length;
12436 cmd->request_bufflen = request_length;
12437- if (targ->dv_state > AHC_DV_STATE_INQ_ASYNC)
12438+ if (targ->dv_state > AIC_DV_STATE_INQ_ASYNC)
12439 cmd->request_buffer = targ->dv_buffer;
12440 else
12441 cmd->request_buffer = targ->inq_data;
12442@@ -3145,7 +3109,7 @@
12443
12444 static void
12445 ahc_linux_dv_rebd(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
12446- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ)
12447+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ)
12448 {
12449
12450 #ifdef AHC_DEBUG
12451@@ -3170,7 +3134,7 @@
12452
12453 static void
12454 ahc_linux_dv_web(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
12455- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ)
12456+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ)
12457 {
12458
12459 #ifdef AHC_DEBUG
12460@@ -3192,7 +3156,7 @@
12461
12462 static void
12463 ahc_linux_dv_reb(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
12464- struct ahc_devinfo *devinfo, struct ahc_linux_target *targ)
12465+ struct ahc_devinfo *devinfo, struct aic_linux_target *targ)
12466 {
12467
12468 #ifdef AHC_DEBUG
12469@@ -3215,7 +3179,7 @@
12470 static void
12471 ahc_linux_dv_su(struct ahc_softc *ahc, struct scsi_cmnd *cmd,
12472 struct ahc_devinfo *devinfo,
12473- struct ahc_linux_target *targ)
12474+ struct aic_linux_target *targ)
12475 {
12476 u_int le;
12477
12478@@ -3237,7 +3201,7 @@
12479 static int
12480 ahc_linux_fallback(struct ahc_softc *ahc, struct ahc_devinfo *devinfo)
12481 {
12482- struct ahc_linux_target *targ;
12483+ struct aic_linux_target *targ;
12484 struct ahc_initiator_tinfo *tinfo;
12485 struct ahc_transinfo *goal;
12486 struct ahc_tmode_tstate *tstate;
12487@@ -3416,7 +3380,7 @@
12488 return (0);
12489 }
12490
12491-static void
12492+void
12493 ahc_linux_dv_timeout(struct scsi_cmnd *cmd)
12494 {
12495 struct ahc_softc *ahc;
12496@@ -3450,29 +3414,19 @@
12497 * error code.
12498 */
12499 if ((scb->flags & SCB_SENSE) != 0)
12500- ahc_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
12501+ aic_set_transaction_status(scb, CAM_AUTOSENSE_FAIL);
12502 else
12503- ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
12504+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
12505 ahc_reset_channel(ahc, cmd->device->channel + 'A', /*initiate*/TRUE);
12506
12507- /*
12508- * Add a minimal bus settle delay for devices that are slow to
12509- * respond after bus resets.
12510- */
12511- ahc_linux_freeze_simq(ahc);
12512- init_timer(&ahc->platform_data->reset_timer);
12513- ahc->platform_data->reset_timer.data = (u_long)ahc;
12514- ahc->platform_data->reset_timer.expires = jiffies + HZ / 2;
12515- ahc->platform_data->reset_timer.function =
12516- (ahc_linux_callback_t *)ahc_linux_release_simq;
12517- add_timer(&ahc->platform_data->reset_timer);
12518- if (ahc_linux_next_device_to_run(ahc) != NULL)
12519- ahc_schedule_runq(ahc);
12520+ if (aic_linux_next_device_to_run(ahc) != NULL)
12521+ aic_schedule_runq(ahc);
12522+
12523 ahc_linux_run_complete_queue(ahc);
12524 ahc_unlock(ahc, &flags);
12525 }
12526
12527-static void
12528+void
12529 ahc_linux_dv_complete(struct scsi_cmnd *cmd)
12530 {
12531 struct ahc_softc *ahc;
12532@@ -3494,7 +3448,7 @@
12533 }
12534
12535 static void
12536-ahc_linux_generate_dv_pattern(struct ahc_linux_target *targ)
12537+ahc_linux_generate_dv_pattern(struct aic_linux_target *targ)
12538 {
12539 uint16_t b;
12540 u_int i;
12541@@ -3626,8 +3580,8 @@
12542 * Determines the queue depth for a given device.
12543 */
12544 static void
12545-ahc_linux_device_queue_depth(struct ahc_softc *ahc,
12546- struct ahc_linux_device *dev)
12547+aic_linux_device_queue_depth(struct ahc_softc *ahc,
12548+ struct aic_linux_device *dev)
12549 {
12550 struct ahc_devinfo devinfo;
12551 u_int tags;
12552@@ -3651,10 +3605,10 @@
12553 }
12554 }
12555
12556-static void
12557-ahc_linux_run_device_queue(struct ahc_softc *ahc, struct ahc_linux_device *dev)
12558+void
12559+ahc_linux_run_device_queue(struct ahc_softc *ahc, struct aic_linux_device *dev)
12560 {
12561- struct ahc_cmd *acmd;
12562+ struct aic_cmd *acmd;
12563 struct scsi_cmnd *cmd;
12564 struct scb *scb;
12565 struct hardware_scb *hscb;
12566@@ -3662,7 +3616,7 @@
12567 struct ahc_tmode_tstate *tstate;
12568 uint16_t mask;
12569
12570- if ((dev->flags & AHC_DEV_ON_RUN_LIST) != 0)
12571+ if ((dev->flags & AIC_DEV_ON_RUN_LIST) != 0)
12572 panic("running device on run list");
12573
12574 while ((acmd = TAILQ_FIRST(&dev->busyq)) != NULL
12575@@ -3673,10 +3627,10 @@
12576 * running is because the whole controller Q is frozen.
12577 */
12578 if (ahc->platform_data->qfrozen != 0
12579- && AHC_DV_SIMQ_FROZEN(ahc) == 0) {
12580+ && AIC_DV_SIMQ_FROZEN(ahc) == 0) {
12581 TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
12582 dev, links);
12583- dev->flags |= AHC_DEV_ON_RUN_LIST;
12584+ dev->flags |= AIC_DEV_ON_RUN_LIST;
12585 return;
12586 }
12587 /*
12588@@ -3685,7 +3639,7 @@
12589 if ((scb = ahc_get_scb(ahc)) == NULL) {
12590 TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq,
12591 dev, links);
12592- dev->flags |= AHC_DEV_ON_RUN_LIST;
12593+ dev->flags |= AIC_DEV_ON_RUN_LIST;
12594 ahc->flags |= AHC_RESOURCE_SHORTAGE;
12595 return;
12596 }
12597@@ -3693,6 +3647,7 @@
12598 cmd = &acmd_scsi_cmd(acmd);
12599 scb->io_ctx = cmd;
12600 scb->platform_data->dev = dev;
12601+ scb->platform_data->flags = 0;
12602 hscb = scb->hscb;
12603 cmd->host_scribble = (char *)scb;
12604
12605@@ -3714,7 +3669,7 @@
12606 if ((ahc->user_discenable & mask) != 0)
12607 hscb->control |= DISCENB;
12608
12609- if (AHC_DV_CMD(cmd) != 0)
12610+ if (AIC_DV_CMD(cmd) != 0)
12611 scb->flags |= SCB_SILENT;
12612
12613 if ((tstate->auto_negotiate & mask) != 0) {
12614@@ -3722,7 +3677,7 @@
12615 scb->hscb->control |= MK_MESSAGE;
12616 }
12617
12618- if ((dev->flags & (AHC_DEV_Q_TAGGED|AHC_DEV_Q_BASIC)) != 0) {
12619+ if ((dev->flags & (AIC_DEV_Q_TAGGED|AIC_DEV_Q_BASIC)) != 0) {
12620 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
12621 int msg_bytes;
12622 uint8_t tag_msgs[2];
12623@@ -3734,8 +3689,8 @@
12624 dev->commands_since_idle_or_otag = 0;
12625 } else
12626 #endif
12627- if (dev->commands_since_idle_or_otag == AHC_OTAG_THRESH
12628- && (dev->flags & AHC_DEV_Q_TAGGED) != 0) {
12629+ if (dev->commands_since_idle_or_otag == AIC_OTAG_THRESH
12630+ && (dev->flags & AIC_DEV_Q_TAGGED) != 0) {
12631 hscb->control |= MSG_ORDERED_TASK;
12632 dev->commands_since_idle_or_otag = 0;
12633 } else {
12634@@ -3752,8 +3707,8 @@
12635 }
12636
12637 scb->platform_data->xfer_len = 0;
12638- ahc_set_residual(scb, 0);
12639- ahc_set_sense_residual(scb, 0);
12640+ aic_set_residual(scb, 0);
12641+ aic_set_sense_residual(scb, 0);
12642 scb->sg_count = 0;
12643 if (cmd->use_sg != 0) {
12644 struct ahc_dma_seg *sg;
12645@@ -3762,7 +3717,7 @@
12646 int nseg;
12647
12648 cur_seg = (struct scatterlist *)cmd->request_buffer;
12649- nseg = pci_map_sg(ahc->dev_softc, cur_seg, cmd->use_sg,
12650+ nseg = aic_map_sg(ahc, cur_seg, cmd->use_sg,
12651 scsi_to_pci_dma_dir(cmd->sc_data_direction));
12652 end_seg = cur_seg + nseg;
12653 /* Copy the segments into the SG list. */
12654@@ -3785,13 +3740,13 @@
12655 cur_seg++;
12656 }
12657 sg--;
12658- sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
12659+ sg->len |= aic_htole32(AHC_DMA_LAST_SEG);
12660
12661 /*
12662 * Reset the sg list pointer.
12663 */
12664 scb->hscb->sgptr =
12665- ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
12666+ aic_htole32(scb->sg_list_phys | SG_FULL_RESID);
12667
12668 /*
12669 * Copy the first SG into the "current"
12670@@ -3804,7 +3759,7 @@
12671 bus_addr_t addr;
12672
12673 sg = scb->sg_list;
12674- addr = pci_map_single(ahc->dev_softc,
12675+ addr = aic_map_single(ahc,
12676 cmd->request_buffer,
12677 cmd->request_bufflen,
12678 scsi_to_pci_dma_dir(cmd->sc_data_direction));
12679@@ -3812,13 +3767,13 @@
12680 scb->sg_count = ahc_linux_map_seg(ahc, scb,
12681 sg, addr,
12682 cmd->request_bufflen);
12683- sg->len |= ahc_htole32(AHC_DMA_LAST_SEG);
12684+ sg->len |= aic_htole32(AHC_DMA_LAST_SEG);
12685
12686 /*
12687 * Reset the sg list pointer.
12688 */
12689 scb->hscb->sgptr =
12690- ahc_htole32(scb->sg_list_phys | SG_FULL_RESID);
12691+ aic_htole32(scb->sg_list_phys | SG_FULL_RESID);
12692
12693 /*
12694 * Copy the first SG into the "current"
12695@@ -3827,7 +3782,7 @@
12696 scb->hscb->dataptr = sg->addr;
12697 scb->hscb->datacnt = sg->len;
12698 } else {
12699- scb->hscb->sgptr = ahc_htole32(SG_LIST_NULL);
12700+ scb->hscb->sgptr = aic_htole32(SG_LIST_NULL);
12701 scb->hscb->dataptr = 0;
12702 scb->hscb->datacnt = 0;
12703 scb->sg_count = 0;
12704@@ -3838,7 +3793,7 @@
12705 dev->openings--;
12706 dev->active++;
12707 dev->commands_issued++;
12708- if ((dev->flags & AHC_DEV_PERIODIC_OTAG) != 0)
12709+ if ((dev->flags & AIC_DEV_PERIODIC_OTAG) != 0)
12710 dev->commands_since_idle_or_otag++;
12711
12712 /*
12713@@ -3860,6 +3815,7 @@
12714 continue;
12715 }
12716 scb->flags |= SCB_ACTIVE;
12717+ aic_scb_timer_start(scb);
12718 ahc_queue_scb(ahc, scb);
12719 }
12720 }
12721@@ -3877,8 +3833,8 @@
12722 ahc = (struct ahc_softc *) dev_id;
12723 ahc_lock(ahc, &flags);
12724 ours = ahc_intr(ahc);
12725- if (ahc_linux_next_device_to_run(ahc) != NULL)
12726- ahc_schedule_runq(ahc);
12727+ if (aic_linux_next_device_to_run(ahc) != NULL)
12728+ aic_schedule_runq(ahc);
12729 ahc_linux_run_complete_queue(ahc);
12730 ahc_unlock(ahc, &flags);
12731 return IRQ_RETVAL(ours);
12732@@ -3892,10 +3848,10 @@
12733 ;
12734 }
12735
12736-static struct ahc_linux_target*
12737+static struct aic_linux_target*
12738 ahc_linux_alloc_target(struct ahc_softc *ahc, u_int channel, u_int target)
12739 {
12740- struct ahc_linux_target *targ;
12741+ struct aic_linux_target *targ;
12742 u_int target_offset;
12743
12744 target_offset = target;
12745@@ -3908,14 +3864,14 @@
12746 memset(targ, 0, sizeof(*targ));
12747 targ->channel = channel;
12748 targ->target = target;
12749- targ->ahc = ahc;
12750- targ->flags = AHC_DV_REQUIRED;
12751+ targ->softc = ahc;
12752+ targ->flags = AIC_DV_REQUIRED;
12753 ahc->platform_data->targets[target_offset] = targ;
12754 return (targ);
12755 }
12756
12757 static void
12758-ahc_linux_free_target(struct ahc_softc *ahc, struct ahc_linux_target *targ)
12759+ahc_linux_free_target(struct ahc_softc *ahc, struct aic_linux_target *targ)
12760 {
12761 struct ahc_devinfo devinfo;
12762 struct ahc_initiator_tinfo *tinfo;
12763@@ -3955,11 +3911,11 @@
12764 free(targ, M_DEVBUF);
12765 }
12766
12767-static struct ahc_linux_device*
12768+static struct aic_linux_device*
12769 ahc_linux_alloc_device(struct ahc_softc *ahc,
12770- struct ahc_linux_target *targ, u_int lun)
12771+ struct aic_linux_target *targ, u_int lun)
12772 {
12773- struct ahc_linux_device *dev;
12774+ struct aic_linux_device *dev;
12775
12776 dev = malloc(sizeof(*dev), M_DEVBUG, M_NOWAIT);
12777 if (dev == NULL)
12778@@ -3967,7 +3923,7 @@
12779 memset(dev, 0, sizeof(*dev));
12780 init_timer(&dev->timer);
12781 TAILQ_INIT(&dev->busyq);
12782- dev->flags = AHC_DEV_UNCONFIGURED;
12783+ dev->flags = AIC_DEV_UNCONFIGURED;
12784 dev->lun = lun;
12785 dev->target = targ;
12786
12787@@ -3990,17 +3946,17 @@
12788 }
12789
12790 static void
12791-ahc_linux_free_device(struct ahc_softc *ahc, struct ahc_linux_device *dev)
12792+ahc_linux_free_device(struct ahc_softc *ahc, struct aic_linux_device *dev)
12793 {
12794- struct ahc_linux_target *targ;
12795+ struct aic_linux_target *targ;
12796
12797- del_timer_sync(&dev->timer);
12798+ del_timer(&dev->timer);
12799 targ = dev->target;
12800 targ->devices[dev->lun] = NULL;
12801 free(dev, M_DEVBUF);
12802 targ->refcount--;
12803 if (targ->refcount == 0
12804- && (targ->flags & AHC_DV_REQUIRED) == 0)
12805+ && (targ->flags & AIC_DV_REQUIRED) == 0)
12806 ahc_linux_free_target(ahc, targ);
12807 }
12808
12809@@ -4012,7 +3968,7 @@
12810 case AC_TRANSFER_NEG:
12811 {
12812 char buf[80];
12813- struct ahc_linux_target *targ;
12814+ struct aic_linux_target *targ;
12815 struct info_str info;
12816 struct ahc_initiator_tinfo *tinfo;
12817 struct ahc_tmode_tstate *tstate;
12818@@ -4106,6 +4062,20 @@
12819 channel - 'A');
12820 }
12821 #endif
12822+ /*
12823+ * Add a minimal bus settle delay for devices that are slow to
12824+ * respond after bus resets.
12825+ */
12826+ if ((ahc->platform_data->flags & AIC_BUS_SETTLE_TIMER) == 0) {
12827+ aic_freeze_simq(ahc);
12828+ ahc->platform_data->flags |= AIC_BUS_SETTLE_TIMER;
12829+ ahc->platform_data->bus_settle_timer.expires =
12830+ jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000;
12831+ add_timer(&ahc->platform_data->bus_settle_timer);
12832+ } else {
12833+ mod_timer(&ahc->platform_data->bus_settle_timer,
12834+ jiffies + (AIC7XXX_RESET_DELAY * HZ)/1000);
12835+ }
12836 break;
12837 default:
12838 panic("ahc_send_async: Unexpected async event");
12839@@ -4119,9 +4089,11 @@
12840 ahc_done(struct ahc_softc *ahc, struct scb *scb)
12841 {
12842 Scsi_Cmnd *cmd;
12843- struct ahc_linux_device *dev;
12844+ struct aic_linux_device *dev;
12845
12846 LIST_REMOVE(scb, pending_links);
12847+ if ((scb->flags & SCB_TIMEDOUT) != 0)
12848+ LIST_REMOVE(scb, timedout_links);
12849 if ((scb->flags & SCB_UNTAGGEDQ) != 0) {
12850 struct scb_tailq *untagged_q;
12851 int target_offset;
12852@@ -4154,11 +4126,11 @@
12853 * the sense buffer looks "sane".
12854 */
12855 cmd->sense_buffer[0] = 0;
12856- if (ahc_get_transaction_status(scb) == CAM_REQ_INPROG) {
12857+ if (aic_get_transaction_status(scb) == CAM_REQ_INPROG) {
12858 uint32_t amount_xferred;
12859
12860 amount_xferred =
12861- ahc_get_transfer_length(scb) - ahc_get_residual(scb);
12862+ aic_get_transfer_length(scb) - aic_get_residual(scb);
12863 if ((scb->flags & SCB_TRANSMISSION_ERROR) != 0) {
12864 #ifdef AHC_DEBUG
12865 if ((ahc_debug & AHC_SHOW_MISC) != 0) {
12866@@ -4166,7 +4138,17 @@
12867 printf("Set CAM_UNCOR_PARITY\n");
12868 }
12869 #endif
12870- ahc_set_transaction_status(scb, CAM_UNCOR_PARITY);
12871+ aic_set_transaction_status(scb, CAM_UNCOR_PARITY);
12872+#ifdef AHC_REPORT_UNDERFLOWS
12873+ /*
12874+ * This code is disabled by default as some
12875+ * clients of the SCSI system do not properly
12876+ * initialize the underflow parameter. This
12877+ * results in spurious termination of commands
12878+ * that complete as expected (e.g. underflow is
12879+ * allowed as command can return variable amounts
12880+ * of data.
12881+ */
12882 } else if (amount_xferred < scb->io_ctx->underflow) {
12883 u_int i;
12884
12885@@ -4178,30 +4160,31 @@
12886 ahc_print_path(ahc, scb);
12887 printf("Saw underflow (%ld of %ld bytes). "
12888 "Treated as error\n",
12889- ahc_get_residual(scb),
12890- ahc_get_transfer_length(scb));
12891- ahc_set_transaction_status(scb, CAM_DATA_RUN_ERR);
12892+ aic_get_residual(scb),
12893+ aic_get_transfer_length(scb));
12894+ aic_set_transaction_status(scb, CAM_DATA_RUN_ERR);
12895+#endif
12896 } else {
12897- ahc_set_transaction_status(scb, CAM_REQ_CMP);
12898+ aic_set_transaction_status(scb, CAM_REQ_CMP);
12899 }
12900- } else if (ahc_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
12901+ } else if (aic_get_transaction_status(scb) == CAM_SCSI_STATUS_ERROR) {
12902 ahc_linux_handle_scsi_status(ahc, dev, scb);
12903- } else if (ahc_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
12904- dev->flags |= AHC_DEV_UNCONFIGURED;
12905- if (AHC_DV_CMD(cmd) == FALSE)
12906- dev->target->flags &= ~AHC_DV_REQUIRED;
12907+ } else if (aic_get_transaction_status(scb) == CAM_SEL_TIMEOUT) {
12908+ dev->flags |= AIC_DEV_UNCONFIGURED;
12909+ if (AIC_DV_CMD(cmd) == FALSE)
12910+ dev->target->flags &= ~AIC_DV_REQUIRED;
12911 }
12912 /*
12913 * Start DV for devices that require it assuming the first command
12914 * sent does not result in a selection timeout.
12915 */
12916- if (ahc_get_transaction_status(scb) != CAM_SEL_TIMEOUT
12917- && (dev->target->flags & AHC_DV_REQUIRED) != 0)
12918+ if (aic_get_transaction_status(scb) != CAM_SEL_TIMEOUT
12919+ && (dev->target->flags & AIC_DV_REQUIRED) != 0)
12920 ahc_linux_start_dv(ahc);
12921
12922 if (dev->openings == 1
12923- && ahc_get_transaction_status(scb) == CAM_REQ_CMP
12924- && ahc_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
12925+ && aic_get_transaction_status(scb) == CAM_REQ_CMP
12926+ && aic_get_scsi_status(scb) != SCSI_STATUS_QUEUE_FULL)
12927 dev->tag_success_count++;
12928 /*
12929 * Some devices deal with temporary internal resource
12930@@ -4210,7 +4193,7 @@
12931 * back to our previous queue depth.
12932 */
12933 if ((dev->openings + dev->active) < dev->maxtags
12934- && dev->tag_success_count > AHC_TAG_SUCCESS_INTERVAL) {
12935+ && dev->tag_success_count > AIC_TAG_SUCCESS_INTERVAL) {
12936 dev->tag_success_count = 0;
12937 dev->openings++;
12938 }
12939@@ -4219,32 +4202,61 @@
12940 dev->commands_since_idle_or_otag = 0;
12941
12942 if (TAILQ_EMPTY(&dev->busyq)) {
12943- if ((dev->flags & AHC_DEV_UNCONFIGURED) != 0
12944- && dev->active == 0
12945- && (dev->flags & AHC_DEV_TIMER_ACTIVE) == 0)
12946+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
12947+ && dev->active == 0)
12948 ahc_linux_free_device(ahc, dev);
12949- } else if ((dev->flags & AHC_DEV_ON_RUN_LIST) == 0) {
12950+ } else if ((dev->flags & AIC_DEV_ON_RUN_LIST) == 0) {
12951 TAILQ_INSERT_TAIL(&ahc->platform_data->device_runq, dev, links);
12952- dev->flags |= AHC_DEV_ON_RUN_LIST;
12953+ dev->flags |= AIC_DEV_ON_RUN_LIST;
12954 }
12955
12956 if ((scb->flags & SCB_RECOVERY_SCB) != 0) {
12957 printf("Recovery SCB completes\n");
12958- if (ahc_get_transaction_status(scb) == CAM_BDR_SENT
12959- || ahc_get_transaction_status(scb) == CAM_REQ_ABORTED)
12960- ahc_set_transaction_status(scb, CAM_CMD_TIMEOUT);
12961- if ((ahc->platform_data->flags & AHC_UP_EH_SEMAPHORE) != 0) {
12962- ahc->platform_data->flags &= ~AHC_UP_EH_SEMAPHORE;
12963+ if (aic_get_transaction_status(scb) == CAM_BDR_SENT
12964+ || aic_get_transaction_status(scb) == CAM_REQ_ABORTED)
12965+ aic_set_transaction_status(scb, CAM_CMD_TIMEOUT);
12966+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
12967+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
12968 up(&ahc->platform_data->eh_sem);
12969+ } else {
12970+ struct scb *list_scb;
12971+
12972+ /*
12973+ * We were able to complete the command successfully,
12974+ * so reinstate the timeouts for all other pending
12975+ * commands.
12976+ */
12977+ LIST_FOREACH(list_scb,
12978+ &ahc->pending_scbs, pending_links) {
12979+
12980+ aic_scb_timer_start(list_scb);
12981+ }
12982 }
12983 }
12984
12985+ if ((scb->platform_data->flags & AIC_TIMEOUT_ACTIVE) == 0) {
12986+ /*
12987+ * The completion handler believes that
12988+ * commands without active timers running
12989+ * have lost the race of completing before
12990+ * their timer expires. Since commands in
12991+ * our busy queues do not have timers running,
12992+ * appease the mid-layer by adding a timer
12993+ * now. This timer will be immediately
12994+ * canceled by the midlayer.
12995+ */
12996+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
12997+ }
12998+
12999+ if ((scb->platform_data->flags & AIC_RELEASE_SIMQ) != 0)
13000+ aic_release_simq_locked(ahc);
13001+
13002 ahc_free_scb(ahc, scb);
13003 ahc_linux_queue_cmd_complete(ahc, cmd);
13004
13005- if ((ahc->platform_data->flags & AHC_DV_WAIT_SIMQ_EMPTY) != 0
13006+ if ((ahc->platform_data->flags & AIC_DV_WAIT_SIMQ_EMPTY) != 0
13007 && LIST_FIRST(&ahc->pending_scbs) == NULL) {
13008- ahc->platform_data->flags &= ~AHC_DV_WAIT_SIMQ_EMPTY;
13009+ ahc->platform_data->flags &= ~AIC_DV_WAIT_SIMQ_EMPTY;
13010 up(&ahc->platform_data->dv_sem);
13011 }
13012
13013@@ -4252,7 +4264,7 @@
13014
13015 static void
13016 ahc_linux_handle_scsi_status(struct ahc_softc *ahc,
13017- struct ahc_linux_device *dev, struct scb *scb)
13018+ struct aic_linux_device *dev, struct scb *scb)
13019 {
13020 struct ahc_devinfo devinfo;
13021
13022@@ -4272,7 +4284,7 @@
13023 * we don't clobber the device with too many
13024 * commands.
13025 */
13026- switch (ahc_get_scsi_status(scb)) {
13027+ switch (aic_get_scsi_status(scb)) {
13028 default:
13029 break;
13030 case SCSI_STATUS_CHECK_COND:
13031@@ -4286,13 +4298,15 @@
13032 */
13033 cmd = scb->io_ctx;
13034 if (scb->flags & SCB_SENSE) {
13035- u_int sense_size;
13036+ struct scsi_sense_data *sense;
13037+ u_int sense_size;
13038+ int error_code, sense_key, asc, ascq;
13039
13040+ sense = ahc_get_sense_buf(ahc, scb);
13041 sense_size = MIN(sizeof(struct scsi_sense_data)
13042- - ahc_get_sense_residual(scb),
13043+ - aic_get_sense_residual(scb),
13044 sizeof(cmd->sense_buffer));
13045- memcpy(cmd->sense_buffer,
13046- ahc_get_sense_buf(ahc, scb), sense_size);
13047+ memcpy(cmd->sense_buffer, sense, sense_size);
13048 if (sense_size < sizeof(cmd->sense_buffer))
13049 memset(&cmd->sense_buffer[sense_size], 0,
13050 sizeof(cmd->sense_buffer) - sense_size);
13051@@ -4311,6 +4325,23 @@
13052 printf("\n");
13053 }
13054 #endif
13055+ /*
13056+ * If this is not a DV command and the target
13057+ * provides some status that makes us believe
13058+ * that the target has changed (power on reset,
13059+ * etc.) kick off a DV scan to re-validate the
13060+ * device.
13061+ */
13062+ if (AIC_DV_CMD(cmd) != 0)
13063+ break;
13064+
13065+ scsi_extract_sense(sense, &error_code,
13066+ &sense_key, &asc, &ascq);
13067+ if (error_code == SSD_CURRENT_ERROR
13068+ && sense_key == SSD_KEY_UNIT_ATTENTION
13069+ && asc == 0x29
13070+ && (ascq == 0 || ascq == 1))
13071+ dev->target->flags |= AIC_DV_REQUIRED;
13072 }
13073 break;
13074 }
13075@@ -4347,7 +4378,7 @@
13076 * this device.
13077 */
13078 if (dev->last_queuefull_same_count
13079- == AHC_LOCK_TAGS_COUNT) {
13080+ == AIC_LOCK_TAGS_COUNT) {
13081 dev->maxtags = dev->active;
13082 ahc_print_path(ahc, scb);
13083 printf("Locking max tag count at %d\n",
13084@@ -4357,10 +4388,10 @@
13085 dev->tags_on_last_queuefull = dev->active;
13086 dev->last_queuefull_same_count = 0;
13087 }
13088- ahc_set_transaction_status(scb, CAM_REQUEUE_REQ);
13089- ahc_set_scsi_status(scb, SCSI_STATUS_OK);
13090+ aic_set_transaction_status(scb, CAM_REQUEUE_REQ);
13091+ aic_set_scsi_status(scb, SCSI_STATUS_OK);
13092 ahc_platform_set_tags(ahc, &devinfo,
13093- (dev->flags & AHC_DEV_Q_BASIC)
13094+ (dev->flags & AIC_DEV_Q_BASIC)
13095 ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
13096 break;
13097 }
13098@@ -4369,9 +4400,9 @@
13099 * as if the target returned BUSY SCSI status.
13100 */
13101 dev->openings = 1;
13102- ahc_set_scsi_status(scb, SCSI_STATUS_BUSY);
13103+ aic_set_scsi_status(scb, SCSI_STATUS_BUSY);
13104 ahc_platform_set_tags(ahc, &devinfo,
13105- (dev->flags & AHC_DEV_Q_BASIC)
13106+ (dev->flags & AIC_DEV_Q_BASIC)
13107 ? AHC_QUEUE_BASIC : AHC_QUEUE_TAGGED);
13108 /* FALLTHROUGH */
13109 }
13110@@ -4381,13 +4412,13 @@
13111 * Set a short timer to defer sending commands for
13112 * a bit since Linux will not delay in this case.
13113 */
13114- if ((dev->flags & AHC_DEV_TIMER_ACTIVE) != 0) {
13115+ if ((dev->flags & AIC_DEV_TIMER_ACTIVE) != 0) {
13116 printf("%s:%c:%d: Device Timer still active during "
13117 "busy processing\n", ahc_name(ahc),
13118 dev->target->channel, dev->target->target);
13119 break;
13120 }
13121- dev->flags |= AHC_DEV_TIMER_ACTIVE;
13122+ dev->flags |= AIC_DEV_TIMER_ACTIVE;
13123 dev->qfrozen++;
13124 init_timer(&dev->timer);
13125 dev->timer.data = (u_long)dev;
13126@@ -4414,9 +4445,9 @@
13127 * not guarantee the order that aborted commands will be
13128 * returned to us.
13129 */
13130- struct ahc_completeq *completeq;
13131- struct ahc_cmd *list_cmd;
13132- struct ahc_cmd *acmd;
13133+ struct aic_completeq *completeq;
13134+ struct aic_cmd *list_cmd;
13135+ struct aic_cmd *acmd;
13136
13137 /*
13138 * Map CAM error codes into Linux Error codes. We
13139@@ -4424,10 +4455,10 @@
13140 * full error information available when making
13141 * state change decisions.
13142 */
13143- if (AHC_DV_CMD(cmd) == FALSE) {
13144+ if (AIC_DV_CMD(cmd) == FALSE) {
13145 u_int new_status;
13146
13147- switch (ahc_cmd_get_transaction_status(cmd)) {
13148+ switch (aic_cmd_get_transaction_status(cmd)) {
13149 case CAM_REQ_INPROG:
13150 case CAM_REQ_CMP:
13151 case CAM_SCSI_STATUS_ERROR:
13152@@ -4454,7 +4485,17 @@
13153 new_status = DID_PARITY;
13154 break;
13155 case CAM_CMD_TIMEOUT:
13156- new_status = DID_TIME_OUT;
13157+ /*
13158+ * Returning DID_TIME_OUT will
13159+ * wake up the error recovery
13160+ * thread instead of doing the
13161+ * command retry we desire. Since
13162+ * we have already recovered the
13163+ * command, returning DID_ERROR
13164+ * will cause a retry up to the
13165+ * retry limit for this command.
13166+ */
13167+ new_status = DID_ERROR;
13168 break;
13169 case CAM_UA_ABORT:
13170 case CAM_REQ_CMP_ERR:
13171@@ -4484,7 +4525,7 @@
13172 if (cmd->retries > 0)
13173 cmd->retries--;
13174 new_status = DID_OK;
13175- ahc_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
13176+ aic_cmd_set_scsi_status(cmd, SCSI_STATUS_CHECK_COND);
13177 cmd->result |= (DRIVER_SENSE << 24);
13178 memset(cmd->sense_buffer, 0,
13179 sizeof(cmd->sense_buffer));
13180@@ -4498,12 +4539,12 @@
13181 break;
13182 }
13183
13184- ahc_cmd_set_transaction_status(cmd, new_status);
13185+ aic_cmd_set_transaction_status(cmd, new_status);
13186 }
13187
13188 completeq = &ahc->platform_data->completeq;
13189 list_cmd = TAILQ_FIRST(completeq);
13190- acmd = (struct ahc_cmd *)cmd;
13191+ acmd = (struct aic_cmd *)cmd;
13192 while (list_cmd != NULL
13193 && acmd_scsi_cmd(list_cmd).serial_number
13194 < acmd_scsi_cmd(acmd).serial_number)
13195@@ -4524,7 +4565,7 @@
13196 struct ahc_transinfo *curr;
13197 struct ahc_tmode_tstate *tstate;
13198 struct ahc_syncrate *syncrate;
13199- struct ahc_linux_device *dev;
13200+ struct aic_linux_device *dev;
13201 u_int maxsync;
13202 u_int width;
13203 u_int period;
13204@@ -4547,9 +4588,9 @@
13205 sid = (struct scsi_inquiry_data *)dev->target->inq_data;
13206 if (SID_QUAL(sid) == SID_QUAL_LU_CONNECTED) {
13207
13208- dev->flags &= ~AHC_DEV_UNCONFIGURED;
13209+ dev->flags &= ~AIC_DEV_UNCONFIGURED;
13210 } else {
13211- dev->flags |= AHC_DEV_UNCONFIGURED;
13212+ dev->flags |= AIC_DEV_UNCONFIGURED;
13213 return;
13214 }
13215
13216@@ -4626,82 +4667,38 @@
13217 static void
13218 ahc_linux_sem_timeout(u_long arg)
13219 {
13220+ struct scb *scb;
13221 struct ahc_softc *ahc;
13222 u_long s;
13223
13224- ahc = (struct ahc_softc *)arg;
13225-
13226+ scb = (struct scb *)arg;
13227+ ahc = scb->ahc_softc;
13228 ahc_lock(ahc, &s);
13229- if ((ahc->platform_data->flags & AHC_UP_EH_SEMAPHORE) != 0) {
13230- ahc->platform_data->flags &= ~AHC_UP_EH_SEMAPHORE;
13231+ if ((scb->platform_data->flags & AIC_SCB_UP_EH_SEM) != 0) {
13232+ scb->platform_data->flags &= ~AIC_SCB_UP_EH_SEM;
13233 up(&ahc->platform_data->eh_sem);
13234 }
13235 ahc_unlock(ahc, &s);
13236 }
13237
13238 static void
13239-ahc_linux_freeze_simq(struct ahc_softc *ahc)
13240-{
13241- ahc->platform_data->qfrozen++;
13242- if (ahc->platform_data->qfrozen == 1) {
13243- scsi_block_requests(ahc->platform_data->host);
13244-
13245- /* XXX What about Twin channels? */
13246- ahc_platform_abort_scbs(ahc, CAM_TARGET_WILDCARD, ALL_CHANNELS,
13247- CAM_LUN_WILDCARD, SCB_LIST_NULL,
13248- ROLE_INITIATOR, CAM_REQUEUE_REQ);
13249- }
13250-}
13251-
13252-static void
13253-ahc_linux_release_simq(u_long arg)
13254-{
13255- struct ahc_softc *ahc;
13256- u_long s;
13257- int unblock_reqs;
13258-
13259- ahc = (struct ahc_softc *)arg;
13260-
13261- unblock_reqs = 0;
13262- ahc_lock(ahc, &s);
13263- if (ahc->platform_data->qfrozen > 0)
13264- ahc->platform_data->qfrozen--;
13265- if (ahc->platform_data->qfrozen == 0)
13266- unblock_reqs = 1;
13267- if (AHC_DV_SIMQ_FROZEN(ahc)
13268- && ((ahc->platform_data->flags & AHC_DV_WAIT_SIMQ_RELEASE) != 0)) {
13269- ahc->platform_data->flags &= ~AHC_DV_WAIT_SIMQ_RELEASE;
13270- up(&ahc->platform_data->dv_sem);
13271- }
13272- ahc_schedule_runq(ahc);
13273- ahc_unlock(ahc, &s);
13274- /*
13275- * There is still a race here. The mid-layer
13276- * should keep its own freeze count and use
13277- * a bottom half handler to run the queues
13278- * so we can unblock with our own lock held.
13279- */
13280- if (unblock_reqs)
13281- scsi_unblock_requests(ahc->platform_data->host);
13282-}
13283-
13284-static void
13285 ahc_linux_dev_timed_unfreeze(u_long arg)
13286 {
13287- struct ahc_linux_device *dev;
13288+ struct aic_linux_device *dev;
13289 struct ahc_softc *ahc;
13290 u_long s;
13291
13292- dev = (struct ahc_linux_device *)arg;
13293- ahc = dev->target->ahc;
13294+ dev = (struct aic_linux_device *)arg;
13295+ ahc = dev->target->softc;
13296 ahc_lock(ahc, &s);
13297- dev->flags &= ~AHC_DEV_TIMER_ACTIVE;
13298+ dev->flags &= ~AIC_DEV_TIMER_ACTIVE;
13299 if (dev->qfrozen > 0)
13300 dev->qfrozen--;
13301 if (dev->qfrozen == 0
13302- && (dev->flags & AHC_DEV_ON_RUN_LIST) == 0)
13303+ && (dev->flags & AIC_DEV_ON_RUN_LIST) == 0)
13304 ahc_linux_run_device_queue(ahc, dev);
13305- if (TAILQ_EMPTY(&dev->busyq)
13306+ if ((dev->flags & AIC_DEV_UNCONFIGURED) != 0
13307+ && TAILQ_EMPTY(&dev->busyq)
13308 && dev->active == 0)
13309 ahc_linux_free_device(ahc, dev);
13310 ahc_unlock(ahc, &s);
13311@@ -4711,9 +4708,9 @@
13312 ahc_linux_queue_recovery_cmd(Scsi_Cmnd *cmd, scb_flag flag)
13313 {
13314 struct ahc_softc *ahc;
13315- struct ahc_cmd *acmd;
13316- struct ahc_cmd *list_acmd;
13317- struct ahc_linux_device *dev;
13318+ struct aic_cmd *acmd;
13319+ struct aic_cmd *list_acmd;
13320+ struct aic_linux_device *dev;
13321 struct scb *pending_scb;
13322 u_long s;
13323 u_int saved_scbptr;
13324@@ -4731,7 +4728,7 @@
13325 paused = FALSE;
13326 wait = FALSE;
13327 ahc = *(struct ahc_softc **)cmd->device->host->hostdata;
13328- acmd = (struct ahc_cmd *)cmd;
13329+ acmd = (struct aic_cmd *)cmd;
13330
13331 printf("%s:%d:%d:%d: Attempting to queue a%s message\n",
13332 ahc_name(ahc), cmd->device->channel,
13333@@ -4793,13 +4790,24 @@
13334 if (flag == SCB_ABORT) {
13335 TAILQ_REMOVE(&dev->busyq, list_acmd, acmd_links.tqe);
13336 cmd->result = DID_ABORT << 16;
13337+ /*
13338+ * The completion handler believes that
13339+ * commands without active timers running
13340+ * have lost the race of completing before
13341+ * their timer expires. Since commands in our
13342+ * busy queues do not have timers running,
13343+ * appease the mid-layer by adding a timer
13344+ * now. This timer will be immediately
13345+ * canceled by the midlayer.
13346+ */
13347+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
13348 ahc_linux_queue_cmd_complete(ahc, cmd);
13349 retval = SUCCESS;
13350 goto done;
13351 }
13352 }
13353
13354- if ((dev->flags & (AHC_DEV_Q_BASIC|AHC_DEV_Q_TAGGED)) == 0
13355+ if ((dev->flags & (AIC_DEV_Q_BASIC|AIC_DEV_Q_TAGGED)) == 0
13356 && ahc_search_untagged_queues(ahc, cmd, cmd->device->id,
13357 cmd->device->channel + 'A',
13358 cmd->device->lun,
13359@@ -5015,10 +5023,10 @@
13360 struct timer_list timer;
13361 int ret;
13362
13363- ahc->platform_data->flags |= AHC_UP_EH_SEMAPHORE;
13364+ pending_scb->platform_data->flags |= AIC_SCB_UP_EH_SEM;
13365 spin_unlock_irq(&ahc->platform_data->spin_lock);
13366 init_timer(&timer);
13367- timer.data = (u_long)ahc;
13368+ timer.data = (u_long)pending_scb;
13369 timer.expires = jiffies + (5 * HZ);
13370 timer.function = ahc_linux_sem_timeout;
13371 add_timer(&timer);
13372@@ -5032,7 +5040,7 @@
13373 }
13374 spin_lock_irq(&ahc->platform_data->spin_lock);
13375 }
13376- ahc_schedule_runq(ahc);
13377+ aic_schedule_runq(ahc);
13378 ahc_linux_run_complete_queue(ahc);
13379 ahc_midlayer_entrypoint_unlock(ahc, &s);
13380 return (retval);
13381@@ -5041,7 +5049,8 @@
13382 void
13383 ahc_platform_dump_card_state(struct ahc_softc *ahc)
13384 {
13385- struct ahc_linux_device *dev;
13386+ struct Scsi_Host *host;
13387+ struct aic_linux_device *dev;
13388 int channel;
13389 int maxchannel;
13390 int target;
13391@@ -5049,6 +5058,14 @@
13392 int lun;
13393 int i;
13394
13395+ host = ahc->platform_data->host;
13396+ printf("%s: Host Status: Failed(%d) %s%s%s\n",
13397+ ahc_name(ahc),
13398+ host->host_failed,
13399+ host->eh_active ? "eh_active " : "",
13400+ host->host_blocked ? "host_blocked " : "",
13401+ host->host_self_blocked ? "host_self_blocked " : "");
13402+
13403 maxchannel = (ahc->features & AHC_TWIN) ? 1 : 0;
13404 maxtarget = (ahc->features & AHC_WIDE) ? 15 : 7;
13405 for (channel = 0; channel <= maxchannel; channel++) {
13406@@ -5056,7 +5073,7 @@
13407 for (target = 0; target <=maxtarget; target++) {
13408
13409 for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
13410- struct ahc_cmd *acmd;
13411+ struct aic_cmd *acmd;
13412
13413 dev = ahc_linux_get_device(ahc, channel, target,
13414 lun, /*alloc*/FALSE);
13415@@ -5098,20 +5115,18 @@
13416 ahc_linux_exit(void)
13417 {
13418 struct ahc_softc *ahc;
13419- u_long l;
13420
13421 /*
13422- * Shutdown DV threads before going into the SCSI mid-layer.
13423+ * Shutdown our threads before going into the SCSI mid-layer.
13424 * This avoids situations where the mid-layer locks the entire
13425 * kernel so that waiting for our DV threads to exit leads
13426 * to deadlock.
13427 */
13428- ahc_list_lock(&l);
13429 TAILQ_FOREACH(ahc, &ahc_tailq, links) {
13430
13431 ahc_linux_kill_dv_thread(ahc);
13432+ ahc_terminate_recovery_thread(ahc);
13433 }
13434- ahc_list_unlock(&l);
13435
13436 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
13437 /*
13438diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_osm.h linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_osm.h
13439--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_osm.h 2004-01-08 11:57:43.031001441 +0100
13440+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_osm.h 2003-12-23 00:31:43.000000000 +0100
13441@@ -53,51 +53,22 @@
13442 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
13443 * POSSIBILITY OF SUCH DAMAGES.
13444 *
13445- * $Id$
13446+ * $Id$
13447 *
13448 */
13449 #ifndef _AIC7XXX_LINUX_H_
13450 #define _AIC7XXX_LINUX_H_
13451
13452-#include <linux/types.h>
13453-#include <linux/blk.h>
13454-#include <linux/blkdev.h>
13455-#include <linux/delay.h>
13456-#include <linux/ioport.h>
13457-#include <linux/pci.h>
13458-#include <linux/smp_lock.h>
13459 #include <linux/version.h>
13460-#include <linux/module.h>
13461-#include <asm/byteorder.h>
13462-#include <asm/io.h>
13463
13464 #ifndef KERNEL_VERSION
13465 #define KERNEL_VERSION(x,y,z) (((x)<<16)+((y)<<8)+(z))
13466 #endif
13467
13468 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
13469-#include <linux/interrupt.h> /* For tasklet support. */
13470 #include <linux/config.h>
13471-#include <linux/slab.h>
13472-#else
13473-#include <linux/malloc.h>
13474 #endif
13475
13476-/* Core SCSI definitions */
13477-#define AIC_LIB_PREFIX ahc
13478-#include "scsi.h"
13479-#include "hosts.h"
13480-
13481-/* Name space conflict with BSD queue macros */
13482-#ifdef LIST_HEAD
13483-#undef LIST_HEAD
13484-#endif
13485-
13486-#include "cam.h"
13487-#include "queue.h"
13488-#include "scsi_message.h"
13489-#include "aiclib.h"
13490-
13491 /*********************************** Debugging ********************************/
13492 #ifdef CONFIG_AIC7XXX_DEBUG_ENABLE
13493 #ifdef CONFIG_AIC7XXX_DEBUG_MASK
13494@@ -112,42 +83,18 @@
13495 /* No debugging code. */
13496 #endif
13497
13498-/************************* Forward Declarations *******************************/
13499-struct ahc_softc;
13500-typedef struct pci_dev *ahc_dev_softc_t;
13501-typedef Scsi_Cmnd *ahc_io_ctx_t;
13502-
13503-/******************************* Byte Order ***********************************/
13504-#define ahc_htobe16(x) cpu_to_be16(x)
13505-#define ahc_htobe32(x) cpu_to_be32(x)
13506-#define ahc_htobe64(x) cpu_to_be64(x)
13507-#define ahc_htole16(x) cpu_to_le16(x)
13508-#define ahc_htole32(x) cpu_to_le32(x)
13509-#define ahc_htole64(x) cpu_to_le64(x)
13510-
13511-#define ahc_be16toh(x) be16_to_cpu(x)
13512-#define ahc_be32toh(x) be32_to_cpu(x)
13513-#define ahc_be64toh(x) be64_to_cpu(x)
13514-#define ahc_le16toh(x) le16_to_cpu(x)
13515-#define ahc_le32toh(x) le32_to_cpu(x)
13516-#define ahc_le64toh(x) le64_to_cpu(x)
13517-
13518-#ifndef LITTLE_ENDIAN
13519-#define LITTLE_ENDIAN 1234
13520-#endif
13521-
13522-#ifndef BIG_ENDIAN
13523-#define BIG_ENDIAN 4321
13524-#endif
13525+/********************************** Includes **********************************/
13526+/* Core SCSI definitions */
13527+#define AIC_LIB_PREFIX ahc
13528+#define AIC_CONST_PREFIX AHC
13529
13530-#ifndef BYTE_ORDER
13531-#if defined(__BIG_ENDIAN)
13532-#define BYTE_ORDER BIG_ENDIAN
13533-#endif
13534-#if defined(__LITTLE_ENDIAN)
13535-#define BYTE_ORDER LITTLE_ENDIAN
13536+#ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT
13537+#define AIC_DEBUG_REGISTERS 1
13538+#else
13539+#define AIC_DEBUG_REGISTERS 0
13540 #endif
13541-#endif /* BYTE_ORDER */
13542+#define AIC_CORE_INCLUDE "aic7xxx.h"
13543+#include "aiclib.h"
13544
13545 /************************* Configuration Data *********************************/
13546 extern u_int aic7xxx_no_probe;
13547@@ -155,142 +102,9 @@
13548 extern int aic7xxx_detect_complete;
13549 extern Scsi_Host_Template aic7xxx_driver_template;
13550
13551-/***************************** Bus Space/DMA **********************************/
13552-
13553-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,17)
13554-typedef dma_addr_t bus_addr_t;
13555-#else
13556-typedef uint32_t bus_addr_t;
13557-#endif
13558-typedef uint32_t bus_size_t;
13559-
13560-typedef enum {
13561- BUS_SPACE_MEMIO,
13562- BUS_SPACE_PIO
13563-} bus_space_tag_t;
13564-
13565-typedef union {
13566- u_long ioport;
13567- volatile uint8_t *maddr;
13568-} bus_space_handle_t;
13569-
13570-typedef struct bus_dma_segment
13571-{
13572- bus_addr_t ds_addr;
13573- bus_size_t ds_len;
13574-} bus_dma_segment_t;
13575-
13576-struct ahc_linux_dma_tag
13577-{
13578- bus_size_t alignment;
13579- bus_size_t boundary;
13580- bus_size_t maxsize;
13581-};
13582-typedef struct ahc_linux_dma_tag* bus_dma_tag_t;
13583-
13584-struct ahc_linux_dmamap
13585-{
13586- bus_addr_t bus_addr;
13587-};
13588-typedef struct ahc_linux_dmamap* bus_dmamap_t;
13589-
13590-typedef int bus_dma_filter_t(void*, bus_addr_t);
13591-typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
13592-
13593-#define BUS_DMA_WAITOK 0x0
13594-#define BUS_DMA_NOWAIT 0x1
13595-#define BUS_DMA_ALLOCNOW 0x2
13596-#define BUS_DMA_LOAD_SEGS 0x4 /*
13597- * Argument is an S/G list not
13598- * a single buffer.
13599- */
13600-
13601-#define BUS_SPACE_MAXADDR 0xFFFFFFFF
13602-#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
13603-#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
13604-
13605-int ahc_dma_tag_create(struct ahc_softc *, bus_dma_tag_t /*parent*/,
13606- bus_size_t /*alignment*/, bus_size_t /*boundary*/,
13607- bus_addr_t /*lowaddr*/, bus_addr_t /*highaddr*/,
13608- bus_dma_filter_t*/*filter*/, void */*filterarg*/,
13609- bus_size_t /*maxsize*/, int /*nsegments*/,
13610- bus_size_t /*maxsegsz*/, int /*flags*/,
13611- bus_dma_tag_t */*dma_tagp*/);
13612-
13613-void ahc_dma_tag_destroy(struct ahc_softc *, bus_dma_tag_t /*tag*/);
13614-
13615-int ahc_dmamem_alloc(struct ahc_softc *, bus_dma_tag_t /*dmat*/,
13616- void** /*vaddr*/, int /*flags*/,
13617- bus_dmamap_t* /*mapp*/);
13618-
13619-void ahc_dmamem_free(struct ahc_softc *, bus_dma_tag_t /*dmat*/,
13620- void* /*vaddr*/, bus_dmamap_t /*map*/);
13621-
13622-void ahc_dmamap_destroy(struct ahc_softc *, bus_dma_tag_t /*tag*/,
13623- bus_dmamap_t /*map*/);
13624-
13625-int ahc_dmamap_load(struct ahc_softc *ahc, bus_dma_tag_t /*dmat*/,
13626- bus_dmamap_t /*map*/, void * /*buf*/,
13627- bus_size_t /*buflen*/, bus_dmamap_callback_t *,
13628- void */*callback_arg*/, int /*flags*/);
13629-
13630-int ahc_dmamap_unload(struct ahc_softc *, bus_dma_tag_t, bus_dmamap_t);
13631-
13632-/*
13633- * Operations performed by ahc_dmamap_sync().
13634- */
13635-#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
13636-#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
13637-#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
13638-#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
13639-
13640-/*
13641- * XXX
13642- * ahc_dmamap_sync is only used on buffers allocated with
13643- * the pci_alloc_consistent() API. Although I'm not sure how
13644- * this works on architectures with a write buffer, Linux does
13645- * not have an API to sync "coherent" memory. Perhaps we need
13646- * to do an mb()?
13647- */
13648-#define ahc_dmamap_sync(ahc, dma_tag, dmamap, offset, len, op)
13649-
13650-/************************** Timer DataStructures ******************************/
13651-typedef struct timer_list ahc_timer_t;
13652-
13653-/********************************** Includes **********************************/
13654-#ifdef CONFIG_AIC7XXX_REG_PRETTY_PRINT
13655-#define AIC_DEBUG_REGISTERS 1
13656-#else
13657-#define AIC_DEBUG_REGISTERS 0
13658-#endif
13659-#include "aic7xxx.h"
13660-
13661-/***************************** Timer Facilities *******************************/
13662-#define ahc_timer_init init_timer
13663-#define ahc_timer_stop del_timer_sync
13664-typedef void ahc_linux_callback_t (u_long);
13665-static __inline void ahc_timer_reset(ahc_timer_t *timer, int usec,
13666- ahc_callback_t *func, void *arg);
13667-static __inline void ahc_scb_timer_reset(struct scb *scb, u_int usec);
13668-
13669-static __inline void
13670-ahc_timer_reset(ahc_timer_t *timer, int usec, ahc_callback_t *func, void *arg)
13671-{
13672- struct ahc_softc *ahc;
13673-
13674- ahc = (struct ahc_softc *)arg;
13675- del_timer(timer);
13676- timer->data = (u_long)arg;
13677- timer->expires = jiffies + (usec * HZ)/1000000;
13678- timer->function = (ahc_linux_callback_t*)func;
13679- add_timer(timer);
13680-}
13681-
13682-static __inline void
13683-ahc_scb_timer_reset(struct scb *scb, u_int usec)
13684-{
13685- mod_timer(&scb->io_ctx->eh_timeout, jiffies + (usec * HZ)/1000000);
13686-}
13687+/***************************** Domain Validation ******************************/
13688+void ahc_linux_dv_complete(Scsi_Cmnd *cmd);
13689+void ahc_linux_dv_timeout(struct scsi_cmnd *cmd);
13690
13691 /***************************** SMP support ************************************/
13692 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
13693@@ -305,187 +119,7 @@
13694 #define AHC_SCSI_HAS_HOST_LOCK 0
13695 #endif
13696
13697-#define AIC7XXX_DRIVER_VERSION "6.2.36"
13698-
13699-/**************************** Front End Queues ********************************/
13700-/*
13701- * Data structure used to cast the Linux struct scsi_cmnd to something
13702- * that allows us to use the queue macros. The linux structure has
13703- * plenty of space to hold the links fields as required by the queue
13704- * macros, but the queue macors require them to have the correct type.
13705- */
13706-struct ahc_cmd_internal {
13707- /* Area owned by the Linux scsi layer. */
13708- uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
13709- union {
13710- STAILQ_ENTRY(ahc_cmd) ste;
13711- LIST_ENTRY(ahc_cmd) le;
13712- TAILQ_ENTRY(ahc_cmd) tqe;
13713- } links;
13714- uint32_t end;
13715-};
13716-
13717-struct ahc_cmd {
13718- union {
13719- struct ahc_cmd_internal icmd;
13720- struct scsi_cmnd scsi_cmd;
13721- } un;
13722-};
13723-
13724-#define acmd_icmd(cmd) ((cmd)->un.icmd)
13725-#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
13726-#define acmd_links un.icmd.links
13727-
13728-/*************************** Device Data Structures ***************************/
13729-/*
13730- * A per probed device structure used to deal with some error recovery
13731- * scenarios that the Linux mid-layer code just doesn't know how to
13732- * handle. The structure allocated for a device only becomes persistent
13733- * after a successfully completed inquiry command to the target when
13734- * that inquiry data indicates a lun is present.
13735- */
13736-TAILQ_HEAD(ahc_busyq, ahc_cmd);
13737-typedef enum {
13738- AHC_DEV_UNCONFIGURED = 0x01,
13739- AHC_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
13740- AHC_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */
13741- AHC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
13742- AHC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
13743- AHC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
13744- AHC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
13745- AHC_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
13746-} ahc_linux_dev_flags;
13747-
13748-struct ahc_linux_target;
13749-struct ahc_linux_device {
13750- TAILQ_ENTRY(ahc_linux_device) links;
13751- struct ahc_busyq busyq;
13752-
13753- /*
13754- * The number of transactions currently
13755- * queued to the device.
13756- */
13757- int active;
13758-
13759- /*
13760- * The currently allowed number of
13761- * transactions that can be queued to
13762- * the device. Must be signed for
13763- * conversion from tagged to untagged
13764- * mode where the device may have more
13765- * than one outstanding active transaction.
13766- */
13767- int openings;
13768-
13769- /*
13770- * A positive count indicates that this
13771- * device's queue is halted.
13772- */
13773- u_int qfrozen;
13774-
13775- /*
13776- * Cumulative command counter.
13777- */
13778- u_long commands_issued;
13779-
13780- /*
13781- * The number of tagged transactions when
13782- * running at our current opening level
13783- * that have been successfully received by
13784- * this device since the last QUEUE FULL.
13785- */
13786- u_int tag_success_count;
13787-#define AHC_TAG_SUCCESS_INTERVAL 50
13788-
13789- ahc_linux_dev_flags flags;
13790-
13791- /*
13792- * Per device timer.
13793- */
13794- struct timer_list timer;
13795-
13796- /*
13797- * The high limit for the tags variable.
13798- */
13799- u_int maxtags;
13800-
13801- /*
13802- * The computed number of tags outstanding
13803- * at the time of the last QUEUE FULL event.
13804- */
13805- u_int tags_on_last_queuefull;
13806-
13807- /*
13808- * How many times we have seen a queue full
13809- * with the same number of tags. This is used
13810- * to stop our adaptive queue depth algorithm
13811- * on devices with a fixed number of tags.
13812- */
13813- u_int last_queuefull_same_count;
13814-#define AHC_LOCK_TAGS_COUNT 50
13815-
13816- /*
13817- * How many transactions have been queued
13818- * without the device going idle. We use
13819- * this statistic to determine when to issue
13820- * an ordered tag to prevent transaction
13821- * starvation. This statistic is only updated
13822- * if the AHC_DEV_PERIODIC_OTAG flag is set
13823- * on this device.
13824- */
13825- u_int commands_since_idle_or_otag;
13826-#define AHC_OTAG_THRESH 500
13827-
13828- int lun;
13829- Scsi_Device *scsi_device;
13830- struct ahc_linux_target *target;
13831-};
13832-
13833-typedef enum {
13834- AHC_DV_REQUIRED = 0x01,
13835- AHC_INQ_VALID = 0x02,
13836- AHC_BASIC_DV = 0x04,
13837- AHC_ENHANCED_DV = 0x08
13838-} ahc_linux_targ_flags;
13839-
13840-/* DV States */
13841-typedef enum {
13842- AHC_DV_STATE_EXIT = 0,
13843- AHC_DV_STATE_INQ_SHORT_ASYNC,
13844- AHC_DV_STATE_INQ_ASYNC,
13845- AHC_DV_STATE_INQ_ASYNC_VERIFY,
13846- AHC_DV_STATE_TUR,
13847- AHC_DV_STATE_REBD,
13848- AHC_DV_STATE_INQ_VERIFY,
13849- AHC_DV_STATE_WEB,
13850- AHC_DV_STATE_REB,
13851- AHC_DV_STATE_SU,
13852- AHC_DV_STATE_BUSY
13853-} ahc_dv_state;
13854-
13855-struct ahc_linux_target {
13856- struct ahc_linux_device *devices[AHC_NUM_LUNS];
13857- int channel;
13858- int target;
13859- int refcount;
13860- struct ahc_transinfo last_tinfo;
13861- struct ahc_softc *ahc;
13862- ahc_linux_targ_flags flags;
13863- struct scsi_inquiry_data *inq_data;
13864- /*
13865- * The next "fallback" period to use for narrow/wide transfers.
13866- */
13867- uint8_t dv_next_narrow_period;
13868- uint8_t dv_next_wide_period;
13869- uint8_t dv_max_width;
13870- uint8_t dv_max_ppr_options;
13871- uint8_t dv_last_ppr_options;
13872- u_int dv_echo_size;
13873- ahc_dv_state dv_state;
13874- u_int dv_state_retry;
13875- char *dv_buffer;
13876- char *dv_buffer1;
13877-};
13878+#define AIC7XXX_DRIVER_VERSION "6.3.4"
13879
13880 /********************* Definitions Required by the Core ***********************/
13881 /*
13882@@ -507,120 +141,39 @@
13883 #define AHC_NSEG 128
13884 #endif
13885
13886-/*
13887- * Per-SCB OSM storage.
13888- */
13889-typedef enum {
13890- AHC_UP_EH_SEMAPHORE = 0x1
13891-} ahc_linux_scb_flags;
13892-
13893-struct scb_platform_data {
13894- struct ahc_linux_device *dev;
13895- bus_addr_t buf_busaddr;
13896- uint32_t xfer_len;
13897-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
13898- uint32_t resid; /* Transfer residual */
13899-#endif
13900- uint32_t sense_resid; /* Auto-Sense residual */
13901- ahc_linux_scb_flags flags;
13902-};
13903-
13904-/*
13905- * Define a structure used for each host adapter. All members are
13906- * aligned on a boundary >= the size of the member to honor the
13907- * alignment restrictions of the various platforms supported by
13908- * this driver.
13909- */
13910-typedef enum {
13911- AHC_DV_WAIT_SIMQ_EMPTY = 0x01,
13912- AHC_DV_WAIT_SIMQ_RELEASE = 0x02,
13913- AHC_DV_ACTIVE = 0x04,
13914- AHC_DV_SHUTDOWN = 0x08,
13915- AHC_RUN_CMPLT_Q_TIMER = 0x10
13916-} ahc_linux_softc_flags;
13917-
13918-TAILQ_HEAD(ahc_completeq, ahc_cmd);
13919-
13920-struct ahc_platform_data {
13921- /*
13922- * Fields accessed from interrupt context.
13923- */
13924- struct ahc_linux_target *targets[AHC_NUM_TARGETS];
13925- TAILQ_HEAD(, ahc_linux_device) device_runq;
13926- struct ahc_completeq completeq;
13927-
13928- spinlock_t spin_lock;
13929-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
13930- struct tasklet_struct runq_tasklet;
13931-#endif
13932- u_int qfrozen;
13933- pid_t dv_pid;
13934- struct timer_list completeq_timer;
13935- struct timer_list reset_timer;
13936- struct semaphore eh_sem;
13937- struct semaphore dv_sem;
13938- struct semaphore dv_cmd_sem; /* XXX This needs to be in
13939- * the target struct
13940- */
13941- struct scsi_device *dv_scsi_dev;
13942- struct Scsi_Host *host; /* pointer to scsi host */
13943-#define AHC_LINUX_NOIRQ ((uint32_t)~0)
13944- uint32_t irq; /* IRQ for this adapter */
13945- uint32_t bios_address;
13946- uint32_t mem_busaddr; /* Mem Base Addr */
13947- bus_addr_t hw_dma_mask;
13948- ahc_linux_softc_flags flags;
13949-};
13950-
13951-/************************** OS Utility Wrappers *******************************/
13952-#define printf printk
13953-#define M_NOWAIT GFP_ATOMIC
13954-#define M_WAITOK 0
13955-#define malloc(size, type, flags) kmalloc(size, flags)
13956-#define free(ptr, type) kfree(ptr)
13957-
13958-static __inline void ahc_delay(long);
13959-static __inline void
13960-ahc_delay(long usec)
13961-{
13962- /*
13963- * udelay on Linux can have problems for
13964- * multi-millisecond waits. Wait at most
13965- * 1024us per call.
13966- */
13967- while (usec > 0) {
13968- udelay(usec % 1024);
13969- usec -= 1024;
13970- }
13971-}
13972-
13973+/************************** Error Recovery ************************************/
13974+static __inline void ahc_wakeup_recovery_thread(struct ahc_softc *ahc);
13975+
13976+static __inline void
13977+ahc_wakeup_recovery_thread(struct ahc_softc *ahc)
13978+{
13979+ up(&ahc->platform_data->recovery_sem);
13980+}
13981+
13982+int ahc_spawn_recovery_thread(struct ahc_softc *ahc);
13983+void ahc_terminate_recovery_thread(struct ahc_softc *ahc);
13984+void ahc_set_recoveryscb(struct ahc_softc *ahc,
13985+ struct scb *scb);
13986
13987 /***************************** Low Level I/O **********************************/
13988-#if defined(__powerpc__) || defined(__i386__) || defined(__ia64__)
13989-#define MMAPIO
13990-#endif
13991-
13992 static __inline uint8_t ahc_inb(struct ahc_softc * ahc, long port);
13993 static __inline void ahc_outb(struct ahc_softc * ahc, long port, uint8_t val);
13994 static __inline void ahc_outsb(struct ahc_softc * ahc, long port,
13995 uint8_t *, int count);
13996 static __inline void ahc_insb(struct ahc_softc * ahc, long port,
13997 uint8_t *, int count);
13998+static __inline void ahc_flush_device_writes(struct ahc_softc *);
13999
14000 static __inline uint8_t
14001 ahc_inb(struct ahc_softc * ahc, long port)
14002 {
14003 uint8_t x;
14004-#ifdef MMAPIO
14005
14006 if (ahc->tag == BUS_SPACE_MEMIO) {
14007 x = readb(ahc->bsh.maddr + port);
14008 } else {
14009 x = inb(ahc->bsh.ioport + port);
14010 }
14011-#else
14012- x = inb(ahc->bsh.ioport + port);
14013-#endif
14014 mb();
14015 return (x);
14016 }
14017@@ -628,15 +181,11 @@
14018 static __inline void
14019 ahc_outb(struct ahc_softc * ahc, long port, uint8_t val)
14020 {
14021-#ifdef MMAPIO
14022 if (ahc->tag == BUS_SPACE_MEMIO) {
14023 writeb(val, ahc->bsh.maddr + port);
14024 } else {
14025 outb(val, ahc->bsh.ioport + port);
14026 }
14027-#else
14028- outb(val, ahc->bsh.ioport + port);
14029-#endif
14030 mb();
14031 }
14032
14033@@ -668,6 +217,13 @@
14034 *array++ = ahc_inb(ahc, port);
14035 }
14036
14037+static __inline void
14038+ahc_flush_device_writes(struct ahc_softc *ahc)
14039+{
14040+ /* XXX Is this sufficient for all architectures??? */
14041+ ahc_inb(ahc, INTSTAT);
14042+}
14043+
14044 /**************************** Initialization **********************************/
14045 int ahc_linux_register_host(struct ahc_softc *,
14046 Scsi_Host_Template *);
14047@@ -796,54 +352,10 @@
14048 }
14049
14050 /******************************* PCI Definitions ******************************/
14051-/*
14052- * PCIM_xxx: mask to locate subfield in register
14053- * PCIR_xxx: config register offset
14054- * PCIC_xxx: device class
14055- * PCIS_xxx: device subclass
14056- * PCIP_xxx: device programming interface
14057- * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
14058- * PCID_xxx: device ID
14059- */
14060-#define PCIR_DEVVENDOR 0x00
14061-#define PCIR_VENDOR 0x00
14062-#define PCIR_DEVICE 0x02
14063-#define PCIR_COMMAND 0x04
14064-#define PCIM_CMD_PORTEN 0x0001
14065-#define PCIM_CMD_MEMEN 0x0002
14066-#define PCIM_CMD_BUSMASTEREN 0x0004
14067-#define PCIM_CMD_MWRICEN 0x0010
14068-#define PCIM_CMD_PERRESPEN 0x0040
14069-#define PCIM_CMD_SERRESPEN 0x0100
14070-#define PCIR_STATUS 0x06
14071-#define PCIR_REVID 0x08
14072-#define PCIR_PROGIF 0x09
14073-#define PCIR_SUBCLASS 0x0a
14074-#define PCIR_CLASS 0x0b
14075-#define PCIR_CACHELNSZ 0x0c
14076-#define PCIR_LATTIMER 0x0d
14077-#define PCIR_HEADERTYPE 0x0e
14078-#define PCIM_MFDEV 0x80
14079-#define PCIR_BIST 0x0f
14080-#define PCIR_CAP_PTR 0x34
14081-
14082-/* config registers for header type 0 devices */
14083-#define PCIR_MAPS 0x10
14084-#define PCIR_SUBVEND_0 0x2c
14085-#define PCIR_SUBDEV_0 0x2e
14086-
14087 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
14088 extern struct pci_driver aic7xxx_pci_driver;
14089 #endif
14090
14091-typedef enum
14092-{
14093- AHC_POWER_STATE_D0,
14094- AHC_POWER_STATE_D1,
14095- AHC_POWER_STATE_D2,
14096- AHC_POWER_STATE_D3
14097-} ahc_power_state;
14098-
14099 /**************************** VL/EISA Routines ********************************/
14100 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) \
14101 && (defined(__i386__) || defined(__alpha__)) \
14102@@ -862,118 +374,12 @@
14103
14104 /******************************* PCI Routines *********************************/
14105 #ifdef CONFIG_PCI
14106-void ahc_power_state_change(struct ahc_softc *ahc,
14107- ahc_power_state new_state);
14108 int ahc_linux_pci_init(void);
14109 void ahc_linux_pci_exit(void);
14110 int ahc_pci_map_registers(struct ahc_softc *ahc);
14111 int ahc_pci_map_int(struct ahc_softc *ahc);
14112+#endif
14113
14114-static __inline uint32_t ahc_pci_read_config(ahc_dev_softc_t pci,
14115- int reg, int width);
14116-
14117-static __inline uint32_t
14118-ahc_pci_read_config(ahc_dev_softc_t pci, int reg, int width)
14119-{
14120- switch (width) {
14121- case 1:
14122- {
14123- uint8_t retval;
14124-
14125- pci_read_config_byte(pci, reg, &retval);
14126- return (retval);
14127- }
14128- case 2:
14129- {
14130- uint16_t retval;
14131- pci_read_config_word(pci, reg, &retval);
14132- return (retval);
14133- }
14134- case 4:
14135- {
14136- uint32_t retval;
14137- pci_read_config_dword(pci, reg, &retval);
14138- return (retval);
14139- }
14140- default:
14141- panic("ahc_pci_read_config: Read size too big");
14142- /* NOTREACHED */
14143- return (0);
14144- }
14145-}
14146-
14147-static __inline void ahc_pci_write_config(ahc_dev_softc_t pci,
14148- int reg, uint32_t value,
14149- int width);
14150-
14151-static __inline void
14152-ahc_pci_write_config(ahc_dev_softc_t pci, int reg, uint32_t value, int width)
14153-{
14154- switch (width) {
14155- case 1:
14156- pci_write_config_byte(pci, reg, value);
14157- break;
14158- case 2:
14159- pci_write_config_word(pci, reg, value);
14160- break;
14161- case 4:
14162- pci_write_config_dword(pci, reg, value);
14163- break;
14164- default:
14165- panic("ahc_pci_write_config: Write size too big");
14166- /* NOTREACHED */
14167- }
14168-}
14169-
14170-static __inline int ahc_get_pci_function(ahc_dev_softc_t);
14171-static __inline int
14172-ahc_get_pci_function(ahc_dev_softc_t pci)
14173-{
14174- return (PCI_FUNC(pci->devfn));
14175-}
14176-
14177-static __inline int ahc_get_pci_slot(ahc_dev_softc_t);
14178-static __inline int
14179-ahc_get_pci_slot(ahc_dev_softc_t pci)
14180-{
14181- return (PCI_SLOT(pci->devfn));
14182-}
14183-
14184-static __inline int ahc_get_pci_bus(ahc_dev_softc_t);
14185-static __inline int
14186-ahc_get_pci_bus(ahc_dev_softc_t pci)
14187-{
14188- return (pci->bus->number);
14189-}
14190-#endif
14191-
14192-static __inline void ahc_flush_device_writes(struct ahc_softc *);
14193-static __inline void
14194-ahc_flush_device_writes(struct ahc_softc *ahc)
14195-{
14196- /* XXX Is this sufficient for all architectures??? */
14197- ahc_inb(ahc, INTSTAT);
14198-}
14199-
14200-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,3,0)
14201-#define pci_map_sg(pdev, sg_list, nseg, direction) (nseg)
14202-#define pci_unmap_sg(pdev, sg_list, nseg, direction)
14203-#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
14204-#define sg_dma_len(sg) ((sg)->length)
14205-#define pci_map_single(pdev, buffer, bufflen, direction) \
14206- (VIRT_TO_BUS(buffer))
14207-#define pci_unmap_single(pdev, buffer, buflen, direction)
14208-#endif
14209-
14210-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
14211-#define ahc_pci_set_dma_mask pci_set_dma_mask
14212-#else
14213-/*
14214- * Always "return" 0 for success.
14215- */
14216-#define ahc_pci_set_dma_mask(dev_softc, mask) \
14217- (((dev_softc)->dma_mask = mask) && 0)
14218-#endif
14219 /**************************** Proc FS Support *********************************/
14220 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
14221 int ahc_linux_proc_info(char *, char **, off_t, int, int, int);
14222@@ -989,194 +395,9 @@
14223 && (ahc)->platform_data->qfrozen == 1)
14224
14225 /*********************** Transaction Access Wrappers *************************/
14226-static __inline void ahc_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
14227-static __inline void ahc_set_transaction_status(struct scb *, uint32_t);
14228-static __inline void ahc_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
14229-static __inline void ahc_set_scsi_status(struct scb *, uint32_t);
14230-static __inline uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd);
14231-static __inline uint32_t ahc_get_transaction_status(struct scb *);
14232-static __inline uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd);
14233-static __inline uint32_t ahc_get_scsi_status(struct scb *);
14234-static __inline void ahc_set_transaction_tag(struct scb *, int, u_int);
14235-static __inline u_long ahc_get_transfer_length(struct scb *);
14236-static __inline int ahc_get_transfer_dir(struct scb *);
14237-static __inline void ahc_set_residual(struct scb *, u_long);
14238-static __inline void ahc_set_sense_residual(struct scb *scb, u_long resid);
14239-static __inline u_long ahc_get_residual(struct scb *);
14240-static __inline u_long ahc_get_sense_residual(struct scb *);
14241-static __inline int ahc_perform_autosense(struct scb *);
14242-static __inline uint32_t ahc_get_sense_bufsize(struct ahc_softc *,
14243- struct scb *);
14244-static __inline void ahc_notify_xfer_settings_change(struct ahc_softc *,
14245- struct ahc_devinfo *);
14246-static __inline void ahc_platform_scb_free(struct ahc_softc *ahc,
14247- struct scb *scb);
14248-static __inline void ahc_freeze_scb(struct scb *scb);
14249-
14250-static __inline
14251-void ahc_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
14252-{
14253- cmd->result &= ~(CAM_STATUS_MASK << 16);
14254- cmd->result |= status << 16;
14255-}
14256-
14257-static __inline
14258-void ahc_set_transaction_status(struct scb *scb, uint32_t status)
14259-{
14260- ahc_cmd_set_transaction_status(scb->io_ctx,status);
14261-}
14262-
14263-static __inline
14264-void ahc_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
14265-{
14266- cmd->result &= ~0xFFFF;
14267- cmd->result |= status;
14268-}
14269-
14270-static __inline
14271-void ahc_set_scsi_status(struct scb *scb, uint32_t status)
14272-{
14273- ahc_cmd_set_scsi_status(scb->io_ctx, status);
14274-}
14275-
14276-static __inline
14277-uint32_t ahc_cmd_get_transaction_status(Scsi_Cmnd *cmd)
14278-{
14279- return ((cmd->result >> 16) & CAM_STATUS_MASK);
14280-}
14281-
14282-static __inline
14283-uint32_t ahc_get_transaction_status(struct scb *scb)
14284-{
14285- return (ahc_cmd_get_transaction_status(scb->io_ctx));
14286-}
14287-
14288-static __inline
14289-uint32_t ahc_cmd_get_scsi_status(Scsi_Cmnd *cmd)
14290-{
14291- return (cmd->result & 0xFFFF);
14292-}
14293-
14294-static __inline
14295-uint32_t ahc_get_scsi_status(struct scb *scb)
14296-{
14297- return (ahc_cmd_get_scsi_status(scb->io_ctx));
14298-}
14299-
14300-static __inline
14301-void ahc_set_transaction_tag(struct scb *scb, int enabled, u_int type)
14302-{
14303- /*
14304- * Nothing to do for linux as the incoming transaction
14305- * has no concept of tag/non tagged, etc.
14306- */
14307-}
14308-
14309-static __inline
14310-u_long ahc_get_transfer_length(struct scb *scb)
14311-{
14312- return (scb->platform_data->xfer_len);
14313-}
14314-
14315-static __inline
14316-int ahc_get_transfer_dir(struct scb *scb)
14317-{
14318-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40)
14319- return (scb->io_ctx->sc_data_direction);
14320-#else
14321- if (scb->io_ctx->bufflen == 0)
14322- return (CAM_DIR_NONE);
14323-
14324- switch(scb->io_ctx->cmnd[0]) {
14325- case 0x08: /* READ(6) */
14326- case 0x28: /* READ(10) */
14327- case 0xA8: /* READ(12) */
14328- return (CAM_DIR_IN);
14329- case 0x0A: /* WRITE(6) */
14330- case 0x2A: /* WRITE(10) */
14331- case 0xAA: /* WRITE(12) */
14332- return (CAM_DIR_OUT);
14333- default:
14334- return (CAM_DIR_NONE);
14335- }
14336-#endif
14337-}
14338-
14339-static __inline
14340-void ahc_set_residual(struct scb *scb, u_long resid)
14341-{
14342-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
14343- scb->io_ctx->resid = resid;
14344-#else
14345- scb->platform_data->resid = resid;
14346-#endif
14347-}
14348-
14349-static __inline
14350-void ahc_set_sense_residual(struct scb *scb, u_long resid)
14351-{
14352- scb->platform_data->sense_resid = resid;
14353-}
14354-
14355-static __inline
14356-u_long ahc_get_residual(struct scb *scb)
14357-{
14358-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
14359- return (scb->io_ctx->resid);
14360-#else
14361- return (scb->platform_data->resid);
14362-#endif
14363-}
14364-
14365-static __inline
14366-u_long ahc_get_sense_residual(struct scb *scb)
14367-{
14368- return (scb->platform_data->sense_resid);
14369-}
14370-
14371-static __inline
14372-int ahc_perform_autosense(struct scb *scb)
14373-{
14374- /*
14375- * We always perform autosense in Linux.
14376- * On other platforms this is set on a
14377- * per-transaction basis.
14378- */
14379- return (1);
14380-}
14381-
14382-static __inline uint32_t
14383-ahc_get_sense_bufsize(struct ahc_softc *ahc, struct scb *scb)
14384-{
14385- return (sizeof(struct scsi_sense_data));
14386-}
14387-
14388-static __inline void
14389-ahc_notify_xfer_settings_change(struct ahc_softc *ahc,
14390- struct ahc_devinfo *devinfo)
14391-{
14392- /* Nothing to do here for linux */
14393-}
14394-
14395-static __inline void
14396-ahc_platform_scb_free(struct ahc_softc *ahc, struct scb *scb)
14397-{
14398- ahc->flags &= ~AHC_RESOURCE_SHORTAGE;
14399-}
14400-
14401 int ahc_platform_alloc(struct ahc_softc *ahc, void *platform_arg);
14402 void ahc_platform_free(struct ahc_softc *ahc);
14403 void ahc_platform_freeze_devq(struct ahc_softc *ahc, struct scb *scb);
14404-
14405-static __inline void
14406-ahc_freeze_scb(struct scb *scb)
14407-{
14408- if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
14409- scb->io_ctx->result |= CAM_DEV_QFRZN << 16;
14410- scb->platform_data->dev->qfrozen++;
14411- }
14412-}
14413-
14414 void ahc_platform_set_tags(struct ahc_softc *ahc,
14415 struct ahc_devinfo *devinfo, ahc_queue_alg);
14416 int ahc_platform_abort_scbs(struct ahc_softc *ahc, int target,
14417@@ -1193,9 +414,9 @@
14418 void ahc_platform_dump_card_state(struct ahc_softc *ahc);
14419
14420 #ifdef CONFIG_PCI
14421-#define AHC_PCI_CONFIG 1
14422+#define AIC_PCI_CONFIG 1
14423 #else
14424-#define AHC_PCI_CONFIG 0
14425+#define AIC_PCI_CONFIG 0
14426 #endif
14427 #define bootverbose aic7xxx_verbose
14428 extern u_int aic7xxx_verbose;
14429diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c
14430--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c 2004-01-08 11:57:43.029001855 +0100
14431+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_osm_pci.c 2003-12-22 22:46:59.000000000 +0100
14432@@ -36,11 +36,17 @@
14433 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
14434 * POSSIBILITY OF SUCH DAMAGES.
14435 *
14436- * $Id$
14437+ * $Id$
14438 */
14439
14440 #include "aic7xxx_osm.h"
14441
14442+/*
14443+ * Include aiclib_pci.c as part of our
14444+ * "module dependencies are hard" work around.
14445+ */
14446+#include "aiclib_pci.c"
14447+
14448 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0)
14449 struct pci_device_id
14450 {
14451@@ -51,11 +57,9 @@
14452 const struct pci_device_id *ent);
14453 static int ahc_linux_pci_reserve_io_region(struct ahc_softc *ahc,
14454 u_long *base);
14455-#ifdef MMAPIO
14456 static int ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
14457 u_long *bus_addr,
14458 uint8_t **maddr);
14459-#endif /* MMAPIO */
14460 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
14461 static void ahc_linux_pci_dev_remove(struct pci_dev *pdev);
14462
14463@@ -75,10 +79,10 @@
14464 MODULE_DEVICE_TABLE(pci, ahc_linux_pci_id_table);
14465
14466 struct pci_driver aic7xxx_pci_driver = {
14467- name: "aic7xxx",
14468- probe: ahc_linux_pci_dev_probe,
14469- remove: ahc_linux_pci_dev_remove,
14470- id_table: ahc_linux_pci_id_table
14471+ .name = "aic7xxx",
14472+ .probe = ahc_linux_pci_dev_probe,
14473+ .remove = ahc_linux_pci_dev_remove,
14474+ .id_table = ahc_linux_pci_id_table
14475 };
14476
14477 static void
14478@@ -97,12 +101,14 @@
14479 if (ahc != NULL) {
14480 u_long s;
14481
14482+ TAILQ_REMOVE(&ahc_tailq, ahc, links);
14483+ ahc_list_unlock(&l);
14484 ahc_lock(ahc, &s);
14485 ahc_intr_enable(ahc, FALSE);
14486 ahc_unlock(ahc, &s);
14487 ahc_free(ahc);
14488- }
14489- ahc_list_unlock(&l);
14490+ } else
14491+ ahc_list_unlock(&l);
14492 }
14493 #endif /* !LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) */
14494
14495@@ -112,7 +118,7 @@
14496 char buf[80];
14497 bus_addr_t mask_39bit;
14498 struct ahc_softc *ahc;
14499- ahc_dev_softc_t pci;
14500+ aic_dev_softc_t dev;
14501 struct ahc_pci_identity *entry;
14502 char *name;
14503 int error;
14504@@ -123,7 +129,7 @@
14505 TAILQ_FOREACH(ahc, &ahc_tailq, links) {
14506 struct pci_dev *probed_pdev;
14507
14508- probed_pdev = ahc->dev_softc;
14509+ probed_pdev = aic_dev_to_pci_dev(ahc->dev_softc);
14510 if (probed_pdev->bus->number == pdev->bus->number
14511 && probed_pdev->devfn == pdev->devfn)
14512 break;
14513@@ -133,8 +139,8 @@
14514 return (-ENODEV);
14515 }
14516
14517- pci = pdev;
14518- entry = ahc_find_pci_device(pci);
14519+ dev = aic_pci_dev_to_dev(pdev);
14520+ entry = ahc_find_pci_device(dev);
14521 if (entry == NULL)
14522 return (-ENODEV);
14523
14524@@ -144,9 +150,9 @@
14525 * common detect routine.
14526 */
14527 sprintf(buf, "ahc_pci:%d:%d:%d",
14528- ahc_get_pci_bus(pci),
14529- ahc_get_pci_slot(pci),
14530- ahc_get_pci_function(pci));
14531+ aic_get_pci_bus(dev),
14532+ aic_get_pci_slot(dev),
14533+ aic_get_pci_function(dev));
14534 name = malloc(strlen(buf) + 1, M_DEVBUF, M_NOWAIT);
14535 if (name == NULL)
14536 return (-ENOMEM);
14537@@ -154,6 +160,8 @@
14538 ahc = ahc_alloc(NULL, name);
14539 if (ahc == NULL)
14540 return (-ENOMEM);
14541+ ahc->dev_softc = dev;
14542+
14543 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
14544 if (pci_enable_device(pdev)) {
14545 ahc_free(ahc);
14546@@ -164,15 +172,14 @@
14547 mask_39bit = (bus_addr_t)0x7FFFFFFFFFULL;
14548 if (sizeof(bus_addr_t) > 4
14549 && ahc_linux_get_memsize() > 0x80000000
14550- && ahc_pci_set_dma_mask(pdev, mask_39bit) == 0) {
14551+ && aic_set_dma_mask(ahc, mask_39bit) == 0) {
14552 ahc->flags |= AHC_39BIT_ADDRESSING;
14553 ahc->platform_data->hw_dma_mask = mask_39bit;
14554 } else {
14555- ahc_pci_set_dma_mask(pdev, 0xFFFFFFFF);
14556+ aic_set_dma_mask(ahc, 0xFFFFFFFF);
14557 ahc->platform_data->hw_dma_mask = 0xFFFFFFFF;
14558 }
14559 #endif
14560- ahc->dev_softc = pci;
14561 error = ahc_pci_config(ahc, entry);
14562 if (error != 0) {
14563 ahc_free(ahc);
14564@@ -211,10 +218,8 @@
14565 pdev = NULL;
14566 class = PCI_CLASS_STORAGE_SCSI << 8;
14567 while ((pdev = pci_find_class(class, pdev)) != NULL) {
14568- ahc_dev_softc_t pci;
14569 int error;
14570
14571- pci = pdev;
14572 error = ahc_linux_pci_dev_probe(pdev, /*pci_devid*/NULL);
14573 if (error == 0)
14574 found++;
14575@@ -236,9 +241,9 @@
14576 return (ENOMEM);
14577
14578 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
14579- *base = pci_resource_start(ahc->dev_softc, 0);
14580+ *base = pci_resource_start(aic_pci_dev(ahc), 0);
14581 #else
14582- *base = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
14583+ *base = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS, 4);
14584 *base &= PCI_BASE_ADDRESS_IO_MASK;
14585 #endif
14586 if (*base == 0)
14587@@ -254,7 +259,6 @@
14588 return (0);
14589 }
14590
14591-#ifdef MMAPIO
14592 static int
14593 ahc_linux_pci_reserve_mem_region(struct ahc_softc *ahc,
14594 u_long *bus_addr,
14595@@ -267,11 +271,11 @@
14596
14597 error = 0;
14598 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
14599- start = pci_resource_start(ahc->dev_softc, 1);
14600+ start = pci_resource_start(aic_pci_dev(ahc), 1);
14601 base_page = start & PAGE_MASK;
14602 base_offset = start - base_page;
14603 #else
14604- start = ahc_pci_read_config(ahc->dev_softc, PCIR_MAPS+4, 4);
14605+ start = aic_pci_read_config(ahc->dev_softc, PCIR_MAPS+4, 4);
14606 base_offset = start & PCI_BASE_ADDRESS_MEM_MASK;
14607 base_page = base_offset & PAGE_MASK;
14608 base_offset -= base_page;
14609@@ -296,7 +300,6 @@
14610 error = ENOMEM;
14611 return (error);
14612 }
14613-#endif /* MMAPIO */
14614
14615 int
14616 ahc_pci_map_registers(struct ahc_softc *ahc)
14617@@ -309,17 +312,16 @@
14618 /*
14619 * If its allowed, we prefer memory mapped access.
14620 */
14621- command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
14622+ command = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, 4);
14623 command &= ~(PCIM_CMD_PORTEN|PCIM_CMD_MEMEN);
14624 base = 0;
14625 maddr = NULL;
14626-#ifdef MMAPIO
14627 error = ahc_linux_pci_reserve_mem_region(ahc, &base, &maddr);
14628 if (error == 0) {
14629 ahc->platform_data->mem_busaddr = base;
14630 ahc->tag = BUS_SPACE_MEMIO;
14631 ahc->bsh.maddr = maddr;
14632- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
14633+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
14634 command | PCIM_CMD_MEMEN, 4);
14635
14636 /*
14637@@ -330,9 +332,9 @@
14638
14639 printf("aic7xxx: PCI Device %d:%d:%d "
14640 "failed memory mapped test. Using PIO.\n",
14641- ahc_get_pci_bus(ahc->dev_softc),
14642- ahc_get_pci_slot(ahc->dev_softc),
14643- ahc_get_pci_function(ahc->dev_softc));
14644+ aic_get_pci_bus(ahc->dev_softc),
14645+ aic_get_pci_slot(ahc->dev_softc),
14646+ aic_get_pci_function(ahc->dev_softc));
14647 iounmap((void *)((u_long)maddr & PAGE_MASK));
14648 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
14649 release_mem_region(ahc->platform_data->mem_busaddr,
14650@@ -345,12 +347,11 @@
14651 } else {
14652 printf("aic7xxx: PCI%d:%d:%d MEM region 0x%lx "
14653 "unavailable. Cannot memory map device.\n",
14654- ahc_get_pci_bus(ahc->dev_softc),
14655- ahc_get_pci_slot(ahc->dev_softc),
14656- ahc_get_pci_function(ahc->dev_softc),
14657+ aic_get_pci_bus(ahc->dev_softc),
14658+ aic_get_pci_slot(ahc->dev_softc),
14659+ aic_get_pci_function(ahc->dev_softc),
14660 base);
14661 }
14662-#endif /* MMAPIO */
14663
14664 /*
14665 * We always prefer memory mapped access.
14666@@ -358,20 +359,20 @@
14667 if (maddr == NULL) {
14668
14669 error = ahc_linux_pci_reserve_io_region(ahc, &base);
14670- if (error == 0) {
14671+ if (error == 0 && ahc_pci_test_register_access(ahc) == 0) {
14672 ahc->tag = BUS_SPACE_PIO;
14673 ahc->bsh.ioport = base;
14674 command |= PCIM_CMD_PORTEN;
14675 } else {
14676 printf("aic7xxx: PCI%d:%d:%d IO region 0x%lx[0..255] "
14677 "unavailable. Cannot map device.\n",
14678- ahc_get_pci_bus(ahc->dev_softc),
14679- ahc_get_pci_slot(ahc->dev_softc),
14680- ahc_get_pci_function(ahc->dev_softc),
14681+ aic_get_pci_bus(ahc->dev_softc),
14682+ aic_get_pci_slot(ahc->dev_softc),
14683+ aic_get_pci_function(ahc->dev_softc),
14684 base);
14685 }
14686 }
14687- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4);
14688+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, 4);
14689 return (error);
14690 }
14691
14692@@ -380,49 +381,10 @@
14693 {
14694 int error;
14695
14696- error = request_irq(ahc->dev_softc->irq, ahc_linux_isr,
14697+ error = request_irq(aic_pci_dev(ahc)->irq, ahc_linux_isr,
14698 SA_SHIRQ, "aic7xxx", ahc);
14699 if (error == 0)
14700- ahc->platform_data->irq = ahc->dev_softc->irq;
14701+ ahc->platform_data->irq = aic_pci_dev(ahc)->irq;
14702
14703 return (-error);
14704 }
14705-
14706-void
14707-ahc_power_state_change(struct ahc_softc *ahc, ahc_power_state new_state)
14708-{
14709-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
14710- pci_set_power_state(ahc->dev_softc, new_state);
14711-#else
14712- uint32_t cap;
14713- u_int cap_offset;
14714-
14715- /*
14716- * Traverse the capability list looking for
14717- * the power management capability.
14718- */
14719- cap = 0;
14720- cap_offset = ahc_pci_read_config(ahc->dev_softc,
14721- PCIR_CAP_PTR, /*bytes*/1);
14722- while (cap_offset != 0) {
14723-
14724- cap = ahc_pci_read_config(ahc->dev_softc,
14725- cap_offset, /*bytes*/4);
14726- if ((cap & 0xFF) == 1
14727- && ((cap >> 16) & 0x3) > 0) {
14728- uint32_t pm_control;
14729-
14730- pm_control = ahc_pci_read_config(ahc->dev_softc,
14731- cap_offset + 4,
14732- /*bytes*/4);
14733- pm_control &= ~0x3;
14734- pm_control |= new_state;
14735- ahc_pci_write_config(ahc->dev_softc,
14736- cap_offset + 4,
14737- pm_control, /*bytes*/2);
14738- break;
14739- }
14740- cap_offset = (cap >> 8) & 0xFF;
14741- }
14742-#endif
14743-}
14744diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_pci.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_pci.c
14745--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_pci.c 2004-01-08 11:57:43.028002061 +0100
14746+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_pci.c 2003-12-22 22:46:59.000000000 +0100
14747@@ -39,9 +39,7 @@
14748 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
14749 * POSSIBILITY OF SUCH DAMAGES.
14750 *
14751- * $Id$
14752- *
14753- * $FreeBSD$
14754+ * $Id$
14755 */
14756
14757 #ifdef __linux__
14758@@ -49,14 +47,13 @@
14759 #include "aic7xxx_inline.h"
14760 #include "aic7xxx_93cx6.h"
14761 #else
14762+
14763+
14764 #include <dev/aic7xxx/aic7xxx_osm.h>
14765 #include <dev/aic7xxx/aic7xxx_inline.h>
14766 #include <dev/aic7xxx/aic7xxx_93cx6.h>
14767 #endif
14768
14769-#define AHC_PCI_IOADDR PCIR_MAPS /* I/O Address */
14770-#define AHC_PCI_MEMADDR (PCIR_MAPS + 4) /* Mem I/O Address */
14771-
14772 static __inline uint64_t
14773 ahc_compose_id(u_int device, u_int vendor, u_int subdevice, u_int subvendor)
14774 {
14775@@ -133,6 +130,7 @@
14776 #define ID_AHA_29160C 0x0080900562209005ull
14777 #define ID_AHA_29160B 0x00809005E2209005ull
14778 #define ID_AHA_19160B 0x0081900562A19005ull
14779+#define ID_AHA_2915_30LP 0x0082900502109005ull
14780
14781 #define ID_AIC7896 0x005F9005FFFF9005ull
14782 #define ID_AIC7896_ARO 0x00539005FFFF9005ull
14783@@ -470,6 +468,12 @@
14784 "Adaptec aic7892 Ultra160 SCSI adapter (ARO)",
14785 ahc_aic7892_setup
14786 },
14787+ {
14788+ ID_AHA_2915_30LP,
14789+ ID_ALL_MASK,
14790+ "Adaptec 2915/30LP Ultra160 SCSI adapter",
14791+ ahc_aic7892_setup
14792+ },
14793 /* aic7895 based controllers */
14794 {
14795 ID_AHA_2940U_DUAL,
14796@@ -738,7 +742,7 @@
14797 }
14798
14799 struct ahc_pci_identity *
14800-ahc_find_pci_device(ahc_dev_softc_t pci)
14801+ahc_find_pci_device(aic_dev_softc_t pci)
14802 {
14803 uint64_t full_id;
14804 uint16_t device;
14805@@ -748,10 +752,10 @@
14806 struct ahc_pci_identity *entry;
14807 u_int i;
14808
14809- vendor = ahc_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
14810- device = ahc_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
14811- subvendor = ahc_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
14812- subdevice = ahc_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
14813+ vendor = aic_pci_read_config(pci, PCIR_DEVVENDOR, /*bytes*/2);
14814+ device = aic_pci_read_config(pci, PCIR_DEVICE, /*bytes*/2);
14815+ subvendor = aic_pci_read_config(pci, PCIR_SUBVEND_0, /*bytes*/2);
14816+ subdevice = aic_pci_read_config(pci, PCIR_SUBDEV_0, /*bytes*/2);
14817 full_id = ahc_compose_id(device, vendor, subdevice, subvendor);
14818
14819 /*
14820@@ -761,7 +765,7 @@
14821 * to sanity check it prior to accepting the subdevice
14822 * ID as valid.
14823 */
14824- if (ahc_get_pci_function(pci) > 0
14825+ if (aic_get_pci_function(pci) > 0
14826 && ahc_9005_subdevinfo_valid(vendor, device, subvendor, subdevice)
14827 && SUBID_9005_MFUNCENB(subdevice) == 0)
14828 return (NULL);
14829@@ -798,7 +802,7 @@
14830 ahc->chip |= AHC_PCI;
14831 ahc->description = entry->name;
14832
14833- ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
14834+ aic_power_state_change(ahc, AIC_POWER_STATE_D0);
14835
14836 error = ahc_pci_map_registers(ahc);
14837 if (error != 0)
14838@@ -812,7 +816,7 @@
14839 */
14840 ahc_intr_enable(ahc, FALSE);
14841
14842- devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
14843+ devconfig = aic_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
14844
14845 /*
14846 * If we need to support high memory, enable dual
14847@@ -831,13 +835,13 @@
14848 /* Ensure that pci error generation, a test feature, is disabled. */
14849 devconfig |= PCIERRGENDIS;
14850
14851- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
14852+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
14853
14854 /* Ensure busmastering is enabled */
14855- command = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
14856+ command = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
14857 command |= PCIM_CMD_BUSMASTEREN;
14858
14859- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
14860+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, command, /*bytes*/2);
14861
14862 /* On all PCI adapters, we allow SCB paging */
14863 ahc->flags |= AHC_PAGESCBS;
14864@@ -920,14 +924,14 @@
14865 ahc_outb(ahc, DSCOMMAND0, dscommand0);
14866
14867 ahc->pci_cachesize =
14868- ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME,
14869+ aic_pci_read_config(ahc->dev_softc, CSIZE_LATTIME,
14870 /*bytes*/1) & CACHESIZE;
14871 ahc->pci_cachesize *= 4;
14872
14873 if ((ahc->bugs & AHC_PCI_2_1_RETRY_BUG) != 0
14874 && ahc->pci_cachesize == 4) {
14875
14876- ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
14877+ aic_pci_write_config(ahc->dev_softc, CSIZE_LATTIME,
14878 0, /*bytes*/1);
14879 ahc->pci_cachesize = 0;
14880 }
14881@@ -939,7 +943,7 @@
14882 if ((ahc->features & AHC_ULTRA) != 0) {
14883 uint32_t devconfig;
14884
14885- devconfig = ahc_pci_read_config(ahc->dev_softc,
14886+ devconfig = aic_pci_read_config(ahc->dev_softc,
14887 DEVCONFIG, /*bytes*/4);
14888 if ((devconfig & REXTVALID) == 0)
14889 ahc->features &= ~AHC_ULTRA;
14890@@ -1005,11 +1009,11 @@
14891 * that occur during runtime and resume events.
14892 */
14893 ahc->bus_softc.pci_softc.devconfig =
14894- ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
14895+ aic_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
14896 ahc->bus_softc.pci_softc.command =
14897- ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
14898+ aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1);
14899 ahc->bus_softc.pci_softc.csize_lattime =
14900- ahc_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
14901+ aic_pci_read_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1);
14902 ahc->bus_softc.pci_softc.dscommand0 = ahc_inb(ahc, DSCOMMAND0);
14903 ahc->bus_softc.pci_softc.dspcistatus = ahc_inb(ahc, DSPCISTATUS);
14904 if ((ahc->features & AHC_DT) != 0) {
14905@@ -1063,7 +1067,7 @@
14906 uint32_t devconfig;
14907
14908 chip = ahc->chip & AHC_CHIPID_MASK;
14909- devconfig = ahc_pci_read_config(ahc->dev_softc,
14910+ devconfig = aic_pci_read_config(ahc->dev_softc,
14911 DEVCONFIG, /*bytes*/4);
14912 single_user = (devconfig & MPORTMODE) != 0;
14913
14914@@ -1101,13 +1105,13 @@
14915 * Set the SCB Base addr (highest address bit)
14916 * depending on which channel we are.
14917 */
14918- ahc_outb(ahc, SCBBADDR, ahc_get_pci_function(ahc->dev_softc));
14919+ ahc_outb(ahc, SCBBADDR, aic_get_pci_function(ahc->dev_softc));
14920 }
14921
14922 ahc->flags &= ~AHC_LSCBS_ENABLED;
14923 if (large)
14924 ahc->flags |= AHC_LSCBS_ENABLED;
14925- devconfig = ahc_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
14926+ devconfig = aic_pci_read_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4);
14927 if ((ahc->features & AHC_ULTRA2) != 0) {
14928 u_int dscommand0;
14929
14930@@ -1140,7 +1144,7 @@
14931 else
14932 devconfig &= ~EXTSCBPEN;
14933
14934- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
14935+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG, devconfig, /*bytes*/4);
14936 }
14937
14938 /*
14939@@ -1263,8 +1267,8 @@
14940 * Enable PCI error interrupt status, but suppress NMIs
14941 * generated by SERR raised due to target aborts.
14942 */
14943- cmd = ahc_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
14944- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
14945+ cmd = aic_pci_read_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/2);
14946+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND,
14947 cmd & ~PCIM_CMD_SERRESPEN, /*bytes*/2);
14948
14949 /*
14950@@ -1276,24 +1280,36 @@
14951 * use for this test.
14952 */
14953 hcntrl = ahc_inb(ahc, HCNTRL);
14954+
14955 if (hcntrl == 0xFF)
14956 goto fail;
14957
14958+ if ((hcntrl & CHIPRST) != 0) {
14959+ /*
14960+ * The chip has not been initialized since
14961+ * PCI/EISA/VLB bus reset. Don't trust
14962+ * "left over BIOS data".
14963+ */
14964+ ahc->flags |= AHC_NO_BIOS_INIT;
14965+ }
14966+
14967 /*
14968 * Next create a situation where write combining
14969 * or read prefetching could be initiated by the
14970 * CPU or host bridge. Our device does not support
14971 * either, so look for data corruption and/or flagged
14972- * PCI errors.
14973+ * PCI errors. First pause without causing another
14974+ * chip reset.
14975 */
14976+ hcntrl &= ~CHIPRST;
14977 ahc_outb(ahc, HCNTRL, hcntrl|PAUSE);
14978 while (ahc_is_paused(ahc) == 0)
14979 ;
14980
14981 /* Clear any PCI errors that occurred before our driver attached. */
14982- status1 = ahc_pci_read_config(ahc->dev_softc,
14983+ status1 = aic_pci_read_config(ahc->dev_softc,
14984 PCIR_STATUS + 1, /*bytes*/1);
14985- ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
14986+ aic_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
14987 status1, /*bytes*/1);
14988 ahc_outb(ahc, CLRINT, CLRPARERR);
14989
14990@@ -1303,7 +1319,7 @@
14991 if (ahc_inl(ahc, SCB_BASE) != 0x5aa555aa)
14992 goto fail;
14993
14994- status1 = ahc_pci_read_config(ahc->dev_softc,
14995+ status1 = aic_pci_read_config(ahc->dev_softc,
14996 PCIR_STATUS + 1, /*bytes*/1);
14997 if ((status1 & STA) != 0)
14998 goto fail;
14999@@ -1312,13 +1328,13 @@
15000
15001 fail:
15002 /* Silently clear any latched errors. */
15003- status1 = ahc_pci_read_config(ahc->dev_softc,
15004+ status1 = aic_pci_read_config(ahc->dev_softc,
15005 PCIR_STATUS + 1, /*bytes*/1);
15006- ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
15007+ aic_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
15008 status1, /*bytes*/1);
15009 ahc_outb(ahc, CLRINT, CLRPARERR);
15010 ahc_outb(ahc, SEQCTL, PERRORDIS|FAILDIS);
15011- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
15012+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, cmd, /*bytes*/2);
15013 return (error);
15014 }
15015
15016@@ -1388,6 +1404,10 @@
15017 sd.sd_chip = C56_66;
15018 }
15019 ahc_release_seeprom(&sd);
15020+
15021+ /* Remember the SEEPROM type for later */
15022+ if (sd.sd_chip == C56_66)
15023+ ahc->flags |= AHC_LARGE_SEEPROM;
15024 }
15025
15026 if (!have_seeprom) {
15027@@ -1573,12 +1593,12 @@
15028 uint32_t devconfig;
15029
15030 /* Honor the STPWLEVEL settings */
15031- devconfig = ahc_pci_read_config(ahc->dev_softc,
15032+ devconfig = aic_pci_read_config(ahc->dev_softc,
15033 DEVCONFIG, /*bytes*/4);
15034 devconfig &= ~STPWLEVEL;
15035 if ((sc->bios_control & CFSTPWLEVEL) != 0)
15036 devconfig |= STPWLEVEL;
15037- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG,
15038+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG,
15039 devconfig, /*bytes*/4);
15040 }
15041 /* Set SCSICONF info */
15042@@ -1891,10 +1911,10 @@
15043 ahc_outb(ahc, SPIOCAP, spiocap);
15044 ahc_outb(ahc, BRDCTL, BRDRW|BRDCS);
15045 ahc_flush_device_writes(ahc);
15046- ahc_delay(500);
15047+ aic_delay(500);
15048 ahc_outb(ahc, BRDCTL, 0);
15049 ahc_flush_device_writes(ahc);
15050- ahc_delay(500);
15051+ aic_delay(500);
15052 brdctl = ahc_inb(ahc, BRDCTL);
15053 *internal50_present = (brdctl & BRDDAT5) ? 0 : 1;
15054 *externalcable_present = (brdctl & BRDDAT6) ? 0 : 1;
15055@@ -1920,7 +1940,7 @@
15056 SEEPROM_OUTB(sd, sd->sd_MS);
15057 wait = 1000; /* 1 second timeout in msec */
15058 while (--wait && ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0)) {
15059- ahc_delay(1000); /* delay 1 msec */
15060+ aic_delay(1000); /* delay 1 msec */
15061 }
15062 if ((SEEPROM_STATUS_INB(sd) & sd->sd_RDY) == 0) {
15063 SEEPROM_OUTB(sd, 0);
15064@@ -2000,7 +2020,7 @@
15065 if ((error & PCIERRSTAT) == 0)
15066 return;
15067
15068- status1 = ahc_pci_read_config(ahc->dev_softc,
15069+ status1 = aic_pci_read_config(ahc->dev_softc,
15070 PCIR_STATUS + 1, /*bytes*/1);
15071
15072 printf("%s: PCI error Interrupt at seqaddr = 0x%x\n",
15073@@ -2030,7 +2050,7 @@
15074 }
15075
15076 /* Clear latched errors. */
15077- ahc_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
15078+ aic_pci_write_config(ahc->dev_softc, PCIR_STATUS + 1,
15079 status1, /*bytes*/1);
15080
15081 if ((status1 & (DPE|SSE|RMA|RTA|STA|DPR)) == 0) {
15082@@ -2091,7 +2111,7 @@
15083 ahc_pci_resume(struct ahc_softc *ahc)
15084 {
15085
15086- ahc_power_state_change(ahc, AHC_POWER_STATE_D0);
15087+ aic_power_state_change(ahc, AIC_POWER_STATE_D0);
15088
15089 /*
15090 * We assume that the OS has restored our register
15091@@ -2099,11 +2119,11 @@
15092 * that the OS doesn't know about and rely on our chip
15093 * reset handler to handle the rest.
15094 */
15095- ahc_pci_write_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4,
15096+ aic_pci_write_config(ahc->dev_softc, DEVCONFIG, /*bytes*/4,
15097 ahc->bus_softc.pci_softc.devconfig);
15098- ahc_pci_write_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1,
15099+ aic_pci_write_config(ahc->dev_softc, PCIR_COMMAND, /*bytes*/1,
15100 ahc->bus_softc.pci_softc.command);
15101- ahc_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1,
15102+ aic_pci_write_config(ahc->dev_softc, CSIZE_LATTIME, /*bytes*/1,
15103 ahc->bus_softc.pci_softc.csize_lattime);
15104 if ((ahc->flags & AHC_HAS_TERM_LOGIC) != 0) {
15105 struct seeprom_descriptor sd;
15106@@ -2126,7 +2146,7 @@
15107 static int
15108 ahc_aic785X_setup(struct ahc_softc *ahc)
15109 {
15110- ahc_dev_softc_t pci;
15111+ aic_dev_softc_t pci;
15112 uint8_t rev;
15113
15114 pci = ahc->dev_softc;
15115@@ -2134,7 +2154,7 @@
15116 ahc->chip = AHC_AIC7850;
15117 ahc->features = AHC_AIC7850_FE;
15118 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
15119- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15120+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15121 if (rev >= 1)
15122 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
15123 ahc->instruction_ram_size = 512;
15124@@ -2144,7 +2164,7 @@
15125 static int
15126 ahc_aic7860_setup(struct ahc_softc *ahc)
15127 {
15128- ahc_dev_softc_t pci;
15129+ aic_dev_softc_t pci;
15130 uint8_t rev;
15131
15132 pci = ahc->dev_softc;
15133@@ -2152,7 +2172,7 @@
15134 ahc->chip = AHC_AIC7860;
15135 ahc->features = AHC_AIC7860_FE;
15136 ahc->bugs |= AHC_TMODE_WIDEODD_BUG|AHC_CACHETHEN_BUG|AHC_PCI_MWI_BUG;
15137- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15138+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15139 if (rev >= 1)
15140 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
15141 ahc->instruction_ram_size = 512;
15142@@ -2219,7 +2239,7 @@
15143 static int
15144 ahc_aic7880_setup(struct ahc_softc *ahc)
15145 {
15146- ahc_dev_softc_t pci;
15147+ aic_dev_softc_t pci;
15148 uint8_t rev;
15149
15150 pci = ahc->dev_softc;
15151@@ -2227,7 +2247,7 @@
15152 ahc->chip = AHC_AIC7880;
15153 ahc->features = AHC_AIC7880_FE;
15154 ahc->bugs |= AHC_TMODE_WIDEODD_BUG;
15155- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15156+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15157 if (rev >= 1) {
15158 ahc->bugs |= AHC_PCI_2_1_RETRY_BUG;
15159 } else {
15160@@ -2270,7 +2290,7 @@
15161 static int
15162 ahc_aic7890_setup(struct ahc_softc *ahc)
15163 {
15164- ahc_dev_softc_t pci;
15165+ aic_dev_softc_t pci;
15166 uint8_t rev;
15167
15168 pci = ahc->dev_softc;
15169@@ -2278,7 +2298,7 @@
15170 ahc->chip = AHC_AIC7890;
15171 ahc->features = AHC_AIC7890_FE;
15172 ahc->flags |= AHC_NEWEEPROM_FMT;
15173- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15174+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15175 if (rev == 0)
15176 ahc->bugs |= AHC_AUTOFLUSH_BUG|AHC_CACHETHEN_BUG;
15177 ahc->instruction_ram_size = 768;
15178@@ -2301,15 +2321,15 @@
15179 static int
15180 ahc_aic7895_setup(struct ahc_softc *ahc)
15181 {
15182- ahc_dev_softc_t pci;
15183+ aic_dev_softc_t pci;
15184 uint8_t rev;
15185
15186 pci = ahc->dev_softc;
15187- ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
15188+ ahc->channel = aic_get_pci_function(pci) == 1 ? 'B' : 'A';
15189 /*
15190 * The 'C' revision of the aic7895 has a few additional features.
15191 */
15192- rev = ahc_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15193+ rev = aic_pci_read_config(pci, PCIR_REVID, /*bytes*/1);
15194 if (rev >= 4) {
15195 ahc->chip = AHC_AIC7895C;
15196 ahc->features = AHC_AIC7895C_FE;
15197@@ -2325,9 +2345,9 @@
15198 * we have. Disabling MWI reduces performance, so
15199 * turn it on again.
15200 */
15201- command = ahc_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
15202+ command = aic_pci_read_config(pci, PCIR_COMMAND, /*bytes*/1);
15203 command |= PCIM_CMD_MWRICEN;
15204- ahc_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
15205+ aic_pci_write_config(pci, PCIR_COMMAND, command, /*bytes*/1);
15206 ahc->bugs |= AHC_PCI_MWI_BUG;
15207 }
15208 /*
15209@@ -2344,10 +2364,10 @@
15210 * Cachesize must also be zero due to stray DAC
15211 * problem when sitting behind some bridges.
15212 */
15213- ahc_pci_write_config(pci, CSIZE_LATTIME, 0, /*bytes*/1);
15214- devconfig = ahc_pci_read_config(pci, DEVCONFIG, /*bytes*/1);
15215+ aic_pci_write_config(pci, CSIZE_LATTIME, 0, /*bytes*/1);
15216+ devconfig = aic_pci_read_config(pci, DEVCONFIG, /*bytes*/1);
15217 devconfig |= MRDCEN;
15218- ahc_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
15219+ aic_pci_write_config(pci, DEVCONFIG, devconfig, /*bytes*/1);
15220 #endif
15221 ahc->flags |= AHC_NEWEEPROM_FMT;
15222 ahc->instruction_ram_size = 512;
15223@@ -2357,10 +2377,10 @@
15224 static int
15225 ahc_aic7896_setup(struct ahc_softc *ahc)
15226 {
15227- ahc_dev_softc_t pci;
15228+ aic_dev_softc_t pci;
15229
15230 pci = ahc->dev_softc;
15231- ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
15232+ ahc->channel = aic_get_pci_function(pci) == 1 ? 'B' : 'A';
15233 ahc->chip = AHC_AIC7896;
15234 ahc->features = AHC_AIC7896_FE;
15235 ahc->flags |= AHC_NEWEEPROM_FMT;
15236@@ -2372,10 +2392,10 @@
15237 static int
15238 ahc_aic7899_setup(struct ahc_softc *ahc)
15239 {
15240- ahc_dev_softc_t pci;
15241+ aic_dev_softc_t pci;
15242
15243 pci = ahc->dev_softc;
15244- ahc->channel = ahc_get_pci_function(pci) == 1 ? 'B' : 'A';
15245+ ahc->channel = aic_get_pci_function(pci) == 1 ? 'B' : 'A';
15246 ahc->chip = AHC_AIC7899;
15247 ahc->features = AHC_AIC7899_FE;
15248 ahc->flags |= AHC_NEWEEPROM_FMT;
15249@@ -2406,10 +2426,10 @@
15250 static int
15251 ahc_aha394XX_setup(struct ahc_softc *ahc)
15252 {
15253- ahc_dev_softc_t pci;
15254+ aic_dev_softc_t pci;
15255
15256 pci = ahc->dev_softc;
15257- switch (ahc_get_pci_slot(pci)) {
15258+ switch (aic_get_pci_slot(pci)) {
15259 case AHC_394X_SLOT_CHANNEL_A:
15260 ahc->channel = 'A';
15261 break;
15262@@ -2419,7 +2439,7 @@
15263 default:
15264 printf("adapter at unexpected slot %d\n"
15265 "unable to map to a channel\n",
15266- ahc_get_pci_slot(pci));
15267+ aic_get_pci_slot(pci));
15268 ahc->channel = 'A';
15269 }
15270 return (0);
15271@@ -2428,10 +2448,10 @@
15272 static int
15273 ahc_aha398XX_setup(struct ahc_softc *ahc)
15274 {
15275- ahc_dev_softc_t pci;
15276+ aic_dev_softc_t pci;
15277
15278 pci = ahc->dev_softc;
15279- switch (ahc_get_pci_slot(pci)) {
15280+ switch (aic_get_pci_slot(pci)) {
15281 case AHC_398X_SLOT_CHANNEL_A:
15282 ahc->channel = 'A';
15283 break;
15284@@ -2444,7 +2464,7 @@
15285 default:
15286 printf("adapter at unexpected slot %d\n"
15287 "unable to map to a channel\n",
15288- ahc_get_pci_slot(pci));
15289+ aic_get_pci_slot(pci));
15290 ahc->channel = 'A';
15291 break;
15292 }
15293@@ -2455,10 +2475,10 @@
15294 static int
15295 ahc_aha494XX_setup(struct ahc_softc *ahc)
15296 {
15297- ahc_dev_softc_t pci;
15298+ aic_dev_softc_t pci;
15299
15300 pci = ahc->dev_softc;
15301- switch (ahc_get_pci_slot(pci)) {
15302+ switch (aic_get_pci_slot(pci)) {
15303 case AHC_494X_SLOT_CHANNEL_A:
15304 ahc->channel = 'A';
15305 break;
15306@@ -2474,7 +2494,7 @@
15307 default:
15308 printf("adapter at unexpected slot %d\n"
15309 "unable to map to a channel\n",
15310- ahc_get_pci_slot(pci));
15311+ aic_get_pci_slot(pci));
15312 ahc->channel = 'A';
15313 }
15314 ahc->flags |= AHC_LARGE_SEEPROM;
15315diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_proc.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_proc.c
15316--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_proc.c 2004-01-08 11:57:43.026002475 +0100
15317+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_proc.c 2003-12-22 22:46:59.000000000 +0100
15318@@ -37,7 +37,7 @@
15319 * String handling code courtesy of Gerard Roudier's <groudier@club-internet.fr>
15320 * sym driver.
15321 *
15322- * $Id$
15323+ * $Id$
15324 */
15325 #include "aic7xxx_osm.h"
15326 #include "aic7xxx_inline.h"
15327@@ -50,7 +50,7 @@
15328 u_int our_id, char channel,
15329 u_int target_id, u_int target_offset);
15330 static void ahc_dump_device_state(struct info_str *info,
15331- struct ahc_linux_device *dev);
15332+ struct aic_linux_device *dev);
15333 static int ahc_proc_write_seeprom(struct ahc_softc *ahc,
15334 char *buffer, int length);
15335
15336@@ -141,7 +141,7 @@
15337 u_int our_id, char channel, u_int target_id,
15338 u_int target_offset)
15339 {
15340- struct ahc_linux_target *targ;
15341+ struct aic_linux_target *targ;
15342 struct ahc_initiator_tinfo *tinfo;
15343 struct ahc_tmode_tstate *tstate;
15344 int lun;
15345@@ -163,7 +163,7 @@
15346 ahc_format_transinfo(info, &tinfo->curr);
15347
15348 for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
15349- struct ahc_linux_device *dev;
15350+ struct aic_linux_device *dev;
15351
15352 dev = targ->devices[lun];
15353
15354@@ -175,7 +175,7 @@
15355 }
15356
15357 static void
15358-ahc_dump_device_state(struct info_str *info, struct ahc_linux_device *dev)
15359+ahc_dump_device_state(struct info_str *info, struct aic_linux_device *dev)
15360 {
15361 copy_info(info, "\tChannel %c Target %d Lun %d Settings\n",
15362 dev->target->channel + 'A', dev->target->target, dev->lun);
15363@@ -204,7 +204,8 @@
15364 ahc_pause(ahc);
15365
15366 if (length != sizeof(struct seeprom_config)) {
15367- printf("ahc_proc_write_seeprom: incorrect buffer size\n");
15368+ printf("ahc_proc_write_seeprom: incorrect buffer size %d\n",
15369+ length);
15370 goto done;
15371 }
15372
15373@@ -215,7 +216,7 @@
15374 }
15375
15376 sd.sd_ahc = ahc;
15377-#if AHC_PCI_CONFIG > 0
15378+#if AIC_PCI_CONFIG > 0
15379 if ((ahc->chip & AHC_PCI) != 0) {
15380 sd.sd_control_offset = SEECTL;
15381 sd.sd_status_offset = SEECTL;
15382@@ -271,7 +272,7 @@
15383 sizeof(struct seeprom_config)/2);
15384 ahc_read_seeprom(&sd, (uint16_t *)ahc->seep_config,
15385 start_addr, sizeof(struct seeprom_config)/2);
15386-#if AHC_PCI_CONFIG > 0
15387+#if AIC_PCI_CONFIG > 0
15388 if ((ahc->chip & AHC_VL) == 0)
15389 ahc_release_seeprom(&sd);
15390 #endif
15391diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx.reg linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx.reg
15392--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx.reg 2004-01-08 11:57:43.041999168 +0100
15393+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx.reg 2003-12-22 22:46:59.000000000 +0100
15394@@ -39,7 +39,7 @@
15395 *
15396 * $FreeBSD$
15397 */
15398-VERSION = "$Id$"
15399+VERSION = "$Id$"
15400
15401 /*
15402 * This file is processed by the aic7xxx_asm utility for use in assembling
15403@@ -1306,7 +1306,6 @@
15404 */
15405 MWI_RESIDUAL {
15406 size 1
15407- alias TARG_IMMEDIATE_SCB
15408 }
15409 /*
15410 * SCBID of the next SCB to be started by the controller.
15411@@ -1461,6 +1460,7 @@
15412 */
15413 LAST_MSG {
15414 size 1
15415+ alias TARG_IMMEDIATE_SCB
15416 }
15417
15418 /*
15419diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_reg.h linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_reg.h
15420--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_reg.h 2004-01-08 11:57:43.024002888 +0100
15421+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_reg.h 2003-12-23 00:31:43.000000000 +0100
15422@@ -2,8 +2,8 @@
15423 * DO NOT EDIT - This file is automatically generated
15424 * from the following source files:
15425 *
15426- * $Id$
15427- * $Id$
15428+ * $Id$
15429+ * $Id$
15430 */
15431 typedef int (ahc_reg_print_t)(u_int, u_int *, u_int);
15432 typedef struct ahc_reg_parse_entry {
15433@@ -1298,7 +1298,6 @@
15434 #define CMDSIZE_TABLE_TAIL 0x34
15435
15436 #define MWI_RESIDUAL 0x38
15437-#define TARG_IMMEDIATE_SCB 0x38
15438
15439 #define NEXT_QUEUED_SCB 0x39
15440
15441@@ -1380,6 +1379,7 @@
15442 #define RETURN_2 0x52
15443
15444 #define LAST_MSG 0x53
15445+#define TARG_IMMEDIATE_SCB 0x53
15446
15447 #define SCSISEQ_TEMPLATE 0x54
15448 #define ENSELO 0x40
15449diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_reg_print.c linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_reg_print.c
15450--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_reg_print.c 2004-01-08 11:57:43.022003301 +0100
15451+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_reg_print.c 2003-12-23 00:31:43.000000000 +0100
15452@@ -2,8 +2,8 @@
15453 * DO NOT EDIT - This file is automatically generated
15454 * from the following source files:
15455 *
15456- * $Id$
15457- * $Id$
15458+ * $Id$
15459+ * $Id$
15460 */
15461
15462 #include "aic7xxx_osm.h"
15463diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx.seq linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx.seq
15464--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx.seq 2004-01-08 11:57:43.040999375 +0100
15465+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx.seq 2003-12-22 22:46:59.000000000 +0100
15466@@ -40,7 +40,7 @@
15467 * $FreeBSD$
15468 */
15469
15470-VERSION = "$Id$"
15471+VERSION = "$Id$"
15472 PATCH_ARG_LIST = "struct ahc_softc *ahc"
15473 PREFIX = "ahc_"
15474
15475@@ -679,6 +679,7 @@
15476 clr SCSIBUSL; /* Prevent bit leakage durint SELTO */
15477 }
15478 and SXFRCTL0, ~SPIOEN;
15479+ mvi SEQ_FLAGS, NOT_IDENTIFIED|NO_CDB_SENT;
15480 test SSTAT1,REQINIT|BUSFREE jz .;
15481 test SSTAT1, BUSFREE jnz poll_for_work;
15482 mvi MISSED_BUSFREE call set_seqint;
15483@@ -1097,7 +1098,7 @@
15484 test SCB_RESIDUAL_DATACNT[3], SG_LAST_SEG jz dma_mid_sg;
15485 if ((ahc->flags & AHC_TARGETROLE) != 0) {
15486 test SSTAT0, TARGET jz dma_last_sg;
15487- if ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0) {
15488+ if ((ahc->bugs & AHC_TMODE_WIDEODD_BUG) != 0) {
15489 test DMAPARAMS, DIRECTION jz dma_mid_sg;
15490 }
15491 }
15492diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_seq.h linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_seq.h
15493--- linux-2.4.24.org/drivers/scsi/aic7xxx/aic7xxx_seq.h 2004-01-08 11:57:43.020003714 +0100
15494+++ linux-2.4.24/drivers/scsi/aic7xxx/aic7xxx_seq.h 2003-12-23 00:31:43.000000000 +0100
15495@@ -2,13 +2,13 @@
15496 * DO NOT EDIT - This file is automatically generated
15497 * from the following source files:
15498 *
15499- * $Id$
15500- * $Id$
15501+ * $Id$
15502+ * $Id$
15503 */
15504 static uint8_t seqprog[] = {
15505 0xb2, 0x00, 0x00, 0x08,
15506 0xf7, 0x11, 0x22, 0x08,
15507- 0x00, 0x65, 0xec, 0x59,
15508+ 0x00, 0x65, 0xee, 0x59,
15509 0xf7, 0x01, 0x02, 0x08,
15510 0xff, 0x6a, 0x24, 0x08,
15511 0x40, 0x00, 0x40, 0x68,
15512@@ -21,15 +21,15 @@
15513 0x01, 0x4d, 0xc8, 0x30,
15514 0x00, 0x4c, 0x12, 0x70,
15515 0x01, 0x39, 0xa2, 0x30,
15516- 0x00, 0x6a, 0xc0, 0x5e,
15517+ 0x00, 0x6a, 0xc2, 0x5e,
15518 0x01, 0x51, 0x20, 0x31,
15519 0x01, 0x57, 0xae, 0x00,
15520 0x0d, 0x6a, 0x76, 0x00,
15521- 0x00, 0x51, 0x12, 0x5e,
15522+ 0x00, 0x51, 0x14, 0x5e,
15523 0x01, 0x51, 0xc8, 0x30,
15524 0x00, 0x39, 0xc8, 0x60,
15525 0x00, 0xbb, 0x30, 0x70,
15526- 0xc1, 0x6a, 0xd8, 0x5e,
15527+ 0xc1, 0x6a, 0xda, 0x5e,
15528 0x01, 0xbf, 0x72, 0x30,
15529 0x01, 0x40, 0x7e, 0x31,
15530 0x01, 0x90, 0x80, 0x30,
15531@@ -49,10 +49,10 @@
15532 0x08, 0x6a, 0x78, 0x00,
15533 0x01, 0x50, 0xc8, 0x30,
15534 0xe0, 0x6a, 0xcc, 0x00,
15535- 0x48, 0x6a, 0xfc, 0x5d,
15536+ 0x48, 0x6a, 0xfe, 0x5d,
15537 0x01, 0x6a, 0xdc, 0x01,
15538 0x88, 0x6a, 0xcc, 0x00,
15539- 0x48, 0x6a, 0xfc, 0x5d,
15540+ 0x48, 0x6a, 0xfe, 0x5d,
15541 0x01, 0x6a, 0x26, 0x01,
15542 0xf0, 0x19, 0x7a, 0x08,
15543 0x0f, 0x18, 0xc8, 0x08,
15544@@ -93,7 +93,7 @@
15545 0x00, 0x65, 0x20, 0x41,
15546 0x02, 0x57, 0xae, 0x00,
15547 0x00, 0x65, 0x9e, 0x40,
15548- 0x61, 0x6a, 0xd8, 0x5e,
15549+ 0x61, 0x6a, 0xda, 0x5e,
15550 0x08, 0x51, 0x20, 0x71,
15551 0x02, 0x0b, 0xb2, 0x78,
15552 0x00, 0x65, 0xae, 0x40,
15553@@ -106,7 +106,7 @@
15554 0x80, 0x3d, 0x7a, 0x00,
15555 0x20, 0x6a, 0x16, 0x00,
15556 0x00, 0x65, 0xcc, 0x41,
15557- 0x00, 0x65, 0xb2, 0x5e,
15558+ 0x00, 0x65, 0xb4, 0x5e,
15559 0x00, 0x65, 0x12, 0x40,
15560 0x20, 0x11, 0xd2, 0x68,
15561 0x20, 0x6a, 0x18, 0x00,
15562@@ -140,27 +140,27 @@
15563 0x80, 0x0b, 0xc4, 0x79,
15564 0x12, 0x01, 0x02, 0x00,
15565 0x01, 0xab, 0xac, 0x30,
15566- 0xe4, 0x6a, 0x6e, 0x5d,
15567+ 0xe4, 0x6a, 0x70, 0x5d,
15568 0x40, 0x6a, 0x16, 0x00,
15569- 0x80, 0x3e, 0x84, 0x5d,
15570+ 0x80, 0x3e, 0x86, 0x5d,
15571 0x20, 0xb8, 0x18, 0x79,
15572- 0x20, 0x6a, 0x84, 0x5d,
15573- 0x00, 0xab, 0x84, 0x5d,
15574+ 0x20, 0x6a, 0x86, 0x5d,
15575+ 0x00, 0xab, 0x86, 0x5d,
15576 0x01, 0xa9, 0x78, 0x30,
15577 0x10, 0xb8, 0x20, 0x79,
15578- 0xe4, 0x6a, 0x6e, 0x5d,
15579+ 0xe4, 0x6a, 0x70, 0x5d,
15580 0x00, 0x65, 0xae, 0x40,
15581 0x10, 0x03, 0x3c, 0x69,
15582 0x08, 0x3c, 0x5a, 0x69,
15583 0x04, 0x3c, 0x92, 0x69,
15584 0x02, 0x3c, 0x98, 0x69,
15585 0x01, 0x3c, 0x44, 0x79,
15586- 0xff, 0x6a, 0x70, 0x00,
15587+ 0xff, 0x6a, 0xa6, 0x00,
15588 0x00, 0x65, 0xa4, 0x59,
15589- 0x00, 0x6a, 0xc0, 0x5e,
15590- 0xff, 0x38, 0x30, 0x71,
15591+ 0x00, 0x6a, 0xc2, 0x5e,
15592+ 0xff, 0x53, 0x30, 0x71,
15593 0x0d, 0x6a, 0x76, 0x00,
15594- 0x00, 0x38, 0x12, 0x5e,
15595+ 0x00, 0x53, 0x14, 0x5e,
15596 0x00, 0x65, 0xea, 0x58,
15597 0x12, 0x01, 0x02, 0x00,
15598 0x00, 0x65, 0x18, 0x41,
15599@@ -168,10 +168,10 @@
15600 0x00, 0x65, 0xf2, 0x58,
15601 0xfd, 0x57, 0xae, 0x08,
15602 0x00, 0x65, 0xae, 0x40,
15603- 0xe4, 0x6a, 0x6e, 0x5d,
15604+ 0xe4, 0x6a, 0x70, 0x5d,
15605 0x20, 0x3c, 0x4a, 0x79,
15606- 0x02, 0x6a, 0x84, 0x5d,
15607- 0x04, 0x6a, 0x84, 0x5d,
15608+ 0x02, 0x6a, 0x86, 0x5d,
15609+ 0x04, 0x6a, 0x86, 0x5d,
15610 0x01, 0x03, 0x4c, 0x69,
15611 0xf7, 0x11, 0x22, 0x08,
15612 0xff, 0x6a, 0x24, 0x08,
15613@@ -182,13 +182,13 @@
15614 0x80, 0x86, 0xc8, 0x08,
15615 0x01, 0x4f, 0xc8, 0x30,
15616 0x00, 0x50, 0x6c, 0x61,
15617- 0xc4, 0x6a, 0x6e, 0x5d,
15618+ 0xc4, 0x6a, 0x70, 0x5d,
15619 0x40, 0x3c, 0x68, 0x79,
15620- 0x28, 0x6a, 0x84, 0x5d,
15621+ 0x28, 0x6a, 0x86, 0x5d,
15622 0x00, 0x65, 0x4c, 0x41,
15623- 0x08, 0x6a, 0x84, 0x5d,
15624+ 0x08, 0x6a, 0x86, 0x5d,
15625 0x00, 0x65, 0x4c, 0x41,
15626- 0x84, 0x6a, 0x6e, 0x5d,
15627+ 0x84, 0x6a, 0x70, 0x5d,
15628 0x00, 0x65, 0xf2, 0x58,
15629 0x01, 0x66, 0xc8, 0x30,
15630 0x01, 0x64, 0xd8, 0x31,
15631@@ -208,16 +208,16 @@
15632 0xf7, 0x3c, 0x78, 0x08,
15633 0x00, 0x65, 0x20, 0x41,
15634 0x40, 0xaa, 0x7e, 0x10,
15635- 0x04, 0xaa, 0x6e, 0x5d,
15636- 0x00, 0x65, 0x56, 0x42,
15637- 0xc4, 0x6a, 0x6e, 0x5d,
15638+ 0x04, 0xaa, 0x70, 0x5d,
15639+ 0x00, 0x65, 0x58, 0x42,
15640+ 0xc4, 0x6a, 0x70, 0x5d,
15641 0xc0, 0x6a, 0x7e, 0x00,
15642- 0x00, 0xa8, 0x84, 0x5d,
15643+ 0x00, 0xa8, 0x86, 0x5d,
15644 0xe4, 0x6a, 0x06, 0x00,
15645- 0x00, 0x6a, 0x84, 0x5d,
15646+ 0x00, 0x6a, 0x86, 0x5d,
15647 0x00, 0x65, 0x4c, 0x41,
15648 0x10, 0x3c, 0xa8, 0x69,
15649- 0x00, 0xbb, 0x8a, 0x44,
15650+ 0x00, 0xbb, 0x8c, 0x44,
15651 0x18, 0x6a, 0xda, 0x01,
15652 0x01, 0x69, 0xd8, 0x31,
15653 0x1c, 0x6a, 0xd0, 0x01,
15654@@ -227,31 +227,32 @@
15655 0x01, 0x93, 0x26, 0x01,
15656 0x03, 0x6a, 0x2a, 0x01,
15657 0x01, 0x69, 0x32, 0x31,
15658- 0x1c, 0x6a, 0xe0, 0x5d,
15659+ 0x1c, 0x6a, 0xe2, 0x5d,
15660 0x0a, 0x93, 0x26, 0x01,
15661- 0x00, 0x65, 0xa8, 0x5e,
15662+ 0x00, 0x65, 0xaa, 0x5e,
15663 0x01, 0x50, 0xa0, 0x18,
15664 0x02, 0x6a, 0x22, 0x05,
15665 0x1a, 0x01, 0x02, 0x00,
15666 0x80, 0x6a, 0x74, 0x00,
15667 0x40, 0x6a, 0x78, 0x00,
15668 0x40, 0x6a, 0x16, 0x00,
15669- 0x00, 0x65, 0xd8, 0x5d,
15670+ 0x00, 0x65, 0xda, 0x5d,
15671 0x01, 0x3f, 0xc8, 0x30,
15672- 0xbf, 0x64, 0x56, 0x7a,
15673- 0x80, 0x64, 0x9e, 0x73,
15674- 0xa0, 0x64, 0x00, 0x74,
15675- 0xc0, 0x64, 0xf4, 0x73,
15676- 0xe0, 0x64, 0x30, 0x74,
15677- 0x01, 0x6a, 0xd8, 0x5e,
15678+ 0xbf, 0x64, 0x58, 0x7a,
15679+ 0x80, 0x64, 0xa0, 0x73,
15680+ 0xa0, 0x64, 0x02, 0x74,
15681+ 0xc0, 0x64, 0xf6, 0x73,
15682+ 0xe0, 0x64, 0x32, 0x74,
15683+ 0x01, 0x6a, 0xda, 0x5e,
15684 0x00, 0x65, 0xcc, 0x41,
15685 0xf7, 0x11, 0x22, 0x08,
15686 0x01, 0x06, 0xd4, 0x30,
15687 0xff, 0x6a, 0x24, 0x08,
15688 0xf7, 0x01, 0x02, 0x08,
15689- 0x09, 0x0c, 0xe6, 0x79,
15690+ 0xc0, 0x6a, 0x78, 0x00,
15691+ 0x09, 0x0c, 0xe8, 0x79,
15692 0x08, 0x0c, 0x04, 0x68,
15693- 0xb1, 0x6a, 0xd8, 0x5e,
15694+ 0xb1, 0x6a, 0xda, 0x5e,
15695 0xff, 0x6a, 0x26, 0x09,
15696 0x12, 0x01, 0x02, 0x00,
15697 0x02, 0x6a, 0x08, 0x30,
15698@@ -264,29 +265,29 @@
15699 0x00, 0xa5, 0x4a, 0x21,
15700 0x00, 0xa6, 0x4c, 0x21,
15701 0x00, 0xa7, 0x4e, 0x25,
15702- 0x08, 0xeb, 0xdc, 0x7e,
15703- 0x80, 0xeb, 0x06, 0x7a,
15704+ 0x08, 0xeb, 0xde, 0x7e,
15705+ 0x80, 0xeb, 0x08, 0x7a,
15706 0xff, 0x6a, 0xd6, 0x09,
15707- 0x08, 0xeb, 0x0a, 0x6a,
15708+ 0x08, 0xeb, 0x0c, 0x6a,
15709 0xff, 0x6a, 0xd4, 0x0c,
15710- 0x80, 0xa3, 0xdc, 0x6e,
15711- 0x88, 0xeb, 0x20, 0x72,
15712- 0x08, 0xeb, 0xdc, 0x6e,
15713- 0x04, 0xea, 0x24, 0xe2,
15714- 0x08, 0xee, 0xdc, 0x6e,
15715+ 0x80, 0xa3, 0xde, 0x6e,
15716+ 0x88, 0xeb, 0x22, 0x72,
15717+ 0x08, 0xeb, 0xde, 0x6e,
15718+ 0x04, 0xea, 0x26, 0xe2,
15719+ 0x08, 0xee, 0xde, 0x6e,
15720 0x04, 0x6a, 0xd0, 0x81,
15721 0x05, 0xa4, 0xc0, 0x89,
15722 0x03, 0xa5, 0xc2, 0x31,
15723 0x09, 0x6a, 0xd6, 0x05,
15724- 0x00, 0x65, 0x08, 0x5a,
15725+ 0x00, 0x65, 0x0a, 0x5a,
15726 0x06, 0xa4, 0xd4, 0x89,
15727- 0x80, 0x94, 0xdc, 0x7e,
15728+ 0x80, 0x94, 0xde, 0x7e,
15729 0x07, 0xe9, 0x10, 0x31,
15730 0x01, 0xe9, 0x46, 0x31,
15731- 0x00, 0xa3, 0xba, 0x5e,
15732- 0x00, 0x65, 0xfa, 0x59,
15733+ 0x00, 0xa3, 0xbc, 0x5e,
15734+ 0x00, 0x65, 0xfc, 0x59,
15735 0x01, 0xa4, 0xca, 0x30,
15736- 0x80, 0xa3, 0x34, 0x7a,
15737+ 0x80, 0xa3, 0x36, 0x7a,
15738 0x02, 0x65, 0xca, 0x00,
15739 0x01, 0x65, 0xf8, 0x31,
15740 0x80, 0x93, 0x26, 0x01,
15741@@ -294,162 +295,162 @@
15742 0x01, 0x8c, 0xc8, 0x30,
15743 0x00, 0x88, 0xc8, 0x18,
15744 0x02, 0x64, 0xc8, 0x88,
15745- 0xff, 0x64, 0xdc, 0x7e,
15746- 0xff, 0x8d, 0x4a, 0x6a,
15747- 0xff, 0x8e, 0x4a, 0x6a,
15748+ 0xff, 0x64, 0xde, 0x7e,
15749+ 0xff, 0x8d, 0x4c, 0x6a,
15750+ 0xff, 0x8e, 0x4c, 0x6a,
15751 0x03, 0x8c, 0xd4, 0x98,
15752- 0x00, 0x65, 0xdc, 0x56,
15753+ 0x00, 0x65, 0xde, 0x56,
15754 0x01, 0x64, 0x70, 0x30,
15755 0xff, 0x64, 0xc8, 0x10,
15756 0x01, 0x64, 0xc8, 0x18,
15757 0x00, 0x8c, 0x18, 0x19,
15758 0xff, 0x8d, 0x1a, 0x21,
15759 0xff, 0x8e, 0x1c, 0x25,
15760- 0xc0, 0x3c, 0x5a, 0x7a,
15761- 0x21, 0x6a, 0xd8, 0x5e,
15762+ 0xc0, 0x3c, 0x5c, 0x7a,
15763+ 0x21, 0x6a, 0xda, 0x5e,
15764 0xa8, 0x6a, 0x76, 0x00,
15765 0x79, 0x6a, 0x76, 0x00,
15766- 0x40, 0x3f, 0x62, 0x6a,
15767+ 0x40, 0x3f, 0x64, 0x6a,
15768 0x04, 0x3b, 0x76, 0x00,
15769 0x04, 0x6a, 0xd4, 0x81,
15770- 0x20, 0x3c, 0x6a, 0x7a,
15771- 0x51, 0x6a, 0xd8, 0x5e,
15772- 0x00, 0x65, 0x82, 0x42,
15773+ 0x20, 0x3c, 0x6c, 0x7a,
15774+ 0x51, 0x6a, 0xda, 0x5e,
15775+ 0x00, 0x65, 0x84, 0x42,
15776 0x20, 0x3c, 0x78, 0x00,
15777- 0x00, 0xb3, 0xba, 0x5e,
15778+ 0x00, 0xb3, 0xbc, 0x5e,
15779 0x07, 0xac, 0x10, 0x31,
15780 0x05, 0xb3, 0x46, 0x31,
15781 0x88, 0x6a, 0xcc, 0x00,
15782- 0xac, 0x6a, 0xee, 0x5d,
15783+ 0xac, 0x6a, 0xf0, 0x5d,
15784 0xa3, 0x6a, 0xcc, 0x00,
15785- 0xb3, 0x6a, 0xf2, 0x5d,
15786- 0x00, 0x65, 0x3a, 0x5a,
15787+ 0xb3, 0x6a, 0xf4, 0x5d,
15788+ 0x00, 0x65, 0x3c, 0x5a,
15789 0xfd, 0xa4, 0x48, 0x09,
15790 0x03, 0x8c, 0x10, 0x30,
15791- 0x00, 0x65, 0xe6, 0x5d,
15792- 0x01, 0xa4, 0x94, 0x7a,
15793+ 0x00, 0x65, 0xe8, 0x5d,
15794+ 0x01, 0xa4, 0x96, 0x7a,
15795 0x04, 0x3b, 0x76, 0x08,
15796 0x01, 0x3b, 0x26, 0x31,
15797 0x80, 0x02, 0x04, 0x00,
15798- 0x10, 0x0c, 0x8a, 0x7a,
15799- 0x03, 0x9e, 0x8c, 0x6a,
15800+ 0x10, 0x0c, 0x8c, 0x7a,
15801+ 0x03, 0x9e, 0x8e, 0x6a,
15802 0x7f, 0x02, 0x04, 0x08,
15803- 0x91, 0x6a, 0xd8, 0x5e,
15804+ 0x91, 0x6a, 0xda, 0x5e,
15805 0x00, 0x65, 0xcc, 0x41,
15806 0x01, 0xa4, 0xca, 0x30,
15807- 0x80, 0xa3, 0x9a, 0x7a,
15808+ 0x80, 0xa3, 0x9c, 0x7a,
15809 0x02, 0x65, 0xca, 0x00,
15810 0x01, 0x65, 0xf8, 0x31,
15811 0x01, 0x3b, 0x26, 0x31,
15812- 0x00, 0x65, 0x0e, 0x5a,
15813- 0x01, 0xfc, 0xa8, 0x6a,
15814- 0x80, 0x0b, 0x9e, 0x6a,
15815- 0x10, 0x0c, 0x9e, 0x7a,
15816- 0x20, 0x93, 0x9e, 0x6a,
15817+ 0x00, 0x65, 0x10, 0x5a,
15818+ 0x01, 0xfc, 0xaa, 0x6a,
15819+ 0x80, 0x0b, 0xa0, 0x6a,
15820+ 0x10, 0x0c, 0xa0, 0x7a,
15821+ 0x20, 0x93, 0xa0, 0x6a,
15822 0x02, 0x93, 0x26, 0x01,
15823- 0x02, 0xfc, 0xb2, 0x7a,
15824- 0x40, 0x0d, 0xc6, 0x6a,
15825+ 0x02, 0xfc, 0xb4, 0x7a,
15826+ 0x40, 0x0d, 0xc8, 0x6a,
15827 0x01, 0xa4, 0x48, 0x01,
15828- 0x00, 0x65, 0xc6, 0x42,
15829- 0x40, 0x0d, 0xb8, 0x6a,
15830- 0x00, 0x65, 0x0e, 0x5a,
15831- 0x00, 0x65, 0xaa, 0x42,
15832- 0x80, 0xfc, 0xc2, 0x7a,
15833- 0x80, 0xa4, 0xc2, 0x6a,
15834+ 0x00, 0x65, 0xc8, 0x42,
15835+ 0x40, 0x0d, 0xba, 0x6a,
15836+ 0x00, 0x65, 0x10, 0x5a,
15837+ 0x00, 0x65, 0xac, 0x42,
15838+ 0x80, 0xfc, 0xc4, 0x7a,
15839+ 0x80, 0xa4, 0xc4, 0x6a,
15840 0xff, 0xa5, 0x4a, 0x19,
15841 0xff, 0xa6, 0x4c, 0x21,
15842 0xff, 0xa7, 0x4e, 0x21,
15843 0xf8, 0xfc, 0x48, 0x09,
15844 0x7f, 0xa3, 0x46, 0x09,
15845- 0x04, 0x3b, 0xe2, 0x6a,
15846+ 0x04, 0x3b, 0xe4, 0x6a,
15847 0x02, 0x93, 0x26, 0x01,
15848- 0x01, 0x94, 0xc8, 0x7a,
15849- 0x01, 0x94, 0xc8, 0x7a,
15850- 0x01, 0x94, 0xc8, 0x7a,
15851- 0x01, 0x94, 0xc8, 0x7a,
15852- 0x01, 0x94, 0xc8, 0x7a,
15853- 0x01, 0xa4, 0xe0, 0x7a,
15854- 0x01, 0xfc, 0xd6, 0x7a,
15855- 0x01, 0x94, 0xe2, 0x6a,
15856- 0x01, 0x94, 0xe2, 0x6a,
15857- 0x01, 0x94, 0xe2, 0x6a,
15858- 0x00, 0x65, 0x82, 0x42,
15859- 0x01, 0x94, 0xe0, 0x7a,
15860- 0x10, 0x94, 0xe2, 0x6a,
15861+ 0x01, 0x94, 0xca, 0x7a,
15862+ 0x01, 0x94, 0xca, 0x7a,
15863+ 0x01, 0x94, 0xca, 0x7a,
15864+ 0x01, 0x94, 0xca, 0x7a,
15865+ 0x01, 0x94, 0xca, 0x7a,
15866+ 0x01, 0xa4, 0xe2, 0x7a,
15867+ 0x01, 0xfc, 0xd8, 0x7a,
15868+ 0x01, 0x94, 0xe4, 0x6a,
15869+ 0x01, 0x94, 0xe4, 0x6a,
15870+ 0x01, 0x94, 0xe4, 0x6a,
15871+ 0x00, 0x65, 0x84, 0x42,
15872+ 0x01, 0x94, 0xe2, 0x7a,
15873+ 0x10, 0x94, 0xe4, 0x6a,
15874 0xd7, 0x93, 0x26, 0x09,
15875- 0x28, 0x93, 0xe6, 0x6a,
15876+ 0x28, 0x93, 0xe8, 0x6a,
15877 0x01, 0x85, 0x0a, 0x01,
15878- 0x02, 0xfc, 0xee, 0x6a,
15879+ 0x02, 0xfc, 0xf0, 0x6a,
15880 0x01, 0x14, 0x46, 0x31,
15881 0xff, 0x6a, 0x10, 0x09,
15882 0xfe, 0x85, 0x0a, 0x09,
15883- 0xff, 0x38, 0xfc, 0x6a,
15884- 0x80, 0xa3, 0xfc, 0x7a,
15885- 0x80, 0x0b, 0xfa, 0x7a,
15886- 0x04, 0x3b, 0xfc, 0x7a,
15887+ 0xff, 0x38, 0xfe, 0x6a,
15888+ 0x80, 0xa3, 0xfe, 0x7a,
15889+ 0x80, 0x0b, 0xfc, 0x7a,
15890+ 0x04, 0x3b, 0xfe, 0x7a,
15891 0xbf, 0x3b, 0x76, 0x08,
15892 0x01, 0x3b, 0x26, 0x31,
15893- 0x00, 0x65, 0x0e, 0x5a,
15894- 0x01, 0x0b, 0x0a, 0x6b,
15895- 0x10, 0x0c, 0xfe, 0x7a,
15896- 0x04, 0x93, 0x08, 0x6b,
15897- 0x01, 0x94, 0x06, 0x7b,
15898- 0x10, 0x94, 0x08, 0x6b,
15899+ 0x00, 0x65, 0x10, 0x5a,
15900+ 0x01, 0x0b, 0x0c, 0x6b,
15901+ 0x10, 0x0c, 0x00, 0x7b,
15902+ 0x04, 0x93, 0x0a, 0x6b,
15903+ 0x01, 0x94, 0x08, 0x7b,
15904+ 0x10, 0x94, 0x0a, 0x6b,
15905 0xc7, 0x93, 0x26, 0x09,
15906 0x01, 0x99, 0xd4, 0x30,
15907- 0x38, 0x93, 0x0c, 0x6b,
15908- 0xff, 0x08, 0x5a, 0x6b,
15909- 0xff, 0x09, 0x5a, 0x6b,
15910- 0xff, 0x0a, 0x5a, 0x6b,
15911- 0xff, 0x38, 0x28, 0x7b,
15912+ 0x38, 0x93, 0x0e, 0x6b,
15913+ 0xff, 0x08, 0x5c, 0x6b,
15914+ 0xff, 0x09, 0x5c, 0x6b,
15915+ 0xff, 0x0a, 0x5c, 0x6b,
15916+ 0xff, 0x38, 0x2a, 0x7b,
15917 0x04, 0x14, 0x10, 0x31,
15918 0x01, 0x38, 0x18, 0x31,
15919 0x02, 0x6a, 0x1a, 0x31,
15920 0x88, 0x6a, 0xcc, 0x00,
15921- 0x14, 0x6a, 0xf4, 0x5d,
15922- 0x00, 0x38, 0xe0, 0x5d,
15923+ 0x14, 0x6a, 0xf6, 0x5d,
15924+ 0x00, 0x38, 0xe2, 0x5d,
15925 0xff, 0x6a, 0x70, 0x08,
15926- 0x00, 0x65, 0x54, 0x43,
15927- 0x80, 0xa3, 0x2e, 0x7b,
15928+ 0x00, 0x65, 0x56, 0x43,
15929+ 0x80, 0xa3, 0x30, 0x7b,
15930 0x01, 0xa4, 0x48, 0x01,
15931- 0x00, 0x65, 0x5a, 0x43,
15932- 0x08, 0xeb, 0x34, 0x7b,
15933- 0x00, 0x65, 0x0e, 0x5a,
15934- 0x08, 0xeb, 0x30, 0x6b,
15935+ 0x00, 0x65, 0x5c, 0x43,
15936+ 0x08, 0xeb, 0x36, 0x7b,
15937+ 0x00, 0x65, 0x10, 0x5a,
15938+ 0x08, 0xeb, 0x32, 0x6b,
15939 0x07, 0xe9, 0x10, 0x31,
15940 0x01, 0xe9, 0xca, 0x30,
15941 0x01, 0x65, 0x46, 0x31,
15942- 0x00, 0x6a, 0xba, 0x5e,
15943+ 0x00, 0x6a, 0xbc, 0x5e,
15944 0x88, 0x6a, 0xcc, 0x00,
15945- 0xa4, 0x6a, 0xf4, 0x5d,
15946- 0x08, 0x6a, 0xe0, 0x5d,
15947+ 0xa4, 0x6a, 0xf6, 0x5d,
15948+ 0x08, 0x6a, 0xe2, 0x5d,
15949 0x0d, 0x93, 0x26, 0x01,
15950- 0x00, 0x65, 0xa8, 0x5e,
15951+ 0x00, 0x65, 0xaa, 0x5e,
15952 0x88, 0x6a, 0xcc, 0x00,
15953- 0x00, 0x65, 0x8a, 0x5e,
15954+ 0x00, 0x65, 0x8c, 0x5e,
15955 0x01, 0x99, 0x46, 0x31,
15956- 0x00, 0xa3, 0xba, 0x5e,
15957+ 0x00, 0xa3, 0xbc, 0x5e,
15958 0x01, 0x88, 0x10, 0x31,
15959- 0x00, 0x65, 0x3a, 0x5a,
15960- 0x00, 0x65, 0xfa, 0x59,
15961+ 0x00, 0x65, 0x3c, 0x5a,
15962+ 0x00, 0x65, 0xfc, 0x59,
15963 0x03, 0x8c, 0x10, 0x30,
15964- 0x00, 0x65, 0xe6, 0x5d,
15965- 0x80, 0x0b, 0x82, 0x6a,
15966- 0x80, 0x0b, 0x62, 0x6b,
15967- 0x01, 0x0c, 0x5c, 0x7b,
15968- 0x10, 0x0c, 0x82, 0x7a,
15969- 0x03, 0x9e, 0x82, 0x6a,
15970- 0x00, 0x65, 0x04, 0x5a,
15971- 0x00, 0x6a, 0xba, 0x5e,
15972- 0x01, 0xa4, 0x82, 0x6b,
15973- 0xff, 0x38, 0x78, 0x7b,
15974+ 0x00, 0x65, 0xe8, 0x5d,
15975+ 0x80, 0x0b, 0x84, 0x6a,
15976+ 0x80, 0x0b, 0x64, 0x6b,
15977+ 0x01, 0x0c, 0x5e, 0x7b,
15978+ 0x10, 0x0c, 0x84, 0x7a,
15979+ 0x03, 0x9e, 0x84, 0x6a,
15980+ 0x00, 0x65, 0x06, 0x5a,
15981+ 0x00, 0x6a, 0xbc, 0x5e,
15982+ 0x01, 0xa4, 0x84, 0x6b,
15983+ 0xff, 0x38, 0x7a, 0x7b,
15984 0x01, 0x38, 0xc8, 0x30,
15985 0x00, 0x08, 0x40, 0x19,
15986 0xff, 0x6a, 0xc8, 0x08,
15987 0x00, 0x09, 0x42, 0x21,
15988 0x00, 0x0a, 0x44, 0x21,
15989 0xff, 0x6a, 0x70, 0x08,
15990- 0x00, 0x65, 0x7a, 0x43,
15991+ 0x00, 0x65, 0x7c, 0x43,
15992 0x03, 0x08, 0x40, 0x31,
15993 0x03, 0x08, 0x40, 0x31,
15994 0x01, 0x08, 0x40, 0x31,
15995@@ -461,16 +462,16 @@
15996 0x04, 0x3c, 0xcc, 0x79,
15997 0xfb, 0x3c, 0x78, 0x08,
15998 0x04, 0x93, 0x20, 0x79,
15999- 0x01, 0x0c, 0x8e, 0x6b,
16000+ 0x01, 0x0c, 0x90, 0x6b,
16001 0x80, 0xba, 0x20, 0x79,
16002 0x80, 0x04, 0x20, 0x79,
16003- 0xe4, 0x6a, 0x6e, 0x5d,
16004- 0x23, 0x6a, 0x84, 0x5d,
16005- 0x01, 0x6a, 0x84, 0x5d,
16006+ 0xe4, 0x6a, 0x70, 0x5d,
16007+ 0x23, 0x6a, 0x86, 0x5d,
16008+ 0x01, 0x6a, 0x86, 0x5d,
16009 0x00, 0x65, 0x20, 0x41,
16010 0x00, 0x65, 0xcc, 0x41,
16011- 0x80, 0x3c, 0xa2, 0x7b,
16012- 0x21, 0x6a, 0xd8, 0x5e,
16013+ 0x80, 0x3c, 0xa4, 0x7b,
16014+ 0x21, 0x6a, 0xda, 0x5e,
16015 0x01, 0xbc, 0x18, 0x31,
16016 0x02, 0x6a, 0x1a, 0x31,
16017 0x02, 0x6a, 0xf8, 0x01,
16018@@ -480,16 +481,16 @@
16019 0xff, 0x6a, 0x12, 0x08,
16020 0xff, 0x6a, 0x14, 0x08,
16021 0xf3, 0xbc, 0xd4, 0x18,
16022- 0xa0, 0x6a, 0xc8, 0x53,
16023+ 0xa0, 0x6a, 0xca, 0x53,
16024 0x04, 0xa0, 0x10, 0x31,
16025 0xac, 0x6a, 0x26, 0x01,
16026 0x04, 0xa0, 0x10, 0x31,
16027 0x03, 0x08, 0x18, 0x31,
16028 0x88, 0x6a, 0xcc, 0x00,
16029- 0xa0, 0x6a, 0xf4, 0x5d,
16030- 0x00, 0xbc, 0xe0, 0x5d,
16031+ 0xa0, 0x6a, 0xf6, 0x5d,
16032+ 0x00, 0xbc, 0xe2, 0x5d,
16033 0x3d, 0x6a, 0x26, 0x01,
16034- 0x00, 0x65, 0xe0, 0x43,
16035+ 0x00, 0x65, 0xe2, 0x43,
16036 0xff, 0x6a, 0x10, 0x09,
16037 0xa4, 0x6a, 0x26, 0x01,
16038 0x0c, 0xa0, 0x32, 0x31,
16039@@ -499,128 +500,128 @@
16040 0x36, 0x6a, 0x26, 0x01,
16041 0x02, 0x93, 0x26, 0x01,
16042 0x35, 0x6a, 0x26, 0x01,
16043- 0x00, 0x65, 0x9c, 0x5e,
16044- 0x00, 0x65, 0x9c, 0x5e,
16045+ 0x00, 0x65, 0x9e, 0x5e,
16046+ 0x00, 0x65, 0x9e, 0x5e,
16047 0x02, 0x93, 0x26, 0x01,
16048 0xbf, 0x3c, 0x78, 0x08,
16049- 0x04, 0x0b, 0xe6, 0x6b,
16050- 0x10, 0x0c, 0xe2, 0x7b,
16051- 0x01, 0x03, 0xe6, 0x6b,
16052- 0x20, 0x93, 0xe8, 0x6b,
16053- 0x04, 0x0b, 0xee, 0x6b,
16054+ 0x04, 0x0b, 0xe8, 0x6b,
16055+ 0x10, 0x0c, 0xe4, 0x7b,
16056+ 0x01, 0x03, 0xe8, 0x6b,
16057+ 0x20, 0x93, 0xea, 0x6b,
16058+ 0x04, 0x0b, 0xf0, 0x6b,
16059 0x40, 0x3c, 0x78, 0x00,
16060 0xc7, 0x93, 0x26, 0x09,
16061- 0x38, 0x93, 0xf0, 0x6b,
16062+ 0x38, 0x93, 0xf2, 0x6b,
16063 0x00, 0x65, 0xcc, 0x41,
16064- 0x80, 0x3c, 0x56, 0x6c,
16065+ 0x80, 0x3c, 0x58, 0x6c,
16066 0x01, 0x06, 0x50, 0x31,
16067 0x80, 0xb8, 0x70, 0x01,
16068 0x00, 0x65, 0xcc, 0x41,
16069 0x10, 0x3f, 0x06, 0x00,
16070 0x10, 0x6a, 0x06, 0x00,
16071 0x01, 0x3a, 0xca, 0x30,
16072- 0x80, 0x65, 0x1c, 0x64,
16073- 0x10, 0xb8, 0x40, 0x6c,
16074+ 0x80, 0x65, 0x1e, 0x64,
16075+ 0x10, 0xb8, 0x42, 0x6c,
16076 0xc0, 0x3e, 0xca, 0x00,
16077- 0x40, 0xb8, 0x0c, 0x6c,
16078+ 0x40, 0xb8, 0x0e, 0x6c,
16079 0xbf, 0x65, 0xca, 0x08,
16080- 0x20, 0xb8, 0x20, 0x7c,
16081+ 0x20, 0xb8, 0x22, 0x7c,
16082 0x01, 0x65, 0x0c, 0x30,
16083- 0x00, 0x65, 0xd8, 0x5d,
16084- 0xa0, 0x3f, 0x28, 0x64,
16085+ 0x00, 0x65, 0xda, 0x5d,
16086+ 0xa0, 0x3f, 0x2a, 0x64,
16087 0x23, 0xb8, 0x0c, 0x08,
16088- 0x00, 0x65, 0xd8, 0x5d,
16089- 0xa0, 0x3f, 0x28, 0x64,
16090- 0x00, 0xbb, 0x20, 0x44,
16091- 0xff, 0x65, 0x20, 0x64,
16092- 0x00, 0x65, 0x40, 0x44,
16093+ 0x00, 0x65, 0xda, 0x5d,
16094+ 0xa0, 0x3f, 0x2a, 0x64,
16095+ 0x00, 0xbb, 0x22, 0x44,
16096+ 0xff, 0x65, 0x22, 0x64,
16097+ 0x00, 0x65, 0x42, 0x44,
16098 0x40, 0x6a, 0x18, 0x00,
16099 0x01, 0x65, 0x0c, 0x30,
16100- 0x00, 0x65, 0xd8, 0x5d,
16101- 0xa0, 0x3f, 0xfc, 0x73,
16102+ 0x00, 0x65, 0xda, 0x5d,
16103+ 0xa0, 0x3f, 0xfe, 0x73,
16104 0x40, 0x6a, 0x18, 0x00,
16105 0x01, 0x3a, 0xa6, 0x30,
16106 0x08, 0x6a, 0x74, 0x00,
16107 0x00, 0x65, 0xcc, 0x41,
16108- 0x64, 0x6a, 0x68, 0x5d,
16109- 0x80, 0x64, 0xd8, 0x6c,
16110- 0x04, 0x64, 0x9a, 0x74,
16111- 0x02, 0x64, 0xaa, 0x74,
16112- 0x00, 0x6a, 0x60, 0x74,
16113- 0x03, 0x64, 0xc8, 0x74,
16114- 0x23, 0x64, 0x48, 0x74,
16115- 0x08, 0x64, 0x5c, 0x74,
16116- 0x61, 0x6a, 0xd8, 0x5e,
16117- 0x00, 0x65, 0xd8, 0x5d,
16118+ 0x64, 0x6a, 0x6a, 0x5d,
16119+ 0x80, 0x64, 0xda, 0x6c,
16120+ 0x04, 0x64, 0x9c, 0x74,
16121+ 0x02, 0x64, 0xac, 0x74,
16122+ 0x00, 0x6a, 0x62, 0x74,
16123+ 0x03, 0x64, 0xca, 0x74,
16124+ 0x23, 0x64, 0x4a, 0x74,
16125+ 0x08, 0x64, 0x5e, 0x74,
16126+ 0x61, 0x6a, 0xda, 0x5e,
16127+ 0x00, 0x65, 0xda, 0x5d,
16128 0x08, 0x51, 0xce, 0x71,
16129- 0x00, 0x65, 0x40, 0x44,
16130- 0x80, 0x04, 0x5a, 0x7c,
16131- 0x51, 0x6a, 0x5e, 0x5d,
16132- 0x01, 0x51, 0x5a, 0x64,
16133- 0x01, 0xa4, 0x52, 0x7c,
16134- 0x80, 0xba, 0x5c, 0x6c,
16135- 0x41, 0x6a, 0xd8, 0x5e,
16136- 0x00, 0x65, 0x5c, 0x44,
16137- 0x21, 0x6a, 0xd8, 0x5e,
16138- 0x00, 0x65, 0x5c, 0x44,
16139- 0x07, 0x6a, 0x54, 0x5d,
16140+ 0x00, 0x65, 0x42, 0x44,
16141+ 0x80, 0x04, 0x5c, 0x7c,
16142+ 0x51, 0x6a, 0x60, 0x5d,
16143+ 0x01, 0x51, 0x5c, 0x64,
16144+ 0x01, 0xa4, 0x54, 0x7c,
16145+ 0x80, 0xba, 0x5e, 0x6c,
16146+ 0x41, 0x6a, 0xda, 0x5e,
16147+ 0x00, 0x65, 0x5e, 0x44,
16148+ 0x21, 0x6a, 0xda, 0x5e,
16149+ 0x00, 0x65, 0x5e, 0x44,
16150+ 0x07, 0x6a, 0x56, 0x5d,
16151 0x01, 0x06, 0xd4, 0x30,
16152 0x00, 0x65, 0xcc, 0x41,
16153- 0x80, 0xb8, 0x56, 0x7c,
16154- 0xc0, 0x3c, 0x6a, 0x7c,
16155- 0x80, 0x3c, 0x56, 0x6c,
16156- 0xff, 0xa8, 0x6a, 0x6c,
16157- 0x40, 0x3c, 0x56, 0x6c,
16158- 0x10, 0xb8, 0x6e, 0x7c,
16159- 0xa1, 0x6a, 0xd8, 0x5e,
16160- 0x01, 0xb4, 0x74, 0x6c,
16161- 0x02, 0xb4, 0x76, 0x6c,
16162- 0x01, 0xa4, 0x76, 0x7c,
16163- 0xff, 0xa8, 0x86, 0x7c,
16164+ 0x80, 0xb8, 0x58, 0x7c,
16165+ 0xc0, 0x3c, 0x6c, 0x7c,
16166+ 0x80, 0x3c, 0x58, 0x6c,
16167+ 0xff, 0xa8, 0x6c, 0x6c,
16168+ 0x40, 0x3c, 0x58, 0x6c,
16169+ 0x10, 0xb8, 0x70, 0x7c,
16170+ 0xa1, 0x6a, 0xda, 0x5e,
16171+ 0x01, 0xb4, 0x76, 0x6c,
16172+ 0x02, 0xb4, 0x78, 0x6c,
16173+ 0x01, 0xa4, 0x78, 0x7c,
16174+ 0xff, 0xa8, 0x88, 0x7c,
16175 0x04, 0xb4, 0x68, 0x01,
16176 0x01, 0x6a, 0x76, 0x00,
16177- 0x00, 0xbb, 0x12, 0x5e,
16178- 0xff, 0xa8, 0x86, 0x7c,
16179- 0x71, 0x6a, 0xd8, 0x5e,
16180- 0x40, 0x51, 0x86, 0x64,
16181- 0x00, 0x65, 0xb2, 0x5e,
16182+ 0x00, 0xbb, 0x14, 0x5e,
16183+ 0xff, 0xa8, 0x88, 0x7c,
16184+ 0x71, 0x6a, 0xda, 0x5e,
16185+ 0x40, 0x51, 0x88, 0x64,
16186+ 0x00, 0x65, 0xb4, 0x5e,
16187 0x00, 0x65, 0xde, 0x41,
16188- 0x00, 0xbb, 0x8a, 0x5c,
16189+ 0x00, 0xbb, 0x8c, 0x5c,
16190 0x00, 0x65, 0xde, 0x41,
16191- 0x00, 0x65, 0xb2, 0x5e,
16192+ 0x00, 0x65, 0xb4, 0x5e,
16193 0x01, 0x65, 0xa2, 0x30,
16194 0x01, 0xf8, 0xc8, 0x30,
16195 0x01, 0x4e, 0xc8, 0x30,
16196- 0x00, 0x6a, 0xb6, 0xdd,
16197- 0x00, 0x51, 0xc8, 0x5d,
16198+ 0x00, 0x6a, 0xb8, 0xdd,
16199+ 0x00, 0x51, 0xca, 0x5d,
16200 0x01, 0x4e, 0x9c, 0x18,
16201 0x02, 0x6a, 0x22, 0x05,
16202- 0xc0, 0x3c, 0x56, 0x6c,
16203+ 0xc0, 0x3c, 0x58, 0x6c,
16204 0x04, 0xb8, 0x70, 0x01,
16205- 0x00, 0x65, 0xd4, 0x5e,
16206+ 0x00, 0x65, 0xd6, 0x5e,
16207 0x20, 0xb8, 0xde, 0x69,
16208 0x01, 0xbb, 0xa2, 0x30,
16209 0x3f, 0xba, 0x7c, 0x08,
16210- 0x00, 0xb9, 0xce, 0x5c,
16211+ 0x00, 0xb9, 0xd0, 0x5c,
16212 0x00, 0x65, 0xde, 0x41,
16213 0x01, 0x06, 0xd4, 0x30,
16214 0x20, 0x3c, 0xcc, 0x79,
16215- 0x20, 0x3c, 0x5c, 0x7c,
16216- 0x01, 0xa4, 0xb8, 0x7c,
16217+ 0x20, 0x3c, 0x5e, 0x7c,
16218+ 0x01, 0xa4, 0xba, 0x7c,
16219 0x01, 0xb4, 0x68, 0x01,
16220 0x00, 0x65, 0xcc, 0x41,
16221- 0x00, 0x65, 0x5c, 0x44,
16222+ 0x00, 0x65, 0x5e, 0x44,
16223 0x04, 0x14, 0x58, 0x31,
16224 0x01, 0x06, 0xd4, 0x30,
16225 0x08, 0xa0, 0x60, 0x31,
16226 0xac, 0x6a, 0xcc, 0x00,
16227- 0x14, 0x6a, 0xf4, 0x5d,
16228+ 0x14, 0x6a, 0xf6, 0x5d,
16229 0x01, 0x06, 0xd4, 0x30,
16230- 0xa0, 0x6a, 0xec, 0x5d,
16231+ 0xa0, 0x6a, 0xee, 0x5d,
16232 0x00, 0x65, 0xcc, 0x41,
16233 0xdf, 0x3c, 0x78, 0x08,
16234 0x12, 0x01, 0x02, 0x00,
16235- 0x00, 0x65, 0x5c, 0x44,
16236+ 0x00, 0x65, 0x5e, 0x44,
16237 0x4c, 0x65, 0xcc, 0x28,
16238 0x01, 0x3e, 0x20, 0x31,
16239 0xd0, 0x66, 0xcc, 0x18,
16240@@ -631,102 +632,102 @@
16241 0xd0, 0x65, 0xca, 0x18,
16242 0x01, 0x3e, 0x20, 0x31,
16243 0x30, 0x65, 0xd4, 0x18,
16244- 0x00, 0x65, 0xe6, 0x4c,
16245+ 0x00, 0x65, 0xe8, 0x4c,
16246 0xe1, 0x6a, 0x22, 0x01,
16247 0xff, 0x6a, 0xd4, 0x08,
16248 0x20, 0x65, 0xd4, 0x18,
16249- 0x00, 0x65, 0xee, 0x54,
16250+ 0x00, 0x65, 0xf0, 0x54,
16251 0xe1, 0x6a, 0x22, 0x01,
16252 0xff, 0x6a, 0xd4, 0x08,
16253 0x20, 0x65, 0xca, 0x18,
16254 0xe0, 0x65, 0xd4, 0x18,
16255- 0x00, 0x65, 0xf8, 0x4c,
16256+ 0x00, 0x65, 0xfa, 0x4c,
16257 0xe1, 0x6a, 0x22, 0x01,
16258 0xff, 0x6a, 0xd4, 0x08,
16259 0xd0, 0x65, 0xd4, 0x18,
16260- 0x00, 0x65, 0x00, 0x55,
16261+ 0x00, 0x65, 0x02, 0x55,
16262 0xe1, 0x6a, 0x22, 0x01,
16263 0xff, 0x6a, 0xd4, 0x08,
16264 0x01, 0x6c, 0xa2, 0x30,
16265- 0xff, 0x51, 0x12, 0x75,
16266- 0x00, 0x51, 0x8e, 0x5d,
16267+ 0xff, 0x51, 0x14, 0x75,
16268+ 0x00, 0x51, 0x90, 0x5d,
16269 0x01, 0x51, 0x20, 0x31,
16270- 0x00, 0x65, 0x34, 0x45,
16271+ 0x00, 0x65, 0x36, 0x45,
16272 0x3f, 0xba, 0xc8, 0x08,
16273- 0x00, 0x3e, 0x34, 0x75,
16274- 0x00, 0x65, 0xb0, 0x5e,
16275+ 0x00, 0x3e, 0x36, 0x75,
16276+ 0x00, 0x65, 0xb2, 0x5e,
16277 0x80, 0x3c, 0x78, 0x00,
16278 0x01, 0x06, 0xd4, 0x30,
16279- 0x00, 0x65, 0xd8, 0x5d,
16280+ 0x00, 0x65, 0xda, 0x5d,
16281 0x01, 0x3c, 0x78, 0x00,
16282- 0xe0, 0x3f, 0x50, 0x65,
16283+ 0xe0, 0x3f, 0x52, 0x65,
16284 0x02, 0x3c, 0x78, 0x00,
16285- 0x20, 0x12, 0x50, 0x65,
16286- 0x51, 0x6a, 0x5e, 0x5d,
16287- 0x00, 0x51, 0x8e, 0x5d,
16288- 0x51, 0x6a, 0x5e, 0x5d,
16289+ 0x20, 0x12, 0x52, 0x65,
16290+ 0x51, 0x6a, 0x60, 0x5d,
16291+ 0x00, 0x51, 0x90, 0x5d,
16292+ 0x51, 0x6a, 0x60, 0x5d,
16293 0x01, 0x51, 0x20, 0x31,
16294 0x04, 0x3c, 0x78, 0x00,
16295 0x01, 0xb9, 0xc8, 0x30,
16296- 0x00, 0x3d, 0x4e, 0x65,
16297+ 0x00, 0x3d, 0x50, 0x65,
16298 0x08, 0x3c, 0x78, 0x00,
16299 0x3f, 0xba, 0xc8, 0x08,
16300- 0x00, 0x3e, 0x4e, 0x65,
16301+ 0x00, 0x3e, 0x50, 0x65,
16302 0x10, 0x3c, 0x78, 0x00,
16303- 0x04, 0xb8, 0x4e, 0x7d,
16304+ 0x04, 0xb8, 0x50, 0x7d,
16305 0xfb, 0xb8, 0x70, 0x09,
16306- 0x20, 0xb8, 0x44, 0x6d,
16307+ 0x20, 0xb8, 0x46, 0x6d,
16308 0x01, 0x90, 0xc8, 0x30,
16309 0xff, 0x6a, 0xa2, 0x00,
16310- 0x00, 0x3d, 0xce, 0x5c,
16311+ 0x00, 0x3d, 0xd0, 0x5c,
16312 0x01, 0x64, 0x20, 0x31,
16313 0xff, 0x6a, 0x78, 0x08,
16314 0x00, 0x65, 0xea, 0x58,
16315- 0x10, 0xb8, 0x5c, 0x7c,
16316- 0xff, 0x6a, 0x54, 0x5d,
16317- 0x00, 0x65, 0x5c, 0x44,
16318- 0x00, 0x65, 0xb0, 0x5e,
16319- 0x31, 0x6a, 0xd8, 0x5e,
16320- 0x00, 0x65, 0x5c, 0x44,
16321+ 0x10, 0xb8, 0x5e, 0x7c,
16322+ 0xff, 0x6a, 0x56, 0x5d,
16323+ 0x00, 0x65, 0x5e, 0x44,
16324+ 0x00, 0x65, 0xb2, 0x5e,
16325+ 0x31, 0x6a, 0xda, 0x5e,
16326+ 0x00, 0x65, 0x5e, 0x44,
16327 0x10, 0x3f, 0x06, 0x00,
16328 0x10, 0x6a, 0x06, 0x00,
16329 0x01, 0x65, 0x74, 0x34,
16330- 0x81, 0x6a, 0xd8, 0x5e,
16331- 0x00, 0x65, 0x60, 0x45,
16332+ 0x81, 0x6a, 0xda, 0x5e,
16333+ 0x00, 0x65, 0x62, 0x45,
16334 0x01, 0x06, 0xd4, 0x30,
16335- 0x01, 0x0c, 0x60, 0x7d,
16336- 0x04, 0x0c, 0x5a, 0x6d,
16337+ 0x01, 0x0c, 0x62, 0x7d,
16338+ 0x04, 0x0c, 0x5c, 0x6d,
16339 0xe0, 0x03, 0x7e, 0x08,
16340 0xe0, 0x3f, 0xcc, 0x61,
16341 0x01, 0x65, 0xcc, 0x30,
16342 0x01, 0x12, 0xda, 0x34,
16343 0x01, 0x06, 0xd4, 0x34,
16344- 0x01, 0x03, 0x6e, 0x6d,
16345+ 0x01, 0x03, 0x70, 0x6d,
16346 0x40, 0x03, 0xcc, 0x08,
16347 0x01, 0x65, 0x06, 0x30,
16348 0x40, 0x65, 0xc8, 0x08,
16349- 0x00, 0x66, 0x7c, 0x75,
16350- 0x40, 0x65, 0x7c, 0x7d,
16351- 0x00, 0x65, 0x7c, 0x5d,
16352+ 0x00, 0x66, 0x7e, 0x75,
16353+ 0x40, 0x65, 0x7e, 0x7d,
16354+ 0x00, 0x65, 0x7e, 0x5d,
16355 0xff, 0x6a, 0xd4, 0x08,
16356 0xff, 0x6a, 0xd4, 0x08,
16357 0xff, 0x6a, 0xd4, 0x08,
16358 0xff, 0x6a, 0xd4, 0x0c,
16359 0x08, 0x01, 0x02, 0x00,
16360- 0x02, 0x0b, 0x86, 0x7d,
16361+ 0x02, 0x0b, 0x88, 0x7d,
16362 0x01, 0x65, 0x0c, 0x30,
16363- 0x02, 0x0b, 0x8a, 0x7d,
16364+ 0x02, 0x0b, 0x8c, 0x7d,
16365 0xf7, 0x01, 0x02, 0x0c,
16366 0x01, 0x65, 0xc8, 0x30,
16367- 0xff, 0x41, 0xae, 0x75,
16368+ 0xff, 0x41, 0xb0, 0x75,
16369 0x01, 0x41, 0x20, 0x31,
16370 0xff, 0x6a, 0xa4, 0x00,
16371- 0x00, 0x65, 0x9e, 0x45,
16372- 0xff, 0xbf, 0xae, 0x75,
16373+ 0x00, 0x65, 0xa0, 0x45,
16374+ 0xff, 0xbf, 0xb0, 0x75,
16375 0x01, 0x90, 0xa4, 0x30,
16376 0x01, 0xbf, 0x20, 0x31,
16377- 0x00, 0xbb, 0x98, 0x65,
16378- 0xff, 0x52, 0xac, 0x75,
16379+ 0x00, 0xbb, 0x9a, 0x65,
16380+ 0xff, 0x52, 0xae, 0x75,
16381 0x01, 0xbf, 0xcc, 0x30,
16382 0x01, 0x90, 0xca, 0x30,
16383 0x01, 0x52, 0x20, 0x31,
16384@@ -734,28 +735,28 @@
16385 0x01, 0x65, 0x20, 0x35,
16386 0x01, 0xbf, 0x82, 0x34,
16387 0x01, 0x64, 0xa2, 0x30,
16388- 0x00, 0x6a, 0xc0, 0x5e,
16389+ 0x00, 0x6a, 0xc2, 0x5e,
16390 0x0d, 0x6a, 0x76, 0x00,
16391- 0x00, 0x51, 0x12, 0x46,
16392+ 0x00, 0x51, 0x14, 0x46,
16393 0x01, 0x65, 0xa4, 0x30,
16394 0xe0, 0x6a, 0xcc, 0x00,
16395- 0x48, 0x6a, 0x06, 0x5e,
16396+ 0x48, 0x6a, 0x08, 0x5e,
16397 0x01, 0x6a, 0xd0, 0x01,
16398 0x01, 0x6a, 0xdc, 0x05,
16399 0x88, 0x6a, 0xcc, 0x00,
16400- 0x48, 0x6a, 0x06, 0x5e,
16401- 0x01, 0x6a, 0xe0, 0x5d,
16402+ 0x48, 0x6a, 0x08, 0x5e,
16403+ 0x01, 0x6a, 0xe2, 0x5d,
16404 0x01, 0x6a, 0x26, 0x05,
16405 0x01, 0x65, 0xd8, 0x31,
16406 0x09, 0xee, 0xdc, 0x01,
16407- 0x80, 0xee, 0xcc, 0x7d,
16408+ 0x80, 0xee, 0xce, 0x7d,
16409 0xff, 0x6a, 0xdc, 0x0d,
16410 0x01, 0x65, 0x32, 0x31,
16411 0x0a, 0x93, 0x26, 0x01,
16412- 0x00, 0x65, 0xa8, 0x46,
16413- 0x81, 0x6a, 0xd8, 0x5e,
16414- 0x01, 0x0c, 0xd8, 0x7d,
16415- 0x04, 0x0c, 0xd6, 0x6d,
16416+ 0x00, 0x65, 0xaa, 0x46,
16417+ 0x81, 0x6a, 0xda, 0x5e,
16418+ 0x01, 0x0c, 0xda, 0x7d,
16419+ 0x04, 0x0c, 0xd8, 0x6d,
16420 0xe0, 0x03, 0x06, 0x08,
16421 0xe0, 0x03, 0x7e, 0x0c,
16422 0x01, 0x65, 0x18, 0x31,
16423@@ -774,7 +775,7 @@
16424 0x01, 0x6c, 0xda, 0x34,
16425 0x3d, 0x64, 0xa4, 0x28,
16426 0x55, 0x64, 0xc8, 0x28,
16427- 0x00, 0x65, 0x06, 0x46,
16428+ 0x00, 0x65, 0x08, 0x46,
16429 0x2e, 0x64, 0xa4, 0x28,
16430 0x66, 0x64, 0xc8, 0x28,
16431 0x00, 0x6c, 0xda, 0x18,
16432@@ -785,63 +786,63 @@
16433 0x00, 0x6c, 0xda, 0x24,
16434 0x01, 0x65, 0xc8, 0x30,
16435 0xe0, 0x6a, 0xcc, 0x00,
16436- 0x44, 0x6a, 0x02, 0x5e,
16437+ 0x44, 0x6a, 0x04, 0x5e,
16438 0x01, 0x90, 0xe2, 0x31,
16439- 0x04, 0x3b, 0x26, 0x7e,
16440+ 0x04, 0x3b, 0x28, 0x7e,
16441 0x30, 0x6a, 0xd0, 0x01,
16442 0x20, 0x6a, 0xd0, 0x01,
16443 0x1d, 0x6a, 0xdc, 0x01,
16444- 0xdc, 0xee, 0x22, 0x66,
16445- 0x00, 0x65, 0x3e, 0x46,
16446+ 0xdc, 0xee, 0x24, 0x66,
16447+ 0x00, 0x65, 0x40, 0x46,
16448 0x20, 0x6a, 0xd0, 0x01,
16449 0x01, 0x6a, 0xdc, 0x01,
16450 0x20, 0xa0, 0xd8, 0x31,
16451 0x09, 0xee, 0xdc, 0x01,
16452- 0x80, 0xee, 0x2e, 0x7e,
16453+ 0x80, 0xee, 0x30, 0x7e,
16454 0x11, 0x6a, 0xdc, 0x01,
16455- 0x50, 0xee, 0x32, 0x66,
16456+ 0x50, 0xee, 0x34, 0x66,
16457 0x20, 0x6a, 0xd0, 0x01,
16458 0x09, 0x6a, 0xdc, 0x01,
16459- 0x88, 0xee, 0x38, 0x66,
16460+ 0x88, 0xee, 0x3a, 0x66,
16461 0x19, 0x6a, 0xdc, 0x01,
16462- 0xd8, 0xee, 0x3c, 0x66,
16463+ 0xd8, 0xee, 0x3e, 0x66,
16464 0xff, 0x6a, 0xdc, 0x09,
16465- 0x18, 0xee, 0x40, 0x6e,
16466+ 0x18, 0xee, 0x42, 0x6e,
16467 0xff, 0x6a, 0xd4, 0x0c,
16468 0x88, 0x6a, 0xcc, 0x00,
16469- 0x44, 0x6a, 0x02, 0x5e,
16470- 0x20, 0x6a, 0xe0, 0x5d,
16471+ 0x44, 0x6a, 0x04, 0x5e,
16472+ 0x20, 0x6a, 0xe2, 0x5d,
16473 0x01, 0x3b, 0x26, 0x31,
16474- 0x04, 0x3b, 0x5a, 0x6e,
16475+ 0x04, 0x3b, 0x5c, 0x6e,
16476 0xa0, 0x6a, 0xca, 0x00,
16477 0x20, 0x65, 0xc8, 0x18,
16478- 0x00, 0x65, 0x98, 0x5e,
16479- 0x00, 0x65, 0x52, 0x66,
16480+ 0x00, 0x65, 0x9a, 0x5e,
16481+ 0x00, 0x65, 0x54, 0x66,
16482 0x0a, 0x93, 0x26, 0x01,
16483- 0x00, 0x65, 0xa8, 0x46,
16484+ 0x00, 0x65, 0xaa, 0x46,
16485 0xa0, 0x6a, 0xcc, 0x00,
16486 0xff, 0x6a, 0xc8, 0x08,
16487- 0x20, 0x94, 0x5e, 0x6e,
16488- 0x10, 0x94, 0x60, 0x6e,
16489- 0x08, 0x94, 0x7a, 0x6e,
16490- 0x08, 0x94, 0x7a, 0x6e,
16491- 0x08, 0x94, 0x7a, 0x6e,
16492+ 0x20, 0x94, 0x60, 0x6e,
16493+ 0x10, 0x94, 0x62, 0x6e,
16494+ 0x08, 0x94, 0x7c, 0x6e,
16495+ 0x08, 0x94, 0x7c, 0x6e,
16496+ 0x08, 0x94, 0x7c, 0x6e,
16497 0xff, 0x8c, 0xc8, 0x10,
16498 0xc1, 0x64, 0xc8, 0x18,
16499 0xf8, 0x64, 0xc8, 0x08,
16500 0x01, 0x99, 0xda, 0x30,
16501- 0x00, 0x66, 0x6e, 0x66,
16502- 0xc0, 0x66, 0xaa, 0x76,
16503+ 0x00, 0x66, 0x70, 0x66,
16504+ 0xc0, 0x66, 0xac, 0x76,
16505 0x60, 0x66, 0xc8, 0x18,
16506 0x3d, 0x64, 0xc8, 0x28,
16507- 0x00, 0x65, 0x5e, 0x46,
16508+ 0x00, 0x65, 0x60, 0x46,
16509 0xf7, 0x93, 0x26, 0x09,
16510- 0x08, 0x93, 0x7c, 0x6e,
16511+ 0x08, 0x93, 0x7e, 0x6e,
16512 0x00, 0x62, 0xc4, 0x18,
16513- 0x00, 0x65, 0xa8, 0x5e,
16514- 0x00, 0x65, 0x88, 0x5e,
16515- 0x00, 0x65, 0x88, 0x5e,
16516- 0x00, 0x65, 0x88, 0x5e,
16517+ 0x00, 0x65, 0xaa, 0x5e,
16518+ 0x00, 0x65, 0x8a, 0x5e,
16519+ 0x00, 0x65, 0x8a, 0x5e,
16520+ 0x00, 0x65, 0x8a, 0x5e,
16521 0x01, 0x99, 0xda, 0x30,
16522 0x01, 0x99, 0xda, 0x30,
16523 0x01, 0x99, 0xda, 0x30,
16524@@ -858,11 +859,11 @@
16525 0x01, 0x6c, 0x32, 0x31,
16526 0x01, 0x6c, 0x32, 0x31,
16527 0x01, 0x6c, 0x32, 0x35,
16528- 0x08, 0x94, 0xa8, 0x7e,
16529+ 0x08, 0x94, 0xaa, 0x7e,
16530 0xf7, 0x93, 0x26, 0x09,
16531- 0x08, 0x93, 0xac, 0x6e,
16532+ 0x08, 0x93, 0xae, 0x6e,
16533 0xff, 0x6a, 0xd4, 0x0c,
16534- 0x04, 0xb8, 0xd4, 0x6e,
16535+ 0x04, 0xb8, 0xd6, 0x6e,
16536 0x01, 0x42, 0x7e, 0x31,
16537 0xff, 0x6a, 0x76, 0x01,
16538 0x01, 0x90, 0x84, 0x34,
16539@@ -870,14 +871,14 @@
16540 0x01, 0x85, 0x0a, 0x01,
16541 0x7f, 0x65, 0x10, 0x09,
16542 0xfe, 0x85, 0x0a, 0x0d,
16543- 0xff, 0x42, 0xd0, 0x66,
16544- 0xff, 0x41, 0xc8, 0x66,
16545- 0xd1, 0x6a, 0xd8, 0x5e,
16546+ 0xff, 0x42, 0xd2, 0x66,
16547+ 0xff, 0x41, 0xca, 0x66,
16548+ 0xd1, 0x6a, 0xda, 0x5e,
16549 0xff, 0x6a, 0xca, 0x04,
16550 0x01, 0x41, 0x20, 0x31,
16551 0x01, 0xbf, 0x82, 0x30,
16552 0x01, 0x6a, 0x76, 0x00,
16553- 0x00, 0xbb, 0x12, 0x46,
16554+ 0x00, 0xbb, 0x14, 0x46,
16555 0x01, 0x42, 0x20, 0x31,
16556 0x01, 0xbf, 0x84, 0x34,
16557 0x01, 0x41, 0x7e, 0x31,
16558@@ -941,7 +942,7 @@
16559 static int
16560 ahc_patch17_func(struct ahc_softc *ahc)
16561 {
16562- return ((ahc->flags & AHC_TMODE_WIDEODD_BUG) != 0);
16563+ return ((ahc->bugs & AHC_TMODE_WIDEODD_BUG) != 0);
16564 }
16565
16566 static ahc_patch_func_t ahc_patch16_func;
16567@@ -1142,152 +1143,152 @@
16568 { ahc_patch0_func, 196, 1, 1 },
16569 { ahc_patch9_func, 212, 6, 2 },
16570 { ahc_patch0_func, 218, 6, 1 },
16571- { ahc_patch8_func, 226, 20, 2 },
16572+ { ahc_patch8_func, 226, 21, 2 },
16573 { ahc_patch1_func, 241, 1, 1 },
16574- { ahc_patch1_func, 248, 1, 2 },
16575- { ahc_patch0_func, 249, 2, 2 },
16576- { ahc_patch11_func, 250, 1, 1 },
16577- { ahc_patch9_func, 258, 27, 3 },
16578- { ahc_patch1_func, 274, 10, 2 },
16579- { ahc_patch13_func, 277, 1, 1 },
16580- { ahc_patch14_func, 285, 14, 1 },
16581- { ahc_patch1_func, 301, 1, 2 },
16582- { ahc_patch0_func, 302, 1, 1 },
16583- { ahc_patch9_func, 305, 1, 1 },
16584- { ahc_patch13_func, 310, 1, 1 },
16585- { ahc_patch9_func, 311, 2, 2 },
16586- { ahc_patch0_func, 313, 4, 1 },
16587- { ahc_patch14_func, 317, 1, 1 },
16588- { ahc_patch15_func, 319, 2, 3 },
16589- { ahc_patch9_func, 319, 1, 2 },
16590- { ahc_patch0_func, 320, 1, 1 },
16591- { ahc_patch6_func, 325, 1, 2 },
16592- { ahc_patch0_func, 326, 1, 1 },
16593- { ahc_patch1_func, 330, 47, 11 },
16594- { ahc_patch6_func, 337, 2, 4 },
16595- { ahc_patch7_func, 337, 1, 1 },
16596- { ahc_patch8_func, 338, 1, 1 },
16597- { ahc_patch0_func, 339, 1, 1 },
16598- { ahc_patch16_func, 340, 1, 1 },
16599- { ahc_patch6_func, 356, 6, 3 },
16600- { ahc_patch16_func, 356, 5, 1 },
16601- { ahc_patch0_func, 362, 7, 1 },
16602- { ahc_patch13_func, 372, 5, 1 },
16603- { ahc_patch0_func, 377, 52, 17 },
16604- { ahc_patch14_func, 377, 1, 1 },
16605- { ahc_patch7_func, 379, 2, 2 },
16606- { ahc_patch17_func, 380, 1, 1 },
16607- { ahc_patch9_func, 383, 1, 1 },
16608- { ahc_patch18_func, 390, 1, 1 },
16609- { ahc_patch14_func, 395, 9, 3 },
16610- { ahc_patch9_func, 396, 3, 2 },
16611- { ahc_patch0_func, 399, 3, 1 },
16612- { ahc_patch9_func, 407, 6, 2 },
16613- { ahc_patch0_func, 413, 9, 2 },
16614- { ahc_patch13_func, 413, 1, 1 },
16615- { ahc_patch13_func, 422, 2, 1 },
16616- { ahc_patch14_func, 424, 1, 1 },
16617- { ahc_patch9_func, 426, 1, 2 },
16618- { ahc_patch0_func, 427, 1, 1 },
16619- { ahc_patch7_func, 428, 1, 1 },
16620+ { ahc_patch1_func, 249, 1, 2 },
16621+ { ahc_patch0_func, 250, 2, 2 },
16622+ { ahc_patch11_func, 251, 1, 1 },
16623+ { ahc_patch9_func, 259, 27, 3 },
16624+ { ahc_patch1_func, 275, 10, 2 },
16625+ { ahc_patch13_func, 278, 1, 1 },
16626+ { ahc_patch14_func, 286, 14, 1 },
16627+ { ahc_patch1_func, 302, 1, 2 },
16628+ { ahc_patch0_func, 303, 1, 1 },
16629+ { ahc_patch9_func, 306, 1, 1 },
16630+ { ahc_patch13_func, 311, 1, 1 },
16631+ { ahc_patch9_func, 312, 2, 2 },
16632+ { ahc_patch0_func, 314, 4, 1 },
16633+ { ahc_patch14_func, 318, 1, 1 },
16634+ { ahc_patch15_func, 320, 2, 3 },
16635+ { ahc_patch9_func, 320, 1, 2 },
16636+ { ahc_patch0_func, 321, 1, 1 },
16637+ { ahc_patch6_func, 326, 1, 2 },
16638+ { ahc_patch0_func, 327, 1, 1 },
16639+ { ahc_patch1_func, 331, 47, 11 },
16640+ { ahc_patch6_func, 338, 2, 4 },
16641+ { ahc_patch7_func, 338, 1, 1 },
16642+ { ahc_patch8_func, 339, 1, 1 },
16643+ { ahc_patch0_func, 340, 1, 1 },
16644+ { ahc_patch16_func, 341, 1, 1 },
16645+ { ahc_patch6_func, 357, 6, 3 },
16646+ { ahc_patch16_func, 357, 5, 1 },
16647+ { ahc_patch0_func, 363, 7, 1 },
16648+ { ahc_patch13_func, 373, 5, 1 },
16649+ { ahc_patch0_func, 378, 52, 17 },
16650+ { ahc_patch14_func, 378, 1, 1 },
16651+ { ahc_patch7_func, 380, 2, 2 },
16652+ { ahc_patch17_func, 381, 1, 1 },
16653+ { ahc_patch9_func, 384, 1, 1 },
16654+ { ahc_patch18_func, 391, 1, 1 },
16655+ { ahc_patch14_func, 396, 9, 3 },
16656+ { ahc_patch9_func, 397, 3, 2 },
16657+ { ahc_patch0_func, 400, 3, 1 },
16658+ { ahc_patch9_func, 408, 6, 2 },
16659+ { ahc_patch0_func, 414, 9, 2 },
16660+ { ahc_patch13_func, 414, 1, 1 },
16661+ { ahc_patch13_func, 423, 2, 1 },
16662+ { ahc_patch14_func, 425, 1, 1 },
16663+ { ahc_patch9_func, 427, 1, 2 },
16664+ { ahc_patch0_func, 428, 1, 1 },
16665 { ahc_patch7_func, 429, 1, 1 },
16666- { ahc_patch8_func, 430, 3, 3 },
16667- { ahc_patch6_func, 431, 1, 2 },
16668- { ahc_patch0_func, 432, 1, 1 },
16669- { ahc_patch9_func, 433, 1, 1 },
16670- { ahc_patch15_func, 434, 1, 2 },
16671- { ahc_patch13_func, 434, 1, 1 },
16672- { ahc_patch14_func, 436, 9, 4 },
16673- { ahc_patch9_func, 436, 1, 1 },
16674- { ahc_patch9_func, 443, 2, 1 },
16675- { ahc_patch0_func, 445, 4, 3 },
16676- { ahc_patch9_func, 445, 1, 2 },
16677- { ahc_patch0_func, 446, 3, 1 },
16678- { ahc_patch1_func, 450, 2, 1 },
16679- { ahc_patch7_func, 452, 10, 2 },
16680- { ahc_patch0_func, 462, 1, 1 },
16681- { ahc_patch8_func, 463, 118, 22 },
16682- { ahc_patch1_func, 465, 3, 2 },
16683- { ahc_patch0_func, 468, 5, 3 },
16684- { ahc_patch9_func, 468, 2, 2 },
16685- { ahc_patch0_func, 470, 3, 1 },
16686- { ahc_patch1_func, 475, 2, 2 },
16687- { ahc_patch0_func, 477, 6, 3 },
16688- { ahc_patch9_func, 477, 2, 2 },
16689- { ahc_patch0_func, 479, 3, 1 },
16690- { ahc_patch1_func, 485, 2, 2 },
16691- { ahc_patch0_func, 487, 9, 7 },
16692- { ahc_patch9_func, 487, 5, 6 },
16693- { ahc_patch19_func, 487, 1, 2 },
16694- { ahc_patch0_func, 488, 1, 1 },
16695- { ahc_patch19_func, 490, 1, 2 },
16696- { ahc_patch0_func, 491, 1, 1 },
16697- { ahc_patch0_func, 492, 4, 1 },
16698- { ahc_patch6_func, 497, 3, 2 },
16699- { ahc_patch0_func, 500, 1, 1 },
16700- { ahc_patch6_func, 510, 1, 2 },
16701- { ahc_patch0_func, 511, 1, 1 },
16702- { ahc_patch20_func, 548, 7, 1 },
16703- { ahc_patch3_func, 583, 1, 2 },
16704- { ahc_patch0_func, 584, 1, 1 },
16705- { ahc_patch21_func, 587, 1, 1 },
16706- { ahc_patch8_func, 589, 106, 33 },
16707- { ahc_patch4_func, 591, 1, 1 },
16708- { ahc_patch1_func, 597, 2, 2 },
16709- { ahc_patch0_func, 599, 1, 1 },
16710- { ahc_patch1_func, 602, 1, 2 },
16711- { ahc_patch0_func, 603, 1, 1 },
16712- { ahc_patch9_func, 604, 3, 3 },
16713- { ahc_patch15_func, 605, 1, 1 },
16714- { ahc_patch0_func, 607, 4, 1 },
16715- { ahc_patch19_func, 616, 2, 2 },
16716- { ahc_patch0_func, 618, 1, 1 },
16717- { ahc_patch19_func, 622, 10, 3 },
16718- { ahc_patch5_func, 624, 8, 1 },
16719- { ahc_patch0_func, 632, 9, 2 },
16720- { ahc_patch5_func, 633, 8, 1 },
16721- { ahc_patch4_func, 643, 1, 2 },
16722- { ahc_patch0_func, 644, 1, 1 },
16723- { ahc_patch19_func, 645, 1, 2 },
16724- { ahc_patch0_func, 646, 3, 2 },
16725- { ahc_patch4_func, 648, 1, 1 },
16726- { ahc_patch5_func, 649, 1, 1 },
16727- { ahc_patch5_func, 652, 1, 1 },
16728- { ahc_patch5_func, 654, 1, 1 },
16729- { ahc_patch4_func, 656, 2, 2 },
16730- { ahc_patch0_func, 658, 2, 1 },
16731- { ahc_patch5_func, 660, 1, 1 },
16732- { ahc_patch5_func, 663, 1, 1 },
16733- { ahc_patch5_func, 666, 1, 1 },
16734- { ahc_patch19_func, 670, 1, 1 },
16735- { ahc_patch19_func, 673, 1, 1 },
16736- { ahc_patch4_func, 679, 1, 1 },
16737- { ahc_patch6_func, 682, 1, 2 },
16738- { ahc_patch0_func, 683, 1, 1 },
16739- { ahc_patch7_func, 695, 16, 1 },
16740- { ahc_patch4_func, 711, 20, 1 },
16741- { ahc_patch9_func, 732, 4, 2 },
16742- { ahc_patch0_func, 736, 4, 1 },
16743- { ahc_patch9_func, 740, 4, 2 },
16744- { ahc_patch0_func, 744, 3, 1 },
16745- { ahc_patch6_func, 750, 1, 1 },
16746- { ahc_patch22_func, 752, 14, 1 },
16747- { ahc_patch7_func, 766, 3, 1 },
16748- { ahc_patch9_func, 778, 24, 8 },
16749- { ahc_patch19_func, 782, 1, 2 },
16750- { ahc_patch0_func, 783, 1, 1 },
16751- { ahc_patch15_func, 788, 4, 2 },
16752- { ahc_patch0_func, 792, 7, 3 },
16753- { ahc_patch23_func, 792, 5, 2 },
16754- { ahc_patch0_func, 797, 2, 1 },
16755- { ahc_patch0_func, 802, 42, 3 },
16756- { ahc_patch18_func, 814, 18, 2 },
16757- { ahc_patch0_func, 832, 1, 1 },
16758- { ahc_patch4_func, 856, 1, 1 },
16759- { ahc_patch4_func, 857, 3, 2 },
16760- { ahc_patch0_func, 860, 1, 1 },
16761- { ahc_patch13_func, 861, 3, 1 },
16762- { ahc_patch4_func, 864, 12, 1 }
16763+ { ahc_patch7_func, 430, 1, 1 },
16764+ { ahc_patch8_func, 431, 3, 3 },
16765+ { ahc_patch6_func, 432, 1, 2 },
16766+ { ahc_patch0_func, 433, 1, 1 },
16767+ { ahc_patch9_func, 434, 1, 1 },
16768+ { ahc_patch15_func, 435, 1, 2 },
16769+ { ahc_patch13_func, 435, 1, 1 },
16770+ { ahc_patch14_func, 437, 9, 4 },
16771+ { ahc_patch9_func, 437, 1, 1 },
16772+ { ahc_patch9_func, 444, 2, 1 },
16773+ { ahc_patch0_func, 446, 4, 3 },
16774+ { ahc_patch9_func, 446, 1, 2 },
16775+ { ahc_patch0_func, 447, 3, 1 },
16776+ { ahc_patch1_func, 451, 2, 1 },
16777+ { ahc_patch7_func, 453, 10, 2 },
16778+ { ahc_patch0_func, 463, 1, 1 },
16779+ { ahc_patch8_func, 464, 118, 22 },
16780+ { ahc_patch1_func, 466, 3, 2 },
16781+ { ahc_patch0_func, 469, 5, 3 },
16782+ { ahc_patch9_func, 469, 2, 2 },
16783+ { ahc_patch0_func, 471, 3, 1 },
16784+ { ahc_patch1_func, 476, 2, 2 },
16785+ { ahc_patch0_func, 478, 6, 3 },
16786+ { ahc_patch9_func, 478, 2, 2 },
16787+ { ahc_patch0_func, 480, 3, 1 },
16788+ { ahc_patch1_func, 486, 2, 2 },
16789+ { ahc_patch0_func, 488, 9, 7 },
16790+ { ahc_patch9_func, 488, 5, 6 },
16791+ { ahc_patch19_func, 488, 1, 2 },
16792+ { ahc_patch0_func, 489, 1, 1 },
16793+ { ahc_patch19_func, 491, 1, 2 },
16794+ { ahc_patch0_func, 492, 1, 1 },
16795+ { ahc_patch0_func, 493, 4, 1 },
16796+ { ahc_patch6_func, 498, 3, 2 },
16797+ { ahc_patch0_func, 501, 1, 1 },
16798+ { ahc_patch6_func, 511, 1, 2 },
16799+ { ahc_patch0_func, 512, 1, 1 },
16800+ { ahc_patch20_func, 549, 7, 1 },
16801+ { ahc_patch3_func, 584, 1, 2 },
16802+ { ahc_patch0_func, 585, 1, 1 },
16803+ { ahc_patch21_func, 588, 1, 1 },
16804+ { ahc_patch8_func, 590, 106, 33 },
16805+ { ahc_patch4_func, 592, 1, 1 },
16806+ { ahc_patch1_func, 598, 2, 2 },
16807+ { ahc_patch0_func, 600, 1, 1 },
16808+ { ahc_patch1_func, 603, 1, 2 },
16809+ { ahc_patch0_func, 604, 1, 1 },
16810+ { ahc_patch9_func, 605, 3, 3 },
16811+ { ahc_patch15_func, 606, 1, 1 },
16812+ { ahc_patch0_func, 608, 4, 1 },
16813+ { ahc_patch19_func, 617, 2, 2 },
16814+ { ahc_patch0_func, 619, 1, 1 },
16815+ { ahc_patch19_func, 623, 10, 3 },
16816+ { ahc_patch5_func, 625, 8, 1 },
16817+ { ahc_patch0_func, 633, 9, 2 },
16818+ { ahc_patch5_func, 634, 8, 1 },
16819+ { ahc_patch4_func, 644, 1, 2 },
16820+ { ahc_patch0_func, 645, 1, 1 },
16821+ { ahc_patch19_func, 646, 1, 2 },
16822+ { ahc_patch0_func, 647, 3, 2 },
16823+ { ahc_patch4_func, 649, 1, 1 },
16824+ { ahc_patch5_func, 650, 1, 1 },
16825+ { ahc_patch5_func, 653, 1, 1 },
16826+ { ahc_patch5_func, 655, 1, 1 },
16827+ { ahc_patch4_func, 657, 2, 2 },
16828+ { ahc_patch0_func, 659, 2, 1 },
16829+ { ahc_patch5_func, 661, 1, 1 },
16830+ { ahc_patch5_func, 664, 1, 1 },
16831+ { ahc_patch5_func, 667, 1, 1 },
16832+ { ahc_patch19_func, 671, 1, 1 },
16833+ { ahc_patch19_func, 674, 1, 1 },
16834+ { ahc_patch4_func, 680, 1, 1 },
16835+ { ahc_patch6_func, 683, 1, 2 },
16836+ { ahc_patch0_func, 684, 1, 1 },
16837+ { ahc_patch7_func, 696, 16, 1 },
16838+ { ahc_patch4_func, 712, 20, 1 },
16839+ { ahc_patch9_func, 733, 4, 2 },
16840+ { ahc_patch0_func, 737, 4, 1 },
16841+ { ahc_patch9_func, 741, 4, 2 },
16842+ { ahc_patch0_func, 745, 3, 1 },
16843+ { ahc_patch6_func, 751, 1, 1 },
16844+ { ahc_patch22_func, 753, 14, 1 },
16845+ { ahc_patch7_func, 767, 3, 1 },
16846+ { ahc_patch9_func, 779, 24, 8 },
16847+ { ahc_patch19_func, 783, 1, 2 },
16848+ { ahc_patch0_func, 784, 1, 1 },
16849+ { ahc_patch15_func, 789, 4, 2 },
16850+ { ahc_patch0_func, 793, 7, 3 },
16851+ { ahc_patch23_func, 793, 5, 2 },
16852+ { ahc_patch0_func, 798, 2, 1 },
16853+ { ahc_patch0_func, 803, 42, 3 },
16854+ { ahc_patch18_func, 815, 18, 2 },
16855+ { ahc_patch0_func, 833, 1, 1 },
16856+ { ahc_patch4_func, 857, 1, 1 },
16857+ { ahc_patch4_func, 858, 3, 2 },
16858+ { ahc_patch0_func, 861, 1, 1 },
16859+ { ahc_patch13_func, 862, 3, 1 },
16860+ { ahc_patch4_func, 865, 12, 1 }
16861 };
16862
16863 static struct cs {
16864@@ -1296,11 +1297,11 @@
16865 } critical_sections[] = {
16866 { 11, 18 },
16867 { 21, 30 },
16868- { 711, 727 },
16869- { 857, 860 },
16870- { 864, 870 },
16871- { 872, 874 },
16872- { 874, 876 }
16873+ { 712, 728 },
16874+ { 858, 861 },
16875+ { 865, 871 },
16876+ { 873, 875 },
16877+ { 875, 877 }
16878 };
16879
16880 static const int num_critical_sections = sizeof(critical_sections)
16881diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/aicasm.c linux-2.4.24/drivers/scsi/aic7xxx/aicasm/aicasm.c
16882--- linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/aicasm.c 2004-01-08 11:57:43.090989043 +0100
16883+++ linux-2.4.24/drivers/scsi/aic7xxx/aicasm/aicasm.c 2003-12-22 22:46:59.000000000 +0100
16884@@ -37,7 +37,7 @@
16885 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
16886 * POSSIBILITY OF SUCH DAMAGES.
16887 *
16888- * $Id$
16889+ * $Id$
16890 *
16891 * $FreeBSD$
16892 */
16893@@ -609,10 +609,10 @@
16894
16895 while (line < cur_instr->srcline) {
16896 fgets(buf, sizeof(buf), ifile);
16897- fprintf(listfile, "\t\t%s", buf);
16898+ fprintf(listfile, " \t%s", buf);
16899 line++;
16900 }
16901- fprintf(listfile, "%03x %02x%02x%02x%02x", instrptr,
16902+ fprintf(listfile, "%04x %02x%02x%02x%02x", instrptr,
16903 #if BYTE_ORDER == LITTLE_ENDIAN
16904 cur_instr->format.bytes[0],
16905 cur_instr->format.bytes[1],
16906@@ -624,14 +624,23 @@
16907 cur_instr->format.bytes[1],
16908 cur_instr->format.bytes[0]);
16909 #endif
16910- fgets(buf, sizeof(buf), ifile);
16911- fprintf(listfile, "\t%s", buf);
16912- line++;
16913+ /*
16914+ * Macro expansions can cause several instructions
16915+ * to be output for a single source line. Only
16916+ * advance the line once in these cases.
16917+ */
16918+ if (line == cur_instr->srcline) {
16919+ fgets(buf, sizeof(buf), ifile);
16920+ fprintf(listfile, "\t%s", buf);
16921+ line++;
16922+ } else {
16923+ fprintf(listfile, "\n");
16924+ }
16925 instrptr++;
16926 }
16927 /* Dump the remainder of the file */
16928 while(fgets(buf, sizeof(buf), ifile) != NULL)
16929- fprintf(listfile, "\t\t%s", buf);
16930+ fprintf(listfile, " %s", buf);
16931
16932 fclose(ifile);
16933 }
16934diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l linux-2.4.24/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l
16935--- linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l 2004-01-08 11:57:43.083990489 +0100
16936+++ linux-2.4.24/drivers/scsi/aic7xxx/aicasm/aicasm_macro_scan.l 2003-12-22 22:46:59.000000000 +0100
16937@@ -38,7 +38,7 @@
16938 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
16939 * POSSIBILITY OF SUCH DAMAGES.
16940 *
16941- * $Id$
16942+ * $Id$
16943 *
16944 * $FreeBSD$
16945 */
16946@@ -78,6 +78,7 @@
16947 \n {
16948 ++yylineno;
16949 }
16950+\r ;
16951 <ARGLIST>{SPACE} ;
16952 <ARGLIST>\( {
16953 parren_count++;
16954diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l linux-2.4.24/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l
16955--- linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l 2004-01-08 11:57:43.082990696 +0100
16956+++ linux-2.4.24/drivers/scsi/aic7xxx/aicasm/aicasm_scan.l 2003-12-22 22:46:59.000000000 +0100
16957@@ -38,7 +38,7 @@
16958 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
16959 * POSSIBILITY OF SUCH DAMAGES.
16960 *
16961- * $Id$
16962+ * $Id$
16963 *
16964 * $FreeBSD$
16965 */
16966@@ -87,6 +87,7 @@
16967
16968 %%
16969 \n { ++yylineno; }
16970+\r ;
16971 "/*" { BEGIN COMMENT; /* Enter comment eating state */ }
16972 <COMMENT>"/*" { fprintf(stderr, "Warning! Comment within comment."); }
16973 <COMMENT>\n { ++yylineno; }
16974@@ -114,6 +115,7 @@
16975 }
16976 }
16977 <CEXPR>\n { ++yylineno; }
16978+<CEXPR>\r ;
16979 <CEXPR>[^()\n]+ {
16980 char *yptr;
16981
16982@@ -359,6 +361,7 @@
16983 /* Eat escaped newlines. */
16984 ++yylineno;
16985 }
16986+<MACROBODY>\r ;
16987 <MACROBODY>\n {
16988 /* Macros end on the first unescaped newline. */
16989 BEGIN INITIAL;
16990@@ -369,10 +372,17 @@
16991 }
16992 <MACROBODY>{MBODY} {
16993 char *yptr;
16994+ char c;
16995
16996 yptr = yytext;
16997- while (*yptr)
16998- *string_buf_ptr++ = *yptr++;
16999+ while (c = *yptr++) {
17000+ /*
17001+ * Strip carriage returns.
17002+ */
17003+ if (c == '\r')
17004+ continue;
17005+ *string_buf_ptr++ = c;
17006+ }
17007 }
17008 {WORD}\( {
17009 char *yptr;
17010diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/Makefile linux-2.4.24/drivers/scsi/aic7xxx/aicasm/Makefile
17011--- linux-2.4.24.org/drivers/scsi/aic7xxx/aicasm/Makefile 2004-01-08 11:57:43.091988836 +0100
17012+++ linux-2.4.24/drivers/scsi/aic7xxx/aicasm/Makefile 2003-12-22 22:46:59.000000000 +0100
17013@@ -51,11 +49,19 @@
17014 clean:
17015 rm -f $(clean-files)
17016
17017+# Create a dependency chain in generated files
17018+# to avoid concurrent invocations of the single
17019+# rule that builds them all.
17020+aicasm_gram.c: aicasm_gram.h
17021 aicasm_gram.c aicasm_gram.h: aicasm_gram.y
17022 $(YACC) $(YFLAGS) -b $(<:.y=) $<
17023 mv $(<:.y=).tab.c $(<:.y=.c)
17024 mv $(<:.y=).tab.h $(<:.y=.h)
17025
17026+# Create a dependency chain in generated files
17027+# to avoid concurrent invocations of the single
17028+# rule that builds them all.
17029+aicasm_macro_gram.c: aicasm_macro_gram.h
17030 aicasm_macro_gram.c aicasm_macro_gram.h: aicasm_macro_gram.y
17031 $(YACC) $(YFLAGS) -b $(<:.y=) -p mm $<
17032 mv $(<:.y=).tab.c $(<:.y=.c)
17033diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aiclib.c linux-2.4.24/drivers/scsi/aic7xxx/aiclib.c
17034--- linux-2.4.24.org/drivers/scsi/aic7xxx/aiclib.c 2004-01-08 11:57:43.018004128 +0100
17035+++ linux-2.4.24/drivers/scsi/aic7xxx/aiclib.c 2003-12-22 22:46:59.000000000 +0100
17036@@ -30,17 +30,6 @@
17037 * $Id$
17038 */
17039
17040-#include <linux/blk.h>
17041-#include <linux/blkdev.h>
17042-#include <linux/delay.h>
17043-#include <linux/version.h>
17044-
17045-/* Core SCSI definitions */
17046-#include "scsi.h"
17047-#include "hosts.h"
17048-#include "aiclib.h"
17049-#include "cam.h"
17050-
17051 #ifndef FALSE
17052 #define FALSE 0
17053 #endif /* FALSE */
17054@@ -1411,3 +1400,336 @@
17055 }
17056 return (opt_arg);
17057 }
17058+
17059+/************************* Magic SysReq Support *******************************/
17060+void
17061+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
17062+aic_sysrq_handler(int key, struct pt_regs *unused, struct kbd_struct *unused1,
17063+ struct tty_struct *unused2)
17064+#else
17065+aic_sysrq_handler(int key, struct pt_regs *unused, struct tty_struct *unused2)
17066+#endif
17067+{
17068+#ifdef CONFIG_MAGIC_SYSRQ
17069+ struct aic_softc *aic;
17070+ u_long l;
17071+
17072+ aic_list_lock(&l);
17073+
17074+ TAILQ_FOREACH(aic, &aic_tailq, links) {
17075+ u_long s;
17076+
17077+ aic_lock(aic, &s);
17078+ aic_dump_card_state(aic);
17079+ aic_unlock(aic, &s);
17080+ }
17081+ aic_list_unlock(&l);
17082+#endif
17083+}
17084+
17085+int
17086+aic_install_sysrq(struct aic_sysrq_key_op *key_op)
17087+{
17088+#ifdef CONFIG_MAGIC_SYSRQ
17089+ char *str;
17090+ int len;
17091+ int i;
17092+
17093+ str = key_op->help_msg;
17094+ len = strlen(str);
17095+ for (i = 0; i < len; i++) {
17096+ int key;
17097+
17098+ key = str[i];
17099+ if (register_sysrq_key(key, key_op) == 0) {
17100+
17101+ if (key >= 'a' && key <= 'z')
17102+ str[i] = key + ('A' - 'a');
17103+ return (key);
17104+ }
17105+ }
17106+#endif
17107+ return (0);
17108+}
17109+
17110+void
17111+aic_remove_sysrq(int key, struct aic_sysrq_key_op *key_op)
17112+{
17113+#ifdef CONFIG_MAGIC_SYSRQ
17114+ unregister_sysrq_key(key, key_op);
17115+#endif
17116+}
17117+
17118+/******************************** Bus DMA *************************************/
17119+int
17120+aic_dma_tag_create(struct aic_softc *aic, bus_dma_tag_t parent,
17121+ bus_size_t alignment, bus_size_t boundary,
17122+ bus_addr_t lowaddr, bus_addr_t highaddr,
17123+ bus_dma_filter_t *filter, void *filterarg,
17124+ bus_size_t maxsize, int nsegments,
17125+ bus_size_t maxsegsz, int flags, bus_dma_tag_t *ret_tag)
17126+{
17127+ bus_dma_tag_t dmat;
17128+
17129+ dmat = malloc(sizeof(*dmat), M_DEVBUF, M_NOWAIT);
17130+ if (dmat == NULL)
17131+ return (ENOMEM);
17132+
17133+ /*
17134+ * Linux is very simplistic about DMA memory. For now don't
17135+ * maintain all specification information. Once Linux supplies
17136+ * better facilities for doing these operations, or the
17137+ * needs of this particular driver change, we might need to do
17138+ * more here.
17139+ */
17140+ dmat->alignment = alignment;
17141+ dmat->boundary = boundary;
17142+ dmat->maxsize = maxsize;
17143+ *ret_tag = dmat;
17144+ return (0);
17145+}
17146+
17147+void
17148+aic_dma_tag_destroy(struct aic_softc *aic, bus_dma_tag_t dmat)
17149+{
17150+ free(dmat, M_DEVBUF);
17151+}
17152+
17153+int
17154+aic_dmamem_alloc(struct aic_softc *aic, bus_dma_tag_t dmat, void** vaddr,
17155+ int flags, bus_dmamap_t *mapp)
17156+{
17157+ bus_dmamap_t map;
17158+
17159+ map = malloc(sizeof(*map), M_DEVBUF, M_NOWAIT);
17160+ if (map == NULL)
17161+ return (ENOMEM);
17162+ /*
17163+ * Although we can dma data above 4GB, our
17164+ * coherent memory is below 4GB for
17165+ * space efficiency reasons (only need a 4byte
17166+ * address). For this reason, we have to reset
17167+ * our dma mask when doing allocations.
17168+ */
17169+ aic_set_dma_mask(aic, 0xFFFFFFFF);
17170+ *vaddr = aic_alloc_coherent(aic, dmat->maxsize, &map->bus_addr);
17171+ aic_set_dma_mask(aic, aic->platform_data->hw_dma_mask);
17172+ if (*vaddr == NULL)
17173+ return (ENOMEM);
17174+ *mapp = map;
17175+ return(0);
17176+}
17177+
17178+void
17179+aic_dmamem_free(struct aic_softc *aic, bus_dma_tag_t dmat,
17180+ void* vaddr, bus_dmamap_t map)
17181+{
17182+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
17183+ aic_free_coherent(aic, dmat->maxsize, vaddr, map->bus_addr);
17184+#else
17185+ free(vaddr, M_DEVBUF);
17186+#endif
17187+}
17188+
17189+int
17190+aic_dmamap_load(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map,
17191+ void *buf, bus_size_t buflen, bus_dmamap_callback_t *cb,
17192+ void *cb_arg, int flags)
17193+{
17194+ /*
17195+ * Assume for now that this will only be used during
17196+ * initialization and not for per-transaction buffer mapping.
17197+ */
17198+ bus_dma_segment_t stack_sg;
17199+
17200+ stack_sg.ds_addr = map->bus_addr;
17201+ stack_sg.ds_len = dmat->maxsize;
17202+ cb(cb_arg, &stack_sg, /*nseg*/1, /*error*/0);
17203+ return (0);
17204+}
17205+
17206+void
17207+aic_dmamap_destroy(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map)
17208+{
17209+ free(map, M_DEVBUF);
17210+}
17211+
17212+int
17213+aic_dmamap_unload(struct aic_softc *aic, bus_dma_tag_t dmat, bus_dmamap_t map)
17214+{
17215+ /* Nothing to do */
17216+ return (0);
17217+}
17218+
17219+/***************************** Queue Handling ********************************/
17220+/*
17221+ * In 2.4.X and above, this routine is called from a tasklet,
17222+ * so we must re-acquire our lock prior to executing this code.
17223+ * In all prior kernels, aic_schedule_runq() calls this routine
17224+ * directly and aic_schedule_runq() is called with our lock held.
17225+ */
17226+void
17227+aic_runq_tasklet(unsigned long data)
17228+{
17229+ struct aic_softc* aic;
17230+ struct aic_linux_device *dev;
17231+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17232+ u_long flags;
17233+#endif
17234+
17235+ aic = (struct aic_softc *)data;
17236+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17237+ aic_lock(aic, &flags);
17238+#endif
17239+ while ((dev = aic_linux_next_device_to_run(aic)) != NULL) {
17240+
17241+ TAILQ_REMOVE(&aic->platform_data->device_runq, dev, links);
17242+ dev->flags &= ~AIC_DEV_ON_RUN_LIST;
17243+ aic_linux_check_device_queue(aic, dev);
17244+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17245+ /* Yeild to our interrupt handler */
17246+ aic_unlock(aic, &flags);
17247+ aic_lock(aic, &flags);
17248+#endif
17249+ }
17250+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17251+ aic_unlock(aic, &flags);
17252+#endif
17253+}
17254+
17255+void
17256+aic_unblock_tasklet(unsigned long data)
17257+{
17258+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17259+ struct aic_softc* aic;
17260+
17261+ aic = (struct aic_softc *)data;
17262+ scsi_unblock_requests(aic->platform_data->host);
17263+#else
17264+#error "Fix 2.2.X Kernel Support"
17265+#endif
17266+}
17267+
17268+void
17269+aic_bus_settle_complete(u_long data)
17270+{
17271+ struct aic_softc *aic;
17272+ u_long s;
17273+
17274+ aic = (struct aic_softc *)data;
17275+ /*
17276+ * Guard against our bottom half scheduling another
17277+ * bus settle delay just as our timer runs. If this
17278+ * occurs, do nothing. The newly scheduled timer will
17279+ * take care of things.
17280+ */
17281+ aic_lock(aic, &s);
17282+ if (timer_pending(&aic->platform_data->bus_settle_timer) == 0) {
17283+ aic->platform_data->flags &= ~AIC_BUS_SETTLE_TIMER;
17284+ aic_release_simq_locked(aic);
17285+ }
17286+ aic_unlock(aic, &s);
17287+}
17288+
17289+void
17290+aic_freeze_simq(struct aic_softc *aic)
17291+{
17292+ aic->platform_data->qfrozen++;
17293+ if (aic->platform_data->qfrozen == 1)
17294+ scsi_block_requests(aic->platform_data->host);
17295+}
17296+
17297+void
17298+aic_release_simq(struct aic_softc *aic)
17299+{
17300+ u_long s;
17301+
17302+ aic_lock(aic, &s);
17303+ aic_release_simq_locked(aic);
17304+ aic_unlock(aic, &s);
17305+}
17306+
17307+void
17308+aic_release_simq_locked(struct aic_softc *aic)
17309+{
17310+
17311+ if (aic->platform_data->qfrozen > 0)
17312+ aic->platform_data->qfrozen--;
17313+ if (AIC_DV_SIMQ_FROZEN(aic)
17314+ && ((aic->platform_data->flags & AIC_DV_WAIT_SIMQ_RELEASE) != 0)) {
17315+ aic->platform_data->flags &= ~AIC_DV_WAIT_SIMQ_RELEASE;
17316+ up(&aic->platform_data->dv_sem);
17317+ }
17318+ if (aic->platform_data->qfrozen == 0) {
17319+ aic_schedule_unblock(aic);
17320+ aic_schedule_runq(aic);
17321+ }
17322+}
17323+
17324+/***************************** Timer Facilities *******************************/
17325+void
17326+aic_platform_timeout(struct scsi_cmnd *cmd)
17327+{
17328+
17329+ if (AIC_DV_CMD(cmd) != 0) {
17330+
17331+ aic_linux_dv_timeout(cmd);
17332+ } else {
17333+ struct scb *scb;
17334+ struct aic_softc *aic;
17335+ u_long s;
17336+
17337+ scb = (struct scb *)cmd->host_scribble;
17338+ aic = scb->aic_softc;
17339+ aic_lock(aic, &s);
17340+
17341+ if (scb == NULL
17342+ || scb->flags == SCB_FLAG_NONE) {
17343+ int done_late;
17344+
17345+ /*
17346+ * Handle timeout/completion races.
17347+ * If the command is still sitting on
17348+ * our completion queue, just re-instate
17349+ * the timeout. If we've already completed
17350+ * the command, the function pointer in our
17351+ * timer will be cleared and we will need to
17352+ * additionally complete it again to the mid-layer.
17353+ *
17354+ * Since done_late is cleared by adding a
17355+ * timer, we must save off its value first.
17356+ */
17357+ done_late = cmd->eh_timeout.function == NULL;
17358+ scsi_add_timer(cmd, 60*HZ, aic_linux_midlayer_timeout);
17359+ if (done_late)
17360+ cmd->scsi_done(cmd);
17361+ } else if ((scb->platform_data->flags & AIC_TIMEOUT_ACTIVE)) {
17362+
17363+ /*
17364+ * Handle the case of timeouts that expire just
17365+ * as we delete timers during recovery by skipping
17366+ * SCBs that don't have timers active.
17367+ */
17368+ scb->platform_data->flags &= ~AIC_TIMEOUT_ACTIVE;
17369+
17370+ /*
17371+ * We must clear out the function pointer so that
17372+ * scsi_add_timer does not believe that a del_timer
17373+ * is required before setting up a new timer for
17374+ * this command.
17375+ */
17376+ scb->io_ctx->eh_timeout.function = NULL;
17377+ aic_timeout(scb);
17378+ }
17379+ aic_unlock(aic, &s);
17380+ }
17381+}
17382+
17383+void
17384+aic_linux_midlayer_timeout(struct scsi_cmnd *cmd)
17385+{
17386+ struct aic_softc *aic;
17387+
17388+ aic = *(struct aic_softc **)cmd->device->host->hostdata;
17389+ printf("%s: midlayer_timeout\n", aic_name(aic));
17390+}
17391diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aiclib.h linux-2.4.24/drivers/scsi/aic7xxx/aiclib.h
17392--- linux-2.4.24.org/drivers/scsi/aic7xxx/aiclib.h 2004-01-08 11:57:43.017004334 +0100
17393+++ linux-2.4.24/drivers/scsi/aic7xxx/aiclib.h 2003-12-23 00:31:43.000000000 +0100
17394@@ -1,4 +1,5 @@
17395 /*
17396+ * SCSI definitions...
17397 * Largely written by Julian Elischer (julian@tfs.com)
17398 * for TRW Financial Systems.
17399 *
17400@@ -57,6 +58,42 @@
17401 #ifndef _AICLIB_H
17402 #define _AICLIB_H
17403
17404+#include <linux/types.h>
17405+#include <linux/delay.h>
17406+#include <linux/ioport.h>
17407+#include <linux/pci.h>
17408+#include <linux/smp_lock.h>
17409+#include <linux/module.h>
17410+#include <asm/byteorder.h>
17411+#include <asm/io.h>
17412+
17413+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17414+#include <linux/slab.h>
17415+#else
17416+#include <linux/malloc.h>
17417+#endif
17418+
17419+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
17420+#include <linux/interrupt.h> /* For tasklet support. */
17421+#endif
17422+
17423+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
17424+#include <linux/blk.h>
17425+#endif
17426+#include <linux/blkdev.h>
17427+
17428+#include "scsi.h"
17429+#include "hosts.h"
17430+
17431+/* Name space conflict with BSD queue macros */
17432+#ifdef LIST_HEAD
17433+#undef LIST_HEAD
17434+#endif
17435+#include "cam.h"
17436+#include "queue.h"
17437+#include "scsi_message.h"
17438+#include "scsi_iu.h"
17439+
17440 /*
17441 * Linux Interrupt Support.
17442 */
17443@@ -66,9 +103,731 @@
17444 #endif
17445
17446 /*
17447- * SCSI command format
17448+ * Linux Timer Support.
17449+ */
17450+#define AIC_USECS_PER_JIFFY (1000000/HZ)
17451+
17452+/**************************** Module Library Hack *****************************/
17453+/*
17454+ * What we'd like to do is have a single "scsi library" module that both the
17455+ * aic7xxx and aic79xx drivers could load and depend on. A cursory examination
17456+ * of implementing module dependencies in Linux (handling the install and
17457+ * initrd cases) does not look promissing. For now, we just duplicate this
17458+ * code in both drivers using a simple symbol renaming scheme that hides this
17459+ * hack from the drivers.
17460+ */
17461+#define AIC_LIB_ENTRY_CONCAT(x, prefix) prefix ## x
17462+#define AIC_LIB_ENTRY_EXPAND(x, prefix) AIC_LIB_ENTRY_CONCAT(x, prefix)
17463+#define AIC_LIB_ENTRY(x) AIC_LIB_ENTRY_EXPAND(x, AIC_LIB_PREFIX)
17464+
17465+#define AIC_CONST_ENTRY(x) AIC_LIB_ENTRY_EXPAND(x,AIC_CONST_PREFIX)
17466+
17467+#define aic_sense_desc AIC_LIB_ENTRY(_sense_desc)
17468+#define aic_sense_error_action AIC_LIB_ENTRY(_sense_error_action)
17469+#define aic_error_action AIC_LIB_ENTRY(_error_action)
17470+#define aic_op_desc AIC_LIB_ENTRY(_op_desc)
17471+#define aic_cdb_string AIC_LIB_ENTRY(_cdb_string)
17472+#define aic_print_inquiry AIC_LIB_ENTRY(_print_inquiry)
17473+#define aic_calc_syncsrate AIC_LIB_ENTRY(_calc_syncrate)
17474+#define aic_calc_syncparam AIC_LIB_ENTRY(_calc_syncparam)
17475+#define aic_calc_speed AIC_LIB_ENTRY(_calc_speed)
17476+#define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match)
17477+#define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match)
17478+#define aic_parse_brace_option AIC_LIB_ENTRY(_parse_brace_option)
17479+#define aic_power_state_change AIC_LIB_ENTRY(_power_state_change)
17480+#define aic_sysrq_handler AIC_LIB_ENTRY(_sysrq_handler)
17481+#define aic_install_sysrq AIC_LIB_ENTRY(_install_sysrq)
17482+#define aic_remove_sysrq AIC_LIB_ENTRY(_remove_sysrq)
17483+#define aic_list_lock AIC_LIB_ENTRY(_list_lock)
17484+#define aic_list_unlock AIC_LIB_ENTRY(_list_unlock)
17485+#define aic_lock AIC_LIB_ENTRY(_lock)
17486+#define aic_unlock AIC_LIB_ENTRY(_unlock)
17487+#define aic_dump_card_state AIC_LIB_ENTRY(_dump_card_state)
17488+#define aic_linux_dv_complete AIC_LIB_ENTRY(_linux_dv_complete)
17489+#define aic_linux_run_device_queue AIC_LIB_ENTRY(_linux_run_device_queue)
17490+#define aic_linux_dv_timeout AIC_LIB_ENTRY(_linux_dv_timeout)
17491+#define aic_linux_midlayer_timeout AIC_LIB_ENTRY(_linux_midlayer_timeout)
17492+#define aic_freeze_simq AIC_LIB_ENTRY(_freeze_simq)
17493+#define aic_bus_settle_complete AIC_LIB_ENTRY(_bus_settle_complete)
17494+#define aic_release_simq AIC_LIB_ENTRY(_release_simq)
17495+#define aic_release_simq AIC_LIB_ENTRY(_release_simq)
17496+#define aic_release_simq_locked AIC_LIB_ENTRY(_release_simq_locked)
17497+#define aic_dma_tag_create AIC_LIB_ENTRY(_dma_tag_create)
17498+#define aic_dma_tag_destroy AIC_LIB_ENTRY(_dma_tag_destroy)
17499+#define aic_dmamem_alloc AIC_LIB_ENTRY(_dmamem_alloc)
17500+#define aic_dmamem_free AIC_LIB_ENTRY(_dmamem_free)
17501+#define aic_dmamap_create AIC_LIB_ENTRY(_dmamap_create)
17502+#define aic_dmamap_destroy AIC_LIB_ENTRY(_dmamap_destroy)
17503+#define aic_dmamap_load AIC_LIB_ENTRY(_dmamap_load)
17504+#define aic_dmamap_unload AIC_LIB_ENTRY(_dmamap_unload)
17505+#define aic_dmamap_destroy AIC_LIB_ENTRY(_dmamap_destroy)
17506+#define aic_timeout AIC_LIB_ENTRY(_timeout)
17507+#define aic_runq_tasklet AIC_LIB_ENTRY(_runq_tasklet)
17508+#define aic_unblock_tasklet AIC_LIB_ENTRY(_unblock_tasklet)
17509+#define aic_platform_timeout AIC_LIB_ENTRY(_platform_timeout)
17510+#define aic_name AIC_LIB_ENTRY(_name)
17511+
17512+#define aic_tailq AIC_LIB_ENTRY(_tailq)
17513+#define aic_softc AIC_LIB_ENTRY(_softc)
17514+#define aic_transinfo AIC_LIB_ENTRY(_transinfo)
17515+#define aic_platform_data AIC_LIB_ENTRY(_platform_data)
17516+#define aic_devinfo AIC_LIB_ENTRY(_devinfo)
17517+#define aic_callback_t AIC_LIB_ENTRY(_callback_t)
17518+
17519+#define AIC_NUM_LUNS AIC_CONST_ENTRY(_NUM_LUNS)
17520+#define AIC_NUM_TARGETS AIC_CONST_ENTRY(_NUM_TARGETS)
17521+#define AIC_RESOURCE_SHORTAGE AIC_CONST_ENTRY(_RESOURCE_SHORTAGE)
17522+
17523+/*************************** Forward Declarations *****************************/
17524+struct aic_softc;
17525+
17526+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
17527+typedef struct device *aic_dev_softc_t;
17528+#else
17529+typedef struct pci_dev *aic_dev_softc_t;
17530+#endif
17531+typedef Scsi_Cmnd *aic_io_ctx_t;
17532+
17533+/*************************** Timer DataStructures *****************************/
17534+typedef struct timer_list aic_timer_t;
17535+
17536+/***************************** Bus Space/DMA **********************************/
17537+
17538+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,2,17)
17539+typedef dma_addr_t bus_addr_t;
17540+#else
17541+typedef uint32_t bus_addr_t;
17542+#endif
17543+typedef uint32_t bus_size_t;
17544+
17545+typedef enum {
17546+ BUS_SPACE_MEMIO,
17547+ BUS_SPACE_PIO
17548+} bus_space_tag_t;
17549+
17550+typedef union {
17551+ u_long ioport;
17552+ volatile uint8_t *maddr;
17553+} bus_space_handle_t;
17554+
17555+typedef struct bus_dma_segment
17556+{
17557+ bus_addr_t ds_addr;
17558+ bus_size_t ds_len;
17559+} bus_dma_segment_t;
17560+
17561+struct aic_linux_dma_tag
17562+{
17563+ bus_size_t alignment;
17564+ bus_size_t boundary;
17565+ bus_size_t maxsize;
17566+};
17567+typedef struct aic_linux_dma_tag* bus_dma_tag_t;
17568+
17569+struct aic_linux_dmamap
17570+{
17571+ bus_addr_t bus_addr;
17572+};
17573+typedef struct aic_linux_dmamap* bus_dmamap_t;
17574+
17575+typedef int bus_dma_filter_t(void*, bus_addr_t);
17576+typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
17577+
17578+#define BUS_DMA_WAITOK 0x0
17579+#define BUS_DMA_NOWAIT 0x1
17580+#define BUS_DMA_ALLOCNOW 0x2
17581+#define BUS_DMA_LOAD_SEGS 0x4 /*
17582+ * Argument is an S/G list not
17583+ * a single buffer.
17584+ */
17585+
17586+#define BUS_SPACE_MAXADDR 0xFFFFFFFF
17587+#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
17588+#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
17589+
17590+int aic_dma_tag_create(struct aic_softc *, bus_dma_tag_t /*parent*/,
17591+ bus_size_t /*alignment*/, bus_size_t /*boundary*/,
17592+ bus_addr_t /*lowaddr*/, bus_addr_t /*highaddr*/,
17593+ bus_dma_filter_t*/*filter*/, void */*filterarg*/,
17594+ bus_size_t /*maxsize*/, int /*nsegments*/,
17595+ bus_size_t /*maxsegsz*/, int /*flags*/,
17596+ bus_dma_tag_t */*dma_tagp*/);
17597+
17598+void aic_dma_tag_destroy(struct aic_softc *, bus_dma_tag_t /*tag*/);
17599+
17600+int aic_dmamem_alloc(struct aic_softc *, bus_dma_tag_t /*dmat*/,
17601+ void** /*vaddr*/, int /*flags*/,
17602+ bus_dmamap_t* /*mapp*/);
17603+
17604+void aic_dmamem_free(struct aic_softc *, bus_dma_tag_t /*dmat*/,
17605+ void* /*vaddr*/, bus_dmamap_t /*map*/);
17606+
17607+void aic_dmamap_destroy(struct aic_softc *, bus_dma_tag_t /*tag*/,
17608+ bus_dmamap_t /*map*/);
17609+
17610+int aic_dmamap_load(struct aic_softc *aic, bus_dma_tag_t /*dmat*/,
17611+ bus_dmamap_t /*map*/, void * /*buf*/,
17612+ bus_size_t /*buflen*/, bus_dmamap_callback_t *,
17613+ void */*callback_arg*/, int /*flags*/);
17614+
17615+int aic_dmamap_unload(struct aic_softc *, bus_dma_tag_t, bus_dmamap_t);
17616+
17617+/*
17618+ * Operations performed by aic_dmamap_sync().
17619 */
17620+#define BUS_DMASYNC_PREREAD 0x01 /* pre-read synchronization */
17621+#define BUS_DMASYNC_POSTREAD 0x02 /* post-read synchronization */
17622+#define BUS_DMASYNC_PREWRITE 0x04 /* pre-write synchronization */
17623+#define BUS_DMASYNC_POSTWRITE 0x08 /* post-write synchronization */
17624+
17625+/*
17626+ * XXX
17627+ * aic_dmamap_sync is only used on buffers allocated with
17628+ * the pci_alloc_consistent() API. Although I'm not sure how
17629+ * this works on architectures with a write buffer, Linux does
17630+ * not have an API to sync "coherent" memory. Perhaps we need
17631+ * to do an mb()?
17632+ */
17633+#define aic_dmamap_sync(aic, dma_tag, dmamap, offset, len, op)
17634+
17635+/*************************** Linux DMA Wrappers *******************************/
17636+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
17637+#define aic_alloc_coherent(aic, size, bus_addr_ptr) \
17638+ dma_alloc_coherent(aic->dev_softc, size, bus_addr_ptr, /*flag*/0)
17639+
17640+#define aic_free_coherent(aic, size, vaddr, bus_addr) \
17641+ dma_free_coherent(aic->dev_softc, size, vaddr, bus_addr)
17642+
17643+#define aic_map_single(aic, buf, size, direction) \
17644+ dma_map_single(aic->dev_softc, buf, size, direction)
17645+
17646+#define aic_unmap_single(aic, busaddr, size, direction) \
17647+ dma_unmap_single(aic->dev_softc, busaddr, size, direction)
17648+
17649+#define aic_map_sg(aic, sg_list, num_sg, direction) \
17650+ dma_map_sg(aic->dev_softc, sg_list, num_sg, direction)
17651+
17652+#define aic_unmap_sg(aic, sg_list, num_sg, direction) \
17653+ dma_unmap_sg(aic->dev_softc, sg_list, num_sg, direction)
17654+
17655+#elif LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
17656+
17657+#define aic_alloc_coherent(aic, size, bus_addr_ptr) \
17658+ pci_alloc_consistent(aic->dev_softc, size, bus_addr_ptr)
17659+
17660+#define aic_free_coherent(aic, size, vaddr, bus_addr) \
17661+ pci_free_consistent(aic->dev_softc, size, vaddr, bus_addr)
17662+
17663+#define aic_map_single(aic, buf, size, direction) \
17664+ pci_map_single(aic->dev_softc, buf, size, direction)
17665+
17666+#define aic_unmap_single(aic, busaddr, size, direction) \
17667+ pci_unmap_single(aic->dev_softc, busaddr, size, direction)
17668+
17669+#define aic_map_sg(aic, sg_list, num_sg, direction) \
17670+ pci_map_sg(aic->dev_softc, sg_list, num_sg, direction)
17671+
17672+#define aic_unmap_sg(aic, sg_list, num_sg, direction) \
17673+ pci_unmap_sg(aic->dev_softc, sg_list, num_sg, direction)
17674+
17675+#else
17676+
17677+static __inline void *aic_alloc_coherent(struct aic_softc *aic,
17678+ bus_size_t size, bus_addr_t *baddrp);
17679+
17680+/*
17681+ * At least in 2.2.14, malloc is a slab allocator so all
17682+ * allocations are aligned. We assume for these kernel versions
17683+ * that all allocations will be bellow 4Gig, physically contiguous,
17684+ * and accessible via DMA by the controller.
17685+ */
17686+static __inline void *
17687+aic_alloc_coherent(struct aic_softc *aic, bus_size_t size, bus_addr_t *baddrp)
17688+{
17689+ void *vaddr;
17690+
17691+ vaddr_ = malloc(size, M_DEVBUF, M_NOWAIT);
17692+ if (vaddr != NULL)
17693+ *baddrp = virt_to_bus(vaddr);
17694+ return (vaddr);
17695+}
17696+
17697+#define aic_free_coherent(aic, size, vaddr, bus_addr) \
17698+ free(vaddr, M_DEVBUF)
17699+
17700+#define aic_map_sg(pdev, sg_list, nseg, direction) (nseg)
17701+#define aic_unmap_sg(pdev, sg_list, nseg, direction)
17702+#define aic_map_single(pdev, buffer, bufflen, direction) \
17703+ (VIRT_TO_BUS(buffer))
17704+#define aic_unmap_single(pdev, buffer, buflen, direction)
17705+#define sg_dma_address(sg) (VIRT_TO_BUS((sg)->address))
17706+#define sg_dma_len(sg) ((sg)->length)
17707+#endif
17708+
17709+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
17710+
17711+#define aic_set_dma_mask(aic, mask) dma_set_mask(aic->dev_softc, mask)
17712+
17713+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,3)
17714+
17715+/*
17716+ * Device softc is NULL for EISA devices.
17717+ */
17718+#define aic_set_dma_mask(aic, mask) \
17719+ ((aic)->dev_softc == NULL ? 0 : pci_set_dma_mask(aic->dev_softc, mask))
17720+
17721+#else
17722+/*
17723+ * Device softc is NULL for EISA devices.
17724+ * Always "return" 0 for success.
17725+ */
17726+#define aic_set_dma_mask(aic, mask) \
17727+ (((aic)->dev_softc == NULL) \
17728+ ? 0 \
17729+ : (((aic)->dev_softc->dma_mask = mask) && 0))
17730+#endif
17731+
17732+/************************* Host Template Macros *******************************/
17733+#if defined CONFIG_HIGHIO
17734+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10)
17735+/* Assume RedHat Distribution with its different HIGHIO conventions. */
17736+#define AIC_TEMPLATE_DMA_SETTINGS() \
17737+ .can_dma_32 = 1, \
17738+ .single_sg_okay = 1,
17739+#else
17740+#define AIC_TEMPLATE_DMA_SETTINGS() \
17741+ .highmem_io = 1,
17742+#endif
17743+#else
17744+#define AIC_TEMPLATE_DMA_SETTINGS()
17745+#endif
17746+
17747+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,7)
17748+#define AIC_TEMPLATE_MAX_SECTORS(sectors) \
17749+ .max_sectors = (sectors),
17750+#else
17751+#define AIC_TEMPLATE_MAX_SECTORS(sectors)
17752+#endif
17753+
17754+#if defined(__i386__)
17755+#define AIC_TEMPLATE_BIOSPARAM() \
17756+ .bios_param = AIC_LIB_ENTRY(_linux_biosparam),
17757+#else
17758+#define AIC_TEMPLATE_BIOSPARAM()
17759+#endif
17760+
17761+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
17762+#define AIC_TEMPLATE_VERSIONED_ENTRIES() \
17763+ .slave_alloc = AIC_LIB_ENTRY(_linux_slave_alloc), \
17764+ .slave_configure = AIC_LIB_ENTRY(_linux_slave_configure), \
17765+ .slave_destroy = AIC_LIB_ENTRY(_linux_slave_destroy)
17766+#else
17767+#define AIC_TEMPLATE_VERSIONED_ENTRIES() \
17768+ .detect = AIC_LIB_ENTRY(_linux_detect), \
17769+ .release = AIC_LIB_ENTRY(_linux_release), \
17770+ .select_queue_depths = AIC_LIB_ENTRY(_linux_select_queue_depth), \
17771+ .use_new_eh_code = 1
17772+#endif
17773+
17774+#define AIC_TEMPLATE_INITIALIZER(NAME, MAX_SECTORS) \
17775+{ \
17776+ .module = THIS_MODULE, \
17777+ .name = NAME, \
17778+ .proc_info = AIC_LIB_ENTRY(_linux_proc_info), \
17779+ .info = AIC_LIB_ENTRY(_linux_info), \
17780+ .queuecommand = AIC_LIB_ENTRY(_linux_queue), \
17781+ .eh_abort_handler = AIC_LIB_ENTRY(_linux_abort), \
17782+ .eh_device_reset_handler = AIC_LIB_ENTRY(_linux_dev_reset), \
17783+ .eh_bus_reset_handler = AIC_LIB_ENTRY(_linux_bus_reset), \
17784+ .can_queue = AIC_CONST_ENTRY(_MAX_QUEUE), \
17785+ .this_id = -1, \
17786+ .cmd_per_lun = 2, \
17787+ .use_clustering = ENABLE_CLUSTERING, \
17788+ AIC_TEMPLATE_MAX_SECTORS(MAX_SECTORS) \
17789+ AIC_TEMPLATE_DMA_SETTINGS() \
17790+ AIC_TEMPLATE_BIOSPARAM() \
17791+ AIC_TEMPLATE_VERSIONED_ENTRIES() \
17792+}
17793+
17794+/************************** OS Utility Wrappers *******************************/
17795+#define printf printk
17796+#define M_NOWAIT GFP_ATOMIC
17797+#define M_WAITOK 0
17798+#define malloc(size, type, flags) kmalloc(size, flags)
17799+#define free(ptr, type) kfree(ptr)
17800+
17801+static __inline void aic_delay(long);
17802+static __inline void
17803+aic_delay(long usec)
17804+{
17805+ /*
17806+ * udelay on Linux can have problems for
17807+ * multi-millisecond waits. Wait at most
17808+ * 1024us per call.
17809+ */
17810+ while (usec > 0) {
17811+ udelay(usec % 1024);
17812+ usec -= 1024;
17813+ }
17814+}
17815+
17816+/********************************** Misc Macros *******************************/
17817+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
17818+#define powerof2(x) ((((x)-1)&(x))==0)
17819+
17820+/******************************* Byte Order ***********************************/
17821+#define aic_htobe16(x) cpu_to_be16(x)
17822+#define aic_htobe32(x) cpu_to_be32(x)
17823+#define aic_htobe64(x) cpu_to_be64(x)
17824+#define aic_htole16(x) cpu_to_le16(x)
17825+#define aic_htole32(x) cpu_to_le32(x)
17826+#define aic_htole64(x) cpu_to_le64(x)
17827+
17828+#define aic_be16toh(x) be16_to_cpu(x)
17829+#define aic_be32toh(x) be32_to_cpu(x)
17830+#define aic_be64toh(x) be64_to_cpu(x)
17831+#define aic_le16toh(x) le16_to_cpu(x)
17832+#define aic_le32toh(x) le32_to_cpu(x)
17833+#define aic_le64toh(x) le64_to_cpu(x)
17834+
17835+#ifndef LITTLE_ENDIAN
17836+#define LITTLE_ENDIAN 1234
17837+#endif
17838+
17839+#ifndef BIG_ENDIAN
17840+#define BIG_ENDIAN 4321
17841+#endif
17842+
17843+#ifndef BYTE_ORDER
17844+#if defined(__BIG_ENDIAN)
17845+#define BYTE_ORDER BIG_ENDIAN
17846+#endif
17847+#if defined(__LITTLE_ENDIAN)
17848+#define BYTE_ORDER LITTLE_ENDIAN
17849+#endif
17850+#endif /* BYTE_ORDER */
17851+
17852+/********************************* Core Includes ******************************/
17853+#include AIC_CORE_INCLUDE
17854+
17855+/**************************** Front End Queues ********************************/
17856+/*
17857+ * Data structure used to cast the Linux struct scsi_cmnd to something
17858+ * that allows us to use the queue macros. The linux structure has
17859+ * plenty of space to hold the links fields as required by the queue
17860+ * macros, but the queue macors require them to have the correct type.
17861+ */
17862+struct aic_cmd_internal {
17863+ /* Area owned by the Linux scsi layer. */
17864+ uint8_t private[offsetof(struct scsi_cmnd, SCp.Status)];
17865+ union {
17866+ STAILQ_ENTRY(aic_cmd) ste;
17867+ LIST_ENTRY(aic_cmd) le;
17868+ TAILQ_ENTRY(aic_cmd) tqe;
17869+ } links;
17870+ uint32_t end;
17871+};
17872+
17873+struct aic_cmd {
17874+ union {
17875+ struct aic_cmd_internal icmd;
17876+ struct scsi_cmnd scsi_cmd;
17877+ } un;
17878+};
17879+
17880+#define acmd_icmd(cmd) ((cmd)->un.icmd)
17881+#define acmd_scsi_cmd(cmd) ((cmd)->un.scsi_cmd)
17882+#define acmd_links un.icmd.links
17883+
17884+/*************************** Device Data Structures ***************************/
17885+/*
17886+ * A per probed device structure used to deal with some error recovery
17887+ * scenarios that the Linux mid-layer code just doesn't know how to
17888+ * handle. The structure allocated for a device only becomes persistent
17889+ * after a successfully completed inquiry command to the target when
17890+ * that inquiry data indicates a lun is present.
17891+ */
17892+TAILQ_HEAD(aic_busyq, aic_cmd);
17893+typedef enum {
17894+ AIC_DEV_UNCONFIGURED = 0x01,
17895+ AIC_DEV_FREEZE_TIL_EMPTY = 0x02, /* Freeze queue until active == 0 */
17896+ AIC_DEV_TIMER_ACTIVE = 0x04, /* Our timer is active */
17897+ AIC_DEV_ON_RUN_LIST = 0x08, /* Queued to be run later */
17898+ AIC_DEV_Q_BASIC = 0x10, /* Allow basic device queuing */
17899+ AIC_DEV_Q_TAGGED = 0x20, /* Allow full SCSI2 command queueing */
17900+ AIC_DEV_PERIODIC_OTAG = 0x40, /* Send OTAG to prevent starvation */
17901+ AIC_DEV_SLAVE_CONFIGURED = 0x80 /* slave_configure() has been called */
17902+} aic_linux_dev_flags;
17903+
17904+struct aic_linux_target;
17905+struct aic_linux_device {
17906+ TAILQ_ENTRY(aic_linux_device) links;
17907+ struct aic_busyq busyq;
17908+
17909+ /*
17910+ * The number of transactions currently
17911+ * queued to the device.
17912+ */
17913+ int active;
17914+
17915+ /*
17916+ * The currently allowed number of
17917+ * transactions that can be queued to
17918+ * the device. Must be signed for
17919+ * conversion from tagged to untagged
17920+ * mode where the device may have more
17921+ * than one outstanding active transaction.
17922+ */
17923+ int openings;
17924+
17925+ /*
17926+ * A positive count indicates that this
17927+ * device's queue is halted.
17928+ */
17929+ u_int qfrozen;
17930+
17931+ /*
17932+ * Cumulative command counter.
17933+ */
17934+ u_long commands_issued;
17935+
17936+ /*
17937+ * The number of tagged transactions when
17938+ * running at our current opening level
17939+ * that have been successfully received by
17940+ * this device since the last QUEUE FULL.
17941+ */
17942+ u_int tag_success_count;
17943+#define AIC_TAG_SUCCESS_INTERVAL 50
17944+
17945+ aic_linux_dev_flags flags;
17946+
17947+ /*
17948+ * Per device timer.
17949+ */
17950+ struct timer_list timer;
17951+
17952+ /*
17953+ * The high limit for the tags variable.
17954+ */
17955+ u_int maxtags;
17956+
17957+ /*
17958+ * The computed number of tags outstanding
17959+ * at the time of the last QUEUE FULL event.
17960+ */
17961+ u_int tags_on_last_queuefull;
17962+
17963+ /*
17964+ * How many times we have seen a queue full
17965+ * with the same number of tags. This is used
17966+ * to stop our adaptive queue depth algorithm
17967+ * on devices with a fixed number of tags.
17968+ */
17969+ u_int last_queuefull_same_count;
17970+#define AIC_LOCK_TAGS_COUNT 50
17971+
17972+ /*
17973+ * How many transactions have been queued
17974+ * without the device going idle. We use
17975+ * this statistic to determine when to issue
17976+ * an ordered tag to prevent transaction
17977+ * starvation. This statistic is only updated
17978+ * if the AIC_DEV_PERIODIC_OTAG flag is set
17979+ * on this device.
17980+ */
17981+ u_int commands_since_idle_or_otag;
17982+#define AIC_OTAG_THRESH 500
17983+
17984+ int lun;
17985+ Scsi_Device *scsi_device;
17986+ struct aic_linux_target *target;
17987+};
17988+
17989+typedef enum {
17990+ AIC_DV_REQUIRED = 0x01,
17991+ AIC_INQ_VALID = 0x02,
17992+ AIC_BASIC_DV = 0x04,
17993+ AIC_ENHANCED_DV = 0x08
17994+} aic_linux_targ_flags;
17995+
17996+/* DV States */
17997+typedef enum {
17998+ AIC_DV_STATE_EXIT = 0,
17999+ AIC_DV_STATE_INQ_SHORT_ASYNC,
18000+ AIC_DV_STATE_INQ_ASYNC,
18001+ AIC_DV_STATE_INQ_ASYNC_VERIFY,
18002+ AIC_DV_STATE_TUR,
18003+ AIC_DV_STATE_REBD,
18004+ AIC_DV_STATE_INQ_VERIFY,
18005+ AIC_DV_STATE_WEB,
18006+ AIC_DV_STATE_REB,
18007+ AIC_DV_STATE_SU,
18008+ AIC_DV_STATE_BUSY
18009+} aic_dv_state;
18010+
18011+struct aic_linux_target {
18012+ struct aic_linux_device *devices[AIC_NUM_LUNS];
18013+ int channel;
18014+ int target;
18015+ int refcount;
18016+ struct aic_transinfo last_tinfo;
18017+ struct aic_softc *softc;
18018+ aic_linux_targ_flags flags;
18019+ struct scsi_inquiry_data *inq_data;
18020+ /*
18021+ * The next "fallback" period to use for narrow/wide transfers.
18022+ */
18023+ uint8_t dv_next_narrow_period;
18024+ uint8_t dv_next_wide_period;
18025+ uint8_t dv_max_width;
18026+ uint8_t dv_max_ppr_options;
18027+ uint8_t dv_last_ppr_options;
18028+ u_int dv_echo_size;
18029+ aic_dv_state dv_state;
18030+ u_int dv_state_retry;
18031+ uint8_t *dv_buffer;
18032+ uint8_t *dv_buffer1;
18033+
18034+ /*
18035+ * Cumulative counter of errors.
18036+ */
18037+ u_long errors_detected;
18038+ u_long cmds_since_error;
18039+};
18040+
18041+/*************** OSM Dependent Components of Core Datastructures **************/
18042+/*
18043+ * Per-SCB OSM storage.
18044+ */
18045+typedef enum {
18046+ AIC_SCB_UP_EH_SEM = 0x1,
18047+ AIC_TIMEOUT_ACTIVE = 0x2,
18048+ AIC_RELEASE_SIMQ = 0x4
18049+} aic_linux_scb_flags;
18050+
18051+struct scb_platform_data {
18052+ struct aic_linux_device *dev;
18053+ bus_addr_t buf_busaddr;
18054+ uint32_t xfer_len;
18055+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)
18056+ uint32_t resid; /* Transfer residual */
18057+#endif
18058+ uint32_t sense_resid; /* Auto-Sense residual */
18059+ aic_linux_scb_flags flags;
18060+};
18061+
18062+/*
18063+ * Define a structure used for each host adapter. All members are
18064+ * aligned on a boundary >= the size of the member to honor the
18065+ * alignment restrictions of the various platforms supported by
18066+ * this driver.
18067+ */
18068+typedef enum {
18069+ AIC_DV_WAIT_SIMQ_EMPTY = 0x01,
18070+ AIC_DV_WAIT_SIMQ_RELEASE = 0x02,
18071+ AIC_DV_ACTIVE = 0x04,
18072+ AIC_DV_SHUTDOWN = 0x08,
18073+ AIC_RUN_CMPLT_Q_TIMER = 0x10,
18074+ AIC_BUS_SETTLE_TIMER = 0x20
18075+} aic_linux_softc_flags;
18076+
18077+TAILQ_HEAD(aic_completeq, aic_cmd);
18078+
18079+struct aic_platform_data {
18080+ /*
18081+ * Fields accessed from interrupt context.
18082+ */
18083+ struct aic_linux_target *targets[AIC_NUM_TARGETS];
18084+ TAILQ_HEAD(, aic_linux_device) device_runq;
18085+ struct aic_completeq completeq;
18086+
18087+ spinlock_t spin_lock;
18088+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
18089+ struct tasklet_struct runq_tasklet;
18090+ struct tasklet_struct unblock_tasklet;
18091+#endif
18092+ u_int qfrozen;
18093+ pid_t dv_pid;
18094+ pid_t recovery_pid;
18095+ struct timer_list completeq_timer;
18096+ struct timer_list bus_settle_timer;
18097+ struct timer_list stats_timer;
18098+ struct semaphore eh_sem;
18099+ struct semaphore dv_sem;
18100+ struct semaphore dv_cmd_sem;
18101+ struct semaphore recovery_sem;
18102+ struct semaphore recovery_ending_sem;
18103+ struct scsi_device *dv_scsi_dev;
18104+ struct Scsi_Host *host; /* pointer to scsi host */
18105+#define AIC_LINUX_NOIRQ ((uint32_t)~0)
18106+ uint32_t irq; /* IRQ for this adapter */
18107+ uint32_t bios_address;
18108+ uint32_t mem_busaddr; /* Mem Base Addr */
18109+ bus_addr_t hw_dma_mask;
18110+ aic_linux_softc_flags flags;
18111+};
18112+
18113+/***************************** Timer Facilities *******************************/
18114+typedef void aic_linux_callback_t (u_long);
18115+void aic_platform_timeout(struct scsi_cmnd *);
18116+void aic_linux_midlayer_timeout(struct scsi_cmnd *);
18117+
18118+#define aic_timer_init init_timer
18119+#define aic_timer_stop del_timer_sync
18120+static __inline void aic_timer_reset(aic_timer_t *timer, uint32_t usec,
18121+ aic_callback_t *func, void *arg);
18122+static __inline uint32_t aic_get_timeout(struct scb *);
18123+static __inline void aic_scb_timer_start(struct scb *scb);
18124+static __inline void aic_scb_timer_reset(struct scb *scb, uint32_t usec);
18125
18126+static __inline void
18127+aic_timer_reset(aic_timer_t *timer, uint32_t usec,
18128+ aic_callback_t *func, void *arg)
18129+{
18130+ struct aic_softc *aic;
18131+
18132+ aic = (struct aic_softc *)arg;
18133+ del_timer(timer);
18134+ timer->data = (u_long)arg;
18135+ timer->expires = jiffies + (usec / AIC_USECS_PER_JIFFY);
18136+ timer->function = (aic_linux_callback_t*)func;
18137+ add_timer(timer);
18138+}
18139+
18140+static __inline uint32_t
18141+aic_get_timeout(struct scb *scb)
18142+{
18143+
18144+ /*
18145+ * Convert from jiffies to usec.
18146+ */
18147+ return (scb->io_ctx->timeout_per_command * AIC_USECS_PER_JIFFY);
18148+}
18149+
18150+static __inline void
18151+aic_scb_timer_start(struct scb *scb)
18152+{
18153+ scb->platform_data->flags |= AIC_TIMEOUT_ACTIVE;
18154+ scsi_add_timer(scb->io_ctx, scb->io_ctx->timeout_per_command,
18155+ aic_platform_timeout);
18156+}
18157+
18158+static __inline void
18159+aic_scb_timer_reset(struct scb *scb, uint32_t usec)
18160+{
18161+ /*
18162+ * Restore timer data that is clobbered by scsi_delete_timer().
18163+ */
18164+ scb->io_ctx->eh_timeout.data = (unsigned long)scb->io_ctx;
18165+ scb->io_ctx->eh_timeout.function =
18166+ (void (*)(unsigned long))aic_platform_timeout;
18167+ scb->platform_data->flags |= AIC_TIMEOUT_ACTIVE;
18168+ mod_timer(&scb->io_ctx->eh_timeout,
18169+ jiffies + (usec / AIC_USECS_PER_JIFFY));
18170+}
18171+
18172+/************************* SCSI command formats *******************************/
18173 /*
18174 * Define dome bits that are in ALL (or a lot of) scsi commands
18175 */
18176@@ -865,6 +1624,368 @@
18177
18178 extern const char *scsi_sense_key_text[];
18179
18180+/*************************** Domain Validation ********************************/
18181+#define AIC_DV_CMD(cmd) ((cmd)->scsi_done == aic_linux_dv_complete)
18182+#define AIC_DV_SIMQ_FROZEN(aic) \
18183+ ((((aic)->platform_data->flags & AIC_DV_ACTIVE) != 0) \
18184+ && (aic)->platform_data->qfrozen == 1)
18185+
18186+/*********************** Transaction Access Wrappers **************************/
18187+static __inline void aic_cmd_set_transaction_status(Scsi_Cmnd *, uint32_t);
18188+static __inline void aic_set_transaction_status(struct scb *, uint32_t);
18189+static __inline void aic_cmd_set_scsi_status(Scsi_Cmnd *, uint32_t);
18190+static __inline void aic_set_scsi_status(struct scb *, uint32_t);
18191+static __inline uint32_t aic_cmd_get_transaction_status(Scsi_Cmnd *cmd);
18192+static __inline uint32_t aic_get_transaction_status(struct scb *);
18193+static __inline uint32_t aic_cmd_get_scsi_status(Scsi_Cmnd *cmd);
18194+static __inline uint32_t aic_get_scsi_status(struct scb *);
18195+static __inline void aic_set_transaction_tag(struct scb *, int, u_int);
18196+static __inline u_long aic_get_transfer_length(struct scb *);
18197+static __inline int aic_get_transfer_dir(struct scb *);
18198+static __inline void aic_set_residual(struct scb *, u_long);
18199+static __inline void aic_set_sense_residual(struct scb *scb, u_long resid);
18200+static __inline u_long aic_get_residual(struct scb *);
18201+static __inline u_long aic_get_sense_residual(struct scb *);
18202+static __inline int aic_perform_autosense(struct scb *);
18203+static __inline uint32_t aic_get_sense_bufsize(struct aic_softc *,
18204+ struct scb *);
18205+static __inline void aic_notify_xfer_settings_change(struct aic_softc *,
18206+ struct aic_devinfo *);
18207+static __inline void aic_platform_scb_free(struct aic_softc *aic,
18208+ struct scb *scb);
18209+static __inline void aic_freeze_scb(struct scb *scb);
18210+
18211+static __inline
18212+void aic_cmd_set_transaction_status(Scsi_Cmnd *cmd, uint32_t status)
18213+{
18214+ cmd->result &= ~(CAM_STATUS_MASK << 16);
18215+ cmd->result |= status << 16;
18216+}
18217+
18218+static __inline
18219+void aic_set_transaction_status(struct scb *scb, uint32_t status)
18220+{
18221+ aic_cmd_set_transaction_status(scb->io_ctx,status);
18222+}
18223+
18224+static __inline
18225+void aic_cmd_set_scsi_status(Scsi_Cmnd *cmd, uint32_t status)
18226+{
18227+ cmd->result &= ~0xFFFF;
18228+ cmd->result |= status;
18229+}
18230+
18231+static __inline
18232+void aic_set_scsi_status(struct scb *scb, uint32_t status)
18233+{
18234+ aic_cmd_set_scsi_status(scb->io_ctx, status);
18235+}
18236+
18237+static __inline
18238+uint32_t aic_cmd_get_transaction_status(Scsi_Cmnd *cmd)
18239+{
18240+ return ((cmd->result >> 16) & CAM_STATUS_MASK);
18241+}
18242+
18243+static __inline
18244+uint32_t aic_get_transaction_status(struct scb *scb)
18245+{
18246+ return (aic_cmd_get_transaction_status(scb->io_ctx));
18247+}
18248+
18249+static __inline
18250+uint32_t aic_cmd_get_scsi_status(Scsi_Cmnd *cmd)
18251+{
18252+ return (cmd->result & 0xFFFF);
18253+}
18254+
18255+static __inline
18256+uint32_t aic_get_scsi_status(struct scb *scb)
18257+{
18258+ return (aic_cmd_get_scsi_status(scb->io_ctx));
18259+}
18260+
18261+static __inline
18262+void aic_set_transaction_tag(struct scb *scb, int enabled, u_int type)
18263+{
18264+ /*
18265+ * Nothing to do for linux as the incoming transaction
18266+ * has no concept of tag/non tagged, etc.
18267+ */
18268+}
18269+
18270+static __inline
18271+u_long aic_get_transfer_length(struct scb *scb)
18272+{
18273+ return (scb->platform_data->xfer_len);
18274+}
18275+
18276+static __inline
18277+int aic_get_transfer_dir(struct scb *scb)
18278+{
18279+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,40)
18280+ return (scb->io_ctx->sc_data_direction);
18281+#else
18282+ if (scb->io_ctx->bufflen == 0)
18283+ return (CAM_DIR_NONE);
18284+
18285+ switch(scb->io_ctx->cmnd[0]) {
18286+ case 0x08: /* READ(6) */
18287+ case 0x28: /* READ(10) */
18288+ case 0xA8: /* READ(12) */
18289+ return (CAM_DIR_IN);
18290+ case 0x0A: /* WRITE(6) */
18291+ case 0x2A: /* WRITE(10) */
18292+ case 0xAA: /* WRITE(12) */
18293+ return (CAM_DIR_OUT);
18294+ default:
18295+ return (CAM_DIR_NONE);
18296+ }
18297+#endif
18298+}
18299+
18300+static __inline
18301+void aic_set_residual(struct scb *scb, u_long resid)
18302+{
18303+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
18304+ scb->io_ctx->resid = resid;
18305+#else
18306+ scb->platform_data->resid = resid;
18307+#endif
18308+}
18309+
18310+static __inline
18311+void aic_set_sense_residual(struct scb *scb, u_long resid)
18312+{
18313+ scb->platform_data->sense_resid = resid;
18314+}
18315+
18316+static __inline
18317+u_long aic_get_residual(struct scb *scb)
18318+{
18319+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0)
18320+ return (scb->io_ctx->resid);
18321+#else
18322+ return (scb->platform_data->resid);
18323+#endif
18324+}
18325+
18326+static __inline
18327+u_long aic_get_sense_residual(struct scb *scb)
18328+{
18329+ return (scb->platform_data->sense_resid);
18330+}
18331+
18332+static __inline
18333+int aic_perform_autosense(struct scb *scb)
18334+{
18335+ /*
18336+ * We always perform autosense in Linux.
18337+ * On other platforms this is set on a
18338+ * per-transaction basis.
18339+ */
18340+ return (1);
18341+}
18342+
18343+static __inline uint32_t
18344+aic_get_sense_bufsize(struct aic_softc *aic, struct scb *scb)
18345+{
18346+ return (sizeof(struct scsi_sense_data));
18347+}
18348+
18349+static __inline void
18350+aic_notify_xfer_settings_change(struct aic_softc *aic,
18351+ struct aic_devinfo *devinfo)
18352+{
18353+ /* Nothing to do here for linux */
18354+}
18355+
18356+static __inline void
18357+aic_platform_scb_free(struct aic_softc *aic, struct scb *scb)
18358+{
18359+ aic->flags &= ~AIC_RESOURCE_SHORTAGE;
18360+}
18361+
18362+static __inline void
18363+aic_freeze_scb(struct scb *scb)
18364+{
18365+ if ((scb->io_ctx->result & (CAM_DEV_QFRZN << 16)) == 0) {
18366+ scb->io_ctx->result |= CAM_DEV_QFRZN << 16;
18367+ scb->platform_data->dev->qfrozen++;
18368+ }
18369+}
18370+
18371+/******************************* PCI Definitions ******************************/
18372+/*
18373+ * PCIM_xxx: mask to locate subfield in register
18374+ * PCIR_xxx: config register offset
18375+ * PCIC_xxx: device class
18376+ * PCIS_xxx: device subclass
18377+ * PCIP_xxx: device programming interface
18378+ * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices)
18379+ * PCID_xxx: device ID
18380+ */
18381+#define PCIR_DEVVENDOR 0x00
18382+#define PCIR_VENDOR 0x00
18383+#define PCIR_DEVICE 0x02
18384+#define PCIR_COMMAND 0x04
18385+#define PCIM_CMD_PORTEN 0x0001
18386+#define PCIM_CMD_MEMEN 0x0002
18387+#define PCIM_CMD_BUSMASTEREN 0x0004
18388+#define PCIM_CMD_MWRICEN 0x0010
18389+#define PCIM_CMD_PERRESPEN 0x0040
18390+#define PCIM_CMD_SERRESPEN 0x0100
18391+#define PCIR_STATUS 0x06
18392+#define PCIR_REVID 0x08
18393+#define PCIR_PROGIF 0x09
18394+#define PCIR_SUBCLASS 0x0a
18395+#define PCIR_CLASS 0x0b
18396+#define PCIR_CACHELNSZ 0x0c
18397+#define PCIR_LATTIMER 0x0d
18398+#define PCIR_HEADERTYPE 0x0e
18399+#define PCIM_MFDEV 0x80
18400+#define PCIR_BIST 0x0f
18401+#define PCIR_CAP_PTR 0x34
18402+
18403+/* config registers for header type 0 devices */
18404+#define PCIR_MAPS 0x10
18405+#define PCIR_BARS PCIR_MAPS
18406+#define PCIR_BAR(x) (PCIR_BARS + (x) * 4)
18407+#define PCIR_SUBVEND_0 0x2c
18408+#define PCIR_SUBDEV_0 0x2e
18409+
18410+typedef enum
18411+{
18412+ AIC_POWER_STATE_D0,
18413+ AIC_POWER_STATE_D1,
18414+ AIC_POWER_STATE_D2,
18415+ AIC_POWER_STATE_D3
18416+} aic_power_state;
18417+
18418+/****************************** PCI-X definitions *****************************/
18419+#define PCIXR_COMMAND 0x96
18420+#define PCIXR_DEVADDR 0x98
18421+#define PCIXM_DEVADDR_FNUM 0x0003 /* Function Number */
18422+#define PCIXM_DEVADDR_DNUM 0x00F8 /* Device Number */
18423+#define PCIXM_DEVADDR_BNUM 0xFF00 /* Bus Number */
18424+#define PCIXR_STATUS 0x9A
18425+#define PCIXM_STATUS_64BIT 0x0001 /* Active 64bit connection to device. */
18426+#define PCIXM_STATUS_133CAP 0x0002 /* Device is 133MHz capable */
18427+#define PCIXM_STATUS_SCDISC 0x0004 /* Split Completion Discarded */
18428+#define PCIXM_STATUS_UNEXPSC 0x0008 /* Unexpected Split Completion */
18429+#define PCIXM_STATUS_CMPLEXDEV 0x0010 /* Device Complexity (set == bridge) */
18430+#define PCIXM_STATUS_MAXMRDBC 0x0060 /* Maximum Burst Read Count */
18431+#define PCIXM_STATUS_MAXSPLITS 0x0380 /* Maximum Split Transactions */
18432+#define PCIXM_STATUS_MAXCRDS 0x1C00 /* Maximum Cumulative Read Size */
18433+#define PCIXM_STATUS_RCVDSCEM 0x2000 /* Received a Split Comp w/Error msg */
18434+
18435+/**************************** KObject Wrappers ********************************/
18436+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
18437+#define aic_dev_to_pci_dev(dev) to_pci_dev(dev)
18438+#define aic_dev_to_eisa_dev(dev) to_eisa_dev(dev)
18439+#define aic_pci_dev_to_dev(pci) (&pci->dev)
18440+#define aic_eisa_dev_to_dev(eisa) (&eisa->dev)
18441+#else
18442+#define aic_dev_to_pci_dev(dev) (dev)
18443+#define aic_dev_to_eisa_dev(dev) (NULL)
18444+#define aic_pci_dev_to_dev(pci) (pci)
18445+#define aic_eisa_dev_to_dev(eisa) (NULL)
18446+#endif
18447+
18448+#define aic_pci_dev(aic) aic_dev_to_pci_dev((aic)->dev_softc)
18449+#define aic_eisa_dev(aic) aic_dev_to_eisa_dev((aic)->dev_softc)
18450+/***************************** PCI Routines ***********************************/
18451+static __inline uint32_t aic_pci_read_config(aic_dev_softc_t dev,
18452+ int reg, int width);
18453+static __inline void aic_pci_write_config(aic_dev_softc_t dev,
18454+ int reg, uint32_t value,
18455+ int width);
18456+static __inline int aic_get_pci_function(aic_dev_softc_t);
18457+static __inline int aic_get_pci_slot(aic_dev_softc_t);
18458+static __inline int aic_get_pci_bus(aic_dev_softc_t);
18459+
18460+static __inline uint32_t
18461+aic_pci_read_config(aic_dev_softc_t dev, int reg, int width)
18462+{
18463+ struct pci_dev *pci;
18464+
18465+ pci = aic_dev_to_pci_dev(dev);
18466+ switch (width) {
18467+ case 1:
18468+ {
18469+ uint8_t retval;
18470+
18471+ pci_read_config_byte(pci, reg, &retval);
18472+ return (retval);
18473+ }
18474+ case 2:
18475+ {
18476+ uint16_t retval;
18477+ pci_read_config_word(pci, reg, &retval);
18478+ return (retval);
18479+ }
18480+ case 4:
18481+ {
18482+ uint32_t retval;
18483+ pci_read_config_dword(pci, reg, &retval);
18484+ return (retval);
18485+ }
18486+ default:
18487+ panic("aic_pci_read_config: Read size too big");
18488+ /* NOTREACHED */
18489+ return (0);
18490+ }
18491+}
18492+
18493+static __inline void
18494+aic_pci_write_config(aic_dev_softc_t dev, int reg, uint32_t value, int width)
18495+{
18496+ struct pci_dev *pci;
18497+
18498+ pci = aic_dev_to_pci_dev(dev);
18499+ switch (width) {
18500+ case 1:
18501+ pci_write_config_byte(pci, reg, value);
18502+ break;
18503+ case 2:
18504+ pci_write_config_word(pci, reg, value);
18505+ break;
18506+ case 4:
18507+ pci_write_config_dword(pci, reg, value);
18508+ break;
18509+ default:
18510+ panic("aic_pci_write_config: Write size too big");
18511+ /* NOTREACHED */
18512+ }
18513+}
18514+
18515+static __inline int
18516+aic_get_pci_function(aic_dev_softc_t dev)
18517+{
18518+ struct pci_dev *pci;
18519+
18520+ pci = aic_dev_to_pci_dev(dev);
18521+ return (PCI_FUNC(pci->devfn));
18522+}
18523+
18524+static __inline int
18525+aic_get_pci_slot(aic_dev_softc_t dev)
18526+{
18527+ struct pci_dev *pci;
18528+
18529+ pci = aic_dev_to_pci_dev(dev);
18530+ return (PCI_SLOT(pci->devfn));
18531+}
18532+
18533+static __inline int
18534+aic_get_pci_bus(aic_dev_softc_t dev)
18535+{
18536+ struct pci_dev *pci;
18537+
18538+ pci = aic_dev_to_pci_dev(dev);
18539+ return (pci->bus->number);
18540+}
18541+
18542 /************************* Large Disk Handling ********************************/
18543 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
18544 static __inline int aic_sector_div(u_long capacity, int heads, int sectors);
18545@@ -886,34 +2007,31 @@
18546 }
18547 #endif
18548
18549-/**************************** Module Library Hack *****************************/
18550-/*
18551- * What we'd like to do is have a single "scsi library" module that both the
18552- * aic7xxx and aic79xx drivers could load and depend on. A cursory examination
18553- * of implementing module dependencies in Linux (handling the install and
18554- * initrd cases) does not look promissing. For now, we just duplicate this
18555- * code in both drivers using a simple symbol renaming scheme that hides this
18556- * hack from the drivers.
18557- */
18558-#define AIC_LIB_ENTRY_CONCAT(x, prefix) prefix ## x
18559-#define AIC_LIB_ENTRY_EXPAND(x, prefix) AIC_LIB_ENTRY_CONCAT(x, prefix)
18560-#define AIC_LIB_ENTRY(x) AIC_LIB_ENTRY_EXPAND(x, AIC_LIB_PREFIX)
18561+/************************* Magic SysReq Support *******************************/
18562+#include <linux/sysrq.h>
18563
18564-#define aic_sense_desc AIC_LIB_ENTRY(_sense_desc)
18565-#define aic_sense_error_action AIC_LIB_ENTRY(_sense_error_action)
18566-#define aic_error_action AIC_LIB_ENTRY(_error_action)
18567-#define aic_op_desc AIC_LIB_ENTRY(_op_desc)
18568-#define aic_cdb_string AIC_LIB_ENTRY(_cdb_string)
18569-#define aic_print_inquiry AIC_LIB_ENTRY(_print_inquiry)
18570-#define aic_calc_syncsrate AIC_LIB_ENTRY(_calc_syncrate)
18571-#define aic_calc_syncparam AIC_LIB_ENTRY(_calc_syncparam)
18572-#define aic_calc_speed AIC_LIB_ENTRY(_calc_speed)
18573-#define aic_inquiry_match AIC_LIB_ENTRY(_inquiry_match)
18574-#define aic_static_inquiry_match AIC_LIB_ENTRY(_static_inquiry_match)
18575-#define aic_parse_brace_option AIC_LIB_ENTRY(_parse_brace_option)
18576+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
18577+typedef void aic_sysrq_handler_t (int, struct pt_regs *, struct kbd_struct *,
18578+ struct tty_struct *);
18579+#else
18580+typedef void aic_sysrq_handler_t (int, struct pt_regs *, struct tty_struct *);
18581+#endif
18582
18583-/******************************************************************************/
18584+#ifdef CONFIG_MAGIC_SYSRQ
18585+#define aic_sysrq_key_op sysrq_key_op
18586+#else
18587+struct aic_sysrq_key_op {
18588+ aic_sysrq_handler_t *handler;
18589+ char *help_msg;
18590+ char *action_msg;
18591+};
18592+#endif
18593
18594+aic_sysrq_handler_t aic_sysrq_handler;
18595+int aic_install_sysrq(struct aic_sysrq_key_op *);
18596+void aic_remove_sysrq(int key,
18597+ struct aic_sysrq_key_op *key_op);
18598+/************************ SCSI Library Functions *****************************/
18599 void aic_sense_desc(int /*sense_key*/, int /*asc*/,
18600 int /*ascq*/, struct scsi_inquiry_data*,
18601 const char** /*sense_key_desc*/,
18602@@ -1043,4 +2161,115 @@
18603 return (rv);
18604 }
18605
18606+/******************************* PCI Funcitons ********************************/
18607+void aic_power_state_change(struct aic_softc *aic, aic_power_state new_state);
18608+
18609+/******************************* Queue Handling *******************************/
18610+void aic_runq_tasklet(unsigned long data);
18611+void aic_unblock_tasklet(unsigned long data);
18612+void aic_linux_run_device_queue(struct aic_softc*,
18613+ struct aic_linux_device*);
18614+void aic_bus_settle_complete(u_long data);
18615+void aic_freeze_simq(struct aic_softc *aic);
18616+void aic_release_simq(struct aic_softc *aic);
18617+void aic_release_simq_locked(struct aic_softc *aic);
18618+static __inline void aic_schedule_runq(struct aic_softc *aic);
18619+static __inline void aic_schedule_unblock(struct aic_softc *aic);
18620+static __inline struct aic_linux_device *
18621+ aic_linux_next_device_to_run(struct aic_softc *aic);
18622+static __inline void aic_linux_check_device_queue(struct aic_softc *aic,
18623+ struct aic_linux_device *dev);
18624+static __inline void aic_linux_run_device_queues(struct aic_softc *aic);
18625+
18626+/*
18627+ * Must be called with our lock held.
18628+ */
18629+static __inline void
18630+aic_schedule_runq(struct aic_softc *aic)
18631+{
18632+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
18633+ tasklet_schedule(&aic->platform_data->runq_tasklet);
18634+#else
18635+ /*
18636+ * Tasklets are not available, so run inline.
18637+ */
18638+ aic_runq_tasklet((unsigned long)aic);
18639+#endif
18640+}
18641+
18642+static __inline void
18643+aic_schedule_unblock(struct aic_softc *aic)
18644+{
18645+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
18646+ tasklet_schedule(&aic->platform_data->unblock_tasklet);
18647+#else
18648+#error "Fix 2.2.X Kernel Support"
18649+#endif
18650+}
18651+
18652+static __inline struct aic_linux_device *
18653+aic_linux_next_device_to_run(struct aic_softc *aic)
18654+{
18655+
18656+ if ((aic->flags & AIC_RESOURCE_SHORTAGE) != 0
18657+ || (aic->platform_data->qfrozen != 0
18658+ && AIC_DV_SIMQ_FROZEN(aic) == 0))
18659+ return (NULL);
18660+ return (TAILQ_FIRST(&aic->platform_data->device_runq));
18661+}
18662+
18663+static __inline void
18664+aic_linux_check_device_queue(struct aic_softc *aic,
18665+ struct aic_linux_device *dev)
18666+{
18667+ if ((dev->flags & AIC_DEV_FREEZE_TIL_EMPTY) != 0
18668+ && dev->active == 0) {
18669+ dev->flags &= ~AIC_DEV_FREEZE_TIL_EMPTY;
18670+ dev->qfrozen--;
18671+ }
18672+
18673+ if (TAILQ_FIRST(&dev->busyq) == NULL
18674+ || dev->openings == 0 || dev->qfrozen != 0)
18675+ return;
18676+
18677+ aic_linux_run_device_queue(aic, dev);
18678+}
18679+
18680+static __inline void
18681+aic_linux_run_device_queues(struct aic_softc *aic)
18682+{
18683+ struct aic_linux_device *dev;
18684+
18685+ while ((dev = aic_linux_next_device_to_run(aic)) != NULL) {
18686+ TAILQ_REMOVE(&aic->platform_data->device_runq, dev, links);
18687+ dev->flags &= ~AIC_DEV_ON_RUN_LIST;
18688+ aic_linux_check_device_queue(aic, dev);
18689+ }
18690+}
18691+
18692+/****************************** Tasklet Support *******************************/
18693+static __inline void aic_setup_tasklets(struct aic_softc *aic);
18694+static __inline void aic_teardown_tasklets(struct aic_softc *aic);
18695+
18696+static __inline void
18697+aic_setup_tasklets(struct aic_softc *aic)
18698+{
18699+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
18700+ tasklet_init(&aic->platform_data->runq_tasklet, aic_runq_tasklet,
18701+ (unsigned long)aic);
18702+ tasklet_init(&aic->platform_data->unblock_tasklet, aic_unblock_tasklet,
18703+ (unsigned long)aic);
18704+#endif
18705+}
18706+
18707+static __inline void
18708+aic_teardown_tasklets(struct aic_softc *aic)
18709+{
18710+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
18711+ tasklet_kill(&aic->platform_data->runq_tasklet);
18712+ tasklet_kill(&aic->platform_data->unblock_tasklet);
18713+#endif
18714+}
18715+
18716+
18717 #endif /*_AICLIB_H */
18718diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/aiclib_pci.c linux-2.4.24/drivers/scsi/aic7xxx/aiclib_pci.c
18719--- linux-2.4.24.org/drivers/scsi/aic7xxx/aiclib_pci.c 1970-01-01 01:00:00.000000000 +0100
18720+++ linux-2.4.24/drivers/scsi/aic7xxx/aiclib_pci.c 2003-12-22 22:46:59.000000000 +0100
18721@@ -0,0 +1,79 @@
18722+/*
18723+ * Implementation of Utility functions for PCI controller types.
18724+ *
18725+ * Copyright (c) 2000-2003 Adaptec Inc.
18726+ * All rights reserved.
18727+ *
18728+ * Redistribution and use in source and binary forms, with or without
18729+ * modification, are permitted provided that the following conditions
18730+ * are met:
18731+ * 1. Redistributions of source code must retain the above copyright
18732+ * notice, this list of conditions, and the following disclaimer,
18733+ * without modification.
18734+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18735+ * substantially similar to the "NO WARRANTY" disclaimer below
18736+ * ("Disclaimer") and any redistribution must be conditioned upon
18737+ * including a substantially similar Disclaimer requirement for further
18738+ * binary redistribution.
18739+ * 3. Neither the names of the above-listed copyright holders nor the names
18740+ * of any contributors may be used to endorse or promote products derived
18741+ * from this software without specific prior written permission.
18742+ *
18743+ * Alternatively, this software may be distributed under the terms of the
18744+ * GNU General Public License ("GPL") version 2 as published by the Free
18745+ * Software Foundation.
18746+ *
18747+ * NO WARRANTY
18748+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18749+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18750+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
18751+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18752+ * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18753+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
18754+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
18755+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
18756+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
18757+ * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
18758+ * POSSIBILITY OF SUCH DAMAGES.
18759+ *
18760+ * $Id$
18761+ */
18762+
18763+void
18764+aic_power_state_change(struct aic_softc *aic, aic_power_state new_state)
18765+{
18766+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
18767+ pci_set_power_state(aic_dev_to_pci_dev(aic->dev_softc), new_state);
18768+#else
18769+ uint32_t cap;
18770+ u_int cap_offset;
18771+
18772+ /*
18773+ * Traverse the capability list looking for
18774+ * the power management capability.
18775+ */
18776+ cap = 0;
18777+ cap_offset = aic_pci_read_config(aic->dev_softc,
18778+ PCIR_CAP_PTR, /*bytes*/1);
18779+ while (cap_offset != 0) {
18780+
18781+ cap = aic_pci_read_config(aic->dev_softc,
18782+ cap_offset, /*bytes*/4);
18783+ if ((cap & 0xFF) == 1
18784+ && ((cap >> 16) & 0x3) > 0) {
18785+ uint32_t pm_control;
18786+
18787+ pm_control = aic_pci_read_config(aic->dev_softc,
18788+ cap_offset + 4,
18789+ /*bytes*/4);
18790+ pm_control &= ~0x3;
18791+ pm_control |= new_state;
18792+ aic_pci_write_config(aic->dev_softc,
18793+ cap_offset + 4,
18794+ pm_control, /*bytes*/2);
18795+ break;
18796+ }
18797+ cap_offset = (cap >> 8) & 0xFF;
18798+ }
18799+#endif
18800+}
18801diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/Makefile linux-2.4.24/drivers/scsi/aic7xxx/Makefile
18802--- linux-2.4.24.org/drivers/scsi/aic7xxx/Makefile 2004-01-08 11:57:43.074992349 +0100
18803+++ linux-2.4.24/drivers/scsi/aic7xxx/Makefile 2003-12-22 22:46:59.000000000 +0100
18804@@ -64,8 +64,13 @@
18805 $(LD) $(LD_RFLAG) -r -o $@ $(obj-aic79xx)
18806
18807 ifeq ($(CONFIG_AIC7XXX_BUILD_FIRMWARE),y)
18808+# Create a dependency chain in generated files
18809+# to avoid concurrent invocations of the single
18810+# rule that builds them all.
18811+aic7xxx_seq.h: aic7xxx_reg.h
18812 aic7xxx_gen = aic7xxx_seq.h aic7xxx_reg.h
18813 ifeq ($(CONFIG_AIC7XXX_REG_PRETTY_PRINT),y)
18814+aic7xxx_reg.h: aic7xxx_reg_print.c
18815 aic7xxx_gen += aic7xxx_reg_print.c
18816 aic7xxx_asm_cmd = aicasm/aicasm -I. -r aic7xxx_reg.h \
18817 -p aic7xxx_reg_print.c -i aic7xxx_osm.h \
18818@@ -79,8 +84,13 @@
18819 endif
18820
18821 ifeq ($(CONFIG_AIC79XX_BUILD_FIRMWARE),y)
18822+# Create a dependency chain in generated files
18823+# to avoid concurrent invocations of the single
18824+# rule that builds them all.
18825+aic79xx_seq.h: aic79xx_reg.h
18826 aic79xx_gen = aic79xx_seq.h aic79xx_reg.h
18827 ifeq ($(CONFIG_AIC79XX_REG_PRETTY_PRINT),y)
18828+aic79xx_reg.h: aic79xx_reg_print.c
18829 aic79xx_gen += aic79xx_reg_print.c
18830 aic79xx_asm_cmd = aicasm/aicasm -I. -r aic79xx_reg.h \
18831 -p aic79xx_reg_print.c -i aic79xx_osm.h \
18832diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/README.aic79xx linux-2.4.24/drivers/scsi/aic7xxx/README.aic79xx
18833--- linux-2.4.24.org/drivers/scsi/aic7xxx/README.aic79xx 2004-01-08 11:57:43.072992762 +0100
18834+++ linux-2.4.24/drivers/scsi/aic7xxx/README.aic79xx 2003-12-22 22:46:59.000000000 +0100
18835@@ -1,5 +1,5 @@
18836 ====================================================================
18837-= Adaptec Ultra320 Family Manager Set v1.3.0 =
18838+= Adaptec Ultra320 Family Manager Set v2.0.5 =
18839 = =
18840 = README for =
18841 = The Linux Operating System =
18842@@ -19,34 +19,159 @@
18843 The following Adaptec SCSI Host Adapters are supported by this
18844 driver set.
18845
18846- Ultra320 Adapters Description
18847+ Ultra320 ASIC Description
18848 ----------------------------------------------------------------
18849- Adaptec SCSI Card 39320 Dual Channel 64-bit PCI-X 133MHz to
18850- Ultra320 SCSI Card (one external
18851- 68-pin, two internal 68-pin)
18852- Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to
18853- Ultra320 SCSI Card (two external VHDC
18854- and one internal 68-pin)
18855- Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to
18856- Ultra320 SCSI Card (two external VHDC
18857- and one internal 68-pin) based on the
18858- AIC-7902B ASIC
18859- Adaptec SCSI Card 29320 Single Channel 64-bit PCI-X 133MHz to
18860- Ultra320 SCSI Card (one external
18861- 68-pin, two internal 68-pin, one
18862- internal 50-pin)
18863- Adaptec SCSI Card 29320LP Single Channel 64-bit Low Profile
18864- PCI-X 133MHz to Ultra320 SCSI Card
18865- (One external VHDC, one internal
18866- 68-pin)
18867- AIC-7901A Single Channel 64-bit PCI-X 133MHz to
18868- Ultra320 SCSI ASIC
18869- AIC-7902A4 Dual Channel 64-bit PCI-X 133MHz to
18870- Ultra320 SCSI ASIC
18871- AIC-7902B Dual Channel 64-bit PCI-X 133MHz to
18872- Ultra320 SCSI ASIC
18873-
18874+ AIC-7901A Single Channel 64-bit PCI-X 133MHz to
18875+ Ultra320 SCSI ASIC
18876+ AIC-7901B Single Channel 64-bit PCI-X 133MHz to
18877+ Ultra320 SCSI ASIC with Retained Training
18878+ AIC-7902A4 Dual Channel 64-bit PCI-X 133MHz to
18879+ Ultra320 SCSI ASIC
18880+ AIC-7902B Dual Channel 64-bit PCI-X 133MHz to
18881+ Ultra320 SCSI ASIC with Retained Training
18882+
18883+ Ultra320 Adapters Description ASIC
18884+ --------------------------------------------------------------------------
18885+ Adaptec SCSI Card 39320 Dual Channel 64-bit PCI-X 133MHz to 7902A4/7902B
18886+ Ultra320 SCSI Card (one external
18887+ 68-pin, two internal 68-pin)
18888+ Adaptec SCSI Card 39320A Dual Channel 64-bit PCI-X 133MHz to 7902B
18889+ Ultra320 SCSI Card (one external
18890+ 68-pin, two internal 68-pin)
18891+ Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to 7902A4
18892+ Ultra320 SCSI Card (two external VHDC
18893+ and one internal 68-pin)
18894+ Adaptec SCSI Card 39320D Dual Channel 64-bit PCI-X 133MHz to 7902A4
18895+ Ultra320 SCSI Card (two external VHDC
18896+ and one internal 68-pin) based on the
18897+ AIC-7902B ASIC
18898+ Adaptec SCSI Card 29320 Single Channel 64-bit PCI-X 133MHz to 7901A
18899+ Ultra320 SCSI Card (one external
18900+ 68-pin, two internal 68-pin, one
18901+ internal 50-pin)
18902+ Adaptec SCSI Card 29320A Single Channel 64-bit PCI-X 133MHz to 7901B
18903+ Ultra320 SCSI Card (one external
18904+ 68-pin, two internal 68-pin, one
18905+ internal 50-pin)
18906+ Adaptec SCSI Card 29320LP Single Channel 64-bit Low Profile 7901A
18907+ PCI-X 133MHz to Ultra320 SCSI Card
18908+ (One external VHDC, one internal
18909+ 68-pin)
18910+ Adaptec SCSI Card 29320ALP Single Channel 64-bit Low Profile 7901B
18911+ PCI-X 133MHz to Ultra320 SCSI Card
18912+ (One external VHDC, one internal
18913+ 68-pin)
18914 2. Version History
18915+
18916+ 2.0.5 (December 22nd, 2003)
18917+ - Correct a bug preventing the driver from renegotiating
18918+ during auto-request operations when a check condition
18919+ occurred for a zero length command.
18920+ - Sniff sense information returned by targets for unit
18921+ attention errors that may indicate that the device has
18922+ been changed. If we see such status for non Domain
18923+ Validation related commands, start a DV scan for the
18924+ target. In the past, DV would only occur for hot-plugged
18925+ devices if no target had been previously probed for a
18926+ particular ID. This change guarantees that the DV process
18927+ will occur even if the user swaps devices without any
18928+ interveining I/O to tell us that a device has gone missing.
18929+ The old behavior, among other things, would fail to spin up
18930+ drives that were hot-plugged since the Linux mid-layer
18931+ will only spin-up drives on initial attach.
18932+ - Correct several issues in the rundown of the good status
18933+ FIFO during error recovery. The typical failure scenario
18934+ evidenced by this defect was the loss of several commands
18935+ under high load when several queue full conditions occured
18936+ back to back.
18937+
18938+ 2.0.4 (November 6th, 2003)
18939+ - Support the 2.6.0-test9 kernel
18940+ - Fix rare deadlock caused by using del_timer_sync from within
18941+ a timer handler.
18942+
18943+ 2.0.3 (October 21st, 2003)
18944+ - On 7902A4 hardware, use the slow slew rate for transfer
18945+ rates slower than U320. This behavior matches the Windows
18946+ driver.
18947+ - Fix some issues with the ahd_flush_qoutfifo() routine.
18948+ - Add a delay in the loop waiting for selection activity
18949+ to cease. Otherwise we may exhaust the loop counter too
18950+ quickly on fast machines.
18951+ - Return to processing bad status completions through the
18952+ qoutfifo. This reduces the amount of time the controller
18953+ is paused for these kinds of errors.
18954+ - Move additional common routines to the aiclib OSM library
18955+ to reduce code duplication.
18956+ - Leave removal of softcs from the global list of softcs to
18957+ the OSM. This allows us to avoid holding the list_lock during
18958+ device destruction.
18959+ - Enforce a bus settle delay for bus resets that the
18960+ driver initiates.
18961+ - Fall back to basic DV for U160 devices that lack an
18962+ echo buffer.
18963+
18964+ 2.0.2 (September 4th, 2003)
18965+ - Move additional common routines to the aiclib OSM library
18966+ to reduce code duplication.
18967+ - Avoid an inadvertant reset of the controller during the
18968+ memory mapped I/O test should the controller be left in
18969+ the reset state prior to driver initialization. On some
18970+ systems, this extra reset resulted in a system hang due
18971+ to a chip access that occurred too soon after reset.
18972+ - Correct an endian bug in ahd_swap_with_next_hscb. This
18973+ corrects strong-arm support.
18974+ - Reset the bus for transactions that timeout waiting for
18975+ the bus to go free after a disconnect or command complete
18976+ message.
18977+
18978+ 2.0.1 (August 26th, 2003)
18979+ - Add magic sysrq handler that causes a card dump to be output
18980+ to the console for each controller.
18981+ - Avoid waking the mid-layer's error recovery handler during
18982+ timeout recovery by returning DID_ERROR instead of DID_TIMEOUT
18983+ for timed-out commands that have been aborted.
18984+ - Move additional common routines to the aiclib OSM library
18985+ to reduce code duplication.
18986+
18987+ 2.0.0 (August 20th, 2003)
18988+ - Remove MMAPIO definition and allow memory mapped
18989+ I/O for any platform that supports PCI.
18990+ - Avoid clearing ENBUSFREE during single stepping to avoid
18991+ spurious "unexpected busfree while idle" messages.
18992+ - Correct deadlock in ahd_run_qoutfifo() processing.
18993+ - Optimize support for the 7901B.
18994+ - Correct a few cases where an explicit flush of pending
18995+ register writes was required to ensure acuracy in delays.
18996+ - Correct problems in manually flushing completed commands
18997+ on the controller. The FIFOs are now flushed to ensure
18998+ that completed commands that are still draining to the
18999+ host are completed correctly.
19000+ - Correct incomplete CDB delivery detection on the 790XB.
19001+ - Ignore the cmd->underflow field since userland applications
19002+ using the legacy command pass-thru interface do not set
19003+ it correctly. Honoring this field led to spurious errors
19004+ when users used the "scsi_unique_id" program.
19005+ - Perform timeout recovery within the driver instead of relying
19006+ on the Linux SCSI mid-layer to perform this function. The
19007+ mid-layer does not know the full state of the SCSI bus and
19008+ is therefore prone to looping for several minutes to effect
19009+ recovery. The new scheme recovers within 15 seconds of the
19010+ failure.
19011+ - Correct support for manual termination settings.
19012+ - Increase maximum wait time for serial eeprom writes allowing
19013+ writes to function correctly.
19014+
19015+ 1.3.12 (August 11, 2003)
19016+ - Implement new error recovery thread that supercedes the existing
19017+ Linux SCSI error recovery code.
19018+ - Fix termination logic for 29320ALP.
19019+ - Fix SEEPROM delay to compensate for write ops taking longer.
19020+
19021+ 1.3.11 (July 11, 2003)
19022+ - Fix several deadlock issues.
19023+ - Add 29320ALP and 39320B Id's.
19024+
19025 1.3.10 (June 3rd, 2003)
19026 - Align the SCB_TAG field on a 16byte boundary. This avoids
19027 SCB corruption on some PCI-33 busses.
19028diff -urN linux-2.4.24.org/drivers/scsi/aic7xxx/README.aic7xxx linux-2.4.24/drivers/scsi/aic7xxx/README.aic7xxx
19029--- linux-2.4.24.org/drivers/scsi/aic7xxx/README.aic7xxx 2004-01-08 11:57:43.071992969 +0100
19030+++ linux-2.4.24/drivers/scsi/aic7xxx/README.aic7xxx 2003-12-22 22:46:59.000000000 +0100
19031@@ -1,5 +1,5 @@
19032 ====================================================================
19033-= Adaptec Aic7xxx Fast -> Ultra160 Family Manager Set v6.2.28 =
19034+= Adaptec Aic7xxx Fast -> Ultra160 Family Manager Set v6.3.4 =
19035 = README for =
19036 = The Linux Operating System =
19037 ====================================================================
19038@@ -131,6 +131,80 @@
19039 SCSI "stub" effects.
19040
19041 2. Version History
19042+
19043+ 6.3.4 (December 22nd, 2003)
19044+ - Provide a better description string for the 2915/30LP.
19045+ - Sniff sense information returned by targets for unit
19046+ attention errors that may indicate that the device has
19047+ been changed. If we see such status for non Domain
19048+ Validation related commands, start a DV scan for the
19049+ target. In the past, DV would only occur for hot-plugged
19050+ devices if no target had been previously probed for a
19051+ particular ID. This change guarantees that the DV process
19052+ will occur even if the user swaps devices without any
19053+ interveining I/O to tell us that a device has gone missing.
19054+ The old behavior, among other things, would fail to spin up
19055+ drives that were hot-plugged since the Linux mid-layer
19056+ will only spin-up drives on initial attach.
19057+
19058+ 6.3.3 (November 6th, 2003)
19059+ - Support the 2.6.0-test9 kernel
19060+ - Fix rare deadlock caused by using del_timer_sync from within
19061+ a timer handler.
19062+
19063+ 6.3.2 (October 28th, 2003)
19064+ - Enforce a bus settle delay for bus resets that the
19065+ driver initiates.
19066+ - Fall back to basic DV for U160 devices that lack an
19067+ echo buffer.
19068+ - Correctly detect that left over BIOS data has not
19069+ been initialized when the CHPRST status bit is set
19070+ during driver initialization.
19071+
19072+ 6.3.1 (October 21st, 2003)
19073+ - Fix a compiler error when building with only EISA or PCI
19074+ support compiled into the kernel.
19075+ - Add chained dependencies to both the driver and aicasm Makefiles
19076+ to avoid problems with parallel builds.
19077+ - Move additional common routines to the aiclib OSM library
19078+ to reduce code duplication.
19079+ - Fix a bug in the testing of the AHC_TMODE_WIDEODD_BUG that
19080+ could cause target mode operations to hang.
19081+ - Leave removal of softcs from the global list of softcs to
19082+ the OSM. This allows us to avoid holding the list_lock during
19083+ device destruction.
19084+
19085+ 6.3.0 (September 8th, 2003)
19086+ - Move additional common routines to the aiclib OSM library
19087+ to reduce code duplication.
19088+ - Bump minor number to reflect change in error recovery strategy.
19089+
19090+ 6.2.38 (August 31st, 2003)
19091+ - Avoid an inadvertant reset of the controller during the
19092+ memory mapped I/O test should the controller be left in
19093+ the reset state prior to driver initialization. On some
19094+ systems, this extra reset resulted in a system hang due
19095+ to a chip access that occurred too soon after reset.
19096+ - Move additional common routines to the aiclib OSM library
19097+ to reduce code duplication.
19098+ - Add magic sysrq handler that causes a card dump to be output
19099+ to the console for each controller.
19100+
19101+ 6.2.37 (August 12th, 2003)
19102+ - Perform timeout recovery within the driver instead of relying
19103+ on the Linux SCSI mid-layer to perform this function. The
19104+ mid-layer does not know the full state of the SCSI bus and
19105+ is therefore prone to looping for several minutes to effect
19106+ recovery. The new scheme recovers within 15 seconds of the
19107+ failure.
19108+ - Support writing 93c56/66 SEEPROM on newer cards.
19109+ - Avoid clearing ENBUSFREE during single stepping to avoid
19110+ spurious "unexpected busfree while idle" messages.
19111+ - Enable the use of the "Auto-Access-Pause" feature on the
19112+ aic7880 and aic7870 chips. It was disabled due to an
19113+ oversight. Using this feature drastically reduces command
19114+ delivery latency.
19115+
19116 6.2.36 (June 3rd, 2003)
19117 - Correct code that disables PCI parity error checking.
19118 - Correct and simplify handling of the ignore wide residue
This page took 6.246808 seconds and 4 git commands to generate.