|
|
1.1 root 1: #ifndef NDEBUG
2: #define NDEBUG (NDEBUG_RESTART_SELECT | NDEBUG_ABORT)
3: #endif
4: /*
5: * NCR 5380 generic driver routines. These should make it *trivial*
6: * to implement 5380 SCSI drivers under Linux with a non-trantor
7: * architecture.
8: *
9: * Note that these routines also work with NR53c400 family chips.
10: *
11: * Copyright 1993, Drew Eckhardt
12: * Visionary Computing
13: * (Unix and Linux consulting and custom programming)
14: * [email protected]
15: * +1 (303) 666-5836
16: *
17: * DISTRIBUTION RELEASE 6.
18: *
19: * For more information, please consult
20: *
21: * NCR 5380 Family
22: * SCSI Protocol Controller
23: * Databook
24: *
25: * NCR Microelectronics
26: * 1635 Aeroplaza Drive
27: * Colorado Springs, CO 80916
28: * 1+ (719) 578-3400
29: * 1+ (800) 334-5454
30: */
31:
32: /*
33: * $Log: NCR5380.src,v $
34: * Revision 1.1.1.1 1997/02/25 21:27:44 thomas
35: * Initial source
36: *
37: * Revision 1.1.1.1 1996/10/30 01:39:59 thomas
38: * Imported from UK22
39: *
40: # Revision 1.1 1996/03/25 20:25:10 goel
41: # Linux driver merge.
42: #
43: * Revision 1.5 1994/01/19 09:14:57 drew
44: * Fixed udelay() hack that was being used on DATAOUT phases
45: * instead of a proper wait for the final handshake.
46: *
47: * Revision 1.4 1994/01/19 06:44:25 drew
48: * *** empty log message ***
49: *
50: * Revision 1.3 1994/01/19 05:24:40 drew
51: * Added support for TCR LAST_BYTE_SENT bit.
52: *
53: * Revision 1.2 1994/01/15 06:14:11 drew
54: * REAL DMA support, bug fixes.
55: *
56: * Revision 1.1 1994/01/15 06:00:54 drew
57: * Initial revision
58: *
59: */
60:
61: /*
62: * Further development / testing that should be done :
63: * 1. Cleanup the NCR5380_transfer_dma function and DMA operation complete
64: * code so that everything does the same thing that's done at the
65: * end of a pseudo-DMA read operation.
66: *
67: * 2. Fix REAL_DMA (interrupt driven, polled works fine) -
68: * basically, transfer size needs to be reduced by one
69: * and the last byte read as is done with PSEUDO_DMA.
70: *
71: * 3. Test USLEEP code
72: *
73: * 4. Test SCSI-II tagged queueing (I have no devices which support
74: * tagged queueing)
75: *
76: * 5. Test linked command handling code after Eric is ready with
77: * the high level code.
78: */
79:
80: #if (NDEBUG & NDEBUG_LISTS)
81: #define LIST(x,y) {printk("LINE:%d Adding %p to %p\n", __LINE__, (void*)(x), (void*)(y)); if ((x)==(y)) udelay(5); }
82: #define REMOVE(w,x,y,z) {printk("LINE:%d Removing: %p->%p %p->%p \n", __LINE__, (void*)(w), (void*)(x), (void*)(y), (void*)(z)); if ((x)==(y)) udelay(5); }
83: #else
84: #define LIST(x,y)
85: #define REMOVE(w,x,y,z)
86: #endif
87:
88: #ifndef notyet
89: #undef LINKED
90: #undef USLEEP
91: #undef REAL_DMA
92: #endif
93:
94: #ifdef REAL_DMA_POLL
95: #undef READ_OVERRUNS
96: #define READ_OVERRUNS
97: #endif
98:
99: /*
100: * Design
101: * Issues :
102: *
103: * The other Linux SCSI drivers were written when Linux was Intel PC-only,
104: * and specifically for each board rather than each chip. This makes their
105: * adaptation to platforms like the Mac (Some of which use NCR5380's)
106: * more difficult than it has to be.
107: *
108: * Also, many of the SCSI drivers were written before the command queuing
109: * routines were implemented, meaning their implementations of queued
110: * commands were hacked on rather than designed in from the start.
111: *
112: * When I designed the Linux SCSI drivers I figured that
113: * while having two different SCSI boards in a system might be useful
114: * for debugging things, two of the same type wouldn't be used.
115: * Well, I was wrong and a number of users have mailed me about running
116: * multiple high-performance SCSI boards in a server.
117: *
118: * Finally, when I get questions from users, I have no idea what
119: * revision of my driver they are running.
120: *
121: * This driver attempts to address these problems :
122: * This is a generic 5380 driver. To use it on a different platform,
123: * one simply writes appropriate system specific macros (ie, data
124: * transfer - some PC's will use the I/O bus, 68K's must use
125: * memory mapped) and drops this file in their 'C' wrapper.
126: *
127: * As far as command queueing, two queues are maintained for
128: * each 5380 in the system - commands that haven't been issued yet,
129: * and commands that are currently executing. This means that an
130: * unlimited number of commands may be queued, letting
131: * more commands propagate from the higher driver levels giving higher
132: * throughput. Note that both I_T_L and I_T_L_Q nexuses are supported,
133: * allowing multiple commands to propagate all the way to a SCSI-II device
134: * while a command is already executing.
135: *
136: * To solve the multiple-boards-in-the-same-system problem,
137: * there is a separate instance structure for each instance
138: * of a 5380 in the system. So, multiple NCR5380 drivers will
139: * be able to coexist with appropriate changes to the high level
140: * SCSI code.
141: *
142: * A NCR5380_PUBLIC_REVISION macro is provided, with the release
143: * number (updated for each public release) printed by the
144: * NCR5380_print_options command, which should be called from the
145: * wrapper detect function, so that I know what release of the driver
146: * users are using.
147: *
148: * Issues specific to the NCR5380 :
149: *
150: * When used in a PIO or pseudo-dma mode, the NCR5380 is a braindead
151: * piece of hardware that requires you to sit in a loop polling for
152: * the REQ signal as long as you are connected. Some devices are
153: * brain dead (ie, many TEXEL CD ROM drives) and won't disconnect
154: * while doing long seek operations.
155: *
156: * The workaround for this is to keep track of devices that have
157: * disconnected. If the device hasn't disconnected, for commands that
158: * should disconnect, we do something like
159: *
160: * while (!REQ is asserted) { sleep for N usecs; poll for M usecs }
161: *
162: * Some tweaking of N and M needs to be done. An algorithm based
163: * on "time to data" would give the best results as long as short time
164: * to datas (ie, on the same track) were considered, however these
165: * broken devices are the exception rather than the rule and I'd rather
166: * spend my time optimizing for the normal case.
167: *
168: * Architecture :
169: *
170: * At the heart of the design is a coroutine, NCR5380_main,
171: * which is started when not running by the interrupt handler,
172: * timer, and queue command function. It attempts to establish
173: * I_T_L or I_T_L_Q nexuses by removing the commands from the
174: * issue queue and calling NCR5380_select() if a nexus
175: * is not established.
176: *
177: * Once a nexus is established, the NCR5380_information_transfer()
178: * phase goes through the various phases as instructed by the target.
179: * if the target goes into MSG IN and sends a DISCONNECT message,
180: * the command structure is placed into the per instance disconnected
181: * queue, and NCR5380_main tries to find more work. If USLEEP
182: * was defined, and the target is idle for too long, the system
183: * will try to sleep.
184: *
185: * If a command has disconnected, eventually an interrupt will trigger,
186: * calling NCR5380_intr() which will in turn call NCR5380_reselect
187: * to reestablish a nexus. This will run main if necessary.
188: *
189: * On command termination, the done function will be called as
190: * appropriate.
191: *
192: * SCSI pointers are maintained in the SCp field of SCSI command
193: * structures, being initialized after the command is connected
194: * in NCR5380_select, and set as appropriate in NCR5380_information_transfer.
195: * Note that in violation of the standard, an implicit SAVE POINTERS operation
196: * is done, since some BROKEN disks fail to issue an explicit SAVE POINTERS.
197: */
198:
199: /*
200: * Using this file :
201: * This file a skeleton Linux SCSI driver for the NCR 5380 series
202: * of chips. To use it, you write a architecture specific functions
203: * and macros and include this file in your driver.
204: *
205: * These macros control options :
206: * AUTOPROBE_IRQ - if defined, the NCR5380_probe_irq() function will be
207: * defined.
208: *
209: * AUTOSENSE - if defined, REQUEST SENSE will be performed automatically
210: * for commands that return with a CHECK CONDITION status.
211: *
212: * DIFFERENTIAL - if defined, NCR53c81 chips will use external differential
213: * transceivers.
214: *
215: * LIMIT_TRANSFERSIZE - if defined, limit the pseudo-dma transfers to 512
216: * bytes at a time. Since interrupts are disabled by default during
217: * these transfers, we might need this to give reasonable interrupt
218: * service time if the transfer size gets too large.
219: *
220: * LINKED - if defined, linked commands are supported.
221: *
222: * PSEUDO_DMA - if defined, PSEUDO DMA is used during the data transfer phases.
223: *
224: * REAL_DMA - if defined, REAL DMA is used during the data transfer phases.
225: *
226: * REAL_DMA_POLL - if defined, REAL DMA is used but the driver doesn't
227: * rely on phase mismatch and EOP interrupts to determine end
228: * of phase.
229: *
230: * SCSI2 - if defined, SCSI-2 tagged queuing is used where possible
231: *
232: * UNSAFE - leave interrupts enabled during pseudo-DMA transfers. You
233: * only really want to use this if you're having a problem with
234: * dropped characters during high speed communications, and even
235: * then, you're going to be better off twiddling with transfersize
236: * in the high level code.
237: *
238: * USLEEP - if defined, on devices that aren't disconnecting from the
239: * bus, we will go to sleep so that the CPU can get real work done
240: * when we run a command that won't complete immediately.
241: *
242: * Note that if USLEEP is defined, NCR5380_TIMER *must* also be
243: * defined.
244: *
245: * Defaults for these will be provided if USLEEP is defined, although
246: * the user may want to adjust these to allocate CPU resources to
247: * the SCSI driver or "real" code.
248: *
249: * USLEEP_SLEEP - amount of time, in jiffies, to sleep
250: *
251: * USLEEP_POLL - amount of time, in jiffies, to poll
252: *
253: * These macros MUST be defined :
254: * NCR5380_local_declare() - declare any local variables needed for your transfer
255: * routines.
256: *
257: * NCR5380_setup(instance) - initialize any local variables needed from a given
258: * instance of the host adapter for NCR5380_{read,write,pread,pwrite}
259: *
260: * NCR5380_read(register) - read from the specified register
261: *
262: * NCR5380_write(register, value) - write to the specific register
263: *
264: * NCR5380_implementation_fields - additional fields needed for this
265: * specific implementation of the NCR5380
266: *
267: * Either real DMA *or* pseudo DMA may be implemented
268: * REAL functions :
269: * NCR5380_REAL_DMA should be defined if real DMA is to be used.
270: * Note that the DMA setup functions should return the number of bytes
271: * that they were able to program the controller for.
272: *
273: * Also note that generic i386/PC versions of these macros are
274: * available as NCR5380_i386_dma_write_setup,
275: * NCR5380_i386_dma_read_setup, and NCR5380_i386_dma_residual.
276: *
277: * NCR5380_dma_write_setup(instance, src, count) - initialize
278: * NCR5380_dma_read_setup(instance, dst, count) - initialize
279: * NCR5380_dma_residual(instance); - residual count
280: *
281: * PSEUDO functions :
282: * NCR5380_pwrite(instance, src, count)
283: * NCR5380_pread(instance, dst, count);
284: *
285: * If nothing specific to this implementation needs doing (ie, with external
286: * hardware), you must also define
287: *
288: * NCR5380_queue_command
289: * NCR5380_reset
290: * NCR5380_abort
291: *
292: * to be the global entry points into the specific driver, ie
293: * #define NCR5380_queue_command t128_queue_command.
294: *
295: * If this is not done, the routines will be defined as static functions
296: * with the NCR5380* names and the user must provide a globally
297: * accessible wrapper function.
298: *
299: * The generic driver is initialized by calling NCR5380_init(instance),
300: * after setting the appropriate host specific fields and ID. If the
301: * driver wishes to autoprobe for an IRQ line, the NCR5380_probe_irq(instance,
302: * possible) function may be used. Before the specific driver initialization
303: * code finishes, NCR5380_print_options should be called.
304: */
305:
306: static int do_abort (struct Scsi_Host *host);
307: static void do_reset (struct Scsi_Host *host);
308: static struct Scsi_Host *first_instance = NULL;
309: static Scsi_Host_Template *the_template = NULL;
310:
311: /*
312: * Function : void initialize_SCp(Scsi_Cmnd *cmd)
313: *
314: * Purpose : initialize the saved data pointers for cmd to point to the
315: * start of the buffer.
316: *
317: * Inputs : cmd - Scsi_Cmnd structure to have pointers reset.
318: */
319:
320: static __inline__ void initialize_SCp(Scsi_Cmnd *cmd) {
321: /*
322: * Initialize the Scsi Pointer field so that all of the commands in the
323: * various queues are valid.
324: */
325:
326: if (cmd->use_sg) {
327: cmd->SCp.buffer = (struct scatterlist *) cmd->buffer;
328: cmd->SCp.buffers_residual = cmd->use_sg - 1;
329: cmd->SCp.ptr = (char *) cmd->SCp.buffer->address;
330: cmd->SCp.this_residual = cmd->SCp.buffer->length;
331: } else {
332: cmd->SCp.buffer = NULL;
333: cmd->SCp.buffers_residual = 0;
334: cmd->SCp.ptr = (char *) cmd->request_buffer;
335: cmd->SCp.this_residual = cmd->request_bufflen;
336: }
337: }
338:
339: #include <linux/delay.h>
340:
341: #ifdef NDEBUG
342: static struct {
343: unsigned char mask;
344: const char * name;}
345: signals[] = {{ SR_DBP, "PARITY"}, { SR_RST, "RST" }, { SR_BSY, "BSY" },
346: { SR_REQ, "REQ" }, { SR_MSG, "MSG" }, { SR_CD, "CD" }, { SR_IO, "IO" },
347: { SR_SEL, "SEL" }, {0, NULL}},
348: basrs[] = {{BASR_ATN, "ATN"}, {BASR_ACK, "ACK"}, {0, NULL}},
349: icrs[] = {{ICR_ASSERT_RST, "ASSERT RST"},{ICR_ASSERT_ACK, "ASSERT ACK"},
350: {ICR_ASSERT_BSY, "ASSERT BSY"}, {ICR_ASSERT_SEL, "ASSERT SEL"},
351: {ICR_ASSERT_ATN, "ASSERT ATN"}, {ICR_ASSERT_DATA, "ASSERT DATA"},
352: {0, NULL}},
353: mrs[] = {{MR_BLOCK_DMA_MODE, "MODE BLOCK DMA"}, {MR_TARGET, "MODE TARGET"},
354: {MR_ENABLE_PAR_CHECK, "MODE PARITY CHECK"}, {MR_ENABLE_PAR_INTR,
355: "MODE PARITY INTR"}, {MR_MONITOR_BSY, "MODE MONITOR BSY"},
356: {MR_DMA_MODE, "MODE DMA"}, {MR_ARBITRATE, "MODE ARBITRATION"},
357: {0, NULL}};
358:
359: /*
360: * Function : void NCR5380_print(struct Scsi_Host *instance)
361: *
362: * Purpose : print the SCSI bus signals for debugging purposes
363: *
364: * Input : instance - which NCR5380
365: */
366:
367: static void NCR5380_print(struct Scsi_Host *instance) {
368: NCR5380_local_declare();
369: unsigned char status, data, basr, mr, icr, i;
370: NCR5380_setup(instance);
371: cli();
372: data = NCR5380_read(CURRENT_SCSI_DATA_REG);
373: status = NCR5380_read(STATUS_REG);
374: mr = NCR5380_read(MODE_REG);
375: icr = NCR5380_read(INITIATOR_COMMAND_REG);
376: basr = NCR5380_read(BUS_AND_STATUS_REG);
377: sti();
378: printk("STATUS_REG: %02x ", status);
379: for (i = 0; signals[i].mask ; ++i)
380: if (status & signals[i].mask)
381: printk(",%s", signals[i].name);
382: printk("\nBASR: %02x ", basr);
383: for (i = 0; basrs[i].mask ; ++i)
384: if (basr & basrs[i].mask)
385: printk(",%s", basrs[i].name);
386: printk("\nICR: %02x ", icr);
387: for (i = 0; icrs[i].mask; ++i)
388: if (icr & icrs[i].mask)
389: printk(",%s", icrs[i].name);
390: printk("\nMODE: %02x ", mr);
391: for (i = 0; mrs[i].mask; ++i)
392: if (mr & mrs[i].mask)
393: printk(",%s", mrs[i].name);
394: printk("\n");
395: }
396:
397: static struct {
398: unsigned char value;
399: const char *name;
400: } phases[] = {
401: {PHASE_DATAOUT, "DATAOUT"}, {PHASE_DATAIN, "DATAIN"}, {PHASE_CMDOUT, "CMDOUT"},
402: {PHASE_STATIN, "STATIN"}, {PHASE_MSGOUT, "MSGOUT"}, {PHASE_MSGIN, "MSGIN"},
403: {PHASE_UNKNOWN, "UNKNOWN"}};
404:
405: /*
406: * Function : void NCR5380_print_phase(struct Scsi_Host *instance)
407: *
408: * Purpose : print the current SCSI phase for debugging purposes
409: *
410: * Input : instance - which NCR5380
411: */
412:
413: static void NCR5380_print_phase(struct Scsi_Host *instance) {
414: NCR5380_local_declare();
415: unsigned char status;
416: int i;
417: NCR5380_setup(instance);
418:
419: status = NCR5380_read(STATUS_REG);
420: if (!(status & SR_REQ))
421: printk("scsi%d : REQ not asserted, phase unknown.\n",
422: instance->host_no);
423: else {
424: for (i = 0; (phases[i].value != PHASE_UNKNOWN) &&
425: (phases[i].value != (status & PHASE_MASK)); ++i);
426: printk("scsi%d : phase %s\n", instance->host_no, phases[i].name);
427: }
428: }
429: #endif
430:
431: /*
432: * We need to have our coroutine active given these constraints :
433: * 1. The mutex flag, main_running, can only be set when the main
434: * routine can actually process data, otherwise SCSI commands
435: * will never get issued.
436: *
437: * 2. NCR5380_main() shouldn't be called before it has exited, because
438: * other drivers have had kernel stack overflows in similar
439: * situations.
440: *
441: * 3. We don't want to inline NCR5380_main() because of space concerns,
442: * even though it is only called in two places.
443: *
444: * So, the solution is to set the mutex in an inline wrapper for the
445: * main coroutine, and have the main coroutine exit with interrupts
446: * disabled after the final search through the queues so that no race
447: * conditions are possible.
448: */
449:
450: static volatile int main_running = 0;
451:
452: /*
453: * Function : run_main(void)
454: *
455: * Purpose : insure that the coroutine is running and will process our
456: * request. main_running is checked/set here (in an inline function)
457: * rather than in NCR5380_main itself to reduce the chances of stack
458: * overflow.
459: *
460: */
461:
462: static __inline__ void run_main(void) {
463: cli();
464: if (!main_running) {
465: main_running = 1;
466: NCR5380_main();
467: /*
468: * main_running is cleared in NCR5380_main once it can't do
469: * more work, and NCR5380_main exits with interrupts disabled.
470: */
471: sti();
472: } else
473: sti();
474: }
475:
476: #ifdef USLEEP
477: #ifndef NCR5380_TIMER
478: #error "NCR5380_TIMER must be defined so that this type of NCR5380 driver gets a unique timer."
479: #endif
480:
481: /*
482: * These need tweaking, and would probably work best as per-device
483: * flags initialized differently for disk, tape, cd, etc devices.
484: * People with broken devices are free to experiment as to what gives
485: * the best results for them.
486: *
487: * USLEEP_SLEEP should be a minimum seek time.
488: *
489: * USLEEP_POLL should be a maximum rotational latency.
490: */
491: #ifndef USLEEP_SLEEP
492: /* 20 ms (reasonable hard disk speed) */
493: #define USLEEP_SLEEP 2
494: #endif
495: /* 300 RPM (floppy speed) */
496: #ifndef USLEEP_POLL
497: #define USLEEP_POLL 20
498: #endif
499:
500: static struct Scsi_Host * expires_first = NULL;
501:
502: /*
503: * Function : int should_disconnect (unsigned char cmd)
504: *
505: * Purpose : decide weather a command would normally disconnect or
506: * not, since if it won't disconnect we should go to sleep.
507: *
508: * Input : cmd - opcode of SCSI command
509: *
510: * Returns : DISCONNECT_LONG if we should disconnect for a really long
511: * time (ie always, sleep, look for REQ active, sleep),
512: * DISCONNECT_TIME_TO_DATA if we would only disconnect for a normal
513: * time-to-data delay, DISCONNECT_NONE if this command would return
514: * immediately.
515: *
516: * Future sleep algorithms based on time to data can exploit
517: * something like this so they can differentiate between "normal"
518: * (ie, read, write, seek) and unusual commands (ie, * format).
519: *
520: * Note : We don't deal with commands that handle an immediate disconnect,
521: *
522: */
523:
524: static int should_disconnect (unsigned char cmd) {
525: switch (cmd) {
526: case READ_6:
527: case WRITE_6:
528: case SEEK_6:
529: case READ_10:
530: case WRITE_10:
531: case SEEK_10:
532: return DISCONNECT_TIME_TO_DATA;
533: case FORMAT_UNIT:
534: case SEARCH_HIGH:
535: case SEARCH_LOW:
536: case SEARCH_EQUAL:
537: return DISCONNECT_LONG;
538: default:
539: return DISCONNECT_NONE;
540: }
541: }
542:
543: /*
544: * Assumes instance->time_expires has been set in higher level code.
545: */
546:
547: static int NCR5380_set_timer (struct Scsi_Host *instance) {
548: struct Scsi_Host *tmp, **prev;
549:
550: cli();
551: if (((struct NCR5380_hostdata *) (instance->host_data))->next_timer) {
552: sti();
553: return -1;
554: }
555:
556: for (prev = &expires_first, tmp = expires_first; tmp;
557: prev = &(((struct NCR5380_hostdata *) tmp->host_data)->next_timer),
558: tmp = ((struct NCR5380_hostdata *) tmp->host_data)->next_timer)
559: if (instance->time_expires < tmp->time_expires)
560: break;
561:
562: instance->next_timer = tmp;
563: *prev = instance;
564: timer_table[NCR5380_TIMER].expires = expires_first->time_expires;
565: timer_active |= 1 << NCR5380_TIMER;
566: sti();
567: return 0;
568: }
569:
570: /* Doing something about unwanted reentrancy here might be useful */
571: void NCR5380_timer_fn(void) {
572: struct Scsi_Host *instance;
573: cli();
574: for (; expires_first && expires_first->time_expires >= jiffies; ) {
575: instance = ((NCR5380_hostdata *) expires_first->host_data)->
576: expires_next;
577: ((NCR5380_hostdata *) expires_first->host_data)->expires_next =
578: NULL;
579: ((NCR5380_hostdata *) expires_first->host_data)->time_expires =
580: 0;
581: expires_first = instance;
582: }
583:
584: if (expires_first) {
585: timer_table[NCR5380_TIMER].expires = ((NCR5380_hostdata *)
586: expires_first->host_data)->time_expires;
587: timer_active |= (1 << NCR5380_TIMER);
588: } else {
589: timer_table[NCR5380_TIMER].expires = 0;
590: timer_active &= ~(1 << MCR5380_TIMER);
591: }
592: sti();
593:
594: run_main();
595: }
596: #endif /* def USLEEP */
597:
598: static void NCR5380_all_init (void) {
599: static int done = 0;
600: if (!done) {
601: #if (NDEBUG & NDEBUG_INIT)
602: printk("scsi : NCR5380_all_init()\n");
603: #endif
604: done = 1;
605: #ifdef USLEEP
606: timer_table[NCR5380_TIMER].expires = 0;
607: timer_table[NCR5380_TIMER].fn = NCR5380_timer_fn;
608: #endif
609: }
610: }
611:
612: #ifdef AUTOPROBE_IRQ
613: /*
614: * Function : int NCR5380_probe_irq (struct Scsi_Host *instance, int possible)
615: *
616: * Purpose : autoprobe for the IRQ line used by the NCR5380.
617: *
618: * Inputs : instance - pointer to this instance of the NCR5380 driver,
619: * possible - bitmask of permissible interrupts.
620: *
621: * Returns : number of the IRQ selected, IRQ_NONE if no interrupt fired.
622: *
623: * XXX no effort is made to deal with spurious interrupts.
624: */
625:
626:
627: static int probe_irq;
628: static void probe_intr (int irq, struct pt_regs * regs) {
629: probe_irq = irq;
630: };
631:
632: static int NCR5380_probe_irq (struct Scsi_Host *instance, int possible) {
633: NCR5380_local_declare();
634: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
635: instance->hostdata;
636: unsigned long timeout;
637: int trying_irqs, i, mask;
638: NCR5380_setup(instance);
639:
640: for (trying_irqs = i = 0, mask = 1; i < 16; ++i, mask <<= 1)
641: if ((mask & possible) && (request_irq(i, &probe_intr, SA_INTERRUPT, "NCR-probe")
642: == 0))
643: trying_irqs |= mask;
644:
645: timeout = jiffies + 25;
646: probe_irq = IRQ_NONE;
647:
648: /*
649: * A interrupt is triggered whenever BSY = false, SEL = true
650: * and a bit set in the SELECT_ENABLE_REG is asserted on the
651: * SCSI bus.
652: *
653: * Note that the bus is only driven when the phase control signals
654: * (I/O, C/D, and MSG) match those in the TCR, so we must reset that
655: * to zero.
656: */
657:
658: NCR5380_write(TARGET_COMMAND_REG, 0);
659: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
660: NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask);
661: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_DATA |
662: ICR_ASSERT_SEL);
663:
664: while (probe_irq == IRQ_NONE && jiffies < timeout)
665: barrier();
666:
667: NCR5380_write(SELECT_ENABLE_REG, 0);
668: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
669:
670: for (i = 0, mask = 1; i < 16; ++i, mask <<= 1)
671: if (trying_irqs & mask)
672: free_irq(i);
673:
674: return probe_irq;
675: }
676: #endif /* AUTOPROBE_IRQ */
677:
678: /*
679: * Function : void NCR58380_print_options (struct Scsi_Host *instance)
680: *
681: * Purpose : called by probe code indicating the NCR5380 driver
682: * options that were selected.
683: *
684: * Inputs : instance, pointer to this instance. Unused.
685: */
686:
687: static void NCR5380_print_options (struct Scsi_Host *instance) {
688: printk(" generic options"
689: #ifdef AUTOPROBE_IRQ
690: " AUTOPROBE_IRQ"
691: #endif
692: #ifdef AUTOSENSE
693: " AUTOSENSE"
694: #endif
695: #ifdef DIFFERENTIAL
696: " DIFFERENTIAL"
697: #endif
698: #ifdef REAL_DMA
699: " REAL DMA"
700: #endif
701: #ifdef REAL_DMA_POLL
702: " REAL DMA POLL"
703: #endif
704: #ifdef PARITY
705: " PARITY"
706: #endif
707: #ifdef PSEUDO_DMA
708: " PSEUDO DMA"
709: #endif
710: #ifdef SCSI2
711: " SCSI-2"
712: #endif
713: #ifdef UNSAFE
714: " UNSAFE "
715: #endif
716: );
717: #ifdef USLEEP
718: printk(" USLEEP, USLEEP_POLL=%d USLEEP_SLEEP=%d", USLEEP_POLL, USLEEP_SLEEP);
719: #endif
720: printk(" generic release=%d", NCR5380_PUBLIC_RELEASE);
721: if (((struct NCR5380_hostdata *)instance->hostdata)->flags & FLAG_NCR53C400) {
722: printk(" ncr53c400 release=%d", NCR53C400_PUBLIC_RELEASE);
723: }
724: }
725:
726: /*
727: * Function : void NCR5380_print_status (struct Scsi_Host *instance)
728: *
729: * Purpose : print commands in the various queues, called from
730: * NCR5380_abort and NCR5380_debug to aid debugging.
731: *
732: * Inputs : instance, pointer to this instance.
733: */
734:
735: static void NCR5380_print_status (struct Scsi_Host *instance) {
736: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
737: instance->hostdata;
738: Scsi_Cmnd *ptr;
739:
740:
741: printk("NCR5380 : coroutine is%s running.\n",
742: main_running ? "" : "n't");
743:
744: #ifdef NDEBUG
745: NCR5380_print (instance);
746: NCR5380_print_phase (instance);
747: #endif
748:
749: cli();
750: if (!hostdata->connected) {
751: printk ("scsi%d: no currently connected command\n",
752: instance->host_no);
753: } else {
754: print_Scsi_Cmnd ((Scsi_Cmnd *) hostdata->connected);
755: }
756:
757: printk ("scsi%d: issue_queue\n", instance->host_no);
758:
759: for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr;
760: ptr = (Scsi_Cmnd *) ptr->host_scribble)
761: print_Scsi_Cmnd (ptr);
762:
763: printk ("scsi%d: disconnected_queue\n", instance->host_no);
764:
765: for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
766: ptr = (Scsi_Cmnd *) ptr->host_scribble)
767: print_Scsi_Cmnd (ptr);
768:
769: sti();
770: }
771:
772:
773: /*
774: * Function : void NCR5380_init (struct Scsi_Host *instance, flags)
775: *
776: * Purpose : initializes *instance and corresponding 5380 chip,
777: * with flags OR'd into the initial flags value.
778: *
779: * Inputs : instance - instantiation of the 5380 driver.
780: *
781: * Notes : I assume that the host, hostno, and id bits have been
782: * set correctly. I don't care about the irq and other fields.
783: *
784: */
785:
786: static void NCR5380_init (struct Scsi_Host *instance, int flags) {
787: NCR5380_local_declare();
788: int i, pass;
789: unsigned long timeout;
790: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
791: instance->hostdata;
792:
793: /*
794: * On NCR53C400 boards, NCR5380 registers are mapped 8 past
795: * the base address.
796: */
797:
798: #ifdef NCR53C400
799: if (flags & FLAG_NCR53C400)
800: instance->NCR5380_instance_name += NCR53C400_address_adjust;
801: #endif
802:
803: NCR5380_setup(instance);
804:
805: NCR5380_all_init();
806:
807: hostdata->aborted = 0;
808: hostdata->id_mask = 1 << instance->this_id;
809: for (i = hostdata->id_mask; i <= 0x80; i <<= 1)
810: if (i > hostdata->id_mask)
811: hostdata->id_higher_mask |= i;
812: for (i = 0; i < 8; ++i)
813: hostdata->busy[i] = 0;
814: #ifdef REAL_DMA
815: hostdata->dmalen = 0;
816: #endif
817: hostdata->targets_present = 0;
818: hostdata->connected = NULL;
819: hostdata->issue_queue = NULL;
820: hostdata->disconnected_queue = NULL;
821:
822: /* The CHECK code seems to break the 53C400. Will check it later maybe */
823: if (flags & FLAG_NCR53C400)
824: hostdata->flags = FLAG_HAS_LAST_BYTE_SENT | flags;
825: else
826: hostdata->flags = FLAG_CHECK_LAST_BYTE_SENT | flags;
827:
828: if (!the_template) {
829: the_template = instance->hostt;
830: first_instance = instance;
831: }
832:
833:
834: #ifdef USLEEP
835: hostdata->time_expires = 0;
836: hostdata->next_timer = NULL;
837: #endif
838:
839: #ifndef AUTOSENSE
840: if ((instance->cmd_per_lun > 1) || instance->can_queue > 1))
841: printk("scsi%d : WARNING : support for multiple outstanding commands enabled\n"
842: " without AUTOSENSE option, contingent allegiance conditions may\n"
843: " be incorrectly cleared.\n", instance->host_no);
844: #endif /* def AUTOSENSE */
845:
846: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
847: NCR5380_write(MODE_REG, MR_BASE);
848: NCR5380_write(TARGET_COMMAND_REG, 0);
849: NCR5380_write(SELECT_ENABLE_REG, 0);
850:
851: #ifdef NCR53C400
852: if (hostdata->flags & FLAG_NCR53C400) {
853: NCR5380_write(C400_CONTROL_STATUS_REG, CSR_BASE);
854: }
855: #endif
856:
857: /*
858: * Detect and correct bus wedge problems.
859: *
860: * If the system crashed, it may have crashed in a state
861: * where a SCSI command was still executing, and the
862: * SCSI bus is not in a BUS FREE STATE.
863: *
864: * If this is the case, we'll try to abort the currently
865: * established nexus which we know nothing about, and that
866: * failing, do a hard reset of the SCSI bus
867: */
868:
869: for (pass = 1; (NCR5380_read(STATUS_REG) & SR_BSY) &&
870: pass <= 6 ; ++pass) {
871: switch (pass) {
872: case 1:
873: case 3:
874: case 5:
875: printk("scsi%d: SCSI bus busy, waiting up to five seconds\n",
876: instance->host_no);
877: timeout = jiffies + 500;
878: while (jiffies < timeout && (NCR5380_read(STATUS_REG) & SR_BSY));
879: break;
880: case 2:
881: printk("scsi%d: bus busy, attempting abort\n",
882: instance->host_no);
883: do_abort (instance);
884: break;
885: case 4:
886: printk("scsi%d: bus busy, attempting reset\n",
887: instance->host_no);
888: do_reset (instance);
889: break;
890: case 6:
891: printk("scsi%d: bus locked solid or invalid override\n",
892: instance->host_no);
893: }
894: }
895: }
896:
897: /*
898: * Function : int NCR5380_queue_command (Scsi_Cmnd *cmd,
899: * void (*done)(Scsi_Cmnd *))
900: *
901: * Purpose : enqueues a SCSI command
902: *
903: * Inputs : cmd - SCSI command, done - function called on completion, with
904: * a pointer to the command descriptor.
905: *
906: * Returns : 0
907: *
908: * Side effects :
909: * cmd is added to the per instance issue_queue, with minor
910: * twiddling done to the host specific fields of cmd. If the
911: * main coroutine is not running, it is restarted.
912: *
913: */
914:
915: /* Only make static if a wrapper function is used */
916: #ifndef NCR5380_queue_command
917: static
918: #endif
919: int NCR5380_queue_command (Scsi_Cmnd *cmd, void (*done)(Scsi_Cmnd *)) {
920: struct Scsi_Host *instance = cmd->host;
921: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
922: instance->hostdata;
923: Scsi_Cmnd *tmp;
924:
925: #if (NDEBUG & NDEBUG_NO_WRITE)
926: switch (cmd->cmnd[0]) {
927: case WRITE:
928: case WRITE_10:
929: printk("scsi%d : WRITE attempted with NO_WRITE debugging flag set\n",
930: instance->host_no);
931: cmd->result = (DID_ERROR << 16);
932: done(cmd);
933: return 0;
934: }
935: #endif /* (NDEBUG & NDEBUG_NO_WRITE) */
936:
937:
938: /*
939: * We use the host_scribble field as a pointer to the next command
940: * in a queue
941: */
942:
943: cmd->host_scribble = NULL;
944: cmd->scsi_done = done;
945:
946: cmd->result = 0;
947:
948:
949: /*
950: * Insert the cmd into the issue queue. Note that REQUEST SENSE
951: * commands are added to the head of the queue since any command will
952: * clear the contingent allegiance condition that exists and the
953: * sense data is only guaranteed to be valid while the condition exists.
954: */
955:
956: cli();
957: if (!(hostdata->issue_queue) || (cmd->cmnd[0] == REQUEST_SENSE)) {
958: LIST(cmd, hostdata->issue_queue);
959: cmd->host_scribble = (unsigned char *) hostdata->issue_queue;
960: hostdata->issue_queue = cmd;
961: } else {
962: for (tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp->host_scribble;
963: tmp = (Scsi_Cmnd *) tmp->host_scribble);
964: LIST(cmd, tmp);
965: tmp->host_scribble = (unsigned char *) cmd;
966: }
967: #if (NDEBUG & NDEBUG_QUEUES)
968: printk("scsi%d : command added to %s of queue\n", instance->host_no,
969: (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail");
970: #endif
971:
972: /* Run the coroutine if it isn't already running. */
973: run_main();
974: return 0;
975: }
976:
977: /*
978: * Function : NCR5380_main (void)
979: *
980: * Purpose : NCR5380_main is a coroutine that runs as long as more work can
981: * be done on the NCR5380 host adapters in a system. Both
982: * NCR5380_queue_command() and NCR5380_intr() will try to start it
983: * in case it is not running.
984: *
985: * NOTE : NCR5380_main exits with interrupts *disabled*, the caller should
986: * reenable them. This prevents reentrancy and kernel stack overflow.
987: */
988:
989: static void NCR5380_main (void) {
990: Scsi_Cmnd *tmp, *prev;
991: struct Scsi_Host *instance;
992: struct NCR5380_hostdata *hostdata;
993: int done;
994:
995: /*
996: * We run (with interrupts disabled) until we're sure that none of
997: * the host adapters have anything that can be done, at which point
998: * we set main_running to 0 and exit.
999: *
1000: * Interrupts are enabled before doing various other internal
1001: * instructions, after we've decided that we need to run through
1002: * the loop again.
1003: *
1004: * this should prevent any race conditions.
1005: */
1006:
1007: do {
1008: cli(); /* Freeze request queues */
1009: done = 1;
1010: for (instance = first_instance; instance &&
1011: instance->hostt == the_template; instance=instance->next) {
1012: hostdata = (struct NCR5380_hostdata *) instance->hostdata;
1013: cli();
1014: if (!hostdata->connected) {
1015: #if (NDEBUG & NDEBUG_MAIN)
1016: printk("scsi%d : not connected\n", instance->host_no);
1017: #endif
1018: /*
1019: * Search through the issue_queue for a command destined
1020: * for a target that's not busy.
1021: */
1022: #if (NDEBUG & NDEBUG_LISTS)
1023: for (tmp= (Scsi_Cmnd *) hostdata->issue_queue, prev=NULL; tmp && (tmp != prev); prev=tmp, tmp=(Scsi_Cmnd*)tmp->host_scribble)
1024: ;
1025: /*printk("%p ", tmp);*/
1026: if ((tmp == prev) && tmp) printk(" LOOP\n");/* else printk("\n");*/
1027: #endif
1028: for (tmp = (Scsi_Cmnd *) hostdata->issue_queue,
1029: prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *)
1030: tmp->host_scribble) {
1031:
1032: #if (NDEBUG & NDEBUG_LISTS)
1033: if (prev != tmp)
1034: printk("MAIN tmp=%p target=%d busy=%d lun=%d\n", tmp, tmp->target, hostdata->busy[tmp->target], tmp->lun);
1035: #endif
1036: /* When we find one, remove it from the issue queue. */
1037: if (!(hostdata->busy[tmp->target] & (1 << tmp->lun))) {
1038: if (prev) {
1039: REMOVE(prev,prev->host_scribble,tmp,tmp->host_scribble);
1040: prev->host_scribble = tmp->host_scribble;
1041: } else {
1042: REMOVE(-1,hostdata->issue_queue,tmp,tmp->host_scribble);
1043: hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble;
1044: }
1045: tmp->host_scribble = NULL;
1046:
1047: /* reenable interrupts after finding one */
1048: sti();
1049:
1050: /*
1051: * Attempt to establish an I_T_L nexus here.
1052: * On success, instance->hostdata->connected is set.
1053: * On failure, we must add the command back to the
1054: * issue queue so we can keep trying.
1055: */
1056: #if (NDEBUG & (NDEBUG_MAIN | NDEBUG_QUEUES))
1057: printk("scsi%d : main() : command for target %d lun %d removed from issue_queue\n",
1058: instance->host_no, tmp->target, tmp->lun);
1059: #endif
1060:
1061: /*
1062: * A successful selection is defined as one that
1063: * leaves us with the command connected and
1064: * in hostdata->connected, OR has terminated the
1065: * command.
1066: *
1067: * With successfull commands, we fall through
1068: * and see if we can do an information transfer,
1069: * with failures we will restart.
1070: */
1071:
1072: if (!NCR5380_select(instance, tmp,
1073: /*
1074: * REQUEST SENSE commands are issued without tagged
1075: * queueing, even on SCSI-II devices because the
1076: * contingent allegiance condition exists for the
1077: * entire unit.
1078: */
1079: (tmp->cmnd[0] == REQUEST_SENSE) ? TAG_NONE :
1080: TAG_NEXT)) {
1081: break;
1082: } else {
1083: cli();
1084: LIST(tmp, hostdata->issue_queue);
1085: tmp->host_scribble = (unsigned char *)
1086: hostdata->issue_queue;
1087: hostdata->issue_queue = tmp;
1088: done = 0;
1089: sti();
1090: #if (NDEBUG & (NDEBUG_MAIN | NDEBUG_QUEUES))
1091: printk("scsi%d : main(): select() failed, returned to issue_queue\n",
1092: instance->host_no);
1093: #endif
1094: }
1095: } /* if target/lun is not busy */
1096: } /* for */
1097: } /* if (!hostdata->connected) */
1098:
1099: if (hostdata->connected
1100: #ifdef REAL_DMA
1101: && !hostdata->dmalen
1102: #endif
1103: #ifdef USLEEP
1104: && (!hostdata->time_expires || hostdata->time_expires >= jiffies)
1105: #endif
1106: ) {
1107: sti();
1108: #if (NDEBUG & NDEBUG_MAIN)
1109: printk("scsi%d : main() : performing information transfer\n",
1110: instance->host_no);
1111: #endif
1112: NCR5380_information_transfer(instance);
1113: #if (NDEBUG & NDEBUG_MAIN)
1114: printk("scsi%d : main() : done set false\n", instance->host_no);
1115: #endif
1116: done = 0;
1117: } else
1118: break;
1119: } /* for instance */
1120: } while (!done);
1121: main_running = 0;
1122: }
1123:
1124: /*
1125: * Function : void NCR5380_intr (int irq)
1126: *
1127: * Purpose : handle interrupts, reestablishing I_T_L or I_T_L_Q nexuses
1128: * from the disconnected queue, and restarting NCR5380_main()
1129: * as required.
1130: *
1131: * Inputs : int irq, irq that caused this interrupt.
1132: *
1133: */
1134:
1135: static void NCR5380_intr (int irq, struct pt_regs * regs) {
1136: NCR5380_local_declare();
1137: struct Scsi_Host *instance;
1138: int done;
1139: unsigned char basr;
1140: #if (NDEBUG & NDEBUG_INTR)
1141: printk("scsi : NCR5380 irq %d triggered\n", irq);
1142: #endif
1143: do {
1144: done = 1;
1145: for (instance = first_instance; instance && (instance->hostt ==
1146: the_template); instance = instance->next)
1147: if (instance->irq == irq) {
1148:
1149: /* Look for pending interrupts */
1150: NCR5380_setup(instance);
1151: basr = NCR5380_read(BUS_AND_STATUS_REG);
1152: /* XXX dispatch to appropriate routine if found and done=0 */
1153: if (basr & BASR_IRQ) {
1154: #if (NDEBUG & NDEBUG_INTR)
1155: NCR5380_print(instance);
1156: #endif
1157: if ((NCR5380_read(STATUS_REG) & (SR_SEL | SR_IO)) ==
1158: (SR_SEL | SR_IO)) {
1159: done = 0;
1160: sti();
1161: #if (NDEBUG & NDEBUG_INTR)
1162: printk("scsi%d : SEL interrupt\n", instance->host_no);
1163: #endif
1164: NCR5380_reselect(instance);
1165: (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
1166: } else if (basr & BASR_PARITY_ERROR) {
1167: #if (NDEBUG & NDEBUG_INTR)
1168: printk("scsi%d : PARITY interrupt\n", instance->host_no);
1169: #endif
1170: (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
1171: } else if ((NCR5380_read(STATUS_REG) & SR_RST) == SR_RST) {
1172: #if (NDEBUG & NDEBUG_INTR)
1173: printk("scsi%d : RESET interrupt\n", instance->host_no);
1174: #endif
1175: (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
1176: } else {
1177: /*
1178: * XXX the rest of the interrupt conditions should *only* occur during a
1179: * DMA transfer, which I haven't gotten around to fixing yet.
1180: */
1181:
1182: #if defined(REAL_DMA)
1183: /*
1184: * We should only get PHASE MISMATCH and EOP interrupts
1185: * if we have DMA enabled, so do a sanity check based on
1186: * the current setting of the MODE register.
1187: */
1188:
1189: if ((NCR5380_read(MODE_REG) & MR_DMA) && ((basr &
1190: BASR_END_DMA_TRANSFER) ||
1191: !(basr & BASR_PHASE_MATCH))) {
1192: int transfered;
1193:
1194: if (!hostdata->connected)
1195: panic("scsi%d : received end of DMA interrupt with no connected cmd\n",
1196: instance->hostno);
1197:
1198: transfered = (hostdata->dmalen - NCR5380_dma_residual(instance));
1199: hostdata->connected->SCp.this_residual -= transferred;
1200: hostdata->connected->SCp.ptr += transferred;
1201: hostdata->dmalen = 0;
1202:
1203: (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
1204: #if NCR_TIMEOUT
1205: {
1206: unsigned long timeout = jiffies + NCR_TIMEOUT;
1207:
1208: while (NCR5380_read(BUS_AND_STATUS_REG) & BASR_ACK
1209: && jiffies < timeout)
1210: ;
1211: if (jiffies >= timeout)
1212: printk("scsi%d: timeout at NCR5380.c:%d\n",
1213: host->host_no, __LINE__);
1214: }
1215: #else /* NCR_TIMEOUT */
1216: while (NCR5380_read(BUS_AND_STATUS_REG) & BASR_ACK);
1217: #endif
1218:
1219: NCR5380_write(MODE_REG, MR_BASE);
1220: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1221: }
1222: #else
1223: #if (NDEBUG & NDEBUG_INTR)
1224: printk("scsi : unknown interrupt, BASR 0x%X, MR 0x%X, SR 0x%x\n", basr, NCR5380_read(MODE_REG), NCR5380_read(STATUS_REG));
1225: #endif
1226: (void) NCR5380_read(RESET_PARITY_INTERRUPT_REG);
1227: #endif
1228: }
1229: } /* if BASR_IRQ */
1230: if (!done)
1231: run_main();
1232: } /* if (instance->irq == irq) */
1233: } while (!done);
1234: }
1235:
1236: /*
1237: * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd,
1238: * int tag);
1239: *
1240: * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
1241: * including ARBITRATION, SELECTION, and initial message out for
1242: * IDENTIFY and queue messages.
1243: *
1244: * Inputs : instance - instantiation of the 5380 driver on which this
1245: * target lives, cmd - SCSI command to execute, tag - set to TAG_NEXT for
1246: * new tag, TAG_NONE for untagged queueing, otherwise set to the tag for
1247: * the command that is presently connected.
1248: *
1249: * Returns : -1 if selection could not execute for some reason,
1250: * 0 if selection succeeded or failed because the target
1251: * did not respond.
1252: *
1253: * Side effects :
1254: * If bus busy, arbitration failed, etc, NCR5380_select() will exit
1255: * with registers as they should have been on entry - ie
1256: * SELECT_ENABLE will be set appropriately, the NCR5380
1257: * will cease to drive any SCSI bus signals.
1258: *
1259: * If successful : I_T_L or I_T_L_Q nexus will be established,
1260: * instance->connected will be set to cmd.
1261: * SELECT interrupt will be disabled.
1262: *
1263: * If failed (no target) : cmd->scsi_done() will be called, and the
1264: * cmd->result host byte set to DID_BAD_TARGET.
1265: */
1266:
1267: static int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd,
1268: int tag) {
1269: NCR5380_local_declare();
1270: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata*)
1271: instance->hostdata;
1272: unsigned char tmp[3], phase;
1273: unsigned char *data;
1274: int len;
1275: unsigned long timeout;
1276: NCR5380_setup(instance);
1277:
1278: hostdata->restart_select = 0;
1279: #if defined (NDEBUG) && (NDEBUG & NDEBUG_ARBITRATION)
1280: NCR5380_print(instance);
1281: printk("scsi%d : starting arbitration, id = %d\n", instance->host_no,
1282: instance->this_id);
1283: #endif
1284: cli();
1285:
1286: /*
1287: * Set the phase bits to 0, otherwise the NCR5380 won't drive the
1288: * data bus during SELECTION.
1289: */
1290:
1291: NCR5380_write(TARGET_COMMAND_REG, 0);
1292:
1293:
1294: /*
1295: * Start arbitration.
1296: */
1297:
1298: NCR5380_write(OUTPUT_DATA_REG, hostdata->id_mask);
1299: NCR5380_write(MODE_REG, MR_ARBITRATE);
1300:
1301: sti();
1302:
1303: /* Wait for arbitration logic to complete */
1304: #if NCR_TIMEOUT
1305: {
1306: unsigned long timeout = jiffies + 2*NCR_TIMEOUT;
1307:
1308: while (!(NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_PROGRESS)
1309: && jiffies < timeout)
1310: ;
1311: if (jiffies >= timeout)
1312: {
1313: printk("scsi: arbitration timeout at %d\n", __LINE__);
1314: NCR5380_write(MODE_REG, MR_BASE);
1315: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
1316: return -1;
1317: }
1318: }
1319: #else /* NCR_TIMEOUT */
1320: while (!(NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_PROGRESS));
1321: #endif
1322:
1323: #if (NDEBUG & NDEBUG_ARBITRATION)
1324: printk("scsi%d : arbitration complete\n", instance->host_no);
1325: /* Avoid GCC 2.4.5 asm needs to many reloads error */
1326: __asm__("nop");
1327: #endif
1328:
1329: /*
1330: * The arbitration delay is 2.2us, but this is a minimum and there is
1331: * no maximum so we can safely sleep for ceil(2.2) usecs to accommodate
1332: * the integral nature of udelay().
1333: *
1334: */
1335:
1336: udelay(3);
1337:
1338: /* Check for lost arbitration */
1339: if ((NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) ||
1340: (NCR5380_read(CURRENT_SCSI_DATA_REG) & hostdata->id_higher_mask) ||
1341: (NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST)) {
1342: NCR5380_write(MODE_REG, MR_BASE);
1343: #if (NDEBUG & NDEBUG_ARBITRATION)
1344: printk("scsi%d : lost arbitration, deasserting MR_ARBITRATE\n",
1345: instance->host_no);
1346: #endif
1347: return -1;
1348: }
1349:
1350:
1351:
1352: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_SEL);
1353:
1354: if (NCR5380_read(INITIATOR_COMMAND_REG) & ICR_ARBITRATION_LOST) {
1355: NCR5380_write(MODE_REG, MR_BASE);
1356: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1357: #if (NDEBUG & NDEBUG_ARBITRATION)
1358: printk("scsi%d : lost arbitration, deasserting ICR_ASSERT_SEL\n",
1359: instance->host_no);
1360: #endif
1361: return -1;
1362: }
1363:
1364: /*
1365: * Again, bus clear + bus settle time is 1.2us, however, this is
1366: * a minimum so we'll udelay ceil(1.2)
1367: */
1368:
1369: udelay(2);
1370:
1371: #if (NDEBUG & NDEBUG_ARBITRATION)
1372: printk("scsi%d : won arbitration\n", instance->host_no);
1373: #endif
1374:
1375:
1376: /*
1377: * Now that we have won arbitration, start Selection process, asserting
1378: * the host and target ID's on the SCSI bus.
1379: */
1380:
1381: NCR5380_write(OUTPUT_DATA_REG, (hostdata->id_mask | (1 << cmd->target)));
1382:
1383: /*
1384: * Raise ATN while SEL is true before BSY goes false from arbitration,
1385: * since this is the only way to guarantee that we'll get a MESSAGE OUT
1386: * phase immediately after selection.
1387: */
1388:
1389: NCR5380_write(INITIATOR_COMMAND_REG, (ICR_BASE | ICR_ASSERT_BSY |
1390: ICR_ASSERT_DATA | ICR_ASSERT_ATN | ICR_ASSERT_SEL ));
1391: NCR5380_write(MODE_REG, MR_BASE);
1392:
1393: /*
1394: * Reselect interrupts must be turned off prior to the dropping of BSY,
1395: * otherwise we will trigger an interrupt.
1396: */
1397: NCR5380_write(SELECT_ENABLE_REG, 0);
1398:
1399: /*
1400: * The initiator shall then wait at least two deskew delays and release
1401: * the BSY signal.
1402: */
1403: udelay(1); /* wingel -- wait two bus deskew delay >2*45ns */
1404:
1405: /* Reset BSY */
1406: NCR5380_write(INITIATOR_COMMAND_REG, (ICR_BASE | ICR_ASSERT_DATA |
1407: ICR_ASSERT_ATN | ICR_ASSERT_SEL));
1408:
1409: /*
1410: * Something weird happens when we cease to drive BSY - looks
1411: * like the board/chip is letting us do another read before the
1412: * appropriate propagation delay has expired, and we're confusing
1413: * a BSY signal from ourselves as the target's response to SELECTION.
1414: *
1415: * A small delay (the 'C++' frontend breaks the pipeline with an
1416: * unnecessary jump, making it work on my 386-33/Trantor T128, the
1417: * tighter 'C' code breaks and requires this) solves the problem -
1418: * the 1 us delay is arbitrary, and only used because this delay will
1419: * be the same on other platforms and since it works here, it should
1420: * work there.
1421: *
1422: * wingel suggests that this could be due to failing to wait
1423: * one deskew delay.
1424: */
1425:
1426: udelay(1);
1427:
1428: #if (NDEBUG & NDEBUG_SELECTION)
1429: printk("scsi%d : selecting target %d\n", instance->host_no, cmd->target);
1430: #endif
1431:
1432: /*
1433: * The SCSI specification calls for a 250 ms timeout for the actual
1434: * selection.
1435: */
1436:
1437: timeout = jiffies + 25;
1438:
1439: /*
1440: * XXX very interesting - we're seeing a bounce where the BSY we
1441: * asserted is being reflected / still asserted (propagation delay?)
1442: * and it's detecting as true. Sigh.
1443: */
1444:
1445: while ((jiffies < timeout) && !(NCR5380_read(STATUS_REG) &
1446: (SR_BSY | SR_IO)));
1447:
1448: if ((NCR5380_read(STATUS_REG) & (SR_SEL | SR_IO)) ==
1449: (SR_SEL | SR_IO)) {
1450: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1451: NCR5380_reselect(instance);
1452: printk ("scsi%d : reselection after won arbitration?\n",
1453: instance->host_no);
1454: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
1455: return -1;
1456: }
1457:
1458: /*
1459: * No less than two deskew delays after the initiator detects the
1460: * BSY signal is true, it shall release the SEL signal and may
1461: * change the DATA BUS. -wingel
1462: */
1463:
1464: udelay(1);
1465:
1466: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
1467:
1468: if (!(NCR5380_read(STATUS_REG) & SR_BSY)) {
1469: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1470: if (hostdata->targets_present & (1 << cmd->target)) {
1471: printk("scsi%d : weirdness\n", instance->host_no);
1472: if (hostdata->restart_select)
1473: printk("\trestart select\n");
1474: #ifdef NDEBUG
1475: NCR5380_print (instance);
1476: #endif
1477: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
1478: return -1;
1479: }
1480: cmd->result = DID_BAD_TARGET << 16;
1481: cmd->scsi_done(cmd);
1482: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
1483: #if (NDEBUG & NDEBUG_SELECTION)
1484: printk("scsi%d : target did not respond within 250ms\n",
1485: instance->host_no);
1486: #endif
1487: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
1488: return 0;
1489: }
1490:
1491: hostdata->targets_present |= (1 << cmd->target);
1492:
1493: /*
1494: * Since we followed the SCSI spec, and raised ATN while SEL
1495: * was true but before BSY was false during selection, the information
1496: * transfer phase should be a MESSAGE OUT phase so that we can send the
1497: * IDENTIFY message.
1498: *
1499: * If SCSI-II tagged queuing is enabled, we also send a SIMPLE_QUEUE_TAG
1500: * message (2 bytes) with a tag ID that we increment with every command
1501: * until it wraps back to 0.
1502: *
1503: * XXX - it turns out that there are some broken SCSI-II devices,
1504: * which claim to support tagged queuing but fail when more than
1505: * some number of commands are issued at once.
1506: */
1507:
1508: /* Wait for start of REQ/ACK handshake */
1509: #ifdef NCR_TIMEOUT
1510: {
1511: unsigned long timeout = jiffies + NCR_TIMEOUT;
1512:
1513: while (!(NCR5380_read(STATUS_REG) & SR_REQ) && jiffies < timeout);
1514:
1515: if (jiffies >= timeout) {
1516: printk("scsi%d: timeout at NCR5380.c:%d\n", __LINE__);
1517: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
1518: return -1;
1519: }
1520: }
1521: #else /* NCR_TIMEOUT */
1522: while (!(NCR5380_read(STATUS_REG) & SR_REQ));
1523: #endif /* def NCR_TIMEOUT */
1524:
1525: #if (NDEBUG & NDEBUG_SELECTION)
1526: printk("scsi%d : target %d selected, going into MESSAGE OUT phase.\n",
1527: instance->host_no, cmd->target);
1528: #endif
1529: tmp[0] = IDENTIFY(((instance->irq == IRQ_NONE) ? 0 : 1), cmd->lun);
1530: #ifdef SCSI2
1531: if (cmd->device->tagged_queue && (tag != TAG_NONE)) {
1532: tmp[1] = SIMPLE_QUEUE_TAG;
1533: if (tag == TAG_NEXT) {
1534: /* 0 is TAG_NONE, used to imply no tag for this command */
1535: if (cmd->device->current_tag == 0)
1536: cmd->device->current_tag = 1;
1537:
1538: cmd->tag = cmd->device->current_tag;
1539: cmd->device->current_tag++;
1540: } else
1541: cmd->tag = (unsigned char) tag;
1542:
1543: tmp[2] = cmd->tag;
1544: hostdata->last_message = SIMPLE_QUEUE_TAG;
1545: len = 3;
1546: } else
1547: #endif /* def SCSI2 */
1548: {
1549: len = 1;
1550: cmd->tag=0;
1551: }
1552:
1553: /* Send message(s) */
1554: data = tmp;
1555: phase = PHASE_MSGOUT;
1556: NCR5380_transfer_pio(instance, &phase, &len, &data);
1557: #if (NDEBUG & NDEBUG_SELECTION)
1558: printk("scsi%d : nexus established.\n", instance->host_no);
1559: #endif
1560: /* XXX need to handle errors here */
1561: hostdata->connected = cmd;
1562: #ifdef SCSI2
1563: if (!cmd->device->tagged_queue)
1564: #endif
1565: hostdata->busy[cmd->target] |= (1 << cmd->lun);
1566:
1567: initialize_SCp(cmd);
1568:
1569:
1570: return 0;
1571: }
1572:
1573: /*
1574: * Function : int NCR5380_transfer_pio (struct Scsi_Host *instance,
1575: * unsigned char *phase, int *count, unsigned char **data)
1576: *
1577: * Purpose : transfers data in given phase using polled I/O
1578: *
1579: * Inputs : instance - instance of driver, *phase - pointer to
1580: * what phase is expected, *count - pointer to number of
1581: * bytes to transfer, **data - pointer to data pointer.
1582: *
1583: * Returns : -1 when different phase is entered without transferring
1584: * maximum number of bytes, 0 if all bytes or transfered or exit
1585: * is in same phase.
1586: *
1587: * Also, *phase, *count, *data are modified in place.
1588: *
1589: * XXX Note : handling for bus free may be useful.
1590: */
1591:
1592: /*
1593: * Note : this code is not as quick as it could be, however it
1594: * IS 100% reliable, and for the actual data transfer where speed
1595: * counts, we will always do a pseudo DMA or DMA transfer.
1596: */
1597:
1598: static int NCR5380_transfer_pio (struct Scsi_Host *instance,
1599: unsigned char *phase, int *count, unsigned char **data) {
1600: NCR5380_local_declare();
1601: register unsigned char p = *phase, tmp;
1602: register int c = *count;
1603: register unsigned char *d = *data;
1604: NCR5380_setup(instance);
1605:
1606: #if (NDEBUG & NDEBUG_PIO)
1607: if (!(p & SR_IO))
1608: printk("scsi%d : pio write %d bytes\n", instance->host_no, c);
1609: else
1610: printk("scsi%d : pio read %d bytes\n", instance->host_no, c);
1611: #endif
1612:
1613: /*
1614: * The NCR5380 chip will only drive the SCSI bus when the
1615: * phase specified in the appropriate bits of the TARGET COMMAND
1616: * REGISTER match the STATUS REGISTER
1617: */
1618:
1619: NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p));
1620:
1621: do {
1622: /*
1623: * Wait for assertion of REQ, after which the phase bits will be
1624: * valid
1625: */
1626: while (!((tmp = NCR5380_read(STATUS_REG)) & SR_REQ));
1627:
1628: #if (NDEBUG & NDEBUG_HANDSHAKE)
1629: printk("scsi%d : REQ detected\n", instance->host_no);
1630: #endif
1631:
1632: /* Check for phase mismatch */
1633: if ((tmp & PHASE_MASK) != p) {
1634: #if (NDEBUG & NDEBUG_PIO)
1635: printk("scsi%d : phase mismatch\n", instance->host_no);
1636: NCR5380_print_phase(instance);
1637: #endif
1638: break;
1639: }
1640:
1641: /* Do actual transfer from SCSI bus to / from memory */
1642: if (!(p & SR_IO))
1643: NCR5380_write(OUTPUT_DATA_REG, *d);
1644: else
1645: *d = NCR5380_read(CURRENT_SCSI_DATA_REG);
1646:
1647: ++d;
1648:
1649: /*
1650: * The SCSI standard suggests that in MSGOUT phase, the initiator
1651: * should drop ATN on the last byte of the message phase
1652: * after REQ has been asserted for the handshake but before
1653: * the initiator raises ACK.
1654: */
1655:
1656: if (!(p & SR_IO)) {
1657: if (!((p & SR_MSG) && c > 1)) {
1658: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
1659: ICR_ASSERT_DATA);
1660: #if (NDEBUG & NDEBUG_PIO)
1661: NCR5380_print(instance);
1662: #endif
1663: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
1664: ICR_ASSERT_DATA | ICR_ASSERT_ACK);
1665: } else {
1666: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
1667: ICR_ASSERT_DATA | ICR_ASSERT_ATN);
1668: #if (NDEBUG & NDEBUG_PIO)
1669: NCR5380_print(instance);
1670: #endif
1671: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
1672: ICR_ASSERT_DATA | ICR_ASSERT_ATN | ICR_ASSERT_ACK);
1673: }
1674: } else {
1675: #if (NDEBUG & NDEBUG_PIO)
1676: NCR5380_print(instance);
1677: #endif
1678: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ACK);
1679: }
1680:
1681: while (NCR5380_read(STATUS_REG) & SR_REQ);
1682:
1683: #if (NDEBUG & NDEBUG_HANDSHAKE)
1684: printk("scsi%d : req false, handshake complete\n", instance->host_no);
1685: #endif
1686:
1687: /*
1688: * We have several special cases to consider during REQ/ACK handshaking :
1689: * 1. We were in MSGOUT phase, and we are on the last byte of the
1690: * message. ATN must be dropped as ACK is dropped.
1691: *
1692: * 2. We are in a MSGIN phase, and we are on the last byte of the
1693: * message. We must exit with ACK asserted, so that the calling
1694: * code may raise ATN before dropping ACK to reject the message.
1695: *
1696: * 3. ACK and ATN are clear and the target may proceed as normal.
1697: */
1698: if (!(p == PHASE_MSGIN && c == 1)) {
1699: if (p == PHASE_MSGOUT && c > 1)
1700: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
1701: else
1702: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1703: }
1704: } while (--c);
1705:
1706: #if (NDEBUG & NDEBUG_PIO)
1707: printk("scsi%d : residual %d\n", instance->host_no, c);
1708: #endif
1709:
1710: *count = c;
1711: *data = d;
1712: tmp = NCR5380_read(STATUS_REG);
1713: if (tmp & SR_REQ)
1714: *phase = tmp & PHASE_MASK;
1715: else
1716: *phase = PHASE_UNKNOWN;
1717:
1718: if (!c || (*phase == p))
1719: return 0;
1720: else
1721: return -1;
1722: }
1723:
1724: static void do_reset (struct Scsi_Host *host) {
1725: NCR5380_local_declare();
1726: NCR5380_setup(host);
1727:
1728: cli();
1729: NCR5380_write(TARGET_COMMAND_REG,
1730: PHASE_SR_TO_TCR(NCR5380_read(STATUS_REG) & PHASE_MASK));
1731: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_RST);
1732: udelay(25);
1733: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1734: sti();
1735: }
1736:
1737: /*
1738: * Function : do_abort (Scsi_Host *host)
1739: *
1740: * Purpose : abort the currently established nexus. Should only be
1741: * called from a routine which can drop into a
1742: *
1743: * Returns : 0 on success, -1 on failure.
1744: */
1745:
1746: static int do_abort (struct Scsi_Host *host) {
1747: NCR5380_local_declare();
1748: unsigned char tmp, *msgptr, phase;
1749: int len;
1750: NCR5380_setup(host);
1751:
1752:
1753: /* Request message out phase */
1754: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
1755:
1756: /*
1757: * Wait for the target to indicate a valid phase by asserting
1758: * REQ. Once this happens, we'll have either a MSGOUT phase
1759: * and can immediately send the ABORT message, or we'll have some
1760: * other phase and will have to source/sink data.
1761: *
1762: * We really don't care what value was on the bus or what value
1763: * the target see's, so we just handshake.
1764: */
1765:
1766: while (!(tmp = NCR5380_read(STATUS_REG)) & SR_REQ);
1767:
1768: NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
1769:
1770: if ((tmp & PHASE_MASK) != PHASE_MSGOUT) {
1771: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN |
1772: ICR_ASSERT_ACK);
1773: while (NCR5380_read(STATUS_REG) & SR_REQ);
1774: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN);
1775: }
1776:
1777: tmp = ABORT;
1778: msgptr = &tmp;
1779: len = 1;
1780: phase = PHASE_MSGOUT;
1781: NCR5380_transfer_pio (host, &phase, &len, &msgptr);
1782:
1783: /*
1784: * If we got here, and the command completed successfully,
1785: * we're about to go into bus free state.
1786: */
1787:
1788: return len ? -1 : 0;
1789: }
1790:
1791: #if defined(REAL_DMA) || defined(PSEUDO_DMA) || defined (REAL_DMA_POLL)
1792: /*
1793: * Function : int NCR5380_transfer_dma (struct Scsi_Host *instance,
1794: * unsigned char *phase, int *count, unsigned char **data)
1795: *
1796: * Purpose : transfers data in given phase using either real
1797: * or pseudo DMA.
1798: *
1799: * Inputs : instance - instance of driver, *phase - pointer to
1800: * what phase is expected, *count - pointer to number of
1801: * bytes to transfer, **data - pointer to data pointer.
1802: *
1803: * Returns : -1 when different phase is entered without transferring
1804: * maximum number of bytes, 0 if all bytes or transfered or exit
1805: * is in same phase.
1806: *
1807: * Also, *phase, *count, *data are modified in place.
1808: *
1809: */
1810:
1811:
1812: static int NCR5380_transfer_dma (struct Scsi_Host *instance,
1813: unsigned char *phase, int *count, unsigned char **data) {
1814: NCR5380_local_declare();
1815: register int c = *count;
1816: register unsigned char p = *phase;
1817: register unsigned char *d = *data;
1818: unsigned char tmp;
1819: int foo;
1820: #if defined(REAL_DMA_POLL)
1821: int cnt, toPIO;
1822: unsigned char saved_data = 0, overrun = 0, residue;
1823: #endif
1824:
1825: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
1826: instance->hostdata;
1827:
1828: NCR5380_setup(instance);
1829:
1830: if ((tmp = (NCR5380_read(STATUS_REG) & PHASE_MASK)) != p) {
1831: *phase = tmp;
1832: return -1;
1833: }
1834: #if defined(REAL_DMA) || defined(REAL_DMA_POLL)
1835: #ifdef READ_OVERRUNS
1836: if (p & SR_IO) {
1837: c -= 2;
1838: }
1839: #endif
1840: #if (NDEBUG & NDEBUG_DMA)
1841: printk("scsi%d : initializing DMA channel %d for %s, %d bytes %s %0x\n",
1842: instance->host_no, instance->dma_channel, (p & SR_IO) ? "reading" :
1843: "writing", c, (p & SR_IO) ? "to" : "from", (unsigned) d);
1844: #endif
1845: hostdata->dma_len = (p & SR_IO) ?
1846: NCR5380_dma_read_setup(instance, d, c) :
1847: NCR5380_dma_write_setup(instance, d, c);
1848: #endif
1849:
1850: NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(p));
1851:
1852: #ifdef REAL_DMA
1853: NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_ENABLE_EOP_INTR | MR_MONITOR_BSY);
1854: #elif defined(REAL_DMA_POLL)
1855: NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE);
1856: #else
1857: /*
1858: * Note : on my sample board, watch-dog timeouts occurred when interrupts
1859: * were not disabled for the duration of a single DMA transfer, from
1860: * before the setting of DMA mode to after transfer of the last byte.
1861: */
1862:
1863: #if defined(PSEUDO_DMA) && !defined(UNSAFE)
1864: cli();
1865: #endif
1866: /* KLL May need eop and parity in 53c400 */
1867: if (hostdata->flags & FLAG_NCR53C400)
1868: NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE | MR_ENABLE_PAR_CHECK
1869: | MR_ENABLE_PAR_INTR | MR_ENABLE_EOP_INTR | MR_DMA_MODE
1870: | MR_MONITOR_BSY);
1871: else
1872: NCR5380_write(MODE_REG, MR_BASE | MR_DMA_MODE);
1873: #endif /* def REAL_DMA */
1874:
1875: #if (NDEBUG & NDEBUG_DMA) & 0
1876: printk("scsi%d : mode reg = 0x%X\n", instance->host_no, NCR5380_read(MODE_REG));
1877: #endif
1878:
1879: /*
1880: * FOO stuff. For some UNAPPARENT reason, I'm getting
1881: * watchdog timers fired on bootup for NO APPARENT REASON, meaning it's
1882: * probably a timing problem.
1883: *
1884: * Since this is the only place I have back-to-back writes, perhaps this
1885: * is the problem?
1886: */
1887:
1888: if (p & SR_IO) {
1889: #ifndef FOO
1890: udelay(1);
1891: #endif
1892: NCR5380_write(START_DMA_INITIATOR_RECEIVE_REG, 0);
1893: } else {
1894: #ifndef FOO
1895: udelay(1);
1896: #endif
1897: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_DATA);
1898: #ifndef FOO
1899: udelay(1);
1900: #endif
1901: NCR5380_write(START_DMA_SEND_REG, 0);
1902: #ifndef FOO
1903: udelay(1);
1904: #endif
1905: }
1906:
1907: #if defined(REAL_DMA_POLL)
1908: do {
1909: tmp = NCR5380_read(BUS_AND_STATUS_REG);
1910: } while ((tmp & BASR_PHASE_MATCH) && !(tmp & (BASR_BUSY_ERROR |
1911: BASR_END_DMA_TRANSFER)));
1912:
1913: /*
1914: At this point, either we've completed DMA, or we have a phase mismatch,
1915: or we've unexpectedly lost BUSY (which is a real error).
1916:
1917: For write DMAs, we want to wait until the last byte has been
1918: transferred out over the bus before we turn off DMA mode. Alas, there
1919: seems to be no terribly good way of doing this on a 5380 under all
1920: conditions. For non-scatter-gather operations, we can wait until REQ
1921: and ACK both go false, or until a phase mismatch occurs. Gather-writes
1922: are nastier, since the device will be expecting more data than we
1923: are prepared to send it, and REQ will remain asserted. On a 53C8[01] we
1924: could test LAST BIT SENT to assure transfer (I imagine this is precisely
1925: why this signal was added to the newer chips) but on the older 538[01]
1926: this signal does not exist. The workaround for this lack is a watchdog;
1927: we bail out of the wait-loop after a modest amount of wait-time if
1928: the usual exit conditions are not met. Not a terribly clean or
1929: correct solution :-%
1930:
1931: Reads are equally tricky due to a nasty characteristic of the NCR5380.
1932: If the chip is in DMA mode for an READ, it will respond to a target's
1933: REQ by latching the SCSI data into the INPUT DATA register and asserting
1934: ACK, even if it has _already_ been notified by the DMA controller that
1935: the current DMA transfer has completed! If the NCR5380 is then taken
1936: out of DMA mode, this already-acknowledged byte is lost.
1937:
1938: This is not a problem for "one DMA transfer per command" reads, because
1939: the situation will never arise... either all of the data is DMA'ed
1940: properly, or the target switches to MESSAGE IN phase to signal a
1941: disconnection (either operation bringing the DMA to a clean halt).
1942: However, in order to handle scatter-reads, we must work around the
1943: problem. The chosen fix is to DMA N-2 bytes, then check for the
1944: condition before taking the NCR5380 out of DMA mode. One or two extra
1945: bytes are transferred via PIO as necessary to fill out the original
1946: request.
1947: */
1948:
1949: if (p & SR_IO) {
1950: #ifdef READ_OVERRUNS
1951: udelay(10);
1952: if (((NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH|BASR_ACK)) ==
1953: (BASR_PHASE_MATCH | BASR_ACK))) {
1954: saved_data = NCR5380_read(INPUT_DATA_REGISTER);
1955: overrun = 1;
1956: }
1957: #endif
1958: } else {
1959: int limit = 100;
1960: while (((tmp = NCR5380_read(BUS_AND_STATUS_REG)) & BASR_ACK) ||
1961: (NCR5380_read(STATUS_REG) & SR_REQ)) {
1962: if (!(tmp & BASR_PHASE_MATCH)) break;
1963: if (--limit < 0) break;
1964: }
1965: }
1966:
1967:
1968: #if (NDEBUG & NDEBUG_DMA)
1969: printk("scsi%d : polled DMA transfer complete, basr 0x%X, sr 0x%X\n",
1970: instance->host_no, tmp, NCR5380_read(STATUS_REG));
1971: #endif
1972:
1973: NCR5380_write(MODE_REG, MR_BASE);
1974: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
1975:
1976: residue = NCR5380_dma_residual(instance);
1977: c -= residue;
1978: *count -= c;
1979: *data += c;
1980: *phase = NCR5380_read(STATUS_REG) & PHASE_MASK;
1981:
1982: #ifdef READ_OVERRUNS
1983: if (*phase == p && (p & SR_IO) && residue == 0) {
1984: if (overrun) {
1985: #if (NDEBUG & NDEBUG_DMA)
1986: printk("Got an input overrun, using saved byte\n");
1987: #endif
1988: **data = saved_data;
1989: *data += 1;
1990: *count -= 1;
1991: cnt = toPIO = 1;
1992: } else {
1993: printk("No overrun??\n");
1994: cnt = toPIO = 2;
1995: }
1996: #if (NDEBUG & NDEBUG_DMA)
1997: printk("Doing %d-byte PIO to 0x%X\n", cnt, *data);
1998: #endif
1999: NCR5380_transfer_pio(instance, phase, &cnt, data);
2000: *count -= toPIO - cnt;
2001: }
2002: #endif
2003:
2004: #if (NDEBUG & NDEBUG_DMA)
2005: printk("Return with data ptr = 0x%X, count %d, last 0x%X, next 0x%X\n",
2006: *data, *count, *(*data+*count-1), *(*data+*count));
2007: #endif
2008: return 0;
2009:
2010: #elif defined(REAL_DMA)
2011: return 0;
2012: #else /* defined(REAL_DMA_POLL) */
2013: if (p & SR_IO) {
2014: int diff = 1;
2015: if (hostdata->flags & FLAG_NCR53C400) {
2016: diff=0;
2017: }
2018:
2019: if (!(foo = NCR5380_pread(instance, d, c - diff))) {
2020: /*
2021: * We can't disable DMA mode after successfully transferring
2022: * what we plan to be the last byte, since that would open up
2023: * a race condition where if the target asserted REQ before
2024: * we got the DMA mode reset, the NCR5380 would have latched
2025: * an additional byte into the INPUT DATA register and we'd
2026: * have dropped it.
2027: *
2028: * The workaround was to transfer one fewer bytes than we
2029: * intended to with the pseudo-DMA read function, wait for
2030: * the chip to latch the last byte, read it, and then disable
2031: * pseudo-DMA mode.
2032: *
2033: * After REQ is asserted, the NCR5380 asserts DRQ and ACK.
2034: * REQ is deasserted when ACK is asserted, and not reasserted
2035: * until ACK goes false. Since the NCR5380 won't lower ACK
2036: * until DACK is asserted, which won't happen unless we twiddle
2037: * the DMA port or we take the NCR5380 out of DMA mode, we
2038: * can guarantee that we won't handshake another extra
2039: * byte.
2040: */
2041:
2042: if (!(hostdata->flags & FLAG_NCR53C400)) {
2043: while (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_DRQ));
2044: /* Wait for clean handshake */
2045: while (NCR5380_read(STATUS_REG) & SR_REQ);
2046: d[c - 1] = NCR5380_read(INPUT_DATA_REG);
2047: }
2048: }
2049: } else {
2050: int timeout;
2051: #if (NDEBUG & NDEBUG_C400_PWRITE)
2052: printk("About to pwrite %d bytes\n", c);
2053: #endif
2054: if (!(foo = NCR5380_pwrite(instance, d, c))) {
2055: /*
2056: * Wait for the last byte to be sent. If REQ is being asserted for
2057: * the byte we're interested, we'll ACK it and it will go false.
2058: */
2059: if (!(hostdata->flags & FLAG_HAS_LAST_BYTE_SENT)) {
2060: timeout = 20000;
2061: #if 1
2062: #if 1
2063: while (!(NCR5380_read(BUS_AND_STATUS_REG) &
2064: BASR_DRQ) && (NCR5380_read(BUS_AND_STATUS_REG) &
2065: BASR_PHASE_MATCH));
2066: #else
2067: if (NCR5380_read(STATUS_REG) & SR_REQ) {
2068: for (; timeout &&
2069: !(NCR5380_read(BUS_AND_STATUS_REG) & BASR_ACK);
2070: --timeout);
2071: for (; timeout && (NCR5380_read(STATUS_REG) & SR_REQ);
2072: --timeout);
2073: }
2074: #endif
2075:
2076:
2077: #if (NDEBUG & NDEBUG_LAST_BYTE_SENT)
2078: if (!timeout)
2079: printk("scsi%d : timed out on last byte\n",
2080: instance->host_no);
2081: #endif
2082:
2083:
2084: if (hostdata->flags & FLAG_CHECK_LAST_BYTE_SENT) {
2085: hostdata->flags &= ~FLAG_CHECK_LAST_BYTE_SENT;
2086: if (NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT) {
2087: hostdata->flags |= FLAG_HAS_LAST_BYTE_SENT;
2088: #if (NDEBUG & NDEBUG_LAST_BYTE_SENT)
2089: printk("scsi%d : last bit sent works\n",
2090: instance->host_no);
2091: #endif
2092: }
2093: }
2094: } else {
2095: #if (NDEBUG & NDEBUG_C400_PWRITE)
2096: printk("Waiting for LASTBYTE\n");
2097: #endif
2098: while (!(NCR5380_read(TARGET_COMMAND_REG) & TCR_LAST_BYTE_SENT));
2099: #if (NDEBUG & NDEBUG_C400_PWRITE)
2100: printk("Got LASTBYTE\n");
2101: #endif
2102: }
2103: #else
2104: udelay (5);
2105: #endif
2106: }
2107: }
2108:
2109: NCR5380_write(MODE_REG, MR_BASE);
2110: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2111:
2112: if ((!(p & SR_IO)) && (hostdata->flags & FLAG_NCR53C400)) {
2113: #if (NDEBUG & NDEBUG_C400_PWRITE)
2114: printk("53C400w: Checking for IRQ\n");
2115: #endif
2116: if (NCR5380_read(BUS_AND_STATUS_REG) & BASR_IRQ) {
2117: #if (NDEBUG & NDEBUG_C400_PWRITE)
2118: printk("53C400w: got it, reading reset interupt reg\n");
2119: #endif
2120: NCR5380_read(RESET_PARITY_INTERRUPT_REG);
2121: } else {
2122: printk("53C400w: IRQ NOT THERE!\n");
2123: }
2124: }
2125:
2126: *data = d + c;
2127: *count = 0;
2128: *phase = (NCR5380_read(STATUS_REG & PHASE_MASK));
2129: #if 0
2130: NCR5380_print_phase(instance);
2131: #endif
2132: #if defined(PSEUDO_DMA) && !defined(UNSAFE)
2133: sti();
2134: #endif /* defined(REAL_DMA_POLL) */
2135: return foo;
2136: #endif /* def REAL_DMA */
2137: }
2138: #endif /* defined(REAL_DMA) | defined(PSEUDO_DMA) */
2139:
2140: /*
2141: * Function : NCR5380_information_transfer (struct Scsi_Host *instance)
2142: *
2143: * Purpose : run through the various SCSI phases and do as the target
2144: * directs us to. Operates on the currently connected command,
2145: * instance->connected.
2146: *
2147: * Inputs : instance, instance for which we are doing commands
2148: *
2149: * Side effects : SCSI things happen, the disconnected queue will be
2150: * modified if a command disconnects, *instance->connected will
2151: * change.
2152: *
2153: * XXX Note : we need to watch for bus free or a reset condition here
2154: * to recover from an unexpected bus free condition.
2155: */
2156:
2157: static void NCR5380_information_transfer (struct Scsi_Host *instance) {
2158: NCR5380_local_declare();
2159: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
2160: instance->hostdata;
2161: unsigned char msgout = NOP;
2162: int sink = 0;
2163: int len;
2164: #if defined(PSEUDO_DMA) || defined(REAL_DMA_POLL)
2165: int transfersize;
2166: #endif
2167: unsigned char *data;
2168: unsigned char phase, tmp, extended_msg[10], old_phase=0xff;
2169: Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected;
2170: NCR5380_setup(instance);
2171:
2172: while (1) {
2173: tmp = NCR5380_read(STATUS_REG);
2174: /* We only have a valid SCSI phase when REQ is asserted */
2175: if (tmp & SR_REQ) {
2176: phase = (tmp & PHASE_MASK);
2177: if (phase != old_phase) {
2178: old_phase = phase;
2179: #if (NDEBUG & NDEBUG_INFORMATION)
2180: NCR5380_print_phase(instance);
2181: #endif
2182: }
2183:
2184: if (sink && (phase != PHASE_MSGOUT)) {
2185: NCR5380_write(TARGET_COMMAND_REG, PHASE_SR_TO_TCR(tmp));
2186:
2187: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_ATN |
2188: ICR_ASSERT_ACK);
2189: while (NCR5380_read(STATUS_REG) & SR_REQ);
2190: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
2191: ICR_ASSERT_ATN);
2192: sink = 0;
2193: continue;
2194: }
2195:
2196: switch (phase) {
2197: case PHASE_DATAIN:
2198: case PHASE_DATAOUT:
2199: #if (NDEBUG & NDEBUG_NO_DATAOUT)
2200: printk("scsi%d : NDEBUG_NO_DATAOUT set, attempted DATAOUT aborted\n",
2201: instance->host_no);
2202: sink = 1;
2203: do_abort(instance);
2204: cmd->result = DID_ERROR << 16;
2205: cmd->done(cmd);
2206: return;
2207: #endif
2208: /*
2209: * If there is no room left in the current buffer in the
2210: * scatter-gather list, move onto the next one.
2211: */
2212:
2213: if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) {
2214: ++cmd->SCp.buffer;
2215: --cmd->SCp.buffers_residual;
2216: cmd->SCp.this_residual = cmd->SCp.buffer->length;
2217: cmd->SCp.ptr = cmd->SCp.buffer->address;
2218: #if (NDEBUG & NDEBUG_INFORMATION)
2219: printk("scsi%d : %d bytes and %d buffers left\n",
2220: instance->host_no, cmd->SCp.this_residual,
2221: cmd->SCp.buffers_residual);
2222: #endif
2223: }
2224:
2225: /*
2226: * The preferred transfer method is going to be
2227: * PSEUDO-DMA for systems that are strictly PIO,
2228: * since we can let the hardware do the handshaking.
2229: *
2230: * For this to work, we need to know the transfersize
2231: * ahead of time, since the pseudo-DMA code will sit
2232: * in an unconditional loop.
2233: */
2234:
2235: #if defined(PSEUDO_DMA) || defined(REAL_DMA_POLL)
2236: /* KLL
2237: * PSEUDO_DMA is defined here. If this is the g_NCR5380
2238: * driver then it will always be defined, so the
2239: * FLAG_NO_PSEUDO_DMA is used to inhibit PDMA in the base
2240: * NCR5380 case. I think this is a fairly clean solution.
2241: * We supplement these 2 if's with the flag.
2242: */
2243: #ifdef NCR5380_dma_xfer_len
2244: if (!cmd->device->borken &&
2245: !(hostdata->flags & FLAG_NO_PSEUDO_DMA) &&
2246: (transfersize = NCR5380_dma_xfer_len(instance, cmd)) != 0) {
2247: #else
2248: transfersize = cmd->transfersize;
2249:
2250: #ifdef LIMIT_TRANSFERSIZE /* If we have problems with interrupt service */
2251: if( transfersize > 512 )
2252: transfersize = 512;
2253: #endif /* LIMIT_TRANSFERSIZE */
2254:
2255: if (!cmd->device->borken && transfersize &&
2256: !(hostdata->flags & FLAG_NO_PSEUDO_DMA) &&
2257: cmd->SCp.this_residual && !(cmd->SCp.this_residual %
2258: transfersize)) {
2259: #endif
2260: len = transfersize;
2261: if (NCR5380_transfer_dma(instance, &phase,
2262: &len, (unsigned char **) &cmd->SCp.ptr)) {
2263: /*
2264: * If the watchdog timer fires, all future accesses to this
2265: * device will use the polled-IO.
2266: */
2267: printk("scsi%d : switching target %d lun %d to slow handshake\n",
2268: instance->host_no, cmd->target, cmd->lun);
2269: cmd->device->borken = 1;
2270: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
2271: ICR_ASSERT_ATN);
2272: sink = 1;
2273: do_abort(instance);
2274: cmd->result = DID_ERROR << 16;
2275: cmd->done(cmd);
2276: /* XXX - need to source or sink data here, as appropriate */
2277: } else
2278: cmd->SCp.this_residual -= transfersize - len;
2279: } else
2280: #endif /* defined(PSEUDO_DMA) || defined(REAL_DMA_POLL) */
2281: NCR5380_transfer_pio(instance, &phase,
2282: (int *) &cmd->SCp.this_residual, (unsigned char **)
2283: &cmd->SCp.ptr);
2284: break;
2285: case PHASE_MSGIN:
2286: len = 1;
2287: data = &tmp;
2288: NCR5380_transfer_pio(instance, &phase, &len, &data);
2289: cmd->SCp.Message = tmp;
2290:
2291: switch (tmp) {
2292: /*
2293: * Linking lets us reduce the time required to get the
2294: * next command out to the device, hopefully this will
2295: * mean we don't waste another revolution due to the delays
2296: * required by ARBITRATION and another SELECTION.
2297: *
2298: * In the current implementation proposal, low level drivers
2299: * merely have to start the next command, pointed to by
2300: * next_link, done() is called as with unlinked commands.
2301: */
2302: #ifdef LINKED
2303: case LINKED_CMD_COMPLETE:
2304: case LINKED_FLG_CMD_COMPLETE:
2305: /* Accept message by clearing ACK */
2306: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2307:
2308: #if (NDEBUG & NDEBUG_LINKED)
2309: printk("scsi%d : target %d lun %d linked command complete.\n",
2310: instance->host_no, cmd->target, cmd->lun);
2311: #endif
2312: /*
2313: * Sanity check : A linked command should only terminate with
2314: * one of these messages if there are more linked commands
2315: * available.
2316: */
2317:
2318: if (!cmd->next_link) {
2319: printk("scsi%d : target %d lun %d linked command complete, no next_link\n"
2320: instance->host_no, cmd->target, cmd->lun);
2321: sink = 1;
2322: do_abort (instance);
2323: return;
2324: }
2325:
2326: initialize_SCp(cmd->next_link);
2327: /* The next command is still part of this process */
2328: cmd->next_link->tag = cmd->tag;
2329: cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
2330: #if (NDEBUG & NDEBUG_LINKED)
2331: printk("scsi%d : target %d lun %d linked request done, calling scsi_done().\n",
2332: instance->host_no, cmd->target, cmd->lun);
2333: #endif
2334: cmd->scsi_done(cmd);
2335: cmd = hostdata->connected;
2336: break;
2337: #endif /* def LINKED */
2338: case ABORT:
2339: case COMMAND_COMPLETE:
2340: /* Accept message by clearing ACK */
2341: sink = 1;
2342: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2343: hostdata->connected = NULL;
2344: #if (NDEBUG & NDEBUG_QUEUES)
2345: printk("scsi%d : command for target %d, lun %d completed\n",
2346: instance->host_no, cmd->target, cmd->lun);
2347: #endif
2348: hostdata->busy[cmd->target] &= ~(1 << cmd->lun);
2349:
2350: /*
2351: * I'm not sure what the correct thing to do here is :
2352: *
2353: * If the command that just executed is NOT a request
2354: * sense, the obvious thing to do is to set the result
2355: * code to the values of the stored parameters.
2356: *
2357: * If it was a REQUEST SENSE command, we need some way
2358: * to differentiate between the failure code of the original
2359: * and the failure code of the REQUEST sense - the obvious
2360: * case is success, where we fall through and leave the result
2361: * code unchanged.
2362: *
2363: * The non-obvious place is where the REQUEST SENSE failed
2364: */
2365:
2366: if (cmd->cmnd[0] != REQUEST_SENSE)
2367: cmd->result = cmd->SCp.Status | (cmd->SCp.Message << 8);
2368: else if (cmd->SCp.Status != GOOD)
2369: cmd->result = (cmd->result & 0x00ffff) | (DID_ERROR << 16);
2370:
2371: #ifdef AUTOSENSE
2372: if ((cmd->cmnd[0] != REQUEST_SENSE) &&
2373: (cmd->SCp.Status == CHECK_CONDITION)) {
2374: #if (NDEBUG & NDEBUG_AUTOSENSE)
2375: printk("scsi%d : performing request sense\n",
2376: instance->host_no);
2377: #endif
2378: cmd->cmnd[0] = REQUEST_SENSE;
2379: cmd->cmnd[1] &= 0xe0;
2380: cmd->cmnd[2] = 0;
2381: cmd->cmnd[3] = 0;
2382: cmd->cmnd[4] = sizeof(cmd->sense_buffer);
2383: cmd->cmnd[5] = 0;
2384:
2385: cmd->SCp.buffer = NULL;
2386: cmd->SCp.buffers_residual = 0;
2387: cmd->SCp.ptr = (char *) cmd->sense_buffer;
2388: cmd->SCp.this_residual = sizeof(cmd->sense_buffer);
2389:
2390: cli();
2391: LIST(cmd,hostdata->issue_queue);
2392: cmd->host_scribble = (unsigned char *)
2393: hostdata->issue_queue;
2394: hostdata->issue_queue = (Scsi_Cmnd *) cmd;
2395: sti();
2396: #if (NDEBUG & NDEBUG_QUEUES)
2397: printk("scsi%d : REQUEST SENSE added to head of issue queue\n",instance->host_no);
2398: #endif
2399: } else
2400: #endif /* def AUTOSENSE */
2401: cmd->scsi_done(cmd);
2402:
2403: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
2404: /*
2405: * Restore phase bits to 0 so an interrupted selection,
2406: * arbitration can resume.
2407: */
2408: NCR5380_write(TARGET_COMMAND_REG, 0);
2409:
2410: while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
2411: barrier();
2412: return;
2413: case MESSAGE_REJECT:
2414: /* Accept message by clearing ACK */
2415: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2416: switch (hostdata->last_message) {
2417: case HEAD_OF_QUEUE_TAG:
2418: case ORDERED_QUEUE_TAG:
2419: case SIMPLE_QUEUE_TAG:
2420: cmd->device->tagged_queue = 0;
2421: hostdata->busy[cmd->target] |= (1 << cmd->lun);
2422: break;
2423: default:
2424: break;
2425: }
2426: case DISCONNECT:
2427: /* Accept message by clearing ACK */
2428: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2429: cmd->device->disconnect = 1;
2430: cli();
2431: LIST(cmd,hostdata->disconnected_queue);
2432: cmd->host_scribble = (unsigned char *)
2433: hostdata->disconnected_queue;
2434: hostdata->connected = NULL;
2435: hostdata->disconnected_queue = cmd;
2436: sti();
2437: #if (NDEBUG & NDEBUG_QUEUES)
2438: printk("scsi%d : command for target %d lun %d was moved from connected to"
2439: " the disconnected_queue\n", instance->host_no,
2440: cmd->target, cmd->lun);
2441: #endif
2442: /*
2443: * Restore phase bits to 0 so an interrupted selection,
2444: * arbitration can resume.
2445: */
2446: NCR5380_write(TARGET_COMMAND_REG, 0);
2447:
2448: /* Enable reselect interrupts */
2449: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
2450: /* Wait for bus free to avoid nasty timeouts */
2451: while ((NCR5380_read(STATUS_REG) & SR_BSY) && !hostdata->connected)
2452: barrier();
2453: #if 0
2454: NCR5380_print_status(instance);
2455: #endif
2456: return;
2457: /*
2458: * The SCSI data pointer is *IMPLICITLY* saved on a disconnect
2459: * operation, in violation of the SCSI spec so we can safely
2460: * ignore SAVE/RESTORE pointers calls.
2461: *
2462: * Unfortunately, some disks violate the SCSI spec and
2463: * don't issue the required SAVE_POINTERS message before
2464: * disconnecting, and we have to break spec to remain
2465: * compatible.
2466: */
2467: case SAVE_POINTERS:
2468: case RESTORE_POINTERS:
2469: /* Accept message by clearing ACK */
2470: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2471: break;
2472: case EXTENDED_MESSAGE:
2473: /*
2474: * Extended messages are sent in the following format :
2475: * Byte
2476: * 0 EXTENDED_MESSAGE == 1
2477: * 1 length (includes one byte for code, doesn't
2478: * include first two bytes)
2479: * 2 code
2480: * 3..length+1 arguments
2481: *
2482: * Start the extended message buffer with the EXTENDED_MESSAGE
2483: * byte, since print_msg() wants the whole thing.
2484: */
2485: extended_msg[0] = EXTENDED_MESSAGE;
2486: /* Accept first byte by clearing ACK */
2487: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2488:
2489: #if (NDEBUG & NDEBUG_EXTENDED)
2490: printk("scsi%d : receiving extended message\n",
2491: instance->host_no);
2492: #endif
2493:
2494: len = 2;
2495: data = extended_msg + 1;
2496: phase = PHASE_MSGIN;
2497: NCR5380_transfer_pio(instance, &phase, &len, &data);
2498:
2499: #if (NDEBUG & NDEBUG_EXTENDED)
2500: printk("scsi%d : length=%d, code=0x%02x\n",
2501: instance->host_no, (int) extended_msg[1],
2502: (int) extended_msg[2]);
2503: #endif
2504:
2505: if (!len && extended_msg[1] <=
2506: (sizeof (extended_msg) - 1)) {
2507: /* Accept third byte by clearing ACK */
2508: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2509: len = extended_msg[1] - 1;
2510: data = extended_msg + 3;
2511: phase = PHASE_MSGIN;
2512:
2513: NCR5380_transfer_pio(instance, &phase, &len, &data);
2514:
2515: #if (NDEBUG & NDEBUG_EXTENDED)
2516: printk("scsi%d : message received, residual %d\n",
2517: instance->host_no, len);
2518: #endif
2519:
2520: switch (extended_msg[2]) {
2521: case EXTENDED_SDTR:
2522: case EXTENDED_WDTR:
2523: case EXTENDED_MODIFY_DATA_POINTER:
2524: case EXTENDED_EXTENDED_IDENTIFY:
2525: tmp = 0;
2526: }
2527: } else if (len) {
2528: printk("scsi%d: error receiving extended message\n",
2529: instance->host_no);
2530: tmp = 0;
2531: } else {
2532: printk("scsi%d: extended message code %02x length %d is too long\n",
2533: instance->host_no, extended_msg[2], extended_msg[1]);
2534: tmp = 0;
2535: }
2536: /* Fall through to reject message */
2537:
2538: /*
2539: * If we get something weird that we aren't expecting,
2540: * reject it.
2541: */
2542: default:
2543: if (!tmp) {
2544: printk("scsi%d: rejecting message ", instance->host_no);
2545: print_msg (extended_msg);
2546: printk("\n");
2547: } else if (tmp != EXTENDED_MESSAGE)
2548: printk("scsi%d: rejecting unknown message %02x from target %d, lun %d\n",
2549: instance->host_no, tmp, cmd->target, cmd->lun);
2550: else
2551: printk("scsi%d: rejecting unknown extended message code %02x, length %d from target %d, lun %d\n",
2552: instance->host_no, extended_msg[1], extended_msg[0], cmd->target, cmd->lun);
2553:
2554: msgout = MESSAGE_REJECT;
2555: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE |
2556: ICR_ASSERT_ATN);
2557: break;
2558: } /* switch (tmp) */
2559: break;
2560: case PHASE_MSGOUT:
2561: len = 1;
2562: data = &msgout;
2563: hostdata->last_message = msgout;
2564: NCR5380_transfer_pio(instance, &phase, &len, &data);
2565: if (msgout == ABORT) {
2566: hostdata->busy[cmd->target] &= ~(1 << cmd->lun);
2567: hostdata->connected = NULL;
2568: cmd->result = DID_ERROR << 16;
2569: cmd->scsi_done(cmd);
2570: NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
2571: return;
2572: }
2573: msgout = NOP;
2574: break;
2575: case PHASE_CMDOUT:
2576: len = cmd->cmd_len;
2577: data = cmd->cmnd;
2578: /*
2579: * XXX for performance reasons, on machines with a
2580: * PSEUDO-DMA architecture we should probably
2581: * use the dma transfer function.
2582: */
2583: NCR5380_transfer_pio(instance, &phase, &len,
2584: &data);
2585: #ifdef USLEEP
2586: if (!disconnect && should_disconnect(cmd->cmnd[0])) {
2587: hostdata->time_expires = jiffies + USLEEP_SLEEP;
2588: #if (NDEBUG & NDEBUG_USLEEP)
2589: printk("scsi%d : issued command, sleeping until %ul\n", instance->host_no,
2590: hostdata->time_expires);
2591: #endif
2592: NCR5380_set_timer (instance);
2593: return;
2594: }
2595: #endif /* def USLEEP */
2596: break;
2597: case PHASE_STATIN:
2598: len = 1;
2599: data = &tmp;
2600: NCR5380_transfer_pio(instance, &phase, &len, &data);
2601: cmd->SCp.Status = tmp;
2602: break;
2603: default:
2604: printk("scsi%d : unknown phase\n", instance->host_no);
2605: #ifdef NDEBUG
2606: NCR5380_print(instance);
2607: #endif
2608: } /* switch(phase) */
2609: } /* if (tmp * SR_REQ) */
2610: #ifdef USLEEP
2611: else {
2612: if (!disconnect && hostdata->time_expires && jiffies >
2613: hostdata->time_expires) {
2614: hostdata->time_expires = jiffies + USLEEP_SLEEP;
2615: #if (NDEBUG & NDEBUG_USLEEP)
2616: printk("scsi%d : poll timed out, sleeping until %ul\n", instance->host_no,
2617: hostdata->time_expires);
2618: #endif
2619: NCR5380_set_timer (instance);
2620: return;
2621: }
2622: }
2623: #endif
2624: } /* while (1) */
2625: }
2626:
2627: /*
2628: * Function : void NCR5380_reselect (struct Scsi_Host *instance)
2629: *
2630: * Purpose : does reselection, initializing the instance->connected
2631: * field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q
2632: * nexus has been reestablished,
2633: *
2634: * Inputs : instance - this instance of the NCR5380.
2635: *
2636: */
2637:
2638:
2639: static void NCR5380_reselect (struct Scsi_Host *instance) {
2640: NCR5380_local_declare();
2641: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
2642: instance->hostdata;
2643: unsigned char target_mask;
2644: unsigned char lun, phase;
2645: int len;
2646: #ifdef SCSI2
2647: unsigned char tag;
2648: #endif
2649: unsigned char msg[3];
2650: unsigned char *data;
2651: Scsi_Cmnd *tmp = NULL, *prev;
2652: int abort = 0;
2653: NCR5380_setup(instance);
2654:
2655: /*
2656: * Disable arbitration, etc. since the host adapter obviously
2657: * lost, and tell an interrupted NCR5380_select() to restart.
2658: */
2659:
2660: NCR5380_write(MODE_REG, MR_BASE);
2661: hostdata->restart_select = 1;
2662:
2663: target_mask = NCR5380_read(CURRENT_SCSI_DATA_REG) & ~(hostdata->id_mask);
2664:
2665: #if (NDEBUG & NDEBUG_RESELECTION)
2666: printk("scsi%d : reselect\n", instance->host_no);
2667: #endif
2668:
2669: /*
2670: * At this point, we have detected that our SCSI ID is on the bus,
2671: * SEL is true and BSY was false for at least one bus settle delay
2672: * (400 ns).
2673: *
2674: * We must assert BSY ourselves, until the target drops the SEL
2675: * signal.
2676: */
2677:
2678: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE | ICR_ASSERT_BSY);
2679:
2680: while (NCR5380_read(STATUS_REG) & SR_SEL);
2681: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2682:
2683: /*
2684: * Wait for target to go into MSGIN.
2685: */
2686:
2687: while (!(NCR5380_read(STATUS_REG) & SR_REQ));
2688:
2689: len = 1;
2690: data = msg;
2691: phase = PHASE_MSGIN;
2692: NCR5380_transfer_pio(instance, &phase, &len, &data);
2693:
2694:
2695: if (!msg[0] & 0x80) {
2696: printk("scsi%d : expecting IDENTIFY message, got ",
2697: instance->host_no);
2698: print_msg(msg);
2699: abort = 1;
2700: } else {
2701: /* Accept message by clearing ACK */
2702: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2703: lun = (msg[0] & 0x07);
2704:
2705: /*
2706: * We need to add code for SCSI-II to track which devices have
2707: * I_T_L_Q nexuses established, and which have simple I_T_L
2708: * nexuses so we can chose to do additional data transfer.
2709: */
2710:
2711: #ifdef SCSI2
2712: #error "SCSI-II tagged queueing is not supported yet"
2713: #endif
2714:
2715: /*
2716: * Find the command corresponding to the I_T_L or I_T_L_Q nexus we
2717: * just reestablished, and remove it from the disconnected queue.
2718: */
2719:
2720:
2721: for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL;
2722: tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble)
2723: if ((target_mask == (1 << tmp->target)) && (lun == tmp->lun)
2724: #ifdef SCSI2
2725: && (tag == tmp->tag)
2726: #endif
2727: ) {
2728: if (prev) {
2729: REMOVE(prev,prev->host_scribble,tmp,tmp->host_scribble);
2730: prev->host_scribble = tmp->host_scribble;
2731: } else {
2732: REMOVE(-1,hostdata->disconnected_queue,tmp,tmp->host_scribble);
2733: hostdata->disconnected_queue = (Scsi_Cmnd *) tmp->host_scribble;
2734: }
2735: tmp->host_scribble = NULL;
2736: break;
2737: }
2738:
2739: if (!tmp) {
2740: #ifdef SCSI2
2741: printk("scsi%d : warning : target bitmask %02x lun %d tag %d not in disconnect_queue.\n",
2742: instance->host_no, target_mask, lun, tag);
2743: #else
2744: printk("scsi%d : warning : target bitmask %02x lun %d not in disconnect_queue.\n",
2745: instance->host_no, target_mask, lun);
2746: #endif
2747: /*
2748: * Since we have an established nexus that we can't do anything with,
2749: * we must abort it.
2750: */
2751: abort = 1;
2752: }
2753: }
2754:
2755: if (abort) {
2756: do_abort (instance);
2757: } else {
2758: hostdata->connected = tmp;
2759: #if (NDEBUG & NDEBUG_RESELECTION)
2760: printk("scsi%d : nexus established, target = %d, lun = %d, tag = %d\n",
2761: instance->host_no, tmp->target, tmp->lun, tmp->tag);
2762: #endif
2763: }
2764: }
2765:
2766: /*
2767: * Function : void NCR5380_dma_complete (struct Scsi_Host *instance)
2768: *
2769: * Purpose : called by interrupt handler when DMA finishes or a phase
2770: * mismatch occurs (which would finish the DMA transfer).
2771: *
2772: * Inputs : instance - this instance of the NCR5380.
2773: *
2774: * Returns : pointer to the Scsi_Cmnd structure for which the I_T_L
2775: * nexus has been reestablished, on failure NULL is returned.
2776: */
2777:
2778: #ifdef REAL_DMA
2779: static void NCR5380_dma_complete (NCR5380_instance *instance) {
2780: NCR5380_local_declare();
2781: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *
2782: instance->hostdata);
2783: int transferred;
2784: NCR5380_setup(instance);
2785:
2786: /*
2787: * XXX this might not be right.
2788: *
2789: * Wait for final byte to transfer, ie wait for ACK to go false.
2790: *
2791: * We should use the Last Byte Sent bit, unfortunately this is
2792: * not available on the 5380/5381 (only the various CMOS chips)
2793: */
2794:
2795: while (NCR5380_read(BUS_AND_STATUS_REG) & BASR_ACK);
2796:
2797: NCR5380_write(MODE_REG, MR_BASE);
2798: NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
2799:
2800: /*
2801: * The only places we should see a phase mismatch and have to send
2802: * data from the same set of pointers will be the data transfer
2803: * phases. So, residual, requested length are only important here.
2804: */
2805:
2806: if (!(hostdata->connected->SCp.phase & SR_CD)) {
2807: transferred = instance->dmalen - NCR5380_dma_residual();
2808: hostdata->connected->SCp.this_residual -= transferred;
2809: hostdata->connected->SCp.ptr += transferred;
2810: }
2811: }
2812: #endif /* def REAL_DMA */
2813:
2814: /*
2815: * Function : int NCR5380_abort (Scsi_Cmnd *cmd)
2816: *
2817: * Purpose : abort a command
2818: *
2819: * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the
2820: * host byte of the result field to, if zero DID_ABORTED is
2821: * used.
2822: *
2823: * Returns : 0 - success, -1 on failure.
2824: *
2825: * XXX - there is no way to abort the command that is currently
2826: * connected, you have to wait for it to complete. If this is
2827: * a problem, we could implement longjmp() / setjmp(), setjmp()
2828: * called where the loop started in NCR5380_main().
2829: */
2830:
2831: #ifndef NCR5380_abort
2832: static
2833: #endif
2834: int NCR5380_abort (Scsi_Cmnd *cmd) {
2835: NCR5380_local_declare();
2836: struct Scsi_Host *instance = cmd->host;
2837: struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *)
2838: instance->hostdata;
2839: Scsi_Cmnd *tmp, **prev;
2840:
2841: printk("scsi%d : aborting command\n", instance->host_no);
2842: print_Scsi_Cmnd (cmd);
2843:
2844: NCR5380_print_status (instance);
2845:
2846: printk("scsi%d : aborting command\n", instance->host_no);
2847: print_Scsi_Cmnd (cmd);
2848:
2849: NCR5380_print_status (instance);
2850:
2851: cli();
2852: NCR5380_setup(instance);
2853:
2854: #if (NDEBUG & NDEBUG_ABORT)
2855: printk("scsi%d : abort called\n", instance->host_no);
2856: printk(" basr 0x%X, sr 0x%X\n",
2857: NCR5380_read(BUS_AND_STATUS_REG), NCR5380_read(STATUS_REG));
2858: #endif
2859:
2860: #if 0
2861: /*
2862: * Case 1 : If the command is the currently executing command,
2863: * we'll set the aborted flag and return control so that
2864: * information transfer routine can exit cleanly.
2865: */
2866:
2867: if (hostdata->connected == cmd) {
2868: #if (NDEBUG & NDEBUG_ABORT)
2869: printk("scsi%d : aborting connected command\n", instance->host_no);
2870: #endif
2871: hostdata->aborted = 1;
2872: /*
2873: * We should perform BSY checking, and make sure we haven't slipped
2874: * into BUS FREE.
2875: */
2876:
2877: NCR5380_write(INITIATOR_COMMAND_REG, ICR_ASSERT_ATN);
2878: /*
2879: * Since we can't change phases until we've completed the current
2880: * handshake, we have to source or sink a byte of data if the current
2881: * phase is not MSGOUT.
2882: */
2883:
2884: /*
2885: * Return control to the executing NCR drive so we can clear the
2886: * aborted flag and get back into our main loop.
2887: */
2888:
2889: return 0;
2890: }
2891: #endif
2892:
2893: /*
2894: * Case 2 : If the command hasn't been issued yet, we simply remove it
2895: * from the issue queue.
2896: */
2897: #if (NDEBUG & NDEBUG_ABORT)
2898: /* KLL */
2899: printk("scsi%d : abort going into loop.\n", instance->host_no);
2900: #endif
2901: for (prev = (Scsi_Cmnd **) &(hostdata->issue_queue),
2902: tmp = (Scsi_Cmnd *) hostdata->issue_queue;
2903: tmp; prev = (Scsi_Cmnd **) &(tmp->host_scribble), tmp =
2904: (Scsi_Cmnd *) tmp->host_scribble)
2905: if (cmd == tmp) {
2906: REMOVE(5,*prev,tmp,tmp->host_scribble);
2907: (*prev) = (Scsi_Cmnd *) tmp->host_scribble;
2908: tmp->host_scribble = NULL;
2909: tmp->result = DID_ABORT << 16;
2910: sti();
2911: #if (NDEBUG & NDEBUG_ABORT)
2912: printk("scsi%d : abort removed command from issue queue.\n",
2913: instance->host_no);
2914: #endif
2915: tmp->done(tmp);
2916: return SCSI_ABORT_SUCCESS;
2917: }
2918: #if (NDEBUG & NDEBUG_ABORT)
2919: /* KLL */
2920: else if (prev == tmp) printk("scsi%d : LOOP\n", instance->host_no);
2921: #endif
2922:
2923: /*
2924: * Case 3 : If any commands are connected, we're going to fail the abort
2925: * and let the high level SCSI driver retry at a later time or
2926: * issue a reset.
2927: *
2928: * Timeouts, and therefore aborted commands, will be highly unlikely
2929: * and handling them cleanly in this situation would make the common
2930: * case of noresets less efficient, and would pollute our code. So,
2931: * we fail.
2932: */
2933:
2934: if (hostdata->connected) {
2935: sti();
2936: #if (NDEBUG & NDEBUG_ABORT)
2937: printk("scsi%d : abort failed, command connected.\n", instance->host_no);
2938: #endif
2939: return SCSI_ABORT_NOT_RUNNING;
2940: }
2941:
2942: /*
2943: * Case 4: If the command is currently disconnected from the bus, and
2944: * there are no connected commands, we reconnect the I_T_L or
2945: * I_T_L_Q nexus associated with it, go into message out, and send
2946: * an abort message.
2947: *
2948: * This case is especially ugly. In order to reestablish the nexus, we
2949: * need to call NCR5380_select(). The easiest way to implement this
2950: * function was to abort if the bus was busy, and let the interrupt
2951: * handler triggered on the SEL for reselect take care of lost arbitrations
2952: * where necessary, meaning interrupts need to be enabled.
2953: *
2954: * When interrupts are enabled, the queues may change - so we
2955: * can't remove it from the disconnected queue before selecting it
2956: * because that could cause a failure in hashing the nexus if that
2957: * device reselected.
2958: *
2959: * Since the queues may change, we can't use the pointers from when we
2960: * first locate it.
2961: *
2962: * So, we must first locate the command, and if NCR5380_select()
2963: * succeeds, then issue the abort, relocate the command and remove
2964: * it from the disconnected queue.
2965: */
2966:
2967: for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp;
2968: tmp = (Scsi_Cmnd *) tmp->host_scribble)
2969: if (cmd == tmp) {
2970: sti();
2971: #if (NDEBUG & NDEBUG_ABORT)
2972: printk("scsi%d : aborting disconnected command.\n", instance->host_no);
2973: #endif
2974:
2975: if (NCR5380_select (instance, cmd, (int) cmd->tag))
2976: return SCSI_ABORT_BUSY;
2977:
2978: #if (NDEBUG & NDEBUG_ABORT)
2979: printk("scsi%d : nexus reestablished.\n", instance->host_no);
2980: #endif
2981:
2982: do_abort (instance);
2983:
2984: cli();
2985: for (prev = (Scsi_Cmnd **) &(hostdata->disconnected_queue),
2986: tmp = (Scsi_Cmnd *) hostdata->disconnected_queue;
2987: tmp; prev = (Scsi_Cmnd **) &(tmp->host_scribble), tmp =
2988: (Scsi_Cmnd *) tmp->host_scribble)
2989: if (cmd == tmp) {
2990: REMOVE(5,*prev,tmp,tmp->host_scribble);
2991: *prev = (Scsi_Cmnd *) tmp->host_scribble;
2992: tmp->host_scribble = NULL;
2993: tmp->result = DID_ABORT << 16;
2994: sti();
2995: tmp->done(tmp);
2996: return SCSI_ABORT_SUCCESS;
2997: }
2998: }
2999:
3000: /*
3001: * Case 5 : If we reached this point, the command was not found in any of
3002: * the queues.
3003: *
3004: * We probably reached this point because of an unlikely race condition
3005: * between the command completing successfully and the abortion code,
3006: * so we won't panic, but we will notify the user in case something really
3007: * broke.
3008: */
3009:
3010: sti();
3011: printk("scsi%d : warning : SCSI command probably completed successfully\n"
3012: " before abortion\n", instance->host_no);
3013: return SCSI_ABORT_NOT_RUNNING;
3014: }
3015:
3016:
3017: /*
3018: * Function : int NCR5380_reset (Scsi_Cmnd *cmd)
3019: *
3020: * Purpose : reset the SCSI bus.
3021: *
3022: * Returns : SCSI_RESET_WAKEUP
3023: *
3024: */
3025:
3026: #ifndef NCR5380_reset
3027: static
3028: #endif
3029: int NCR5380_reset (Scsi_Cmnd *cmd) {
3030: NCR5380_local_declare();
3031: NCR5380_setup(cmd->host);
3032:
3033: NCR5380_print_status (cmd->host);
3034: do_reset (cmd->host);
3035:
3036: return SCSI_RESET_WAKEUP;
3037: }
3038:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.