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