blob: 4b4d1233ce8a95e60e885b9575b505dc4f34d9e1 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* aha152x.c -- Adaptec AHA-152x driver
2 * Author: Jürgen E. Fischer, fischer@norbit.de
3 * Copyright 1993-2004 Jürgen E. Fischer
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2, or (at your option) any
8 * later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 *
16 * $Id: aha152x.c,v 2.7 2004/01/24 11:42:59 fischer Exp $
17 *
18 * $Log: aha152x.c,v $
19 * Revision 2.7 2004/01/24 11:42:59 fischer
20 * - gather code that is not used by PCMCIA at the end
21 * - move request_region for !PCMCIA case to detection
22 * - migration to new scsi host api (remove legacy code)
23 * - free host scribble before scsi_done
24 * - fix error handling
25 * - one isapnp device added to id_table
26 *
27 * Revision 2.6 2003/10/30 20:52:47 fischer
28 * - interfaces changes for kernel 2.6
29 * - aha152x_probe_one introduced for pcmcia stub
30 * - fixed pnpdev handling
31 * - instead of allocation a new one, reuse command for request sense after check condition and reset
32 * - fixes race in is_complete
33 *
34 * Revision 2.5 2002/04/14 11:24:53 fischer
35 * - isapnp support
36 * - abort fixed
37 * - 2.5 support
38 *
39 * Revision 2.4 2000/12/16 12:53:56 fischer
40 * - allow REQUEST SENSE to be queued
41 * - handle shared PCI interrupts
42 *
43 * Revision 2.3 2000/11/04 16:40:26 fischer
44 * - handle data overruns
45 * - extend timeout for data phases
46 *
47 * Revision 2.2 2000/08/08 19:54:53 fischer
48 * - minor changes
49 *
50 * Revision 2.1 2000/05/17 16:23:17 fischer
51 * - signature update
52 * - fix for data out w/o scatter gather
53 *
54 * Revision 2.0 1999/12/25 15:07:32 fischer
55 * - interrupt routine completly reworked
56 * - basic support for new eh code
57 *
58 * Revision 1.21 1999/11/10 23:46:36 fischer
59 * - default to synchronous operation
60 * - synchronous negotiation fixed
61 * - added timeout to loops
62 * - debugging output can be controlled through procfs
63 *
64 * Revision 1.20 1999/11/07 18:37:31 fischer
65 * - synchronous operation works
66 * - resid support for sg driver
67 *
68 * Revision 1.19 1999/11/02 22:39:59 fischer
69 * - moved leading comments to README.aha152x
70 * - new additional module parameters
71 * - updates for 2.3
72 * - support for the Tripace TC1550 controller
73 * - interrupt handling changed
74 *
75 * Revision 1.18 1996/09/07 20:10:40 fischer
76 * - fixed can_queue handling (multiple outstanding commands working again)
77 *
78 * Revision 1.17 1996/08/17 16:05:14 fischer
79 * - biosparam improved
80 * - interrupt verification
81 * - updated documentation
82 * - cleanups
83 *
84 * Revision 1.16 1996/06/09 00:04:56 root
85 * - added configuration symbols for insmod (aha152x/aha152x1)
86 *
87 * Revision 1.15 1996/04/30 14:52:06 fischer
88 * - proc info fixed
89 * - support for extended translation for >1GB disks
90 *
91 * Revision 1.14 1996/01/17 15:11:20 fischer
92 * - fixed lockup in MESSAGE IN phase after reconnection
93 *
94 * Revision 1.13 1996/01/09 02:15:53 fischer
95 * - some cleanups
96 * - moved request_irq behind controller initialization
97 * (to avoid spurious interrupts)
98 *
99 * Revision 1.12 1995/12/16 12:26:07 fischer
100 * - barrier()s added
101 * - configurable RESET delay added
102 *
103 * Revision 1.11 1995/12/06 21:18:35 fischer
104 * - some minor updates
105 *
106 * Revision 1.10 1995/07/22 19:18:45 fischer
107 * - support for 2 controllers
108 * - started synchronous data transfers (not working yet)
109 *
110 * Revision 1.9 1995/03/18 09:20:24 root
111 * - patches for PCMCIA and modules
112 *
113 * Revision 1.8 1995/01/21 22:07:19 root
114 * - snarf_region => request_region
115 * - aha152x_intr interface change
116 *
117 * Revision 1.7 1995/01/02 23:19:36 root
118 * - updated COMMAND_SIZE to cmd_len
119 * - changed sti() to restore_flags()
120 * - fixed some #ifdef which generated warnings
121 *
122 * Revision 1.6 1994/11/24 20:35:27 root
123 * - problem with odd number of bytes in fifo fixed
124 *
125 * Revision 1.5 1994/10/30 14:39:56 root
126 * - abort code fixed
127 * - debugging improved
128 *
129 * Revision 1.4 1994/09/12 11:33:01 root
130 * - irqaction to request_irq
131 * - abortion updated
132 *
133 * Revision 1.3 1994/08/04 13:53:05 root
134 * - updates for mid-level-driver changes
135 * - accept unexpected BUSFREE phase as error condition
136 * - parity check now configurable
137 *
138 * Revision 1.2 1994/07/03 12:56:36 root
139 * - cleaned up debugging code
140 * - more tweaking on reset delays
141 * - updated abort/reset code (pretty untested...)
142 *
143 * Revision 1.1 1994/05/28 21:18:49 root
144 * - update for mid-level interface change (abort-reset)
145 * - delays after resets adjusted for some slow devices
146 *
147 * Revision 1.0 1994/03/25 12:52:00 root
148 * - Fixed "more data than expected" problem
149 * - added new BIOS signatures
150 *
151 * Revision 0.102 1994/01/31 20:44:12 root
152 * - minor changes in insw/outsw handling
153 *
154 * Revision 0.101 1993/12/13 01:16:27 root
155 * - fixed STATUS phase (non-GOOD stati were dropped sometimes;
156 * fixes problems with CD-ROM sector size detection & media change)
157 *
158 * Revision 0.100 1993/12/10 16:58:47 root
159 * - fix for unsuccessful selections in case of non-continuous id assignments
160 * on the scsi bus.
161 *
162 * Revision 0.99 1993/10/24 16:19:59 root
163 * - fixed DATA IN (rare read errors gone)
164 *
165 * Revision 0.98 1993/10/17 12:54:44 root
166 * - fixed some recent fixes (shame on me)
167 * - moved initialization of scratch area to aha152x_queue
168 *
169 * Revision 0.97 1993/10/09 18:53:53 root
170 * - DATA IN fixed. Rarely left data in the fifo.
171 *
172 * Revision 0.96 1993/10/03 00:53:59 root
173 * - minor changes on DATA IN
174 *
175 * Revision 0.95 1993/09/24 10:36:01 root
176 * - change handling of MSGI after reselection
177 * - fixed sti/cli
178 * - minor changes
179 *
180 * Revision 0.94 1993/09/18 14:08:22 root
181 * - fixed bug in multiple outstanding command code
182 * - changed detection
183 * - support for kernel command line configuration
184 * - reset corrected
185 * - changed message handling
186 *
187 * Revision 0.93 1993/09/15 20:41:19 root
188 * - fixed bugs with multiple outstanding commands
189 *
190 * Revision 0.92 1993/09/13 02:46:33 root
191 * - multiple outstanding commands work (no problems with IBM drive)
192 *
193 * Revision 0.91 1993/09/12 20:51:46 root
194 * added multiple outstanding commands
195 * (some problem with this $%&? IBM device remain)
196 *
197 * Revision 0.9 1993/09/12 11:11:22 root
198 * - corrected auto-configuration
199 * - changed the auto-configuration (added some '#define's)
200 * - added support for dis-/reconnection
201 *
202 * Revision 0.8 1993/09/06 23:09:39 root
203 * - added support for the drive activity light
204 * - minor changes
205 *
206 * Revision 0.7 1993/09/05 14:30:15 root
207 * - improved phase detection
208 * - now using the new snarf_region code of 0.99pl13
209 *
210 * Revision 0.6 1993/09/02 11:01:38 root
211 * first public release; added some signatures and biosparam()
212 *
213 * Revision 0.5 1993/08/30 10:23:30 root
214 * fixed timing problems with my IBM drive
215 *
216 * Revision 0.4 1993/08/29 14:06:52 root
217 * fixed some problems with timeouts due incomplete commands
218 *
219 * Revision 0.3 1993/08/28 15:55:03 root
220 * writing data works too. mounted and worked on a dos partition
221 *
222 * Revision 0.2 1993/08/27 22:42:07 root
223 * reading data works. Mounted a msdos partition.
224 *
225 * Revision 0.1 1993/08/25 13:38:30 root
226 * first "damn thing doesn't work" version
227 *
228 * Revision 0.0 1993/08/14 19:54:25 root
229 * empty function bodies; detect() works.
230 *
231 *
232 **************************************************************************
233
234 see Documentation/scsi/aha152x.txt for configuration details
235
236 **************************************************************************/
237
238#include <linux/module.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700239#include <asm/irq.h>
Matthew Wilcox53d5ed62006-10-11 01:22:01 -0700240#include <linux/io.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241#include <linux/blkdev.h>
242#include <asm/system.h>
243#include <linux/errno.h>
244#include <linux/string.h>
245#include <linux/wait.h>
246#include <linux/ioport.h>
247#include <linux/delay.h>
248#include <linux/proc_fs.h>
249#include <linux/interrupt.h>
250#include <linux/init.h>
251#include <linux/kernel.h>
252#include <linux/isapnp.h>
253#include <linux/spinlock.h>
254#include <linux/workqueue.h>
James Bottomley5fcda422006-09-14 17:04:58 -0500255#include <linux/list.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256#include <asm/semaphore.h>
257#include <scsi/scsicam.h>
258
259#include "scsi.h"
db9dff32005-04-03 14:53:59 -0500260#include <scsi/scsi_dbg.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261#include <scsi/scsi_host.h>
Matthew Wilcox1abfd372005-12-15 16:22:01 -0500262#include <scsi/scsi_transport_spi.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -0700263#include "aha152x.h"
264
James Bottomley5fcda422006-09-14 17:04:58 -0500265static LIST_HEAD(aha152x_host_list);
266
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267
268/* DEFINES */
269
270/* For PCMCIA cards, always use AUTOCONF */
271#if defined(PCMCIA) || defined(MODULE)
272#if !defined(AUTOCONF)
273#define AUTOCONF
274#endif
275#endif
276
277#if !defined(AUTOCONF) && !defined(SETUP0)
278#error define AUTOCONF or SETUP0
279#endif
280
281#if defined(AHA152X_DEBUG)
282#define DEBUG_DEFAULT debug_eh
283
284#define DPRINTK(when,msgs...) \
285 do { if(HOSTDATA(shpnt)->debug & (when)) printk(msgs); } while(0)
286
287#define DO_LOCK(flags) \
288 do { \
289 if(spin_is_locked(&QLOCK)) { \
290 DPRINTK(debug_intr, DEBUG_LEAD "(%s:%d) already locked at %s:%d\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__, QLOCKER, QLOCKERL); \
291 } \
292 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) locking\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
293 spin_lock_irqsave(&QLOCK,flags); \
294 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) locked\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
295 QLOCKER=__FUNCTION__; \
296 QLOCKERL=__LINE__; \
297 } while(0)
298
299#define DO_UNLOCK(flags) \
300 do { \
301 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) unlocking (locked at %s:%d)\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__, QLOCKER, QLOCKERL); \
302 spin_unlock_irqrestore(&QLOCK,flags); \
303 DPRINTK(debug_locks, DEBUG_LEAD "(%s:%d) unlocked\n", CMDINFO(CURRENT_SC), __FUNCTION__, __LINE__); \
304 QLOCKER="(not locked)"; \
305 QLOCKERL=0; \
306 } while(0)
307
308#else
309#define DPRINTK(when,msgs...)
310#define DO_LOCK(flags) spin_lock_irqsave(&QLOCK,flags)
311#define DO_UNLOCK(flags) spin_unlock_irqrestore(&QLOCK,flags)
312#endif
313
314#define LEAD "(scsi%d:%d:%d) "
315#define WARN_LEAD KERN_WARNING LEAD
316#define INFO_LEAD KERN_INFO LEAD
317#define NOTE_LEAD KERN_NOTICE LEAD
318#define ERR_LEAD KERN_ERR LEAD
319#define DEBUG_LEAD KERN_DEBUG LEAD
320#define CMDINFO(cmd) \
321 (cmd) ? ((cmd)->device->host->host_no) : -1, \
322 (cmd) ? ((cmd)->device->id & 0x0f) : -1, \
323 (cmd) ? ((cmd)->device->lun & 0x07) : -1
324
325#define DELAY_DEFAULT 1000
326
327#if defined(PCMCIA)
328#define IRQ_MIN 0
329#define IRQ_MAX 16
330#else
331#define IRQ_MIN 9
332#if defined(__PPC)
333#define IRQ_MAX (NR_IRQS-1)
334#else
335#define IRQ_MAX 12
336#endif
337#endif
338
339enum {
340 not_issued = 0x0001, /* command not yet issued */
341 selecting = 0x0002, /* target is beeing selected */
342 identified = 0x0004, /* IDENTIFY was sent */
343 disconnected = 0x0008, /* target disconnected */
344 completed = 0x0010, /* target sent COMMAND COMPLETE */
345 aborted = 0x0020, /* ABORT was sent */
346 resetted = 0x0040, /* BUS DEVICE RESET was sent */
347 spiordy = 0x0080, /* waiting for SPIORDY to raise */
348 syncneg = 0x0100, /* synchronous negotiation in progress */
349 aborting = 0x0200, /* ABORT is pending */
350 resetting = 0x0400, /* BUS DEVICE RESET is pending */
351 check_condition = 0x0800, /* requesting sense after CHECK CONDITION */
352};
353
354MODULE_AUTHOR("Jürgen Fischer");
355MODULE_DESCRIPTION(AHA152X_REVID);
356MODULE_LICENSE("GPL");
357
358#if !defined(PCMCIA)
359#if defined(MODULE)
360static int io[] = {0, 0};
361module_param_array(io, int, NULL, 0);
362MODULE_PARM_DESC(io,"base io address of controller");
363
364static int irq[] = {0, 0};
365module_param_array(irq, int, NULL, 0);
366MODULE_PARM_DESC(irq,"interrupt for controller");
367
368static int scsiid[] = {7, 7};
369module_param_array(scsiid, int, NULL, 0);
370MODULE_PARM_DESC(scsiid,"scsi id of controller");
371
372static int reconnect[] = {1, 1};
373module_param_array(reconnect, int, NULL, 0);
374MODULE_PARM_DESC(reconnect,"allow targets to disconnect");
375
376static int parity[] = {1, 1};
377module_param_array(parity, int, NULL, 0);
378MODULE_PARM_DESC(parity,"use scsi parity");
379
380static int sync[] = {1, 1};
381module_param_array(sync, int, NULL, 0);
382MODULE_PARM_DESC(sync,"use synchronous transfers");
383
384static int delay[] = {DELAY_DEFAULT, DELAY_DEFAULT};
385module_param_array(delay, int, NULL, 0);
386MODULE_PARM_DESC(delay,"scsi reset delay");
387
388static int exttrans[] = {0, 0};
389module_param_array(exttrans, int, NULL, 0);
390MODULE_PARM_DESC(exttrans,"use extended translation");
391
392#if !defined(AHA152X_DEBUG)
393static int aha152x[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
394module_param_array(aha152x, int, NULL, 0);
395MODULE_PARM_DESC(aha152x, "parameters for first controller");
396
397static int aha152x1[] = {0, 11, 7, 1, 1, 0, DELAY_DEFAULT, 0};
398module_param_array(aha152x1, int, NULL, 0);
399MODULE_PARM_DESC(aha152x1, "parameters for second controller");
400#else
401static int debug[] = {DEBUG_DEFAULT, DEBUG_DEFAULT};
402module_param_array(debug, int, NULL, 0);
403MODULE_PARM_DESC(debug, "flags for driver debugging");
404
405static int aha152x[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
406module_param_array(aha152x, int, NULL, 0);
407MODULE_PARM_DESC(aha152x, "parameters for first controller");
408
409static int aha152x1[] = {0, 11, 7, 1, 1, 1, DELAY_DEFAULT, 0, DEBUG_DEFAULT};
410module_param_array(aha152x1, int, NULL, 0);
411MODULE_PARM_DESC(aha152x1, "parameters for second controller");
412#endif /* !defined(AHA152X_DEBUG) */
413#endif /* MODULE */
414
415#ifdef __ISAPNP__
416static struct isapnp_device_id id_table[] __devinitdata = {
417 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
418 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1505), 0 },
419 { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
420 ISAPNP_VENDOR('A','D','P'), ISAPNP_FUNCTION(0x1530), 0 },
421 { ISAPNP_DEVICE_SINGLE_END, }
422};
423MODULE_DEVICE_TABLE(isapnp, id_table);
424#endif /* ISAPNP */
425
426#endif /* !PCMCIA */
427
Christoph Hellwigd0be4a7d2005-10-31 18:31:40 +0100428static struct scsi_host_template aha152x_driver_template;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429
430/*
431 * internal states of the host
432 *
433 */
434enum aha152x_state {
435 idle=0,
436 unknown,
437 seldo,
438 seldi,
439 selto,
440 busfree,
441 msgo,
442 cmd,
443 msgi,
444 status,
445 datai,
446 datao,
447 parerr,
448 rsti,
449 maxstate
450};
451
452/*
453 * current state information of the host
454 *
455 */
456struct aha152x_hostdata {
457 Scsi_Cmnd *issue_SC;
458 /* pending commands to issue */
459
460 Scsi_Cmnd *current_SC;
461 /* current command on the bus */
462
463 Scsi_Cmnd *disconnected_SC;
464 /* commands that disconnected */
465
466 Scsi_Cmnd *done_SC;
467 /* command that was completed */
468
469 spinlock_t lock;
470 /* host lock */
471
472#if defined(AHA152X_DEBUG)
473 const char *locker;
474 /* which function has the lock */
475 int lockerl; /* where did it get it */
476
477 int debug; /* current debugging setting */
478#endif
479
480#if defined(AHA152X_STAT)
481 int total_commands;
482 int disconnections;
483 int busfree_without_any_action;
484 int busfree_without_old_command;
485 int busfree_without_new_command;
486 int busfree_without_done_command;
487 int busfree_with_check_condition;
488 int count[maxstate];
489 int count_trans[maxstate];
490 unsigned long time[maxstate];
491#endif
492
493 int commands; /* current number of commands */
494
495 int reconnect; /* disconnection allowed */
496 int parity; /* parity checking enabled */
497 int synchronous; /* synchronous transferes enabled */
498 int delay; /* reset out delay */
499 int ext_trans; /* extended translation enabled */
500
501 int swint; /* software-interrupt was fired during detect() */
502 int service; /* bh needs to be run */
503 int in_intr; /* bh is running */
504
505 /* current state,
506 previous state,
507 last state different from current state */
508 enum aha152x_state state, prevstate, laststate;
509
510 int target;
511 /* reconnecting target */
512
513 unsigned char syncrate[8];
514 /* current synchronous transfer agreements */
515
516 unsigned char syncneg[8];
517 /* 0: no negotiation;
518 * 1: negotiation in progress;
519 * 2: negotiation completed
520 */
521
522 int cmd_i;
523 /* number of sent bytes of current command */
524
525 int msgi_len;
526 /* number of received message bytes */
527 unsigned char msgi[256];
528 /* received message bytes */
529
530 int msgo_i, msgo_len;
531 /* number of sent bytes and length of current messages */
532 unsigned char msgo[256];
533 /* pending messages */
534
535 int data_len;
536 /* number of sent/received bytes in dataphase */
537
538 unsigned long io_port0;
539 unsigned long io_port1;
540
541#ifdef __ISAPNP__
542 struct pnp_dev *pnpdev;
543#endif
James Bottomley5fcda422006-09-14 17:04:58 -0500544 struct list_head host_list;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545};
546
547
548/*
549 * host specific command extension
550 *
551 */
552struct aha152x_scdata {
553 Scsi_Cmnd *next; /* next sc in queue */
554 struct semaphore *sem; /* semaphore to block on */
Christoph Hellwig5e13cdf2006-07-08 20:39:30 +0200555 unsigned char cmd_len;
556 unsigned char cmnd[MAX_COMMAND_SIZE];
557 unsigned short use_sg;
558 unsigned request_bufflen;
559 void *request_buffer;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700560};
561
562
563/* access macros for hostdata */
564
565#define HOSTDATA(shpnt) ((struct aha152x_hostdata *) &shpnt->hostdata)
566
567#define HOSTNO ((shpnt)->host_no)
568
569#define CURRENT_SC (HOSTDATA(shpnt)->current_SC)
570#define DONE_SC (HOSTDATA(shpnt)->done_SC)
571#define ISSUE_SC (HOSTDATA(shpnt)->issue_SC)
572#define DISCONNECTED_SC (HOSTDATA(shpnt)->disconnected_SC)
573#define QLOCK (HOSTDATA(shpnt)->lock)
574#define QLOCKER (HOSTDATA(shpnt)->locker)
575#define QLOCKERL (HOSTDATA(shpnt)->lockerl)
576
577#define STATE (HOSTDATA(shpnt)->state)
578#define PREVSTATE (HOSTDATA(shpnt)->prevstate)
579#define LASTSTATE (HOSTDATA(shpnt)->laststate)
580
581#define RECONN_TARGET (HOSTDATA(shpnt)->target)
582
583#define CMD_I (HOSTDATA(shpnt)->cmd_i)
584
585#define MSGO(i) (HOSTDATA(shpnt)->msgo[i])
586#define MSGO_I (HOSTDATA(shpnt)->msgo_i)
587#define MSGOLEN (HOSTDATA(shpnt)->msgo_len)
588#define ADDMSGO(x) (MSGOLEN<256 ? (void)(MSGO(MSGOLEN++)=x) : aha152x_error(shpnt,"MSGO overflow"))
589
590#define MSGI(i) (HOSTDATA(shpnt)->msgi[i])
591#define MSGILEN (HOSTDATA(shpnt)->msgi_len)
592#define ADDMSGI(x) (MSGILEN<256 ? (void)(MSGI(MSGILEN++)=x) : aha152x_error(shpnt,"MSGI overflow"))
593
594#define DATA_LEN (HOSTDATA(shpnt)->data_len)
595
596#define SYNCRATE (HOSTDATA(shpnt)->syncrate[CURRENT_SC->device->id])
597#define SYNCNEG (HOSTDATA(shpnt)->syncneg[CURRENT_SC->device->id])
598
599#define DELAY (HOSTDATA(shpnt)->delay)
600#define EXT_TRANS (HOSTDATA(shpnt)->ext_trans)
601#define TC1550 (HOSTDATA(shpnt)->tc1550)
602#define RECONNECT (HOSTDATA(shpnt)->reconnect)
603#define PARITY (HOSTDATA(shpnt)->parity)
604#define SYNCHRONOUS (HOSTDATA(shpnt)->synchronous)
605
606#define HOSTIOPORT0 (HOSTDATA(shpnt)->io_port0)
607#define HOSTIOPORT1 (HOSTDATA(shpnt)->io_port1)
608
609#define SCDATA(SCpnt) ((struct aha152x_scdata *) (SCpnt)->host_scribble)
610#define SCNEXT(SCpnt) SCDATA(SCpnt)->next
611#define SCSEM(SCpnt) SCDATA(SCpnt)->sem
612
613#define SG_ADDRESS(buffer) ((char *) (page_address((buffer)->page)+(buffer)->offset))
614
615/* state handling */
616static void seldi_run(struct Scsi_Host *shpnt);
617static void seldo_run(struct Scsi_Host *shpnt);
618static void selto_run(struct Scsi_Host *shpnt);
619static void busfree_run(struct Scsi_Host *shpnt);
620
621static void msgo_init(struct Scsi_Host *shpnt);
622static void msgo_run(struct Scsi_Host *shpnt);
623static void msgo_end(struct Scsi_Host *shpnt);
624
625static void cmd_init(struct Scsi_Host *shpnt);
626static void cmd_run(struct Scsi_Host *shpnt);
627static void cmd_end(struct Scsi_Host *shpnt);
628
629static void datai_init(struct Scsi_Host *shpnt);
630static void datai_run(struct Scsi_Host *shpnt);
631static void datai_end(struct Scsi_Host *shpnt);
632
633static void datao_init(struct Scsi_Host *shpnt);
634static void datao_run(struct Scsi_Host *shpnt);
635static void datao_end(struct Scsi_Host *shpnt);
636
637static void status_run(struct Scsi_Host *shpnt);
638
639static void msgi_run(struct Scsi_Host *shpnt);
640static void msgi_end(struct Scsi_Host *shpnt);
641
642static void parerr_run(struct Scsi_Host *shpnt);
643static void rsti_run(struct Scsi_Host *shpnt);
644
645static void is_complete(struct Scsi_Host *shpnt);
646
647/*
648 * driver states
649 *
650 */
651static struct {
652 char *name;
653 void (*init)(struct Scsi_Host *);
654 void (*run)(struct Scsi_Host *);
655 void (*end)(struct Scsi_Host *);
656 int spio;
657} states[] = {
658 { "idle", NULL, NULL, NULL, 0},
659 { "unknown", NULL, NULL, NULL, 0},
660 { "seldo", NULL, seldo_run, NULL, 0},
661 { "seldi", NULL, seldi_run, NULL, 0},
662 { "selto", NULL, selto_run, NULL, 0},
663 { "busfree", NULL, busfree_run, NULL, 0},
664 { "msgo", msgo_init, msgo_run, msgo_end, 1},
665 { "cmd", cmd_init, cmd_run, cmd_end, 1},
666 { "msgi", NULL, msgi_run, msgi_end, 1},
667 { "status", NULL, status_run, NULL, 1},
668 { "datai", datai_init, datai_run, datai_end, 0},
669 { "datao", datao_init, datao_run, datao_end, 0},
670 { "parerr", NULL, parerr_run, NULL, 0},
671 { "rsti", NULL, rsti_run, NULL, 0},
672};
673
674/* setup & interrupt */
David Howells7d12e782006-10-05 14:55:46 +0100675static irqreturn_t intr(int irq, void *dev_id);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676static void reset_ports(struct Scsi_Host *shpnt);
677static void aha152x_error(struct Scsi_Host *shpnt, char *msg);
678static void done(struct Scsi_Host *shpnt, int error);
679
680/* diagnostics */
681static void disp_ports(struct Scsi_Host *shpnt);
682static void show_command(Scsi_Cmnd * ptr);
683static void show_queues(struct Scsi_Host *shpnt);
684static void disp_enintr(struct Scsi_Host *shpnt);
685
686
687/*
688 * queue services:
689 *
690 */
691static inline void append_SC(Scsi_Cmnd **SC, Scsi_Cmnd *new_SC)
692{
693 Scsi_Cmnd *end;
694
695 SCNEXT(new_SC) = NULL;
696 if (!*SC)
697 *SC = new_SC;
698 else {
699 for (end = *SC; SCNEXT(end); end = SCNEXT(end))
700 ;
701 SCNEXT(end) = new_SC;
702 }
703}
704
705static inline Scsi_Cmnd *remove_first_SC(Scsi_Cmnd ** SC)
706{
707 Scsi_Cmnd *ptr;
708
709 ptr = *SC;
710 if (ptr) {
711 *SC = SCNEXT(*SC);
712 SCNEXT(ptr)=NULL;
713 }
714 return ptr;
715}
716
717static inline Scsi_Cmnd *remove_lun_SC(Scsi_Cmnd ** SC, int target, int lun)
718{
719 Scsi_Cmnd *ptr, *prev;
720
721 for (ptr = *SC, prev = NULL;
722 ptr && ((ptr->device->id != target) || (ptr->device->lun != lun));
723 prev = ptr, ptr = SCNEXT(ptr))
724 ;
725
726 if (ptr) {
727 if (prev)
728 SCNEXT(prev) = SCNEXT(ptr);
729 else
730 *SC = SCNEXT(ptr);
731
732 SCNEXT(ptr)=NULL;
733 }
734
735 return ptr;
736}
737
738static inline Scsi_Cmnd *remove_SC(Scsi_Cmnd **SC, Scsi_Cmnd *SCp)
739{
740 Scsi_Cmnd *ptr, *prev;
741
742 for (ptr = *SC, prev = NULL;
743 ptr && SCp!=ptr;
744 prev = ptr, ptr = SCNEXT(ptr))
745 ;
746
747 if (ptr) {
748 if (prev)
749 SCNEXT(prev) = SCNEXT(ptr);
750 else
751 *SC = SCNEXT(ptr);
752
753 SCNEXT(ptr)=NULL;
754 }
755
756 return ptr;
757}
758
David Howells7d12e782006-10-05 14:55:46 +0100759static irqreturn_t swintr(int irqno, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760{
Jeff Garzikc7bec5a2006-10-06 15:00:58 -0400761 struct Scsi_Host *shpnt = dev_id;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700762
763 HOSTDATA(shpnt)->swint++;
764
765 SETPORT(DMACNTRL0, INTEN);
766 return IRQ_HANDLED;
767}
768
769struct Scsi_Host *aha152x_probe_one(struct aha152x_setup *setup)
770{
771 struct Scsi_Host *shpnt;
772
773 shpnt = scsi_host_alloc(&aha152x_driver_template, sizeof(struct aha152x_hostdata));
774 if (!shpnt) {
775 printk(KERN_ERR "aha152x: scsi_host_alloc failed\n");
776 return NULL;
777 }
778
Linus Torvalds1da177e2005-04-16 15:20:36 -0700779 memset(HOSTDATA(shpnt), 0, sizeof *HOSTDATA(shpnt));
James Bottomley5fcda422006-09-14 17:04:58 -0500780 INIT_LIST_HEAD(&HOSTDATA(shpnt)->host_list);
781
782 /* need to have host registered before triggering any interrupt */
783 list_add_tail(&HOSTDATA(shpnt)->host_list, &aha152x_host_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700784
785 shpnt->io_port = setup->io_port;
786 shpnt->n_io_port = IO_RANGE;
787 shpnt->irq = setup->irq;
788
789 if (!setup->tc1550) {
790 HOSTIOPORT0 = setup->io_port;
791 HOSTIOPORT1 = setup->io_port;
792 } else {
793 HOSTIOPORT0 = setup->io_port+0x10;
794 HOSTIOPORT1 = setup->io_port-0x10;
795 }
796
797 spin_lock_init(&QLOCK);
798 RECONNECT = setup->reconnect;
799 SYNCHRONOUS = setup->synchronous;
800 PARITY = setup->parity;
801 DELAY = setup->delay;
802 EXT_TRANS = setup->ext_trans;
803
804#if defined(AHA152X_DEBUG)
805 HOSTDATA(shpnt)->debug = setup->debug;
806#endif
807
808 SETPORT(SCSIID, setup->scsiid << 4);
809 shpnt->this_id = setup->scsiid;
810
811 if (setup->reconnect)
812 shpnt->can_queue = AHA152X_MAXQUEUE;
813
814 /* RESET OUT */
815 printk("aha152x: resetting bus...\n");
816 SETPORT(SCSISEQ, SCSIRSTO);
817 mdelay(256);
818 SETPORT(SCSISEQ, 0);
819 mdelay(DELAY);
820
821 reset_ports(shpnt);
822
823 printk(KERN_INFO
824 "aha152x%d%s: "
825 "vital data: rev=%x, "
826 "io=0x%03lx (0x%03lx/0x%03lx), "
827 "irq=%d, "
828 "scsiid=%d, "
829 "reconnect=%s, "
830 "parity=%s, "
831 "synchronous=%s, "
832 "delay=%d, "
833 "extended translation=%s\n",
834 shpnt->host_no, setup->tc1550 ? " (tc1550 mode)" : "",
835 GETPORT(REV) & 0x7,
836 shpnt->io_port, HOSTIOPORT0, HOSTIOPORT1,
837 shpnt->irq,
838 shpnt->this_id,
839 RECONNECT ? "enabled" : "disabled",
840 PARITY ? "enabled" : "disabled",
841 SYNCHRONOUS ? "enabled" : "disabled",
842 DELAY,
843 EXT_TRANS ? "enabled" : "disabled");
844
845 /* not expecting any interrupts */
846 SETPORT(SIMODE0, 0);
847 SETPORT(SIMODE1, 0);
848
Thomas Gleixner1d6f3592006-07-01 19:29:42 -0700849 if( request_irq(shpnt->irq, swintr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700850 printk(KERN_ERR "aha152x%d: irq %d busy.\n", shpnt->host_no, shpnt->irq);
851 goto out_host_put;
852 }
853
854 HOSTDATA(shpnt)->swint = 0;
855
856 printk(KERN_INFO "aha152x%d: trying software interrupt, ", shpnt->host_no);
857
858 mb();
859 SETPORT(DMACNTRL0, SWINT|INTEN);
860 mdelay(1000);
861 free_irq(shpnt->irq, shpnt);
862
863 if (!HOSTDATA(shpnt)->swint) {
864 if (TESTHI(DMASTAT, INTSTAT)) {
865 printk("lost.\n");
866 } else {
867 printk("failed.\n");
868 }
869
870 SETPORT(DMACNTRL0, INTEN);
871
872 printk(KERN_ERR "aha152x%d: irq %d possibly wrong. "
873 "Please verify.\n", shpnt->host_no, shpnt->irq);
874 goto out_host_put;
875 }
876 printk("ok.\n");
877
878
879 /* clear interrupts */
880 SETPORT(SSTAT0, 0x7f);
881 SETPORT(SSTAT1, 0xef);
882
Thomas Gleixner1d6f3592006-07-01 19:29:42 -0700883 if ( request_irq(shpnt->irq, intr, IRQF_DISABLED|IRQF_SHARED, "aha152x", shpnt) ) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700884 printk(KERN_ERR "aha152x%d: failed to reassign irq %d.\n", shpnt->host_no, shpnt->irq);
885 goto out_host_put;
886 }
887
888 if( scsi_add_host(shpnt, NULL) ) {
889 free_irq(shpnt->irq, shpnt);
890 printk(KERN_ERR "aha152x%d: failed to add host.\n", shpnt->host_no);
891 goto out_host_put;
892 }
893
894 scsi_scan_host(shpnt);
895
Linus Torvalds1da177e2005-04-16 15:20:36 -0700896 return shpnt;
897
898out_host_put:
James Bottomley5fcda422006-09-14 17:04:58 -0500899 list_del(&HOSTDATA(shpnt)->host_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700900 scsi_host_put(shpnt);
901
902 return NULL;
903}
904
905void aha152x_release(struct Scsi_Host *shpnt)
906{
907 if(!shpnt)
908 return;
909
910 if (shpnt->irq)
911 free_irq(shpnt->irq, shpnt);
912
913#if !defined(PCMCIA)
914 if (shpnt->io_port)
915 release_region(shpnt->io_port, IO_RANGE);
916#endif
917
918#ifdef __ISAPNP__
919 if (HOSTDATA(shpnt)->pnpdev)
920 pnp_device_detach(HOSTDATA(shpnt)->pnpdev);
921#endif
922
923 scsi_remove_host(shpnt);
James Bottomley5fcda422006-09-14 17:04:58 -0500924 list_del(&HOSTDATA(shpnt)->host_list);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700925 scsi_host_put(shpnt);
926}
927
928
929/*
930 * setup controller to generate interrupts depending
931 * on current state (lock has to be acquired)
932 *
933 */
934static int setup_expected_interrupts(struct Scsi_Host *shpnt)
935{
936 if(CURRENT_SC) {
937 CURRENT_SC->SCp.phase |= 1 << 16;
938
939 if(CURRENT_SC->SCp.phase & selecting) {
940 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (seldo) (seltimo) (seldi)\n", CMDINFO(CURRENT_SC));
941 SETPORT(SSTAT1, SELTO);
942 SETPORT(SIMODE0, ENSELDO | (DISCONNECTED_SC ? ENSELDI : 0));
943 SETPORT(SIMODE1, ENSELTIMO);
944 } else {
945 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (busfree) %s\n", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.phase & spiordy ? "(spiordy)" : "");
946 SETPORT(SIMODE0, (CURRENT_SC->SCp.phase & spiordy) ? ENSPIORDY : 0);
947 SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
948 }
949 } else if(STATE==seldi) {
950 DPRINTK(debug_intr, DEBUG_LEAD "expecting: (phase change) (identify)\n", CMDINFO(CURRENT_SC));
951 SETPORT(SIMODE0, 0);
952 SETPORT(SIMODE1, ENPHASEMIS | ENSCSIRST | ENSCSIPERR | ENBUSFREE);
953 } else {
954 DPRINTK(debug_intr, DEBUG_LEAD "expecting: %s %s\n",
955 CMDINFO(CURRENT_SC),
956 DISCONNECTED_SC ? "(reselection)" : "",
957 ISSUE_SC ? "(busfree)" : "");
958 SETPORT(SIMODE0, DISCONNECTED_SC ? ENSELDI : 0);
959 SETPORT(SIMODE1, ENSCSIRST | ( (ISSUE_SC||DONE_SC) ? ENBUSFREE : 0));
960 }
961
962 if(!HOSTDATA(shpnt)->in_intr)
963 SETBITS(DMACNTRL0, INTEN);
964
965 return TESTHI(DMASTAT, INTSTAT);
966}
967
968
969/*
970 * Queue a command and setup interrupts for a free bus.
971 */
972static int aha152x_internal_queue(Scsi_Cmnd *SCpnt, struct semaphore *sem, int phase, void (*done)(Scsi_Cmnd *))
973{
974 struct Scsi_Host *shpnt = SCpnt->device->host;
975 unsigned long flags;
976
977#if defined(AHA152X_DEBUG)
978 if (HOSTDATA(shpnt)->debug & debug_queue) {
979 printk(INFO_LEAD "queue: %p; cmd_len=%d pieces=%d size=%u cmnd=",
980 CMDINFO(SCpnt), SCpnt, SCpnt->cmd_len, SCpnt->use_sg, SCpnt->request_bufflen);
db9dff32005-04-03 14:53:59 -0500981 __scsi_print_command(SCpnt->cmnd);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700982 }
983#endif
984
985 SCpnt->scsi_done = done;
986 SCpnt->resid = SCpnt->request_bufflen;
987 SCpnt->SCp.phase = not_issued | phase;
988 SCpnt->SCp.Status = CHECK_CONDITION;
989 SCpnt->SCp.Message = 0;
990 SCpnt->SCp.have_data_in = 0;
991 SCpnt->SCp.sent_command = 0;
992
993 if(SCpnt->SCp.phase & (resetting|check_condition)) {
994 if(SCpnt->host_scribble==0 || SCSEM(SCpnt) || SCNEXT(SCpnt)) {
995 printk(ERR_LEAD "cannot reuse command\n", CMDINFO(SCpnt));
996 return FAILED;
997 }
998 } else {
Christoph Hellwig5e13cdf2006-07-08 20:39:30 +0200999 struct aha152x_scdata *sc;
1000
Linus Torvalds1da177e2005-04-16 15:20:36 -07001001 SCpnt->host_scribble = kmalloc(sizeof(struct aha152x_scdata), GFP_ATOMIC);
1002 if(SCpnt->host_scribble==0) {
1003 printk(ERR_LEAD "allocation failed\n", CMDINFO(SCpnt));
1004 return FAILED;
1005 }
Christoph Hellwig5e13cdf2006-07-08 20:39:30 +02001006
1007 sc = SCDATA(SCpnt);
1008 memcpy(sc->cmnd, SCpnt->cmnd, sizeof(sc->cmnd));
1009 sc->request_buffer = SCpnt->request_buffer;
1010 sc->request_bufflen = SCpnt->request_bufflen;
1011 sc->use_sg = SCpnt->use_sg;
1012 sc->cmd_len = SCpnt->cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001013 }
1014
1015 SCNEXT(SCpnt) = NULL;
1016 SCSEM(SCpnt) = sem;
1017
1018 /* setup scratch area
1019 SCp.ptr : buffer pointer
1020 SCp.this_residual : buffer length
1021 SCp.buffer : next buffer
1022 SCp.buffers_residual : left buffers in list
1023 SCp.phase : current state of the command */
1024 if (SCpnt->use_sg) {
1025 SCpnt->SCp.buffer = (struct scatterlist *) SCpnt->request_buffer;
1026 SCpnt->SCp.ptr = SG_ADDRESS(SCpnt->SCp.buffer);
1027 SCpnt->SCp.this_residual = SCpnt->SCp.buffer->length;
1028 SCpnt->SCp.buffers_residual = SCpnt->use_sg - 1;
1029 } else {
1030 SCpnt->SCp.ptr = (char *) SCpnt->request_buffer;
1031 SCpnt->SCp.this_residual = SCpnt->request_bufflen;
1032 SCpnt->SCp.buffer = NULL;
1033 SCpnt->SCp.buffers_residual = 0;
1034 }
1035
1036 DO_LOCK(flags);
1037
1038#if defined(AHA152X_STAT)
1039 HOSTDATA(shpnt)->total_commands++;
1040#endif
1041
1042 /* Turn led on, when this is the first command. */
1043 HOSTDATA(shpnt)->commands++;
1044 if (HOSTDATA(shpnt)->commands==1)
1045 SETPORT(PORTA, 1);
1046
1047 append_SC(&ISSUE_SC, SCpnt);
1048
1049 if(!HOSTDATA(shpnt)->in_intr)
1050 setup_expected_interrupts(shpnt);
1051
1052 DO_UNLOCK(flags);
1053
1054 return 0;
1055}
1056
1057/*
1058 * queue a command
1059 *
1060 */
1061static int aha152x_queue(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
1062{
1063#if 0
1064 if(*SCpnt->cmnd == REQUEST_SENSE) {
1065 SCpnt->result = 0;
1066 done(SCpnt);
1067
1068 return 0;
1069 }
1070#endif
1071
1072 return aha152x_internal_queue(SCpnt, NULL, 0, done);
1073}
1074
1075
1076/*
1077 *
1078 *
1079 */
1080static void reset_done(Scsi_Cmnd *SCpnt)
1081{
1082#if 0
1083 struct Scsi_Host *shpnt = SCpnt->host;
1084 DPRINTK(debug_eh, INFO_LEAD "reset_done called\n", CMDINFO(SCpnt));
1085#endif
1086 if(SCSEM(SCpnt)) {
1087 up(SCSEM(SCpnt));
1088 } else {
1089 printk(KERN_ERR "aha152x: reset_done w/o semaphore\n");
1090 }
1091}
1092
1093/*
1094 * Abort a command
1095 *
1096 */
1097static int aha152x_abort(Scsi_Cmnd *SCpnt)
1098{
1099 struct Scsi_Host *shpnt = SCpnt->device->host;
1100 Scsi_Cmnd *ptr;
1101 unsigned long flags;
1102
1103#if defined(AHA152X_DEBUG)
1104 if(HOSTDATA(shpnt)->debug & debug_eh) {
1105 printk(DEBUG_LEAD "abort(%p)", CMDINFO(SCpnt), SCpnt);
1106 show_queues(shpnt);
1107 }
1108#endif
1109
1110 DO_LOCK(flags);
1111
1112 ptr=remove_SC(&ISSUE_SC, SCpnt);
1113
1114 if(ptr) {
1115 DPRINTK(debug_eh, DEBUG_LEAD "not yet issued - SUCCESS\n", CMDINFO(SCpnt));
1116
1117 HOSTDATA(shpnt)->commands--;
1118 if (!HOSTDATA(shpnt)->commands)
1119 SETPORT(PORTA, 0);
1120 DO_UNLOCK(flags);
1121
1122 kfree(SCpnt->host_scribble);
1123 SCpnt->host_scribble=NULL;
1124
1125 return SUCCESS;
1126 }
1127
1128 DO_UNLOCK(flags);
1129
1130 /*
1131 * FIXME:
1132 * for current command: queue ABORT for message out and raise ATN
1133 * for disconnected command: pseudo SC with ABORT message or ABORT on reselection?
1134 *
1135 */
1136
1137 printk(ERR_LEAD "cannot abort running or disconnected command\n", CMDINFO(SCpnt));
1138
1139 return FAILED;
1140}
1141
1142static void timer_expired(unsigned long p)
1143{
1144 Scsi_Cmnd *SCp = (Scsi_Cmnd *)p;
1145 struct semaphore *sem = SCSEM(SCp);
1146 struct Scsi_Host *shpnt = SCp->device->host;
1147 unsigned long flags;
1148
1149 /* remove command from issue queue */
1150 DO_LOCK(flags);
1151 remove_SC(&ISSUE_SC, SCp);
1152 DO_UNLOCK(flags);
1153
1154 up(sem);
1155}
1156
1157/*
1158 * Reset a device
1159 *
1160 */
1161static int aha152x_device_reset(Scsi_Cmnd * SCpnt)
1162{
1163 struct Scsi_Host *shpnt = SCpnt->device->host;
1164 DECLARE_MUTEX_LOCKED(sem);
1165 struct timer_list timer;
1166 int ret, issued, disconnected;
Christoph Hellwig631c2282006-07-08 20:42:15 +02001167 unsigned char old_cmd_len = SCpnt->cmd_len;
1168 unsigned short old_use_sg = SCpnt->use_sg;
1169 void *old_buffer = SCpnt->request_buffer;
1170 unsigned old_bufflen = SCpnt->request_bufflen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001171 unsigned long flags;
1172
1173#if defined(AHA152X_DEBUG)
1174 if(HOSTDATA(shpnt)->debug & debug_eh) {
1175 printk(INFO_LEAD "aha152x_device_reset(%p)", CMDINFO(SCpnt), SCpnt);
1176 show_queues(shpnt);
1177 }
1178#endif
1179
1180 if(CURRENT_SC==SCpnt) {
1181 printk(ERR_LEAD "cannot reset current device\n", CMDINFO(SCpnt));
1182 return FAILED;
1183 }
1184
1185 DO_LOCK(flags);
1186 issued = remove_SC(&ISSUE_SC, SCpnt)==0;
1187 disconnected = issued && remove_SC(&DISCONNECTED_SC, SCpnt);
1188 DO_UNLOCK(flags);
1189
1190 SCpnt->cmd_len = 0;
1191 SCpnt->use_sg = 0;
1192 SCpnt->request_buffer = NULL;
1193 SCpnt->request_bufflen = 0;
1194
1195 init_timer(&timer);
1196 timer.data = (unsigned long) SCpnt;
1197 timer.expires = jiffies + 100*HZ; /* 10s */
1198 timer.function = (void (*)(unsigned long)) timer_expired;
1199
1200 aha152x_internal_queue(SCpnt, &sem, resetting, reset_done);
1201 add_timer(&timer);
1202 down(&sem);
1203 del_timer(&timer);
Christoph Hellwig631c2282006-07-08 20:42:15 +02001204
1205 SCpnt->cmd_len = old_cmd_len;
1206 SCpnt->use_sg = old_use_sg;
1207 SCpnt->request_buffer = old_buffer;
1208 SCpnt->request_bufflen = old_bufflen;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001209
1210 DO_LOCK(flags);
1211
1212 if(SCpnt->SCp.phase & resetted) {
1213 HOSTDATA(shpnt)->commands--;
1214 if (!HOSTDATA(shpnt)->commands)
1215 SETPORT(PORTA, 0);
1216 kfree(SCpnt->host_scribble);
1217 SCpnt->host_scribble=NULL;
1218
1219 ret = SUCCESS;
1220 } else {
1221 /* requeue */
1222 if(!issued) {
1223 append_SC(&ISSUE_SC, SCpnt);
1224 } else if(disconnected) {
1225 append_SC(&DISCONNECTED_SC, SCpnt);
1226 }
1227
1228 ret = FAILED;
1229 }
1230
1231 DO_UNLOCK(flags);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232 return ret;
1233}
1234
1235static void free_hard_reset_SCs(struct Scsi_Host *shpnt, Scsi_Cmnd **SCs)
1236{
1237 Scsi_Cmnd *ptr;
1238
1239 ptr=*SCs;
1240 while(ptr) {
1241 Scsi_Cmnd *next;
1242
1243 if(SCDATA(ptr)) {
1244 next = SCNEXT(ptr);
1245 } else {
1246 printk(DEBUG_LEAD "queue corrupted at %p\n", CMDINFO(ptr), ptr);
1247 next = NULL;
1248 }
1249
1250 if (!ptr->device->soft_reset) {
1251 DPRINTK(debug_eh, DEBUG_LEAD "disconnected command %p removed\n", CMDINFO(ptr), ptr);
1252 remove_SC(SCs, ptr);
1253 HOSTDATA(shpnt)->commands--;
1254 kfree(ptr->host_scribble);
1255 ptr->host_scribble=NULL;
1256 }
1257
1258 ptr = next;
1259 }
1260}
1261
1262/*
1263 * Reset the bus
1264 *
1265 */
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001266static int aha152x_bus_reset_host(struct Scsi_Host *shpnt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001267{
Linus Torvalds1da177e2005-04-16 15:20:36 -07001268 unsigned long flags;
1269
1270 DO_LOCK(flags);
1271
1272#if defined(AHA152X_DEBUG)
1273 if(HOSTDATA(shpnt)->debug & debug_eh) {
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001274 printk(KERN_DEBUG "scsi%d: bus reset", shpnt->host_no);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001275 show_queues(shpnt);
1276 }
1277#endif
1278
1279 free_hard_reset_SCs(shpnt, &ISSUE_SC);
1280 free_hard_reset_SCs(shpnt, &DISCONNECTED_SC);
1281
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001282 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting bus\n", shpnt->host_no);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001283
1284 SETPORT(SCSISEQ, SCSIRSTO);
1285 mdelay(256);
1286 SETPORT(SCSISEQ, 0);
1287 mdelay(DELAY);
1288
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001289 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: bus resetted\n", shpnt->host_no);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001290
1291 setup_expected_interrupts(shpnt);
1292 if(HOSTDATA(shpnt)->commands==0)
1293 SETPORT(PORTA, 0);
1294
1295 DO_UNLOCK(flags);
1296
1297 return SUCCESS;
1298}
1299
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001300/*
1301 * Reset the bus
1302 *
1303 */
1304static int aha152x_bus_reset(Scsi_Cmnd *SCpnt)
1305{
1306 return aha152x_bus_reset_host(SCpnt->device->host);
1307}
Linus Torvalds1da177e2005-04-16 15:20:36 -07001308
1309/*
1310 * Restore default values to the AIC-6260 registers and reset the fifos
1311 *
1312 */
1313static void reset_ports(struct Scsi_Host *shpnt)
1314{
1315 unsigned long flags;
1316
1317 /* disable interrupts */
1318 SETPORT(DMACNTRL0, RSTFIFO);
1319
1320 SETPORT(SCSISEQ, 0);
1321
1322 SETPORT(SXFRCTL1, 0);
1323 SETPORT(SCSISIG, 0);
1324 SETRATE(0);
1325
1326 /* clear all interrupt conditions */
1327 SETPORT(SSTAT0, 0x7f);
1328 SETPORT(SSTAT1, 0xef);
1329
1330 SETPORT(SSTAT4, SYNCERR | FWERR | FRERR);
1331
1332 SETPORT(DMACNTRL0, 0);
1333 SETPORT(DMACNTRL1, 0);
1334
1335 SETPORT(BRSTCNTRL, 0xf1);
1336
1337 /* clear SCSI fifos and transfer count */
1338 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1339 SETPORT(SXFRCTL0, CH1);
1340
1341 DO_LOCK(flags);
1342 setup_expected_interrupts(shpnt);
1343 DO_UNLOCK(flags);
1344}
1345
1346/*
1347 * Reset the host (bus and controller)
1348 *
1349 */
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001350int aha152x_host_reset_host(struct Scsi_Host *shpnt)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001351{
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001352 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: host reset\n", shpnt->host_no);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001353
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001354 aha152x_bus_reset_host(shpnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001355
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001356 DPRINTK(debug_eh, KERN_DEBUG "scsi%d: resetting ports\n", shpnt->host_no);
1357 reset_ports(shpnt);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001358
1359 return SUCCESS;
1360}
1361
1362/*
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001363 * Reset the host (bus and controller)
1364 *
1365 */
1366static int aha152x_host_reset(Scsi_Cmnd *SCpnt)
1367{
1368 return aha152x_host_reset_host(SCpnt->device->host);
1369}
1370
1371/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07001372 * Return the "logical geometry"
1373 *
1374 */
1375static int aha152x_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1376 sector_t capacity, int *info_array)
1377{
1378 struct Scsi_Host *shpnt = sdev->host;
1379
1380 /* try default translation */
1381 info_array[0] = 64;
1382 info_array[1] = 32;
1383 info_array[2] = (unsigned long)capacity / (64 * 32);
1384
1385 /* for disks >1GB do some guessing */
1386 if (info_array[2] >= 1024) {
1387 int info[3];
1388
1389 /* try to figure out the geometry from the partition table */
1390 if (scsicam_bios_param(bdev, capacity, info) < 0 ||
1391 !((info[0] == 64 && info[1] == 32) || (info[0] == 255 && info[1] == 63))) {
1392 if (EXT_TRANS) {
1393 printk(KERN_NOTICE
1394 "aha152x: unable to verify geometry for disk with >1GB.\n"
1395 " using extended translation.\n");
1396 info_array[0] = 255;
1397 info_array[1] = 63;
1398 info_array[2] = (unsigned long)capacity / (255 * 63);
1399 } else {
1400 printk(KERN_NOTICE
1401 "aha152x: unable to verify geometry for disk with >1GB.\n"
1402 " Using default translation. Please verify yourself.\n"
1403 " Perhaps you need to enable extended translation in the driver.\n"
1404 " See Documentation/scsi/aha152x.txt for details.\n");
1405 }
1406 } else {
1407 info_array[0] = info[0];
1408 info_array[1] = info[1];
1409 info_array[2] = info[2];
1410
1411 if (info[0] == 255 && !EXT_TRANS) {
1412 printk(KERN_NOTICE
1413 "aha152x: current partition table is using extended translation.\n"
1414 " using it also, although it's not explicitly enabled.\n");
1415 }
1416 }
1417 }
1418
1419 return 0;
1420}
1421
1422/*
1423 * Internal done function
1424 *
1425 */
1426static void done(struct Scsi_Host *shpnt, int error)
1427{
1428 if (CURRENT_SC) {
1429 if(DONE_SC)
1430 printk(ERR_LEAD "there's already a completed command %p - will cause abort\n", CMDINFO(CURRENT_SC), DONE_SC);
1431
1432 DONE_SC = CURRENT_SC;
1433 CURRENT_SC = NULL;
1434 DONE_SC->result = error;
1435 } else
1436 printk(KERN_ERR "aha152x: done() called outside of command\n");
1437}
1438
1439static struct work_struct aha152x_tq;
1440
1441/*
1442 * Run service completions on the card with interrupts enabled.
1443 *
1444 */
David Howellsc4028952006-11-22 14:57:56 +00001445static void run(struct work_struct *work)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001446{
James Bottomley5fcda422006-09-14 17:04:58 -05001447 struct aha152x_hostdata *hd;
1448
1449 list_for_each_entry(hd, &aha152x_host_list, host_list) {
1450 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
1451
1452 is_complete(shost);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001453 }
1454}
1455
1456/*
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001457 * Interrupt handler
Linus Torvalds1da177e2005-04-16 15:20:36 -07001458 *
1459 */
David Howells7d12e782006-10-05 14:55:46 +01001460static irqreturn_t intr(int irqno, void *dev_id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001461{
James Bottomley5fcda422006-09-14 17:04:58 -05001462 struct Scsi_Host *shpnt = (struct Scsi_Host *)dev_id;
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001463 unsigned long flags;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001464 unsigned char rev, dmacntrl0;
1465
1466 if (!shpnt) {
1467 printk(KERN_ERR "aha152x: catched interrupt %d for unknown controller.\n", irqno);
1468 return IRQ_NONE;
1469 }
1470
1471 /*
1472 * Read a couple of registers that are known to not be all 1's. If
1473 * we read all 1's (-1), that means that either:
1474 *
1475 * a. The host adapter chip has gone bad, and we cannot control it,
1476 * OR
1477 * b. The host adapter is a PCMCIA card that has been ejected
1478 *
1479 * In either case, we cannot do anything with the host adapter at
1480 * this point in time. So just ignore the interrupt and return.
1481 * In the latter case, the interrupt might actually be meant for
1482 * someone else sharing this IRQ, and that driver will handle it.
1483 */
1484 rev = GETPORT(REV);
1485 dmacntrl0 = GETPORT(DMACNTRL0);
1486 if ((rev == 0xFF) && (dmacntrl0 == 0xFF))
1487 return IRQ_NONE;
1488
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001489 if( TESTLO(DMASTAT, INTSTAT) )
1490 return IRQ_NONE;
1491
Linus Torvalds1da177e2005-04-16 15:20:36 -07001492 /* no more interrupts from the controller, while we're busy.
1493 INTEN is restored by the BH handler */
1494 CLRBITS(DMACNTRL0, INTEN);
1495
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001496 DO_LOCK(flags);
1497 if( HOSTDATA(shpnt)->service==0 ) {
1498 HOSTDATA(shpnt)->service=1;
1499
1500 /* Poke the BH handler */
David Howellsc4028952006-11-22 14:57:56 +00001501 INIT_WORK(&aha152x_tq, run);
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001502 schedule_work(&aha152x_tq);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001503 }
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01001504 DO_UNLOCK(flags);
1505
Linus Torvalds1da177e2005-04-16 15:20:36 -07001506 return IRQ_HANDLED;
1507}
1508
1509/*
1510 * busfree phase
1511 * - handle completition/disconnection/error of current command
1512 * - start selection for next command (if any)
1513 */
1514static void busfree_run(struct Scsi_Host *shpnt)
1515{
1516 unsigned long flags;
1517#if defined(AHA152X_STAT)
1518 int action=0;
1519#endif
1520
1521 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
1522 SETPORT(SXFRCTL0, CH1);
1523
1524 SETPORT(SSTAT1, CLRBUSFREE);
1525
1526 if(CURRENT_SC) {
1527#if defined(AHA152X_STAT)
1528 action++;
1529#endif
1530 CURRENT_SC->SCp.phase &= ~syncneg;
1531
1532 if(CURRENT_SC->SCp.phase & completed) {
1533 /* target sent COMMAND COMPLETE */
1534 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_OK << 16));
1535
1536 } else if(CURRENT_SC->SCp.phase & aborted) {
1537 DPRINTK(debug_eh, DEBUG_LEAD "ABORT sent\n", CMDINFO(CURRENT_SC));
1538 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_ABORT << 16));
1539
1540 } else if(CURRENT_SC->SCp.phase & resetted) {
1541 DPRINTK(debug_eh, DEBUG_LEAD "BUS DEVICE RESET sent\n", CMDINFO(CURRENT_SC));
1542 done(shpnt, (CURRENT_SC->SCp.Status & 0xff) | ((CURRENT_SC->SCp.Message & 0xff) << 8) | (DID_RESET << 16));
1543
1544 } else if(CURRENT_SC->SCp.phase & disconnected) {
1545 /* target sent DISCONNECT */
1546 DPRINTK(debug_selection, DEBUG_LEAD "target disconnected at %d/%d\n",
1547 CMDINFO(CURRENT_SC),
1548 CURRENT_SC->resid,
1549 CURRENT_SC->request_bufflen);
1550#if defined(AHA152X_STAT)
1551 HOSTDATA(shpnt)->disconnections++;
1552#endif
1553 append_SC(&DISCONNECTED_SC, CURRENT_SC);
1554 CURRENT_SC->SCp.phase |= 1 << 16;
1555 CURRENT_SC = NULL;
1556
1557 } else {
1558 done(shpnt, DID_ERROR << 16);
1559 }
1560#if defined(AHA152X_STAT)
1561 } else {
1562 HOSTDATA(shpnt)->busfree_without_old_command++;
1563#endif
1564 }
1565
1566 DO_LOCK(flags);
1567
1568 if(DONE_SC) {
1569#if defined(AHA152X_STAT)
1570 action++;
1571#endif
1572
1573 if(DONE_SC->SCp.phase & check_condition) {
Christoph Hellwig5e13cdf2006-07-08 20:39:30 +02001574 struct scsi_cmnd *cmd = HOSTDATA(shpnt)->done_SC;
1575 struct aha152x_scdata *sc = SCDATA(cmd);
1576
Linus Torvalds1da177e2005-04-16 15:20:36 -07001577#if 0
1578 if(HOSTDATA(shpnt)->debug & debug_eh) {
1579 printk(ERR_LEAD "received sense: ", CMDINFO(DONE_SC));
db9dff32005-04-03 14:53:59 -05001580 scsi_print_sense("bh", DONE_SC);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001581 }
1582#endif
1583
1584 /* restore old command */
Christoph Hellwig5e13cdf2006-07-08 20:39:30 +02001585 memcpy(cmd->cmnd, sc->cmnd, sizeof(sc->cmnd));
1586 cmd->request_buffer = sc->request_buffer;
1587 cmd->request_bufflen = sc->request_bufflen;
1588 cmd->use_sg = sc->use_sg;
1589 cmd->cmd_len = sc->cmd_len;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001590
Christoph Hellwig5e13cdf2006-07-08 20:39:30 +02001591 cmd->SCp.Status = 0x02;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001592
1593 HOSTDATA(shpnt)->commands--;
1594 if (!HOSTDATA(shpnt)->commands)
1595 SETPORT(PORTA, 0); /* turn led off */
1596 } else if(DONE_SC->SCp.Status==0x02) {
1597#if defined(AHA152X_STAT)
1598 HOSTDATA(shpnt)->busfree_with_check_condition++;
1599#endif
1600#if 0
1601 DPRINTK(debug_eh, ERR_LEAD "CHECK CONDITION found\n", CMDINFO(DONE_SC));
1602#endif
1603
1604 if(!(DONE_SC->SCp.Status & not_issued)) {
1605 Scsi_Cmnd *ptr = DONE_SC;
1606 DONE_SC=NULL;
1607#if 0
1608 DPRINTK(debug_eh, ERR_LEAD "requesting sense\n", CMDINFO(ptr));
1609#endif
1610
1611 ptr->cmnd[0] = REQUEST_SENSE;
1612 ptr->cmnd[1] = 0;
1613 ptr->cmnd[2] = 0;
1614 ptr->cmnd[3] = 0;
1615 ptr->cmnd[4] = sizeof(ptr->sense_buffer);
1616 ptr->cmnd[5] = 0;
1617 ptr->cmd_len = 6;
1618 ptr->use_sg = 0;
1619 ptr->request_buffer = ptr->sense_buffer;
1620 ptr->request_bufflen = sizeof(ptr->sense_buffer);
1621
1622 DO_UNLOCK(flags);
1623 aha152x_internal_queue(ptr, NULL, check_condition, ptr->scsi_done);
1624 DO_LOCK(flags);
1625#if 0
1626 } else {
1627 DPRINTK(debug_eh, ERR_LEAD "command not issued - CHECK CONDITION ignored\n", CMDINFO(DONE_SC));
1628#endif
1629 }
1630 }
1631
1632 if(DONE_SC && DONE_SC->scsi_done) {
1633#if defined(AHA152X_DEBUG)
1634 int hostno=DONE_SC->device->host->host_no;
1635 int id=DONE_SC->device->id & 0xf;
1636 int lun=DONE_SC->device->lun & 0x7;
1637#endif
1638 Scsi_Cmnd *ptr = DONE_SC;
1639 DONE_SC=NULL;
1640
1641 /* turn led off, when no commands are in the driver */
1642 HOSTDATA(shpnt)->commands--;
1643 if (!HOSTDATA(shpnt)->commands)
1644 SETPORT(PORTA, 0); /* turn led off */
1645
1646 if(ptr->scsi_done != reset_done) {
1647 kfree(ptr->host_scribble);
1648 ptr->host_scribble=NULL;
1649 }
1650
1651 DO_UNLOCK(flags);
1652 DPRINTK(debug_done, DEBUG_LEAD "calling scsi_done(%p)\n", hostno, id, lun, ptr);
1653 ptr->scsi_done(ptr);
1654 DPRINTK(debug_done, DEBUG_LEAD "scsi_done(%p) returned\n", hostno, id, lun, ptr);
1655 DO_LOCK(flags);
1656 }
1657
1658 DONE_SC=NULL;
1659#if defined(AHA152X_STAT)
1660 } else {
1661 HOSTDATA(shpnt)->busfree_without_done_command++;
1662#endif
1663 }
1664
1665 if(ISSUE_SC)
1666 CURRENT_SC = remove_first_SC(&ISSUE_SC);
1667
1668 DO_UNLOCK(flags);
1669
1670 if(CURRENT_SC) {
1671#if defined(AHA152X_STAT)
1672 action++;
1673#endif
1674 CURRENT_SC->SCp.phase |= selecting;
1675
1676 DPRINTK(debug_selection, DEBUG_LEAD "selecting target\n", CMDINFO(CURRENT_SC));
1677
1678 /* clear selection timeout */
1679 SETPORT(SSTAT1, SELTO);
1680
1681 SETPORT(SCSIID, (shpnt->this_id << OID_) | CURRENT_SC->device->id);
1682 SETPORT(SXFRCTL1, (PARITY ? ENSPCHK : 0 ) | ENSTIMER);
1683 SETPORT(SCSISEQ, ENSELO | ENAUTOATNO | (DISCONNECTED_SC ? ENRESELI : 0));
1684 } else {
1685#if defined(AHA152X_STAT)
1686 HOSTDATA(shpnt)->busfree_without_new_command++;
1687#endif
1688 SETPORT(SCSISEQ, DISCONNECTED_SC ? ENRESELI : 0);
1689 }
1690
1691#if defined(AHA152X_STAT)
1692 if(!action)
1693 HOSTDATA(shpnt)->busfree_without_any_action++;
1694#endif
1695}
1696
1697/*
1698 * Selection done (OUT)
1699 * - queue IDENTIFY message and SDTR to selected target for message out
1700 * (ATN asserted automagically via ENAUTOATNO in busfree())
1701 */
1702static void seldo_run(struct Scsi_Host *shpnt)
1703{
1704 SETPORT(SCSISIG, 0);
1705 SETPORT(SSTAT1, CLRBUSFREE);
1706 SETPORT(SSTAT1, CLRPHASECHG);
1707
1708 CURRENT_SC->SCp.phase &= ~(selecting|not_issued);
1709
1710 SETPORT(SCSISEQ, 0);
1711
1712 if (TESTLO(SSTAT0, SELDO)) {
1713 printk(ERR_LEAD "aha152x: passing bus free condition\n", CMDINFO(CURRENT_SC));
1714 done(shpnt, DID_NO_CONNECT << 16);
1715 return;
1716 }
1717
1718 SETPORT(SSTAT0, CLRSELDO);
1719
1720 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
1721
1722 if (CURRENT_SC->SCp.phase & aborting) {
1723 ADDMSGO(ABORT);
1724 } else if (CURRENT_SC->SCp.phase & resetting) {
1725 ADDMSGO(BUS_DEVICE_RESET);
1726 } else if (SYNCNEG==0 && SYNCHRONOUS) {
1727 CURRENT_SC->SCp.phase |= syncneg;
Matthew Wilcox6ea3c0b2006-02-07 07:54:46 -07001728 MSGOLEN += spi_populate_sync_msg(&MSGO(MSGOLEN), 50, 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001729 SYNCNEG=1; /* negotiation in progress */
1730 }
1731
1732 SETRATE(SYNCRATE);
1733}
1734
1735/*
1736 * Selection timeout
1737 * - return command to mid-level with failure cause
1738 *
1739 */
1740static void selto_run(struct Scsi_Host *shpnt)
1741{
1742 SETPORT(SCSISEQ, 0);
1743 SETPORT(SSTAT1, CLRSELTIMO);
1744
1745 DPRINTK(debug_selection, DEBUG_LEAD "selection timeout\n", CMDINFO(CURRENT_SC));
1746
1747 if(!CURRENT_SC) {
1748 DPRINTK(debug_selection, DEBUG_LEAD "!CURRENT_SC\n", CMDINFO(CURRENT_SC));
1749 return;
1750 }
1751
1752 CURRENT_SC->SCp.phase &= ~selecting;
1753
1754 if (CURRENT_SC->SCp.phase & aborted) {
1755 DPRINTK(debug_selection, DEBUG_LEAD "aborted\n", CMDINFO(CURRENT_SC));
1756 done(shpnt, DID_ABORT << 16);
1757 } else if (TESTLO(SSTAT0, SELINGO)) {
1758 DPRINTK(debug_selection, DEBUG_LEAD "arbitration not won\n", CMDINFO(CURRENT_SC));
1759 done(shpnt, DID_BUS_BUSY << 16);
1760 } else {
1761 /* ARBITRATION won, but SELECTION failed */
1762 DPRINTK(debug_selection, DEBUG_LEAD "selection failed\n", CMDINFO(CURRENT_SC));
1763 done(shpnt, DID_NO_CONNECT << 16);
1764 }
1765}
1766
1767/*
1768 * Selection in done
1769 * - put current command back to issue queue
1770 * (reconnection of a disconnected nexus instead
1771 * of successful selection out)
1772 *
1773 */
1774static void seldi_run(struct Scsi_Host *shpnt)
1775{
1776 int selid;
1777 int target;
1778 unsigned long flags;
1779
1780 SETPORT(SCSISIG, 0);
1781 SETPORT(SSTAT0, CLRSELDI);
1782 SETPORT(SSTAT1, CLRBUSFREE);
1783 SETPORT(SSTAT1, CLRPHASECHG);
1784
1785 if(CURRENT_SC) {
1786 if(!(CURRENT_SC->SCp.phase & not_issued))
1787 printk(ERR_LEAD "command should not have been issued yet\n", CMDINFO(CURRENT_SC));
1788
1789 DPRINTK(debug_selection, ERR_LEAD "command requeued - reselection\n", CMDINFO(CURRENT_SC));
1790
1791 DO_LOCK(flags);
1792 append_SC(&ISSUE_SC, CURRENT_SC);
1793 DO_UNLOCK(flags);
1794
1795 CURRENT_SC = NULL;
1796 }
1797
1798 if(!DISCONNECTED_SC) {
1799 DPRINTK(debug_selection, DEBUG_LEAD "unexpected SELDI ", CMDINFO(CURRENT_SC));
1800 return;
1801 }
1802
1803 RECONN_TARGET=-1;
1804
1805 selid = GETPORT(SELID) & ~(1 << shpnt->this_id);
1806
1807 if (selid==0) {
1808 printk("aha152x%d: target id unknown (%02x)\n", HOSTNO, selid);
1809 return;
1810 }
1811
1812 for(target=7; !(selid & (1 << target)); target--)
1813 ;
1814
1815 if(selid & ~(1 << target)) {
1816 printk("aha152x%d: multiple targets reconnected (%02x)\n",
1817 HOSTNO, selid);
1818 }
1819
1820
1821 SETPORT(SCSIID, (shpnt->this_id << OID_) | target);
1822 SETPORT(SCSISEQ, 0);
1823
1824 SETRATE(HOSTDATA(shpnt)->syncrate[target]);
1825
1826 RECONN_TARGET=target;
1827 DPRINTK(debug_selection, DEBUG_LEAD "target %d reselected (%02x).\n", CMDINFO(CURRENT_SC), target, selid);
1828}
1829
1830/*
1831 * message in phase
1832 * - handle initial message after reconnection to identify
1833 * reconnecting nexus
1834 * - queue command on DISCONNECTED_SC on DISCONNECT message
1835 * - set completed flag on COMMAND COMPLETE
1836 * (other completition code moved to busfree_run)
1837 * - handle response to SDTR
1838 * - clear synchronous transfer agreements on BUS RESET
1839 *
1840 * FIXME: what about SAVE POINTERS, RESTORE POINTERS?
1841 *
1842 */
1843static void msgi_run(struct Scsi_Host *shpnt)
1844{
1845 for(;;) {
1846 int sstat1 = GETPORT(SSTAT1);
1847
1848 if(sstat1 & (PHASECHG|PHASEMIS|BUSFREE) || !(sstat1 & REQINIT))
1849 return;
1850
1851 if(TESTLO(SSTAT0,SPIORDY)) {
1852 DPRINTK(debug_msgi, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
1853 return;
1854 }
1855
1856 ADDMSGI(GETPORT(SCSIDAT));
1857
1858#if defined(AHA152X_DEBUG)
1859 if (HOSTDATA(shpnt)->debug & debug_msgi) {
1860 printk(INFO_LEAD "inbound message %02x ", CMDINFO(CURRENT_SC), MSGI(0));
Matthew Wilcox1abfd372005-12-15 16:22:01 -05001861 spi_print_msg(&MSGI(0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001862 printk("\n");
1863 }
1864#endif
1865
1866 if(!CURRENT_SC) {
1867 if(LASTSTATE!=seldi) {
1868 printk(KERN_ERR "aha152x%d: message in w/o current command not after reselection\n", HOSTNO);
1869 }
1870
1871 /*
1872 * Handle reselection
1873 */
1874 if(!(MSGI(0) & IDENTIFY_BASE)) {
1875 printk(KERN_ERR "aha152x%d: target didn't identify after reselection\n", HOSTNO);
1876 continue;
1877 }
1878
1879 CURRENT_SC = remove_lun_SC(&DISCONNECTED_SC, RECONN_TARGET, MSGI(0) & 0x3f);
1880
1881 if (!CURRENT_SC) {
1882 show_queues(shpnt);
1883 printk(KERN_ERR "aha152x%d: no disconnected command for target %d/%d\n", HOSTNO, RECONN_TARGET, MSGI(0) & 0x3f);
1884 continue;
1885 }
1886
1887 DPRINTK(debug_msgi, DEBUG_LEAD "target reconnected\n", CMDINFO(CURRENT_SC));
1888
1889 CURRENT_SC->SCp.Message = MSGI(0);
1890 CURRENT_SC->SCp.phase &= ~disconnected;
1891
1892 MSGILEN=0;
1893
1894 /* next message if any */
1895 continue;
1896 }
1897
1898 CURRENT_SC->SCp.Message = MSGI(0);
1899
1900 switch (MSGI(0)) {
1901 case DISCONNECT:
1902 if (!RECONNECT)
1903 printk(WARN_LEAD "target was not allowed to disconnect\n", CMDINFO(CURRENT_SC));
1904
1905 CURRENT_SC->SCp.phase |= disconnected;
1906 break;
1907
1908 case COMMAND_COMPLETE:
1909 if(CURRENT_SC->SCp.phase & completed)
1910 DPRINTK(debug_msgi, DEBUG_LEAD "again COMMAND COMPLETE\n", CMDINFO(CURRENT_SC));
1911
1912 CURRENT_SC->SCp.phase |= completed;
1913 break;
1914
1915 case MESSAGE_REJECT:
1916 if (SYNCNEG==1) {
1917 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
1918 SYNCNEG=2; /* negotiation completed */
1919 } else
1920 printk(INFO_LEAD "inbound message (MESSAGE REJECT)\n", CMDINFO(CURRENT_SC));
1921 break;
1922
1923 case SAVE_POINTERS:
1924 break;
1925
1926 case RESTORE_POINTERS:
1927 break;
1928
1929 case EXTENDED_MESSAGE:
1930 if(MSGILEN<2 || MSGILEN<MSGI(1)+2) {
1931 /* not yet completed */
1932 continue;
1933 }
1934
1935 switch (MSGI(2)) {
1936 case EXTENDED_SDTR:
1937 {
1938 long ticks;
1939
1940 if (MSGI(1) != 3) {
1941 printk(ERR_LEAD "SDTR message length!=3\n", CMDINFO(CURRENT_SC));
1942 break;
1943 }
1944
1945 if (!HOSTDATA(shpnt)->synchronous)
1946 break;
1947
1948 printk(INFO_LEAD, CMDINFO(CURRENT_SC));
Matthew Wilcox1abfd372005-12-15 16:22:01 -05001949 spi_print_msg(&MSGI(0));
Linus Torvalds1da177e2005-04-16 15:20:36 -07001950 printk("\n");
1951
1952 ticks = (MSGI(3) * 4 + 49) / 50;
1953
1954 if (syncneg) {
1955 /* negotiation in progress */
1956 if (ticks > 9 || MSGI(4) < 1 || MSGI(4) > 8) {
1957 ADDMSGO(MESSAGE_REJECT);
1958 printk(INFO_LEAD "received Synchronous Data Transfer Request invalid - rejected\n", CMDINFO(CURRENT_SC));
1959 break;
1960 }
1961
1962 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1963 } else if (ticks <= 9 && MSGI(4) >= 1) {
1964 ADDMSGO(EXTENDED_MESSAGE);
1965 ADDMSGO(3);
1966 ADDMSGO(EXTENDED_SDTR);
1967 if (ticks < 4) {
1968 ticks = 4;
1969 ADDMSGO(50);
1970 } else
1971 ADDMSGO(MSGI(3));
1972
1973 if (MSGI(4) > 8)
1974 MSGI(4) = 8;
1975
1976 ADDMSGO(MSGI(4));
1977
1978 SYNCRATE |= ((ticks - 2) << 4) + MSGI(4);
1979 } else {
1980 /* requested SDTR is too slow, do it asynchronously */
1981 printk(INFO_LEAD "Synchronous Data Transfer Request too slow - Rejecting\n", CMDINFO(CURRENT_SC));
1982 ADDMSGO(MESSAGE_REJECT);
1983 }
1984
1985 SYNCNEG=2; /* negotiation completed */
1986 SETRATE(SYNCRATE);
1987 }
1988 break;
1989
1990 case BUS_DEVICE_RESET:
1991 {
1992 int i;
1993
1994 for(i=0; i<8; i++) {
1995 HOSTDATA(shpnt)->syncrate[i]=0;
1996 HOSTDATA(shpnt)->syncneg[i]=0;
1997 }
1998
1999 }
2000 break;
2001
2002 case EXTENDED_MODIFY_DATA_POINTER:
2003 case EXTENDED_EXTENDED_IDENTIFY:
2004 case EXTENDED_WDTR:
2005 default:
2006 ADDMSGO(MESSAGE_REJECT);
2007 break;
2008 }
2009 break;
2010 }
2011
2012 MSGILEN=0;
2013 }
2014}
2015
2016static void msgi_end(struct Scsi_Host *shpnt)
2017{
2018 if(MSGILEN>0)
2019 printk(WARN_LEAD "target left before message completed (%d)\n", CMDINFO(CURRENT_SC), MSGILEN);
2020
2021 if (MSGOLEN > 0 && !(GETPORT(SSTAT1) & BUSFREE)) {
2022 DPRINTK(debug_msgi, DEBUG_LEAD "msgo pending\n", CMDINFO(CURRENT_SC));
2023 SETPORT(SCSISIG, P_MSGI | SIG_ATNO);
2024 }
2025}
2026
2027/*
2028 * message out phase
2029 *
2030 */
2031static void msgo_init(struct Scsi_Host *shpnt)
2032{
2033 if(MSGOLEN==0) {
2034 if((CURRENT_SC->SCp.phase & syncneg) && SYNCNEG==2 && SYNCRATE==0) {
2035 ADDMSGO(IDENTIFY(RECONNECT, CURRENT_SC->device->lun));
2036 } else {
2037 printk(INFO_LEAD "unexpected MESSAGE OUT phase; rejecting\n", CMDINFO(CURRENT_SC));
2038 ADDMSGO(MESSAGE_REJECT);
2039 }
2040 }
2041
2042#if defined(AHA152X_DEBUG)
2043 if(HOSTDATA(shpnt)->debug & debug_msgo) {
2044 int i;
2045
2046 printk(DEBUG_LEAD "messages( ", CMDINFO(CURRENT_SC));
Matthew Wilcox1abfd372005-12-15 16:22:01 -05002047 for (i=0; i<MSGOLEN; i+=spi_print_msg(&MSGO(i)), printk(" "))
Linus Torvalds1da177e2005-04-16 15:20:36 -07002048 ;
2049 printk(")\n");
2050 }
2051#endif
2052}
2053
2054/*
2055 * message out phase
2056 *
2057 */
2058static void msgo_run(struct Scsi_Host *shpnt)
2059{
2060 if(MSGO_I==MSGOLEN)
2061 DPRINTK(debug_msgo, DEBUG_LEAD "messages all sent (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2062
2063 while(MSGO_I<MSGOLEN) {
2064 DPRINTK(debug_msgo, DEBUG_LEAD "message byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO(MSGO_I), MSGO_I, MSGOLEN);
2065
2066 if(TESTLO(SSTAT0, SPIORDY)) {
2067 DPRINTK(debug_msgo, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2068 return;
2069 }
2070
2071 if (MSGO_I==MSGOLEN-1) {
2072 /* Leave MESSAGE OUT after transfer */
2073 SETPORT(SSTAT1, CLRATNO);
2074 }
2075
2076
2077 if (MSGO(MSGO_I) & IDENTIFY_BASE)
2078 CURRENT_SC->SCp.phase |= identified;
2079
2080 if (MSGO(MSGO_I)==ABORT)
2081 CURRENT_SC->SCp.phase |= aborted;
2082
2083 if (MSGO(MSGO_I)==BUS_DEVICE_RESET)
2084 CURRENT_SC->SCp.phase |= resetted;
2085
2086 SETPORT(SCSIDAT, MSGO(MSGO_I++));
2087 }
2088}
2089
2090static void msgo_end(struct Scsi_Host *shpnt)
2091{
2092 if(MSGO_I<MSGOLEN) {
2093 printk(ERR_LEAD "message sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), MSGO_I, MSGOLEN);
2094 if(SYNCNEG==1) {
2095 printk(INFO_LEAD "Synchronous Data Transfer Request was rejected\n", CMDINFO(CURRENT_SC));
2096 SYNCNEG=2;
2097 }
2098 }
2099
2100 MSGO_I = 0;
2101 MSGOLEN = 0;
2102}
2103
2104/*
2105 * command phase
2106 *
2107 */
2108static void cmd_init(struct Scsi_Host *shpnt)
2109{
2110 if (CURRENT_SC->SCp.sent_command) {
2111 printk(ERR_LEAD "command already sent\n", CMDINFO(CURRENT_SC));
2112 done(shpnt, DID_ERROR << 16);
2113 return;
2114 }
2115
2116#if defined(AHA152X_DEBUG)
2117 if (HOSTDATA(shpnt)->debug & debug_cmd) {
2118 printk(DEBUG_LEAD "cmd_init: ", CMDINFO(CURRENT_SC));
db9dff32005-04-03 14:53:59 -05002119 __scsi_print_command(CURRENT_SC->cmnd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002120 }
2121#endif
2122
2123 CMD_I=0;
2124}
2125
2126/*
2127 * command phase
2128 *
2129 */
2130static void cmd_run(struct Scsi_Host *shpnt)
2131{
2132 if(CMD_I==CURRENT_SC->cmd_len) {
2133 DPRINTK(debug_cmd, DEBUG_LEAD "command already completely sent (%d/%d)", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2134 disp_ports(shpnt);
2135 }
2136
2137 while(CMD_I<CURRENT_SC->cmd_len) {
2138 DPRINTK(debug_cmd, DEBUG_LEAD "command byte %02x (%d/%d)\n", CMDINFO(CURRENT_SC), CURRENT_SC->cmnd[CMD_I], CMD_I, CURRENT_SC->cmd_len);
2139
2140 if(TESTLO(SSTAT0, SPIORDY)) {
2141 DPRINTK(debug_cmd, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2142 return;
2143 }
2144
2145 SETPORT(SCSIDAT, CURRENT_SC->cmnd[CMD_I++]);
2146 }
2147}
2148
2149static void cmd_end(struct Scsi_Host *shpnt)
2150{
2151 if(CMD_I<CURRENT_SC->cmd_len)
2152 printk(ERR_LEAD "command sent incompletely (%d/%d)\n", CMDINFO(CURRENT_SC), CMD_I, CURRENT_SC->cmd_len);
2153 else
2154 CURRENT_SC->SCp.sent_command++;
2155}
2156
2157/*
2158 * status phase
2159 *
2160 */
2161static void status_run(struct Scsi_Host *shpnt)
2162{
2163 if(TESTLO(SSTAT0,SPIORDY)) {
2164 DPRINTK(debug_status, DEBUG_LEAD "!SPIORDY\n", CMDINFO(CURRENT_SC));
2165 return;
2166 }
2167
2168 CURRENT_SC->SCp.Status = GETPORT(SCSIDAT);
2169
2170#if defined(AHA152X_DEBUG)
2171 if (HOSTDATA(shpnt)->debug & debug_status) {
2172 printk(DEBUG_LEAD "inbound status %02x ", CMDINFO(CURRENT_SC), CURRENT_SC->SCp.Status);
db9dff32005-04-03 14:53:59 -05002173 scsi_print_status(CURRENT_SC->SCp.Status);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002174 printk("\n");
2175 }
2176#endif
2177}
2178
2179/*
2180 * data in phase
2181 *
2182 */
2183static void datai_init(struct Scsi_Host *shpnt)
2184{
2185 SETPORT(DMACNTRL0, RSTFIFO);
2186 SETPORT(DMACNTRL0, RSTFIFO|ENDMA);
2187
2188 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2189 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2190
2191 SETPORT(SIMODE0, 0);
2192 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE);
2193
2194 DATA_LEN=0;
2195 DPRINTK(debug_datai,
2196 DEBUG_LEAD "datai_init: request_bufflen=%d resid=%d\n",
2197 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2198}
2199
2200static void datai_run(struct Scsi_Host *shpnt)
2201{
2202 unsigned long the_time;
2203 int fifodata, data_count;
2204
2205 /*
2206 * loop while the phase persists or the fifos are not empty
2207 *
2208 */
2209 while(TESTLO(DMASTAT, INTSTAT) || TESTLO(DMASTAT, DFIFOEMP) || TESTLO(SSTAT2, SEMPTY)) {
2210 /* FIXME: maybe this should be done by setting up
2211 * STCNT to trigger ENSWRAP interrupt, instead of
2212 * polling for DFIFOFULL
2213 */
2214 the_time=jiffies + 100*HZ;
2215 while(TESTLO(DMASTAT, DFIFOFULL|INTSTAT) && time_before(jiffies,the_time))
2216 barrier();
2217
2218 if(TESTLO(DMASTAT, DFIFOFULL|INTSTAT)) {
2219 printk(ERR_LEAD "datai timeout", CMDINFO(CURRENT_SC));
2220 disp_ports(shpnt);
2221 break;
2222 }
2223
2224 if(TESTHI(DMASTAT, DFIFOFULL)) {
2225 fifodata = 128;
2226 } else {
2227 the_time=jiffies + 100*HZ;
2228 while(TESTLO(SSTAT2, SEMPTY) && time_before(jiffies,the_time))
2229 barrier();
2230
2231 if(TESTLO(SSTAT2, SEMPTY)) {
2232 printk(ERR_LEAD "datai sempty timeout", CMDINFO(CURRENT_SC));
2233 disp_ports(shpnt);
2234 break;
2235 }
2236
2237 fifodata = GETPORT(FIFOSTAT);
2238 }
2239
2240 if(CURRENT_SC->SCp.this_residual>0) {
2241 while(fifodata>0 && CURRENT_SC->SCp.this_residual>0) {
2242 data_count = fifodata>CURRENT_SC->SCp.this_residual ?
2243 CURRENT_SC->SCp.this_residual :
2244 fifodata;
2245 fifodata -= data_count;
2246
2247 if(data_count & 1) {
2248 DPRINTK(debug_datai, DEBUG_LEAD "8bit\n", CMDINFO(CURRENT_SC));
2249 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2250 *CURRENT_SC->SCp.ptr++ = GETPORT(DATAPORT);
2251 CURRENT_SC->SCp.this_residual--;
2252 DATA_LEN++;
2253 SETPORT(DMACNTRL0, ENDMA);
2254 }
2255
2256 if(data_count > 1) {
2257 DPRINTK(debug_datai, DEBUG_LEAD "16bit(%d)\n", CMDINFO(CURRENT_SC), data_count);
2258 data_count >>= 1;
2259 insw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2260 CURRENT_SC->SCp.ptr += 2 * data_count;
2261 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2262 DATA_LEN += 2 * data_count;
2263 }
2264
2265 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2266 /* advance to next buffer */
2267 CURRENT_SC->SCp.buffers_residual--;
2268 CURRENT_SC->SCp.buffer++;
2269 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2270 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2271 }
2272 }
2273 } else if(fifodata>0) {
2274 printk(ERR_LEAD "no buffers left for %d(%d) bytes (data overrun!?)\n", CMDINFO(CURRENT_SC), fifodata, GETPORT(FIFOSTAT));
2275 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2276 while(fifodata>0) {
2277 int data;
2278 data=GETPORT(DATAPORT);
2279 DPRINTK(debug_datai, DEBUG_LEAD "data=%02x\n", CMDINFO(CURRENT_SC), data);
2280 fifodata--;
2281 DATA_LEN++;
2282 }
2283 SETPORT(DMACNTRL0, ENDMA|_8BIT);
2284 }
2285 }
2286
2287 if(TESTLO(DMASTAT, INTSTAT) ||
2288 TESTLO(DMASTAT, DFIFOEMP) ||
2289 TESTLO(SSTAT2, SEMPTY) ||
2290 GETPORT(FIFOSTAT)>0) {
2291 /*
2292 * something went wrong, if there's something left in the fifos
2293 * or the phase didn't change
2294 */
2295 printk(ERR_LEAD "fifos should be empty and phase should have changed\n", CMDINFO(CURRENT_SC));
2296 disp_ports(shpnt);
2297 }
2298
2299 if(DATA_LEN!=GETSTCNT()) {
2300 printk(ERR_LEAD
2301 "manual transfer count differs from automatic (count=%d;stcnt=%d;diff=%d;fifostat=%d)",
2302 CMDINFO(CURRENT_SC), DATA_LEN, GETSTCNT(), GETSTCNT()-DATA_LEN, GETPORT(FIFOSTAT));
2303 disp_ports(shpnt);
2304 mdelay(10000);
2305 }
2306}
2307
2308static void datai_end(struct Scsi_Host *shpnt)
2309{
2310 CURRENT_SC->resid -= GETSTCNT();
2311
2312 DPRINTK(debug_datai,
2313 DEBUG_LEAD "datai_end: request_bufflen=%d resid=%d stcnt=%d\n",
2314 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid, GETSTCNT());
2315
2316 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2317 SETPORT(DMACNTRL0, 0);
2318}
2319
2320/*
2321 * data out phase
2322 *
2323 */
2324static void datao_init(struct Scsi_Host *shpnt)
2325{
2326 SETPORT(DMACNTRL0, WRITE_READ | RSTFIFO);
2327 SETPORT(DMACNTRL0, WRITE_READ | ENDMA);
2328
2329 SETPORT(SXFRCTL0, CH1|CLRSTCNT);
2330 SETPORT(SXFRCTL0, CH1|SCSIEN|DMAEN);
2331
2332 SETPORT(SIMODE0, 0);
2333 SETPORT(SIMODE1, ENSCSIPERR | ENSCSIRST | ENPHASEMIS | ENBUSFREE );
2334
2335 DATA_LEN = CURRENT_SC->resid;
2336
2337 DPRINTK(debug_datao,
2338 DEBUG_LEAD "datao_init: request_bufflen=%d; resid=%d\n",
2339 CMDINFO(CURRENT_SC), CURRENT_SC->request_bufflen, CURRENT_SC->resid);
2340}
2341
2342static void datao_run(struct Scsi_Host *shpnt)
2343{
2344 unsigned long the_time;
2345 int data_count;
2346
2347 /* until phase changes or all data sent */
2348 while(TESTLO(DMASTAT, INTSTAT) && CURRENT_SC->SCp.this_residual>0) {
2349 data_count = 128;
2350 if(data_count > CURRENT_SC->SCp.this_residual)
2351 data_count=CURRENT_SC->SCp.this_residual;
2352
2353 if(TESTLO(DMASTAT, DFIFOEMP)) {
2354 printk(ERR_LEAD "datao fifo not empty (%d)", CMDINFO(CURRENT_SC), GETPORT(FIFOSTAT));
2355 disp_ports(shpnt);
2356 break;
2357 }
2358
2359 if(data_count & 1) {
2360 SETPORT(DMACNTRL0,WRITE_READ|ENDMA|_8BIT);
2361 SETPORT(DATAPORT, *CURRENT_SC->SCp.ptr++);
2362 CURRENT_SC->SCp.this_residual--;
2363 CURRENT_SC->resid--;
2364 SETPORT(DMACNTRL0,WRITE_READ|ENDMA);
2365 }
2366
2367 if(data_count > 1) {
2368 data_count >>= 1;
2369 outsw(DATAPORT, CURRENT_SC->SCp.ptr, data_count);
2370 CURRENT_SC->SCp.ptr += 2 * data_count;
2371 CURRENT_SC->SCp.this_residual -= 2 * data_count;
2372 CURRENT_SC->resid -= 2 * data_count;
2373 }
2374
2375 if(CURRENT_SC->SCp.this_residual==0 && CURRENT_SC->SCp.buffers_residual>0) {
2376 /* advance to next buffer */
2377 CURRENT_SC->SCp.buffers_residual--;
2378 CURRENT_SC->SCp.buffer++;
2379 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer);
2380 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length;
2381 }
2382
2383 the_time=jiffies + 100*HZ;
2384 while(TESTLO(DMASTAT, DFIFOEMP|INTSTAT) && time_before(jiffies,the_time))
2385 barrier();
2386
2387 if(TESTLO(DMASTAT, DFIFOEMP|INTSTAT)) {
2388 printk(ERR_LEAD "dataout timeout", CMDINFO(CURRENT_SC));
2389 disp_ports(shpnt);
2390 break;
2391 }
2392 }
2393}
2394
2395static void datao_end(struct Scsi_Host *shpnt)
2396{
2397 if(TESTLO(DMASTAT, DFIFOEMP)) {
2398 int data_count = (DATA_LEN - CURRENT_SC->resid) - GETSTCNT();
2399
2400 DPRINTK(debug_datao, DEBUG_LEAD "datao: %d bytes to resend (%d written, %d transferred)\n",
2401 CMDINFO(CURRENT_SC),
2402 data_count,
2403 DATA_LEN-CURRENT_SC->resid,
2404 GETSTCNT());
2405
2406 CURRENT_SC->resid += data_count;
2407
2408 if(CURRENT_SC->use_sg) {
2409 data_count -= CURRENT_SC->SCp.ptr - SG_ADDRESS(CURRENT_SC->SCp.buffer);
2410 while(data_count>0) {
2411 CURRENT_SC->SCp.buffer--;
2412 CURRENT_SC->SCp.buffers_residual++;
2413 data_count -= CURRENT_SC->SCp.buffer->length;
2414 }
2415 CURRENT_SC->SCp.ptr = SG_ADDRESS(CURRENT_SC->SCp.buffer) - data_count;
2416 CURRENT_SC->SCp.this_residual = CURRENT_SC->SCp.buffer->length + data_count;
2417 } else {
2418 CURRENT_SC->SCp.ptr -= data_count;
2419 CURRENT_SC->SCp.this_residual += data_count;
2420 }
2421 }
2422
2423 DPRINTK(debug_datao, DEBUG_LEAD "datao_end: request_bufflen=%d; resid=%d; stcnt=%d\n",
2424 CMDINFO(CURRENT_SC),
2425 CURRENT_SC->request_bufflen,
2426 CURRENT_SC->resid,
2427 GETSTCNT());
2428
2429 SETPORT(SXFRCTL0, CH1|CLRCH1|CLRSTCNT);
2430 SETPORT(SXFRCTL0, CH1);
2431
2432 SETPORT(DMACNTRL0, 0);
2433}
2434
2435/*
2436 * figure out what state we're in
2437 *
2438 */
2439static int update_state(struct Scsi_Host *shpnt)
2440{
2441 int dataphase=0;
2442 unsigned int stat0 = GETPORT(SSTAT0);
2443 unsigned int stat1 = GETPORT(SSTAT1);
2444
2445 PREVSTATE = STATE;
2446 STATE=unknown;
2447
2448 if(stat1 & SCSIRSTI) {
2449 STATE=rsti;
2450 SETPORT(SCSISEQ,0);
2451 SETPORT(SSTAT1,SCSIRSTI);
2452 } else if(stat0 & SELDI && PREVSTATE==busfree) {
2453 STATE=seldi;
2454 } else if(stat0 & SELDO && CURRENT_SC && (CURRENT_SC->SCp.phase & selecting)) {
2455 STATE=seldo;
2456 } else if(stat1 & SELTO) {
2457 STATE=selto;
2458 } else if(stat1 & BUSFREE) {
2459 STATE=busfree;
2460 SETPORT(SSTAT1,BUSFREE);
2461 } else if(stat1 & SCSIPERR) {
2462 STATE=parerr;
2463 SETPORT(SSTAT1,SCSIPERR);
2464 } else if(stat1 & REQINIT) {
2465 switch(GETPORT(SCSISIG) & P_MASK) {
2466 case P_MSGI: STATE=msgi; break;
2467 case P_MSGO: STATE=msgo; break;
2468 case P_DATAO: STATE=datao; break;
2469 case P_DATAI: STATE=datai; break;
2470 case P_STATUS: STATE=status; break;
2471 case P_CMD: STATE=cmd; break;
2472 }
2473 dataphase=1;
2474 }
2475
2476 if((stat0 & SELDI) && STATE!=seldi && !dataphase) {
2477 printk(INFO_LEAD "reselection missed?", CMDINFO(CURRENT_SC));
2478 disp_ports(shpnt);
2479 }
2480
2481 if(STATE!=PREVSTATE) {
2482 LASTSTATE=PREVSTATE;
2483 }
2484
2485 return dataphase;
2486}
2487
2488/*
2489 * handle parity error
2490 *
2491 * FIXME: in which phase?
2492 *
2493 */
2494static void parerr_run(struct Scsi_Host *shpnt)
2495{
2496 printk(ERR_LEAD "parity error\n", CMDINFO(CURRENT_SC));
2497 done(shpnt, DID_PARITY << 16);
2498}
2499
2500/*
2501 * handle reset in
2502 *
2503 */
2504static void rsti_run(struct Scsi_Host *shpnt)
2505{
2506 Scsi_Cmnd *ptr;
2507
2508 printk(KERN_NOTICE "aha152x%d: scsi reset in\n", HOSTNO);
2509
2510 ptr=DISCONNECTED_SC;
2511 while(ptr) {
2512 Scsi_Cmnd *next = SCNEXT(ptr);
2513
2514 if (!ptr->device->soft_reset) {
2515 remove_SC(&DISCONNECTED_SC, ptr);
2516
2517 kfree(ptr->host_scribble);
2518 ptr->host_scribble=NULL;
2519
2520 ptr->result = DID_RESET << 16;
2521 ptr->scsi_done(ptr);
2522 }
2523
2524 ptr = next;
2525 }
2526
2527 if(CURRENT_SC && !CURRENT_SC->device->soft_reset)
2528 done(shpnt, DID_RESET << 16 );
2529}
2530
2531
2532/*
2533 * bottom-half handler
2534 *
2535 */
2536static void is_complete(struct Scsi_Host *shpnt)
2537{
2538 int dataphase;
2539 unsigned long flags;
2540 int pending;
2541
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01002542 if(!shpnt)
2543 return;
2544
Linus Torvalds1da177e2005-04-16 15:20:36 -07002545 DO_LOCK(flags);
Jürgen E. Fischere2482fa2006-02-19 00:31:51 +01002546
2547 if( HOSTDATA(shpnt)->service==0 ) {
2548 DO_UNLOCK(flags);
2549 return;
2550 }
2551
2552 HOSTDATA(shpnt)->service = 0;
2553
Linus Torvalds1da177e2005-04-16 15:20:36 -07002554 if(HOSTDATA(shpnt)->in_intr) {
2555 DO_UNLOCK(flags);
2556 /* aha152x_error never returns.. */
2557 aha152x_error(shpnt, "bottom-half already running!?");
2558 }
2559 HOSTDATA(shpnt)->in_intr++;
2560
2561 /*
2562 * loop while there are interrupt conditions pending
2563 *
2564 */
2565 do {
2566 unsigned long start = jiffies;
2567 DO_UNLOCK(flags);
2568
2569 dataphase=update_state(shpnt);
2570
2571 DPRINTK(debug_phases, LEAD "start %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2572
2573 /*
2574 * end previous state
2575 *
2576 */
2577 if(PREVSTATE!=STATE && states[PREVSTATE].end)
2578 states[PREVSTATE].end(shpnt);
2579
2580 /*
2581 * disable SPIO mode if previous phase used it
2582 * and this one doesn't
2583 *
2584 */
2585 if(states[PREVSTATE].spio && !states[STATE].spio) {
2586 SETPORT(SXFRCTL0, CH1);
2587 SETPORT(DMACNTRL0, 0);
2588 if(CURRENT_SC)
2589 CURRENT_SC->SCp.phase &= ~spiordy;
2590 }
2591
2592 /*
2593 * accept current dataphase phase
2594 *
2595 */
2596 if(dataphase) {
2597 SETPORT(SSTAT0, REQINIT);
2598 SETPORT(SCSISIG, GETPORT(SCSISIG) & P_MASK);
2599 SETPORT(SSTAT1, PHASECHG);
2600 }
2601
2602 /*
2603 * enable SPIO mode if previous didn't use it
2604 * and this one does
2605 *
2606 */
2607 if(!states[PREVSTATE].spio && states[STATE].spio) {
2608 SETPORT(DMACNTRL0, 0);
2609 SETPORT(SXFRCTL0, CH1|SPIOEN);
2610 if(CURRENT_SC)
2611 CURRENT_SC->SCp.phase |= spiordy;
2612 }
2613
2614 /*
2615 * initialize for new state
2616 *
2617 */
2618 if(PREVSTATE!=STATE && states[STATE].init)
2619 states[STATE].init(shpnt);
2620
2621 /*
2622 * handle current state
2623 *
2624 */
2625 if(states[STATE].run)
2626 states[STATE].run(shpnt);
2627 else
2628 printk(ERR_LEAD "unexpected state (%x)\n", CMDINFO(CURRENT_SC), STATE);
2629
2630 /*
2631 * setup controller to interrupt on
2632 * the next expected condition and
2633 * loop if it's already there
2634 *
2635 */
2636 DO_LOCK(flags);
2637 pending=setup_expected_interrupts(shpnt);
2638#if defined(AHA152X_STAT)
2639 HOSTDATA(shpnt)->count[STATE]++;
2640 if(PREVSTATE!=STATE)
2641 HOSTDATA(shpnt)->count_trans[STATE]++;
2642 HOSTDATA(shpnt)->time[STATE] += jiffies-start;
2643#endif
2644
2645 DPRINTK(debug_phases, LEAD "end %s %s(%s)\n", CMDINFO(CURRENT_SC), states[STATE].name, states[PREVSTATE].name, states[LASTSTATE].name);
2646 } while(pending);
2647
2648 /*
2649 * enable interrupts and leave bottom-half
2650 *
2651 */
2652 HOSTDATA(shpnt)->in_intr--;
2653 SETBITS(DMACNTRL0, INTEN);
2654 DO_UNLOCK(flags);
2655}
2656
2657
2658/*
2659 * Dump the current driver status and panic
2660 */
2661static void aha152x_error(struct Scsi_Host *shpnt, char *msg)
2662{
2663 printk(KERN_EMERG "\naha152x%d: %s\n", HOSTNO, msg);
2664 show_queues(shpnt);
2665 panic("aha152x panic\n");
2666}
2667
2668/*
2669 * Display registers of AIC-6260
2670 */
2671static void disp_ports(struct Scsi_Host *shpnt)
2672{
2673#if defined(AHA152X_DEBUG)
2674 int s;
2675
2676 printk("\n%s: %s(%s) ",
2677 CURRENT_SC ? "busy" : "waiting",
2678 states[STATE].name,
2679 states[PREVSTATE].name);
2680
2681 s = GETPORT(SCSISEQ);
2682 printk("SCSISEQ( ");
2683 if (s & TEMODEO)
2684 printk("TARGET MODE ");
2685 if (s & ENSELO)
2686 printk("SELO ");
2687 if (s & ENSELI)
2688 printk("SELI ");
2689 if (s & ENRESELI)
2690 printk("RESELI ");
2691 if (s & ENAUTOATNO)
2692 printk("AUTOATNO ");
2693 if (s & ENAUTOATNI)
2694 printk("AUTOATNI ");
2695 if (s & ENAUTOATNP)
2696 printk("AUTOATNP ");
2697 if (s & SCSIRSTO)
2698 printk("SCSIRSTO ");
2699 printk(");");
2700
2701 printk(" SCSISIG(");
2702 s = GETPORT(SCSISIG);
2703 switch (s & P_MASK) {
2704 case P_DATAO:
2705 printk("DATA OUT");
2706 break;
2707 case P_DATAI:
2708 printk("DATA IN");
2709 break;
2710 case P_CMD:
2711 printk("COMMAND");
2712 break;
2713 case P_STATUS:
2714 printk("STATUS");
2715 break;
2716 case P_MSGO:
2717 printk("MESSAGE OUT");
2718 break;
2719 case P_MSGI:
2720 printk("MESSAGE IN");
2721 break;
2722 default:
2723 printk("*invalid*");
2724 break;
2725 }
2726
2727 printk("); ");
2728
2729 printk("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
2730
2731 printk("SSTAT( ");
2732 s = GETPORT(SSTAT0);
2733 if (s & TARGET)
2734 printk("TARGET ");
2735 if (s & SELDO)
2736 printk("SELDO ");
2737 if (s & SELDI)
2738 printk("SELDI ");
2739 if (s & SELINGO)
2740 printk("SELINGO ");
2741 if (s & SWRAP)
2742 printk("SWRAP ");
2743 if (s & SDONE)
2744 printk("SDONE ");
2745 if (s & SPIORDY)
2746 printk("SPIORDY ");
2747 if (s & DMADONE)
2748 printk("DMADONE ");
2749
2750 s = GETPORT(SSTAT1);
2751 if (s & SELTO)
2752 printk("SELTO ");
2753 if (s & ATNTARG)
2754 printk("ATNTARG ");
2755 if (s & SCSIRSTI)
2756 printk("SCSIRSTI ");
2757 if (s & PHASEMIS)
2758 printk("PHASEMIS ");
2759 if (s & BUSFREE)
2760 printk("BUSFREE ");
2761 if (s & SCSIPERR)
2762 printk("SCSIPERR ");
2763 if (s & PHASECHG)
2764 printk("PHASECHG ");
2765 if (s & REQINIT)
2766 printk("REQINIT ");
2767 printk("); ");
2768
2769
2770 printk("SSTAT( ");
2771
2772 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
2773
2774 if (s & TARGET)
2775 printk("TARGET ");
2776 if (s & SELDO)
2777 printk("SELDO ");
2778 if (s & SELDI)
2779 printk("SELDI ");
2780 if (s & SELINGO)
2781 printk("SELINGO ");
2782 if (s & SWRAP)
2783 printk("SWRAP ");
2784 if (s & SDONE)
2785 printk("SDONE ");
2786 if (s & SPIORDY)
2787 printk("SPIORDY ");
2788 if (s & DMADONE)
2789 printk("DMADONE ");
2790
2791 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
2792
2793 if (s & SELTO)
2794 printk("SELTO ");
2795 if (s & ATNTARG)
2796 printk("ATNTARG ");
2797 if (s & SCSIRSTI)
2798 printk("SCSIRSTI ");
2799 if (s & PHASEMIS)
2800 printk("PHASEMIS ");
2801 if (s & BUSFREE)
2802 printk("BUSFREE ");
2803 if (s & SCSIPERR)
2804 printk("SCSIPERR ");
2805 if (s & PHASECHG)
2806 printk("PHASECHG ");
2807 if (s & REQINIT)
2808 printk("REQINIT ");
2809 printk("); ");
2810
2811 printk("SXFRCTL0( ");
2812
2813 s = GETPORT(SXFRCTL0);
2814 if (s & SCSIEN)
2815 printk("SCSIEN ");
2816 if (s & DMAEN)
2817 printk("DMAEN ");
2818 if (s & CH1)
2819 printk("CH1 ");
2820 if (s & CLRSTCNT)
2821 printk("CLRSTCNT ");
2822 if (s & SPIOEN)
2823 printk("SPIOEN ");
2824 if (s & CLRCH1)
2825 printk("CLRCH1 ");
2826 printk("); ");
2827
2828 printk("SIGNAL( ");
2829
2830 s = GETPORT(SCSISIG);
2831 if (s & SIG_ATNI)
2832 printk("ATNI ");
2833 if (s & SIG_SELI)
2834 printk("SELI ");
2835 if (s & SIG_BSYI)
2836 printk("BSYI ");
2837 if (s & SIG_REQI)
2838 printk("REQI ");
2839 if (s & SIG_ACKI)
2840 printk("ACKI ");
2841 printk("); ");
2842
2843 printk("SELID (%02x), ", GETPORT(SELID));
2844
2845 printk("STCNT (%d), ", GETSTCNT());
2846
2847 printk("SSTAT2( ");
2848
2849 s = GETPORT(SSTAT2);
2850 if (s & SOFFSET)
2851 printk("SOFFSET ");
2852 if (s & SEMPTY)
2853 printk("SEMPTY ");
2854 if (s & SFULL)
2855 printk("SFULL ");
2856 printk("); SFCNT (%d); ", s & (SFULL | SFCNT));
2857
2858 s = GETPORT(SSTAT3);
2859 printk("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
2860
2861 printk("SSTAT4( ");
2862 s = GETPORT(SSTAT4);
2863 if (s & SYNCERR)
2864 printk("SYNCERR ");
2865 if (s & FWERR)
2866 printk("FWERR ");
2867 if (s & FRERR)
2868 printk("FRERR ");
2869 printk("); ");
2870
2871 printk("DMACNTRL0( ");
2872 s = GETPORT(DMACNTRL0);
2873 printk("%s ", s & _8BIT ? "8BIT" : "16BIT");
2874 printk("%s ", s & DMA ? "DMA" : "PIO");
2875 printk("%s ", s & WRITE_READ ? "WRITE" : "READ");
2876 if (s & ENDMA)
2877 printk("ENDMA ");
2878 if (s & INTEN)
2879 printk("INTEN ");
2880 if (s & RSTFIFO)
2881 printk("RSTFIFO ");
2882 if (s & SWINT)
2883 printk("SWINT ");
2884 printk("); ");
2885
2886 printk("DMASTAT( ");
2887 s = GETPORT(DMASTAT);
2888 if (s & ATDONE)
2889 printk("ATDONE ");
2890 if (s & WORDRDY)
2891 printk("WORDRDY ");
2892 if (s & DFIFOFULL)
2893 printk("DFIFOFULL ");
2894 if (s & DFIFOEMP)
2895 printk("DFIFOEMP ");
2896 printk(")\n");
2897#endif
2898}
2899
2900/*
2901 * display enabled interrupts
2902 */
2903static void disp_enintr(struct Scsi_Host *shpnt)
2904{
2905 int s;
2906
2907 printk(KERN_DEBUG "enabled interrupts ( ");
2908
2909 s = GETPORT(SIMODE0);
2910 if (s & ENSELDO)
2911 printk("ENSELDO ");
2912 if (s & ENSELDI)
2913 printk("ENSELDI ");
2914 if (s & ENSELINGO)
2915 printk("ENSELINGO ");
2916 if (s & ENSWRAP)
2917 printk("ENSWRAP ");
2918 if (s & ENSDONE)
2919 printk("ENSDONE ");
2920 if (s & ENSPIORDY)
2921 printk("ENSPIORDY ");
2922 if (s & ENDMADONE)
2923 printk("ENDMADONE ");
2924
2925 s = GETPORT(SIMODE1);
2926 if (s & ENSELTIMO)
2927 printk("ENSELTIMO ");
2928 if (s & ENATNTARG)
2929 printk("ENATNTARG ");
2930 if (s & ENPHASEMIS)
2931 printk("ENPHASEMIS ");
2932 if (s & ENBUSFREE)
2933 printk("ENBUSFREE ");
2934 if (s & ENSCSIPERR)
2935 printk("ENSCSIPERR ");
2936 if (s & ENPHASECHG)
2937 printk("ENPHASECHG ");
2938 if (s & ENREQINIT)
2939 printk("ENREQINIT ");
2940 printk(")\n");
2941}
2942
2943/*
2944 * Show the command data of a command
2945 */
2946static void show_command(Scsi_Cmnd *ptr)
2947{
Jeff Garzik017560f2005-10-24 18:04:36 -04002948 scmd_printk(KERN_DEBUG, ptr, "%p: cmnd=(", ptr);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002949
db9dff32005-04-03 14:53:59 -05002950 __scsi_print_command(ptr->cmnd);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002951
2952 printk(KERN_DEBUG "); request_bufflen=%d; resid=%d; phase |",
2953 ptr->request_bufflen, ptr->resid);
2954
2955 if (ptr->SCp.phase & not_issued)
2956 printk("not issued|");
2957 if (ptr->SCp.phase & selecting)
2958 printk("selecting|");
2959 if (ptr->SCp.phase & identified)
2960 printk("identified|");
2961 if (ptr->SCp.phase & disconnected)
2962 printk("disconnected|");
2963 if (ptr->SCp.phase & completed)
2964 printk("completed|");
2965 if (ptr->SCp.phase & spiordy)
2966 printk("spiordy|");
2967 if (ptr->SCp.phase & syncneg)
2968 printk("syncneg|");
2969 if (ptr->SCp.phase & aborted)
2970 printk("aborted|");
2971 if (ptr->SCp.phase & resetted)
2972 printk("resetted|");
2973 if( SCDATA(ptr) ) {
2974 printk("; next=0x%p\n", SCNEXT(ptr));
2975 } else {
2976 printk("; next=(host scribble NULL)\n");
2977 }
2978}
2979
2980/*
2981 * Dump the queued data
2982 */
2983static void show_queues(struct Scsi_Host *shpnt)
2984{
2985 Scsi_Cmnd *ptr;
2986 unsigned long flags;
2987
2988 DO_LOCK(flags);
2989 printk(KERN_DEBUG "\nqueue status:\nissue_SC:\n");
2990 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
2991 show_command(ptr);
2992 DO_UNLOCK(flags);
2993
2994 printk(KERN_DEBUG "current_SC:\n");
2995 if (CURRENT_SC)
2996 show_command(CURRENT_SC);
2997 else
2998 printk(KERN_DEBUG "none\n");
2999
3000 printk(KERN_DEBUG "disconnected_SC:\n");
3001 for (ptr = DISCONNECTED_SC; ptr; ptr = SCDATA(ptr) ? SCNEXT(ptr) : NULL)
3002 show_command(ptr);
3003
3004 disp_ports(shpnt);
3005 disp_enintr(shpnt);
3006}
3007
3008#undef SPRINTF
3009#define SPRINTF(args...) pos += sprintf(pos, ## args)
3010
3011static int get_command(char *pos, Scsi_Cmnd * ptr)
3012{
3013 char *start = pos;
3014 int i;
3015
3016 SPRINTF("0x%08x: target=%d; lun=%d; cmnd=( ",
3017 (unsigned int) ptr, ptr->device->id, ptr->device->lun);
3018
3019 for (i = 0; i < COMMAND_SIZE(ptr->cmnd[0]); i++)
3020 SPRINTF("0x%02x ", ptr->cmnd[i]);
3021
3022 SPRINTF("); resid=%d; residual=%d; buffers=%d; phase |",
3023 ptr->resid, ptr->SCp.this_residual, ptr->SCp.buffers_residual);
3024
3025 if (ptr->SCp.phase & not_issued)
3026 SPRINTF("not issued|");
3027 if (ptr->SCp.phase & selecting)
3028 SPRINTF("selecting|");
3029 if (ptr->SCp.phase & disconnected)
3030 SPRINTF("disconnected|");
3031 if (ptr->SCp.phase & aborted)
3032 SPRINTF("aborted|");
3033 if (ptr->SCp.phase & identified)
3034 SPRINTF("identified|");
3035 if (ptr->SCp.phase & completed)
3036 SPRINTF("completed|");
3037 if (ptr->SCp.phase & spiordy)
3038 SPRINTF("spiordy|");
3039 if (ptr->SCp.phase & syncneg)
3040 SPRINTF("syncneg|");
3041 SPRINTF("; next=0x%p\n", SCNEXT(ptr));
3042
3043 return (pos - start);
3044}
3045
3046static int get_ports(struct Scsi_Host *shpnt, char *pos)
3047{
3048 char *start = pos;
3049 int s;
3050
3051 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name);
3052
3053 s = GETPORT(SCSISEQ);
3054 SPRINTF("SCSISEQ( ");
3055 if (s & TEMODEO)
3056 SPRINTF("TARGET MODE ");
3057 if (s & ENSELO)
3058 SPRINTF("SELO ");
3059 if (s & ENSELI)
3060 SPRINTF("SELI ");
3061 if (s & ENRESELI)
3062 SPRINTF("RESELI ");
3063 if (s & ENAUTOATNO)
3064 SPRINTF("AUTOATNO ");
3065 if (s & ENAUTOATNI)
3066 SPRINTF("AUTOATNI ");
3067 if (s & ENAUTOATNP)
3068 SPRINTF("AUTOATNP ");
3069 if (s & SCSIRSTO)
3070 SPRINTF("SCSIRSTO ");
3071 SPRINTF(");");
3072
3073 SPRINTF(" SCSISIG(");
3074 s = GETPORT(SCSISIG);
3075 switch (s & P_MASK) {
3076 case P_DATAO:
3077 SPRINTF("DATA OUT");
3078 break;
3079 case P_DATAI:
3080 SPRINTF("DATA IN");
3081 break;
3082 case P_CMD:
3083 SPRINTF("COMMAND");
3084 break;
3085 case P_STATUS:
3086 SPRINTF("STATUS");
3087 break;
3088 case P_MSGO:
3089 SPRINTF("MESSAGE OUT");
3090 break;
3091 case P_MSGI:
3092 SPRINTF("MESSAGE IN");
3093 break;
3094 default:
3095 SPRINTF("*invalid*");
3096 break;
3097 }
3098
3099 SPRINTF("); ");
3100
3101 SPRINTF("INTSTAT (%s); ", TESTHI(DMASTAT, INTSTAT) ? "hi" : "lo");
3102
3103 SPRINTF("SSTAT( ");
3104 s = GETPORT(SSTAT0);
3105 if (s & TARGET)
3106 SPRINTF("TARGET ");
3107 if (s & SELDO)
3108 SPRINTF("SELDO ");
3109 if (s & SELDI)
3110 SPRINTF("SELDI ");
3111 if (s & SELINGO)
3112 SPRINTF("SELINGO ");
3113 if (s & SWRAP)
3114 SPRINTF("SWRAP ");
3115 if (s & SDONE)
3116 SPRINTF("SDONE ");
3117 if (s & SPIORDY)
3118 SPRINTF("SPIORDY ");
3119 if (s & DMADONE)
3120 SPRINTF("DMADONE ");
3121
3122 s = GETPORT(SSTAT1);
3123 if (s & SELTO)
3124 SPRINTF("SELTO ");
3125 if (s & ATNTARG)
3126 SPRINTF("ATNTARG ");
3127 if (s & SCSIRSTI)
3128 SPRINTF("SCSIRSTI ");
3129 if (s & PHASEMIS)
3130 SPRINTF("PHASEMIS ");
3131 if (s & BUSFREE)
3132 SPRINTF("BUSFREE ");
3133 if (s & SCSIPERR)
3134 SPRINTF("SCSIPERR ");
3135 if (s & PHASECHG)
3136 SPRINTF("PHASECHG ");
3137 if (s & REQINIT)
3138 SPRINTF("REQINIT ");
3139 SPRINTF("); ");
3140
3141
3142 SPRINTF("SSTAT( ");
3143
3144 s = GETPORT(SSTAT0) & GETPORT(SIMODE0);
3145
3146 if (s & TARGET)
3147 SPRINTF("TARGET ");
3148 if (s & SELDO)
3149 SPRINTF("SELDO ");
3150 if (s & SELDI)
3151 SPRINTF("SELDI ");
3152 if (s & SELINGO)
3153 SPRINTF("SELINGO ");
3154 if (s & SWRAP)
3155 SPRINTF("SWRAP ");
3156 if (s & SDONE)
3157 SPRINTF("SDONE ");
3158 if (s & SPIORDY)
3159 SPRINTF("SPIORDY ");
3160 if (s & DMADONE)
3161 SPRINTF("DMADONE ");
3162
3163 s = GETPORT(SSTAT1) & GETPORT(SIMODE1);
3164
3165 if (s & SELTO)
3166 SPRINTF("SELTO ");
3167 if (s & ATNTARG)
3168 SPRINTF("ATNTARG ");
3169 if (s & SCSIRSTI)
3170 SPRINTF("SCSIRSTI ");
3171 if (s & PHASEMIS)
3172 SPRINTF("PHASEMIS ");
3173 if (s & BUSFREE)
3174 SPRINTF("BUSFREE ");
3175 if (s & SCSIPERR)
3176 SPRINTF("SCSIPERR ");
3177 if (s & PHASECHG)
3178 SPRINTF("PHASECHG ");
3179 if (s & REQINIT)
3180 SPRINTF("REQINIT ");
3181 SPRINTF("); ");
3182
3183 SPRINTF("SXFRCTL0( ");
3184
3185 s = GETPORT(SXFRCTL0);
3186 if (s & SCSIEN)
3187 SPRINTF("SCSIEN ");
3188 if (s & DMAEN)
3189 SPRINTF("DMAEN ");
3190 if (s & CH1)
3191 SPRINTF("CH1 ");
3192 if (s & CLRSTCNT)
3193 SPRINTF("CLRSTCNT ");
3194 if (s & SPIOEN)
3195 SPRINTF("SPIOEN ");
3196 if (s & CLRCH1)
3197 SPRINTF("CLRCH1 ");
3198 SPRINTF("); ");
3199
3200 SPRINTF("SIGNAL( ");
3201
3202 s = GETPORT(SCSISIG);
3203 if (s & SIG_ATNI)
3204 SPRINTF("ATNI ");
3205 if (s & SIG_SELI)
3206 SPRINTF("SELI ");
3207 if (s & SIG_BSYI)
3208 SPRINTF("BSYI ");
3209 if (s & SIG_REQI)
3210 SPRINTF("REQI ");
3211 if (s & SIG_ACKI)
3212 SPRINTF("ACKI ");
3213 SPRINTF("); ");
3214
3215 SPRINTF("SELID(%02x), ", GETPORT(SELID));
3216
3217 SPRINTF("STCNT(%d), ", GETSTCNT());
3218
3219 SPRINTF("SSTAT2( ");
3220
3221 s = GETPORT(SSTAT2);
3222 if (s & SOFFSET)
3223 SPRINTF("SOFFSET ");
3224 if (s & SEMPTY)
3225 SPRINTF("SEMPTY ");
3226 if (s & SFULL)
3227 SPRINTF("SFULL ");
3228 SPRINTF("); SFCNT (%d); ", s & (SFULL | SFCNT));
3229
3230 s = GETPORT(SSTAT3);
3231 SPRINTF("SCSICNT (%d), OFFCNT(%d), ", (s & 0xf0) >> 4, s & 0x0f);
3232
3233 SPRINTF("SSTAT4( ");
3234 s = GETPORT(SSTAT4);
3235 if (s & SYNCERR)
3236 SPRINTF("SYNCERR ");
3237 if (s & FWERR)
3238 SPRINTF("FWERR ");
3239 if (s & FRERR)
3240 SPRINTF("FRERR ");
3241 SPRINTF("); ");
3242
3243 SPRINTF("DMACNTRL0( ");
3244 s = GETPORT(DMACNTRL0);
3245 SPRINTF("%s ", s & _8BIT ? "8BIT" : "16BIT");
3246 SPRINTF("%s ", s & DMA ? "DMA" : "PIO");
3247 SPRINTF("%s ", s & WRITE_READ ? "WRITE" : "READ");
3248 if (s & ENDMA)
3249 SPRINTF("ENDMA ");
3250 if (s & INTEN)
3251 SPRINTF("INTEN ");
3252 if (s & RSTFIFO)
3253 SPRINTF("RSTFIFO ");
3254 if (s & SWINT)
3255 SPRINTF("SWINT ");
3256 SPRINTF("); ");
3257
3258 SPRINTF("DMASTAT( ");
3259 s = GETPORT(DMASTAT);
3260 if (s & ATDONE)
3261 SPRINTF("ATDONE ");
3262 if (s & WORDRDY)
3263 SPRINTF("WORDRDY ");
3264 if (s & DFIFOFULL)
3265 SPRINTF("DFIFOFULL ");
3266 if (s & DFIFOEMP)
3267 SPRINTF("DFIFOEMP ");
3268 SPRINTF(")\n");
3269
3270 SPRINTF("enabled interrupts( ");
3271
3272 s = GETPORT(SIMODE0);
3273 if (s & ENSELDO)
3274 SPRINTF("ENSELDO ");
3275 if (s & ENSELDI)
3276 SPRINTF("ENSELDI ");
3277 if (s & ENSELINGO)
3278 SPRINTF("ENSELINGO ");
3279 if (s & ENSWRAP)
3280 SPRINTF("ENSWRAP ");
3281 if (s & ENSDONE)
3282 SPRINTF("ENSDONE ");
3283 if (s & ENSPIORDY)
3284 SPRINTF("ENSPIORDY ");
3285 if (s & ENDMADONE)
3286 SPRINTF("ENDMADONE ");
3287
3288 s = GETPORT(SIMODE1);
3289 if (s & ENSELTIMO)
3290 SPRINTF("ENSELTIMO ");
3291 if (s & ENATNTARG)
3292 SPRINTF("ENATNTARG ");
3293 if (s & ENPHASEMIS)
3294 SPRINTF("ENPHASEMIS ");
3295 if (s & ENBUSFREE)
3296 SPRINTF("ENBUSFREE ");
3297 if (s & ENSCSIPERR)
3298 SPRINTF("ENSCSIPERR ");
3299 if (s & ENPHASECHG)
3300 SPRINTF("ENPHASECHG ");
3301 if (s & ENREQINIT)
3302 SPRINTF("ENREQINIT ");
3303 SPRINTF(")\n");
3304
3305 return (pos - start);
3306}
3307
3308static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)
3309{
3310 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)
3311 return -EINVAL;
3312
3313#if defined(AHA152X_DEBUG)
3314 if(length>14 && strncmp("debug ", buffer+8, 6)==0) {
3315 int debug = HOSTDATA(shpnt)->debug;
3316
3317 HOSTDATA(shpnt)->debug = simple_strtoul(buffer+14, NULL, 0);
3318
3319 printk(KERN_INFO "aha152x%d: debugging options set to 0x%04x (were 0x%04x)\n", HOSTNO, HOSTDATA(shpnt)->debug, debug);
3320 } else
3321#endif
3322#if defined(AHA152X_STAT)
3323 if(length>13 && strncmp("reset", buffer+8, 5)==0) {
3324 int i;
3325
3326 HOSTDATA(shpnt)->total_commands=0;
3327 HOSTDATA(shpnt)->disconnections=0;
3328 HOSTDATA(shpnt)->busfree_without_any_action=0;
3329 HOSTDATA(shpnt)->busfree_without_old_command=0;
3330 HOSTDATA(shpnt)->busfree_without_new_command=0;
3331 HOSTDATA(shpnt)->busfree_without_done_command=0;
3332 HOSTDATA(shpnt)->busfree_with_check_condition=0;
3333 for (i = idle; i<maxstate; i++) {
3334 HOSTDATA(shpnt)->count[i]=0;
3335 HOSTDATA(shpnt)->count_trans[i]=0;
3336 HOSTDATA(shpnt)->time[i]=0;
3337 }
3338
3339 printk(KERN_INFO "aha152x%d: stats reseted.\n", HOSTNO);
3340
3341 } else
3342#endif
3343 {
3344 return -EINVAL;
3345 }
3346
3347
3348 return length;
3349}
3350
3351#undef SPRINTF
3352#define SPRINTF(args...) \
3353 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3354
3355static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start,
3356 off_t offset, int length, int inout)
3357{
3358 int i;
3359 char *pos = buffer;
3360 Scsi_Cmnd *ptr;
3361 unsigned long flags;
3362 int thislength;
3363
3364 DPRINTK(debug_procinfo,
3365 KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3366 buffer, offset, length, shpnt->host_no, inout);
3367
3368
3369 if (inout)
3370 return aha152x_set_info(buffer, length, shpnt);
3371
3372 SPRINTF(AHA152X_REVID "\n");
3373
3374 SPRINTF("ioports 0x%04lx to 0x%04lx\n",
3375 shpnt->io_port, shpnt->io_port + shpnt->n_io_port - 1);
3376 SPRINTF("interrupt 0x%02x\n", shpnt->irq);
3377 SPRINTF("disconnection/reconnection %s\n",
3378 RECONNECT ? "enabled" : "disabled");
3379 SPRINTF("parity checking %s\n",
3380 PARITY ? "enabled" : "disabled");
3381 SPRINTF("synchronous transfers %s\n",
3382 SYNCHRONOUS ? "enabled" : "disabled");
3383 SPRINTF("%d commands currently queued\n", HOSTDATA(shpnt)->commands);
3384
3385 if(SYNCHRONOUS) {
3386 SPRINTF("synchronously operating targets (tick=50 ns):\n");
3387 for (i = 0; i < 8; i++)
3388 if (HOSTDATA(shpnt)->syncrate[i] & 0x7f)
3389 SPRINTF("target %d: period %dT/%dns; req/ack offset %d\n",
3390 i,
3391 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2),
3392 (((HOSTDATA(shpnt)->syncrate[i] & 0x70) >> 4) + 2) * 50,
3393 HOSTDATA(shpnt)->syncrate[i] & 0x0f);
3394 }
3395#if defined(AHA152X_DEBUG)
3396#define PDEBUG(flags,txt) \
3397 if(HOSTDATA(shpnt)->debug & flags) SPRINTF("(%s) ", txt);
3398
3399 SPRINTF("enabled debugging options: ");
3400
3401 PDEBUG(debug_procinfo, "procinfo");
3402 PDEBUG(debug_queue, "queue");
3403 PDEBUG(debug_intr, "interrupt");
3404 PDEBUG(debug_selection, "selection");
3405 PDEBUG(debug_msgo, "message out");
3406 PDEBUG(debug_msgi, "message in");
3407 PDEBUG(debug_status, "status");
3408 PDEBUG(debug_cmd, "command");
3409 PDEBUG(debug_datai, "data in");
3410 PDEBUG(debug_datao, "data out");
3411 PDEBUG(debug_eh, "eh");
3412 PDEBUG(debug_locks, "locks");
3413 PDEBUG(debug_phases, "phases");
3414
3415 SPRINTF("\n");
3416#endif
3417
3418 SPRINTF("\nqueue status:\n");
3419 DO_LOCK(flags);
3420 if (ISSUE_SC) {
3421 SPRINTF("not yet issued commands:\n");
3422 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
3423 pos += get_command(pos, ptr);
3424 } else
3425 SPRINTF("no not yet issued commands\n");
3426 DO_UNLOCK(flags);
3427
3428 if (CURRENT_SC) {
3429 SPRINTF("current command:\n");
3430 pos += get_command(pos, CURRENT_SC);
3431 } else
3432 SPRINTF("no current command\n");
3433
3434 if (DISCONNECTED_SC) {
3435 SPRINTF("disconnected commands:\n");
3436 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
3437 pos += get_command(pos, ptr);
3438 } else
3439 SPRINTF("no disconnected commands\n");
3440
3441 pos += get_ports(shpnt, pos);
3442
3443#if defined(AHA152X_STAT)
3444 SPRINTF("statistics:\n"
3445 "total commands: %d\n"
3446 "disconnections: %d\n"
3447 "busfree with check condition: %d\n"
3448 "busfree without old command: %d\n"
3449 "busfree without new command: %d\n"
3450 "busfree without done command: %d\n"
3451 "busfree without any action: %d\n"
3452 "state "
3453 "transitions "
3454 "count "
3455 "time\n",
3456 HOSTDATA(shpnt)->total_commands,
3457 HOSTDATA(shpnt)->disconnections,
3458 HOSTDATA(shpnt)->busfree_with_check_condition,
3459 HOSTDATA(shpnt)->busfree_without_old_command,
3460 HOSTDATA(shpnt)->busfree_without_new_command,
3461 HOSTDATA(shpnt)->busfree_without_done_command,
3462 HOSTDATA(shpnt)->busfree_without_any_action);
3463 for(i=0; i<maxstate; i++) {
3464 SPRINTF("%-10s %-12d %-12d %-12ld\n",
3465 states[i].name,
3466 HOSTDATA(shpnt)->count_trans[i],
3467 HOSTDATA(shpnt)->count[i],
3468 HOSTDATA(shpnt)->time[i]);
3469 }
3470#endif
3471
3472 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos);
3473
3474 thislength = pos - (buffer + offset);
3475 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength);
3476
3477 if(thislength<0) {
3478 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n");
3479 *start = NULL;
3480 return 0;
3481 }
3482
3483 thislength = thislength<length ? thislength : length;
3484
3485 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength);
3486
3487 *start = buffer + offset;
3488 return thislength < length ? thislength : length;
3489}
3490
Christoph Hellwigd0be4a7d2005-10-31 18:31:40 +01003491static struct scsi_host_template aha152x_driver_template = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003492 .module = THIS_MODULE,
3493 .name = AHA152X_REVID,
3494 .proc_name = "aha152x",
3495 .proc_info = aha152x_proc_info,
3496 .queuecommand = aha152x_queue,
3497 .eh_abort_handler = aha152x_abort,
3498 .eh_device_reset_handler = aha152x_device_reset,
3499 .eh_bus_reset_handler = aha152x_bus_reset,
3500 .eh_host_reset_handler = aha152x_host_reset,
3501 .bios_param = aha152x_biosparam,
3502 .can_queue = 1,
3503 .this_id = 7,
3504 .sg_tablesize = SG_ALL,
3505 .cmd_per_lun = 1,
3506 .use_clustering = DISABLE_CLUSTERING,
3507};
3508
3509#if !defined(PCMCIA)
3510static int setup_count;
3511static struct aha152x_setup setup[2];
3512
3513/* possible i/o addresses for the AIC-6260; default first */
3514static unsigned short ports[] = { 0x340, 0x140 };
3515
3516#if !defined(SKIP_BIOSTEST)
3517/* possible locations for the Adaptec BIOS; defaults first */
3518static unsigned int addresses[] =
3519{
3520 0xdc000, /* default first */
3521 0xc8000,
3522 0xcc000,
3523 0xd0000,
3524 0xd4000,
3525 0xd8000,
3526 0xe0000,
3527 0xeb800, /* VTech Platinum SMP */
3528 0xf0000,
3529};
3530
3531/* signatures for various AIC-6[23]60 based controllers.
3532 The point in detecting signatures is to avoid useless and maybe
3533 harmful probes on ports. I'm not sure that all listed boards pass
3534 auto-configuration. For those which fail the BIOS signature is
3535 obsolete, because user intervention to supply the configuration is
3536 needed anyway. May be an information whether or not the BIOS supports
3537 extended translation could be also useful here. */
3538static struct signature {
3539 unsigned char *signature;
3540 int sig_offset;
3541 int sig_length;
3542} signatures[] =
3543{
3544 { "Adaptec AHA-1520 BIOS", 0x102e, 21 },
3545 /* Adaptec 152x */
3546 { "Adaptec AHA-1520B", 0x000b, 17 },
3547 /* Adaptec 152x rev B */
3548 { "Adaptec AHA-1520B", 0x0026, 17 },
3549 /* Iomega Jaz Jet ISA (AIC6370Q) */
3550 { "Adaptec ASW-B626 BIOS", 0x1029, 21 },
3551 /* on-board controller */
3552 { "Adaptec BIOS: ASW-B626", 0x000f, 22 },
3553 /* on-board controller */
3554 { "Adaptec ASW-B626 S2", 0x2e6c, 19 },
3555 /* on-board controller */
3556 { "Adaptec BIOS:AIC-6360", 0x000c, 21 },
3557 /* on-board controller */
3558 { "ScsiPro SP-360 BIOS", 0x2873, 19 },
3559 /* ScsiPro-Controller */
3560 { "GA-400 LOCAL BUS SCSI BIOS", 0x102e, 26 },
3561 /* Gigabyte Local-Bus-SCSI */
3562 { "Adaptec BIOS:AVA-282X", 0x000c, 21 },
3563 /* Adaptec 282x */
3564 { "Adaptec IBM Dock II SCSI", 0x2edd, 24 },
3565 /* IBM Thinkpad Dock II */
3566 { "Adaptec BIOS:AHA-1532P", 0x001c, 22 },
3567 /* IBM Thinkpad Dock II SCSI */
3568 { "DTC3520A Host Adapter BIOS", 0x318a, 26 },
3569 /* DTC 3520A ISA SCSI */
3570};
3571#endif /* !SKIP_BIOSTEST */
3572
3573/*
3574 * Test, if port_base is valid.
3575 *
3576 */
3577static int aha152x_porttest(int io_port)
3578{
3579 int i;
3580
3581 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3582 for (i = 0; i < 16; i++)
3583 SETPORT(io_port + O_STACK, i);
3584
3585 SETPORT(io_port + O_DMACNTRL1, 0); /* reset stack pointer */
3586 for (i = 0; i < 16 && GETPORT(io_port + O_STACK) == i; i++)
3587 ;
3588
3589 return (i == 16);
3590}
3591
3592static int tc1550_porttest(int io_port)
3593{
3594 int i;
3595
3596 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3597 for (i = 0; i < 16; i++)
3598 SETPORT(io_port + O_STACK, i);
3599
3600 SETPORT(io_port + O_TC_DMACNTRL1, 0); /* reset stack pointer */
3601 for (i = 0; i < 16 && GETPORT(io_port + O_TC_STACK) == i; i++)
3602 ;
3603
3604 return (i == 16);
3605}
3606
3607
3608static int checksetup(struct aha152x_setup *setup)
3609{
3610 int i;
3611 for (i = 0; i < ARRAY_SIZE(ports) && (setup->io_port != ports[i]); i++)
3612 ;
3613
3614 if (i == ARRAY_SIZE(ports))
3615 return 0;
3616
3617 if ( request_region(setup->io_port, IO_RANGE, "aha152x")==0 ) {
3618 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup->io_port);
3619 return 0;
3620 }
3621
3622 if( aha152x_porttest(setup->io_port) ) {
3623 setup->tc1550=0;
3624 } else if( tc1550_porttest(setup->io_port) ) {
3625 setup->tc1550=1;
3626 } else {
3627 release_region(setup->io_port, IO_RANGE);
3628 return 0;
3629 }
3630
3631 release_region(setup->io_port, IO_RANGE);
3632
3633 if ((setup->irq < IRQ_MIN) || (setup->irq > IRQ_MAX))
3634 return 0;
3635
3636 if ((setup->scsiid < 0) || (setup->scsiid > 7))
3637 return 0;
3638
3639 if ((setup->reconnect < 0) || (setup->reconnect > 1))
3640 return 0;
3641
3642 if ((setup->parity < 0) || (setup->parity > 1))
3643 return 0;
3644
3645 if ((setup->synchronous < 0) || (setup->synchronous > 1))
3646 return 0;
3647
3648 if ((setup->ext_trans < 0) || (setup->ext_trans > 1))
3649 return 0;
3650
3651
3652 return 1;
3653}
3654
3655
3656static int __init aha152x_init(void)
3657{
3658 int i, j, ok;
3659#if defined(AUTOCONF)
3660 aha152x_config conf;
3661#endif
3662#ifdef __ISAPNP__
3663 struct pnp_dev *dev=NULL, *pnpdev[2] = {NULL, NULL};
3664#endif
3665
3666 if ( setup_count ) {
3667 printk(KERN_INFO "aha152x: processing commandline: ");
3668
3669 for (i = 0; i<setup_count; i++) {
3670 if (!checksetup(&setup[i])) {
3671 printk(KERN_ERR "\naha152x: %s\n", setup[i].conf);
3672 printk(KERN_ERR "aha152x: invalid line\n");
3673 }
3674 }
3675 printk("ok\n");
3676 }
3677
3678#if defined(SETUP0)
3679 if (setup_count < ARRAY_SIZE(setup)) {
3680 struct aha152x_setup override = SETUP0;
3681
3682 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3683 if (!checksetup(&override)) {
3684 printk(KERN_ERR "\naha152x: invalid override SETUP0={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3685 override.io_port,
3686 override.irq,
3687 override.scsiid,
3688 override.reconnect,
3689 override.parity,
3690 override.synchronous,
3691 override.delay,
3692 override.ext_trans);
3693 } else
3694 setup[setup_count++] = override;
3695 }
3696 }
3697#endif
3698
3699#if defined(SETUP1)
3700 if (setup_count < ARRAY_SIZE(setup)) {
3701 struct aha152x_setup override = SETUP1;
3702
3703 if (setup_count == 0 || (override.io_port != setup[0].io_port)) {
3704 if (!checksetup(&override)) {
3705 printk(KERN_ERR "\naha152x: invalid override SETUP1={0x%x,%d,%d,%d,%d,%d,%d,%d}\n",
3706 override.io_port,
3707 override.irq,
3708 override.scsiid,
3709 override.reconnect,
3710 override.parity,
3711 override.synchronous,
3712 override.delay,
3713 override.ext_trans);
3714 } else
3715 setup[setup_count++] = override;
3716 }
3717 }
3718#endif
3719
3720#if defined(MODULE)
3721 if (setup_count<ARRAY_SIZE(setup) && (aha152x[0]!=0 || io[0]!=0 || irq[0]!=0)) {
3722 if(aha152x[0]!=0) {
3723 setup[setup_count].conf = "";
3724 setup[setup_count].io_port = aha152x[0];
3725 setup[setup_count].irq = aha152x[1];
3726 setup[setup_count].scsiid = aha152x[2];
3727 setup[setup_count].reconnect = aha152x[3];
3728 setup[setup_count].parity = aha152x[4];
3729 setup[setup_count].synchronous = aha152x[5];
3730 setup[setup_count].delay = aha152x[6];
3731 setup[setup_count].ext_trans = aha152x[7];
3732#if defined(AHA152X_DEBUG)
3733 setup[setup_count].debug = aha152x[8];
3734#endif
3735 } else if(io[0]!=0 || irq[0]!=0) {
3736 if(io[0]!=0) setup[setup_count].io_port = io[0];
3737 if(irq[0]!=0) setup[setup_count].irq = irq[0];
3738
3739 setup[setup_count].scsiid = scsiid[0];
3740 setup[setup_count].reconnect = reconnect[0];
3741 setup[setup_count].parity = parity[0];
3742 setup[setup_count].synchronous = sync[0];
3743 setup[setup_count].delay = delay[0];
3744 setup[setup_count].ext_trans = exttrans[0];
3745#if defined(AHA152X_DEBUG)
3746 setup[setup_count].debug = debug[0];
3747#endif
3748 }
3749
3750 if (checksetup(&setup[setup_count]))
3751 setup_count++;
3752 else
3753 printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3754 setup[setup_count].io_port,
3755 setup[setup_count].irq,
3756 setup[setup_count].scsiid,
3757 setup[setup_count].reconnect,
3758 setup[setup_count].parity,
3759 setup[setup_count].synchronous,
3760 setup[setup_count].delay,
3761 setup[setup_count].ext_trans);
3762 }
3763
3764 if (setup_count<ARRAY_SIZE(setup) && (aha152x1[0]!=0 || io[1]!=0 || irq[1]!=0)) {
3765 if(aha152x1[0]!=0) {
3766 setup[setup_count].conf = "";
3767 setup[setup_count].io_port = aha152x1[0];
3768 setup[setup_count].irq = aha152x1[1];
3769 setup[setup_count].scsiid = aha152x1[2];
3770 setup[setup_count].reconnect = aha152x1[3];
3771 setup[setup_count].parity = aha152x1[4];
3772 setup[setup_count].synchronous = aha152x1[5];
3773 setup[setup_count].delay = aha152x1[6];
3774 setup[setup_count].ext_trans = aha152x1[7];
3775#if defined(AHA152X_DEBUG)
3776 setup[setup_count].debug = aha152x1[8];
3777#endif
3778 } else if(io[1]!=0 || irq[1]!=0) {
3779 if(io[1]!=0) setup[setup_count].io_port = io[1];
3780 if(irq[1]!=0) setup[setup_count].irq = irq[1];
3781
3782 setup[setup_count].scsiid = scsiid[1];
3783 setup[setup_count].reconnect = reconnect[1];
3784 setup[setup_count].parity = parity[1];
3785 setup[setup_count].synchronous = sync[1];
3786 setup[setup_count].delay = delay[1];
3787 setup[setup_count].ext_trans = exttrans[1];
3788#if defined(AHA152X_DEBUG)
3789 setup[setup_count].debug = debug[1];
3790#endif
3791 }
3792 if (checksetup(&setup[setup_count]))
3793 setup_count++;
3794 else
3795 printk(KERN_ERR "aha152x: invalid module params io=0x%x, irq=%d,scsiid=%d,reconnect=%d,parity=%d,sync=%d,delay=%d,exttrans=%d\n",
3796 setup[setup_count].io_port,
3797 setup[setup_count].irq,
3798 setup[setup_count].scsiid,
3799 setup[setup_count].reconnect,
3800 setup[setup_count].parity,
3801 setup[setup_count].synchronous,
3802 setup[setup_count].delay,
3803 setup[setup_count].ext_trans);
3804 }
3805#endif
3806
3807#ifdef __ISAPNP__
3808 for(i=0; setup_count<ARRAY_SIZE(setup) && id_table[i].vendor; i++) {
3809 while ( setup_count<ARRAY_SIZE(setup) &&
3810 (dev=pnp_find_dev(NULL, id_table[i].vendor, id_table[i].function, dev)) ) {
3811 if (pnp_device_attach(dev) < 0)
3812 continue;
3813
3814 if (pnp_activate_dev(dev) < 0) {
3815 pnp_device_detach(dev);
3816 continue;
3817 }
3818
3819 if (!pnp_port_valid(dev, 0)) {
3820 pnp_device_detach(dev);
3821 continue;
3822 }
3823
3824 if (setup_count==1 && pnp_port_start(dev, 0)==setup[0].io_port) {
3825 pnp_device_detach(dev);
3826 continue;
3827 }
3828
3829 setup[setup_count].io_port = pnp_port_start(dev, 0);
3830 setup[setup_count].irq = pnp_irq(dev, 0);
3831 setup[setup_count].scsiid = 7;
3832 setup[setup_count].reconnect = 1;
3833 setup[setup_count].parity = 1;
3834 setup[setup_count].synchronous = 1;
3835 setup[setup_count].delay = DELAY_DEFAULT;
3836 setup[setup_count].ext_trans = 0;
3837#if defined(AHA152X_DEBUG)
3838 setup[setup_count].debug = DEBUG_DEFAULT;
3839#endif
3840#if defined(__ISAPNP__)
3841 pnpdev[setup_count] = dev;
3842#endif
3843 printk (KERN_INFO
3844 "aha152x: found ISAPnP adapter at io=0x%03x, irq=%d\n",
3845 setup[setup_count].io_port, setup[setup_count].irq);
3846 setup_count++;
3847 }
3848 }
3849#endif
3850
3851#if defined(AUTOCONF)
3852 if (setup_count<ARRAY_SIZE(setup)) {
3853#if !defined(SKIP_BIOSTEST)
3854 ok = 0;
3855 for (i = 0; i < ARRAY_SIZE(addresses) && !ok; i++) {
3856 void __iomem *p = ioremap(addresses[i], 0x4000);
3857 if (!p)
3858 continue;
3859 for (j = 0; j<ARRAY_SIZE(signatures) && !ok; j++)
3860 ok = check_signature(p + signatures[j].sig_offset,
3861 signatures[j].signature, signatures[j].sig_length);
3862 iounmap(p);
3863 }
3864 if (!ok && setup_count == 0)
3865 return 0;
3866
3867 printk(KERN_INFO "aha152x: BIOS test: passed, ");
3868#else
3869 printk(KERN_INFO "aha152x: ");
3870#endif /* !SKIP_BIOSTEST */
3871
3872 ok = 0;
3873 for (i = 0; i < ARRAY_SIZE(ports) && setup_count < 2; i++) {
3874 if ((setup_count == 1) && (setup[0].io_port == ports[i]))
3875 continue;
3876
3877 if ( request_region(ports[i], IO_RANGE, "aha152x")==0 ) {
3878 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", ports[i]);
3879 continue;
3880 }
3881
3882 if (aha152x_porttest(ports[i])) {
3883 setup[setup_count].tc1550 = 0;
3884
3885 conf.cf_port =
3886 (GETPORT(ports[i] + O_PORTA) << 8) + GETPORT(ports[i] + O_PORTB);
3887 } else if (tc1550_porttest(ports[i])) {
3888 setup[setup_count].tc1550 = 1;
3889
3890 conf.cf_port =
3891 (GETPORT(ports[i] + O_TC_PORTA) << 8) + GETPORT(ports[i] + O_TC_PORTB);
3892 } else {
3893 release_region(ports[i], IO_RANGE);
3894 continue;
3895 }
3896
3897 release_region(ports[i], IO_RANGE);
3898
3899 ok++;
3900 setup[setup_count].io_port = ports[i];
3901 setup[setup_count].irq = IRQ_MIN + conf.cf_irq;
3902 setup[setup_count].scsiid = conf.cf_id;
3903 setup[setup_count].reconnect = conf.cf_tardisc;
3904 setup[setup_count].parity = !conf.cf_parity;
3905 setup[setup_count].synchronous = conf.cf_syncneg;
3906 setup[setup_count].delay = DELAY_DEFAULT;
3907 setup[setup_count].ext_trans = 0;
3908#if defined(AHA152X_DEBUG)
3909 setup[setup_count].debug = DEBUG_DEFAULT;
3910#endif
3911 setup_count++;
3912
3913 }
3914
3915 if (ok)
3916 printk("auto configuration: ok, ");
3917 }
3918#endif
3919
3920 printk("%d controller(s) configured\n", setup_count);
3921
3922 for (i=0; i<setup_count; i++) {
3923 if ( request_region(setup[i].io_port, IO_RANGE, "aha152x") ) {
3924 struct Scsi_Host *shpnt = aha152x_probe_one(&setup[i]);
3925
3926 if( !shpnt ) {
3927 release_region(setup[i].io_port, IO_RANGE);
3928#if defined(__ISAPNP__)
3929 } else if( pnpdev[i] ) {
3930 HOSTDATA(shpnt)->pnpdev=pnpdev[i];
3931 pnpdev[i]=NULL;
3932#endif
3933 }
3934 } else {
3935 printk(KERN_ERR "aha152x: io port 0x%x busy.\n", setup[i].io_port);
3936 }
3937
3938#if defined(__ISAPNP__)
3939 if( pnpdev[i] )
3940 pnp_device_detach(pnpdev[i]);
3941#endif
3942 }
3943
James Bottomley5fcda422006-09-14 17:04:58 -05003944 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003945}
3946
3947static void __exit aha152x_exit(void)
3948{
James Bottomley5fcda422006-09-14 17:04:58 -05003949 struct aha152x_hostdata *hd;
Linus Torvalds1da177e2005-04-16 15:20:36 -07003950
James Bottomley5fcda422006-09-14 17:04:58 -05003951 list_for_each_entry(hd, &aha152x_host_list, host_list) {
3952 struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata);
3953
3954 aha152x_release(shost);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003955 }
3956}
3957
3958module_init(aha152x_init);
3959module_exit(aha152x_exit);
3960
3961#if !defined(MODULE)
3962static int __init aha152x_setup(char *str)
3963{
3964#if defined(AHA152X_DEBUG)
3965 int ints[11];
3966#else
3967 int ints[10];
3968#endif
3969 get_options(str, ARRAY_SIZE(ints), ints);
3970
3971 if(setup_count>=ARRAY_SIZE(setup)) {
3972 printk(KERN_ERR "aha152x: you can only configure up to two controllers\n");
3973 return 1;
3974 }
3975
3976 setup[setup_count].conf = str;
3977 setup[setup_count].io_port = ints[0] >= 1 ? ints[1] : 0x340;
3978 setup[setup_count].irq = ints[0] >= 2 ? ints[2] : 11;
3979 setup[setup_count].scsiid = ints[0] >= 3 ? ints[3] : 7;
3980 setup[setup_count].reconnect = ints[0] >= 4 ? ints[4] : 1;
3981 setup[setup_count].parity = ints[0] >= 5 ? ints[5] : 1;
3982 setup[setup_count].synchronous = ints[0] >= 6 ? ints[6] : 1;
3983 setup[setup_count].delay = ints[0] >= 7 ? ints[7] : DELAY_DEFAULT;
3984 setup[setup_count].ext_trans = ints[0] >= 8 ? ints[8] : 0;
3985#if defined(AHA152X_DEBUG)
3986 setup[setup_count].debug = ints[0] >= 9 ? ints[9] : DEBUG_DEFAULT;
3987 if (ints[0] > 9) {
3988 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3989 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>[,<DEBUG>]]]]]]]]\n");
3990#else
3991 if (ints[0] > 8) { /*}*/
3992 printk(KERN_NOTICE "aha152x: usage: aha152x=<IOBASE>[,<IRQ>[,<SCSI ID>"
3993 "[,<RECONNECT>[,<PARITY>[,<SYNCHRONOUS>[,<DELAY>[,<EXT_TRANS>]]]]]]]\n");
3994#endif
3995 } else {
3996 setup_count++;
3997 return 0;
3998 }
3999
4000 return 1;
4001}
4002__setup("aha152x=", aha152x_setup);
4003#endif
4004
4005#endif /* !PCMCIA */