Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
fas216.c
Go to the documentation of this file.
1 /*
2  * linux/drivers/acorn/scsi/fas216.c
3  *
4  * Copyright (C) 1997-2003 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * Based on information in qlogicfas.c by Tom Zerucha, Michael Griffith, and
11  * other sources, including:
12  * the AMD Am53CF94 data sheet
13  * the AMD Am53C94 data sheet
14  *
15  * This is a generic driver. To use it, have a look at cumana_2.c. You
16  * should define your own structure that overlays FAS216_Info, eg:
17  * struct my_host_data {
18  * FAS216_Info info;
19  * ... my host specific data ...
20  * };
21  *
22  * Changelog:
23  * 30-08-1997 RMK Created
24  * 14-09-1997 RMK Started disconnect support
25  * 08-02-1998 RMK Corrected real DMA support
26  * 15-02-1998 RMK Started sync xfer support
27  * 06-04-1998 RMK Tightened conditions for printing incomplete
28  * transfers
29  * 02-05-1998 RMK Added extra checks in fas216_reset
30  * 24-05-1998 RMK Fixed synchronous transfers with period >= 200ns
31  * 27-06-1998 RMK Changed asm/delay.h to linux/delay.h
32  * 26-08-1998 RMK Improved message support wrt MESSAGE_REJECT
33  * 02-04-2000 RMK Converted to use the new error handling, and
34  * automatically request sense data upon check
35  * condition status from targets.
36  */
37 #include <linux/module.h>
38 #include <linux/blkdev.h>
39 #include <linux/kernel.h>
40 #include <linux/string.h>
41 #include <linux/ioport.h>
42 #include <linux/proc_fs.h>
43 #include <linux/delay.h>
44 #include <linux/bitops.h>
45 #include <linux/init.h>
46 #include <linux/interrupt.h>
47 
48 #include <asm/dma.h>
49 #include <asm/io.h>
50 #include <asm/irq.h>
51 #include <asm/ecard.h>
52 
53 #include "../scsi.h"
54 #include <scsi/scsi_dbg.h>
55 #include <scsi/scsi_host.h>
56 #include "fas216.h"
57 #include "scsi.h"
58 
59 /* NOTE: SCSI2 Synchronous transfers *require* DMA according to
60  * the data sheet. This restriction is crazy, especially when
61  * you only want to send 16 bytes! What were the guys who
62  * designed this chip on at that time? Did they read the SCSI2
63  * spec at all? The following sections are taken from the SCSI2
64  * standard (s2r10) concerning this:
65  *
66  * > IMPLEMENTORS NOTES:
67  * > (1) Re-negotiation at every selection is not recommended, since a
68  * > significant performance impact is likely.
69  *
70  * > The implied synchronous agreement shall remain in effect until a BUS DEVICE
71  * > RESET message is received, until a hard reset condition occurs, or until one
72  * > of the two SCSI devices elects to modify the agreement. The default data
73  * > transfer mode is asynchronous data transfer mode. The default data transfer
74  * > mode is entered at power on, after a BUS DEVICE RESET message, or after a hard
75  * > reset condition.
76  *
77  * In total, this means that once you have elected to use synchronous
78  * transfers, you must always use DMA.
79  *
80  * I was thinking that this was a good chip until I found this restriction ;(
81  */
82 #define SCSI2_SYNC
83 #undef SCSI2_TAG
84 
85 #undef DEBUG_CONNECT
86 #undef DEBUG_MESSAGES
87 
88 #undef CHECK_STRUCTURE
89 
90 #define LOG_CONNECT (1 << 0)
91 #define LOG_BUSSERVICE (1 << 1)
92 #define LOG_FUNCTIONDONE (1 << 2)
93 #define LOG_MESSAGES (1 << 3)
94 #define LOG_BUFFER (1 << 4)
95 #define LOG_ERROR (1 << 8)
96 
97 static int level_mask = LOG_ERROR;
98 
99 module_param(level_mask, int, 0644);
100 
101 static int __init fas216_log_setup(char *str)
102 {
103  char *s;
104 
105  level_mask = 0;
106 
107  while ((s = strsep(&str, ",")) != NULL) {
108  switch (s[0]) {
109  case 'a':
110  if (strcmp(s, "all") == 0)
111  level_mask |= -1;
112  break;
113  case 'b':
114  if (strncmp(s, "bus", 3) == 0)
115  level_mask |= LOG_BUSSERVICE;
116  if (strncmp(s, "buf", 3) == 0)
117  level_mask |= LOG_BUFFER;
118  break;
119  case 'c':
120  level_mask |= LOG_CONNECT;
121  break;
122  case 'e':
123  level_mask |= LOG_ERROR;
124  break;
125  case 'm':
126  level_mask |= LOG_MESSAGES;
127  break;
128  case 'n':
129  if (strcmp(s, "none") == 0)
130  level_mask = 0;
131  break;
132  case 's':
133  level_mask |= LOG_FUNCTIONDONE;
134  break;
135  }
136  }
137  return 1;
138 }
139 
140 __setup("fas216_logging=", fas216_log_setup);
141 
142 static inline unsigned char fas216_readb(FAS216_Info *info, unsigned int reg)
143 {
144  unsigned int off = reg << info->scsi.io_shift;
145  return readb(info->scsi.io_base + off);
146 }
147 
148 static inline void fas216_writeb(FAS216_Info *info, unsigned int reg, unsigned int val)
149 {
150  unsigned int off = reg << info->scsi.io_shift;
151  writeb(val, info->scsi.io_base + off);
152 }
153 
154 static void fas216_dumpstate(FAS216_Info *info)
155 {
156  unsigned char is, stat, inst;
157 
158  is = fas216_readb(info, REG_IS);
159  stat = fas216_readb(info, REG_STAT);
160  inst = fas216_readb(info, REG_INST);
161 
162  printk("FAS216: CTCL=%02X CTCM=%02X CMD=%02X STAT=%02X"
163  " INST=%02X IS=%02X CFIS=%02X",
164  fas216_readb(info, REG_CTCL),
165  fas216_readb(info, REG_CTCM),
166  fas216_readb(info, REG_CMD), stat, inst, is,
167  fas216_readb(info, REG_CFIS));
168  printk(" CNTL1=%02X CNTL2=%02X CNTL3=%02X CTCH=%02X\n",
169  fas216_readb(info, REG_CNTL1),
170  fas216_readb(info, REG_CNTL2),
171  fas216_readb(info, REG_CNTL3),
172  fas216_readb(info, REG_CTCH));
173 }
174 
175 static void print_SCp(struct scsi_pointer *SCp, const char *prefix, const char *suffix)
176 {
177  printk("%sptr %p this_residual 0x%x buffer %p buffers_residual 0x%x%s",
178  prefix, SCp->ptr, SCp->this_residual, SCp->buffer,
179  SCp->buffers_residual, suffix);
180 }
181 
182 #ifdef CHECK_STRUCTURE
183 static void fas216_dumpinfo(FAS216_Info *info)
184 {
185  static int used = 0;
186  int i;
187 
188  if (used++)
189  return;
190 
191  printk("FAS216_Info=\n");
192  printk(" { magic_start=%lX host=%p SCpnt=%p origSCpnt=%p\n",
193  info->magic_start, info->host, info->SCpnt,
194  info->origSCpnt);
195  printk(" scsi={ io_shift=%X irq=%X cfg={ %X %X %X %X }\n",
196  info->scsi.io_shift, info->scsi.irq,
197  info->scsi.cfg[0], info->scsi.cfg[1], info->scsi.cfg[2],
198  info->scsi.cfg[3]);
199  printk(" type=%p phase=%X\n",
200  info->scsi.type, info->scsi.phase);
201  print_SCp(&info->scsi.SCp, " SCp={ ", " }\n");
202  printk(" msgs async_stp=%X disconnectable=%d aborting=%d }\n",
203  info->scsi.async_stp,
204  info->scsi.disconnectable, info->scsi.aborting);
205  printk(" stats={ queues=%X removes=%X fins=%X reads=%X writes=%X miscs=%X\n"
206  " disconnects=%X aborts=%X bus_resets=%X host_resets=%X}\n",
207  info->stats.queues, info->stats.removes, info->stats.fins,
208  info->stats.reads, info->stats.writes, info->stats.miscs,
209  info->stats.disconnects, info->stats.aborts, info->stats.bus_resets,
210  info->stats.host_resets);
211  printk(" ifcfg={ clockrate=%X select_timeout=%X asyncperiod=%X sync_max_depth=%X }\n",
212  info->ifcfg.clockrate, info->ifcfg.select_timeout,
213  info->ifcfg.asyncperiod, info->ifcfg.sync_max_depth);
214  for (i = 0; i < 8; i++) {
215  printk(" busyluns[%d]=%08lx dev[%d]={ disconnect_ok=%d stp=%X sof=%X sync_state=%X }\n",
216  i, info->busyluns[i], i,
217  info->device[i].disconnect_ok, info->device[i].stp,
218  info->device[i].sof, info->device[i].sync_state);
219  }
220  printk(" dma={ transfer_type=%X setup=%p pseudo=%p stop=%p }\n",
221  info->dma.transfer_type, info->dma.setup,
222  info->dma.pseudo, info->dma.stop);
223  printk(" internal_done=%X magic_end=%lX }\n",
224  info->internal_done, info->magic_end);
225 }
226 
227 static void __fas216_checkmagic(FAS216_Info *info, const char *func)
228 {
229  int corruption = 0;
230  if (info->magic_start != MAGIC) {
231  printk(KERN_CRIT "FAS216 Error: magic at start corrupted\n");
232  corruption++;
233  }
234  if (info->magic_end != MAGIC) {
235  printk(KERN_CRIT "FAS216 Error: magic at end corrupted\n");
236  corruption++;
237  }
238  if (corruption) {
239  fas216_dumpinfo(info);
240  panic("scsi memory space corrupted in %s", func);
241  }
242 }
243 #define fas216_checkmagic(info) __fas216_checkmagic((info), __func__)
244 #else
245 #define fas216_checkmagic(info)
246 #endif
247 
248 static const char *fas216_bus_phase(int stat)
249 {
250  static const char *phases[] = {
251  "DATA OUT", "DATA IN",
252  "COMMAND", "STATUS",
253  "MISC OUT", "MISC IN",
254  "MESG OUT", "MESG IN"
255  };
256 
257  return phases[stat & STAT_BUSMASK];
258 }
259 
260 static const char *fas216_drv_phase(FAS216_Info *info)
261 {
262  static const char *phases[] = {
263  [PHASE_IDLE] = "idle",
264  [PHASE_SELECTION] = "selection",
265  [PHASE_COMMAND] = "command",
266  [PHASE_DATAOUT] = "data out",
267  [PHASE_DATAIN] = "data in",
268  [PHASE_MSGIN] = "message in",
269  [PHASE_MSGIN_DISCONNECT]= "disconnect",
270  [PHASE_MSGOUT_EXPECT] = "expect message out",
271  [PHASE_MSGOUT] = "message out",
272  [PHASE_STATUS] = "status",
273  [PHASE_DONE] = "done",
274  };
275 
276  if (info->scsi.phase < ARRAY_SIZE(phases) &&
277  phases[info->scsi.phase])
278  return phases[info->scsi.phase];
279  return "???";
280 }
281 
282 static char fas216_target(FAS216_Info *info)
283 {
284  if (info->SCpnt)
285  return '0' + info->SCpnt->device->id;
286  else
287  return 'H';
288 }
289 
290 static void
291 fas216_do_log(FAS216_Info *info, char target, char *fmt, va_list ap)
292 {
293  static char buf[1024];
294 
295  vsnprintf(buf, sizeof(buf), fmt, ap);
296  printk("scsi%d.%c: %s", info->host->host_no, target, buf);
297 }
298 
299 static void fas216_log_command(FAS216_Info *info, int level,
300  struct scsi_cmnd *SCpnt, char *fmt, ...)
301 {
302  va_list args;
303 
304  if (level != 0 && !(level & level_mask))
305  return;
306 
307  va_start(args, fmt);
308  fas216_do_log(info, '0' + SCpnt->device->id, fmt, args);
309  va_end(args);
310 
311  printk(" CDB: ");
312  __scsi_print_command(SCpnt->cmnd);
313 }
314 
315 static void
316 fas216_log_target(FAS216_Info *info, int level, int target, char *fmt, ...)
317 {
318  va_list args;
319 
320  if (level != 0 && !(level & level_mask))
321  return;
322 
323  if (target < 0)
324  target = 'H';
325  else
326  target += '0';
327 
328  va_start(args, fmt);
329  fas216_do_log(info, target, fmt, args);
330  va_end(args);
331 
332  printk("\n");
333 }
334 
335 static void fas216_log(FAS216_Info *info, int level, char *fmt, ...)
336 {
337  va_list args;
338 
339  if (level != 0 && !(level & level_mask))
340  return;
341 
342  va_start(args, fmt);
343  fas216_do_log(info, fas216_target(info), fmt, args);
344  va_end(args);
345 
346  printk("\n");
347 }
348 
349 #define PH_SIZE 32
350 
351 static struct { int stat, ssr, isr, ph; } ph_list[PH_SIZE];
352 static int ph_ptr;
353 
354 static void add_debug_list(int stat, int ssr, int isr, int ph)
355 {
356  ph_list[ph_ptr].stat = stat;
357  ph_list[ph_ptr].ssr = ssr;
358  ph_list[ph_ptr].isr = isr;
359  ph_list[ph_ptr].ph = ph;
360 
361  ph_ptr = (ph_ptr + 1) & (PH_SIZE-1);
362 }
363 
364 static struct { int command; void *from; } cmd_list[8];
365 static int cmd_ptr;
366 
367 static void fas216_cmd(FAS216_Info *info, unsigned int command)
368 {
369  cmd_list[cmd_ptr].command = command;
370  cmd_list[cmd_ptr].from = __builtin_return_address(0);
371 
372  cmd_ptr = (cmd_ptr + 1) & 7;
373 
374  fas216_writeb(info, REG_CMD, command);
375 }
376 
377 static void print_debug_list(void)
378 {
379  int i;
380 
381  i = ph_ptr;
382 
383  printk(KERN_ERR "SCSI IRQ trail\n");
384  do {
385  printk(" %02x:%02x:%02x:%1x",
386  ph_list[i].stat, ph_list[i].ssr,
387  ph_list[i].isr, ph_list[i].ph);
388  i = (i + 1) & (PH_SIZE - 1);
389  if (((i ^ ph_ptr) & 7) == 0)
390  printk("\n");
391  } while (i != ph_ptr);
392  if ((i ^ ph_ptr) & 7)
393  printk("\n");
394 
395  i = cmd_ptr;
396  printk(KERN_ERR "FAS216 commands: ");
397  do {
398  printk("%02x:%p ", cmd_list[i].command, cmd_list[i].from);
399  i = (i + 1) & 7;
400  } while (i != cmd_ptr);
401  printk("\n");
402 }
403 
404 static void fas216_done(FAS216_Info *info, unsigned int result);
405 
413 static inline unsigned short
414 fas216_get_last_msg(FAS216_Info *info, int pos)
415 {
416  unsigned short packed_msg = NOP;
417  struct message *msg;
418  int msgnr = 0;
419 
420  while ((msg = msgqueue_getmsg(&info->scsi.msgs, msgnr++)) != NULL) {
421  if (pos >= msg->fifo)
422  break;
423  }
424 
425  if (msg) {
426  if (msg->msg[0] == EXTENDED_MESSAGE)
427  packed_msg = EXTENDED_MESSAGE | msg->msg[2] << 8;
428  else
429  packed_msg = msg->msg[0];
430  }
431 
432  fas216_log(info, LOG_MESSAGES,
433  "Message: %04x found at position %02x\n", packed_msg, pos);
434 
435  return packed_msg;
436 }
437 
446 static int fas216_syncperiod(FAS216_Info *info, int ns)
447 {
448  int value = (info->ifcfg.clockrate * ns) / 1000;
449 
450  fas216_checkmagic(info);
451 
452  if (value < 4)
453  value = 4;
454  else if (value > 35)
455  value = 35;
456 
457  return value & 31;
458 }
459 
470 static void fas216_set_sync(FAS216_Info *info, int target)
471 {
472  unsigned int cntl3;
473 
474  fas216_writeb(info, REG_SOF, info->device[target].sof);
475  fas216_writeb(info, REG_STP, info->device[target].stp);
476 
477  cntl3 = info->scsi.cfg[2];
478  if (info->device[target].period >= (200 / 4))
479  cntl3 = cntl3 & ~CNTL3_FASTSCSI;
480 
481  fas216_writeb(info, REG_CNTL3, cntl3);
482 }
483 
484 /* Synchronous transfer support
485  *
486  * Note: The SCSI II r10 spec says (5.6.12):
487  *
488  * (2) Due to historical problems with early host adapters that could
489  * not accept an SDTR message, some targets may not initiate synchronous
490  * negotiation after a power cycle as required by this standard. Host
491  * adapters that support synchronous mode may avoid the ensuing failure
492  * modes when the target is independently power cycled by initiating a
493  * synchronous negotiation on each REQUEST SENSE and INQUIRY command.
494  * This approach increases the SCSI bus overhead and is not recommended
495  * for new implementations. The correct method is to respond to an
496  * SDTR message with a MESSAGE REJECT message if the either the
497  * initiator or target devices does not support synchronous transfers
498  * or does not want to negotiate for synchronous transfers at the time.
499  * Using the correct method assures compatibility with wide data
500  * transfers and future enhancements.
501  *
502  * We will always initiate a synchronous transfer negotiation request on
503  * every INQUIRY or REQUEST SENSE message, unless the target itself has
504  * at some point performed a synchronous transfer negotiation request, or
505  * we have synchronous transfers disabled for this device.
506  */
507 
515 static void fas216_handlesync(FAS216_Info *info, char *msg)
516 {
517  struct fas216_device *dev = &info->device[info->SCpnt->device->id];
518  enum { sync, async, none, reject } res = none;
519 
520 #ifdef SCSI2_SYNC
521  switch (msg[0]) {
522  case MESSAGE_REJECT:
523  /* Synchronous transfer request failed.
524  * Note: SCSI II r10:
525  *
526  * SCSI devices that are capable of synchronous
527  * data transfers shall not respond to an SDTR
528  * message with a MESSAGE REJECT message.
529  *
530  * Hence, if we get this condition, we disable
531  * negotiation for this device.
532  */
533  if (dev->sync_state == neg_inprogress) {
534  dev->sync_state = neg_invalid;
535  res = async;
536  }
537  break;
538 
539  case EXTENDED_MESSAGE:
540  switch (dev->sync_state) {
541  /* We don't accept synchronous transfer requests.
542  * Respond with a MESSAGE_REJECT to prevent a
543  * synchronous transfer agreement from being reached.
544  */
545  case neg_invalid:
546  res = reject;
547  break;
548 
549  /* We were not negotiating a synchronous transfer,
550  * but the device sent us a negotiation request.
551  * Honour the request by sending back a SDTR
552  * message containing our capability, limited by
553  * the targets capability.
554  */
555  default:
556  fas216_cmd(info, CMD_SETATN);
557  if (msg[4] > info->ifcfg.sync_max_depth)
558  msg[4] = info->ifcfg.sync_max_depth;
559  if (msg[3] < 1000 / info->ifcfg.clockrate)
560  msg[3] = 1000 / info->ifcfg.clockrate;
561 
562  msgqueue_flush(&info->scsi.msgs);
563  msgqueue_addmsg(&info->scsi.msgs, 5,
565  msg[3], msg[4]);
566  info->scsi.phase = PHASE_MSGOUT_EXPECT;
567 
568  /* This is wrong. The agreement is not in effect
569  * until this message is accepted by the device
570  */
571  dev->sync_state = neg_targcomplete;
572  res = sync;
573  break;
574 
575  /* We initiated the synchronous transfer negotiation,
576  * and have successfully received a response from the
577  * target. The synchronous transfer agreement has been
578  * reached. Note: if the values returned are out of our
579  * bounds, we must reject the message.
580  */
581  case neg_inprogress:
582  res = reject;
583  if (msg[4] <= info->ifcfg.sync_max_depth &&
584  msg[3] >= 1000 / info->ifcfg.clockrate) {
585  dev->sync_state = neg_complete;
586  res = sync;
587  }
588  break;
589  }
590  }
591 #else
592  res = reject;
593 #endif
594 
595  switch (res) {
596  case sync:
597  dev->period = msg[3];
598  dev->sof = msg[4];
599  dev->stp = fas216_syncperiod(info, msg[3] * 4);
600  fas216_set_sync(info, info->SCpnt->device->id);
601  break;
602 
603  case reject:
604  fas216_cmd(info, CMD_SETATN);
605  msgqueue_flush(&info->scsi.msgs);
606  msgqueue_addmsg(&info->scsi.msgs, 1, MESSAGE_REJECT);
607  info->scsi.phase = PHASE_MSGOUT_EXPECT;
608 
609  case async:
610  dev->period = info->ifcfg.asyncperiod / 4;
611  dev->sof = 0;
612  dev->stp = info->scsi.async_stp;
613  fas216_set_sync(info, info->SCpnt->device->id);
614  break;
615 
616  case none:
617  break;
618  }
619 }
620 
628 static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
629 {
630  struct scsi_pointer *SCp = &info->scsi.SCp;
631 
632  fas216_checkmagic(info);
633 
634  BUG_ON(bytes_transferred < 0);
635 
636  SCp->phase -= bytes_transferred;
637 
638  while (bytes_transferred != 0) {
639  if (SCp->this_residual > bytes_transferred)
640  break;
641  /*
642  * We have used up this buffer. Move on to the
643  * next buffer.
644  */
645  bytes_transferred -= SCp->this_residual;
646  if (!next_SCp(SCp) && bytes_transferred) {
647  printk(KERN_WARNING "scsi%d.%c: out of buffers\n",
648  info->host->host_no, '0' + info->SCpnt->device->id);
649  return;
650  }
651  }
652 
653  SCp->this_residual -= bytes_transferred;
654  if (SCp->this_residual)
655  SCp->ptr += bytes_transferred;
656  else
657  SCp->ptr = NULL;
658 }
659 
668 static void fas216_pio(FAS216_Info *info, fasdmadir_t direction)
669 {
670  struct scsi_pointer *SCp = &info->scsi.SCp;
671 
672  fas216_checkmagic(info);
673 
674  if (direction == DMA_OUT)
675  fas216_writeb(info, REG_FF, get_next_SCp_byte(SCp));
676  else
677  put_next_SCp_byte(SCp, fas216_readb(info, REG_FF));
678 
679  if (SCp->this_residual == 0)
680  next_SCp(SCp);
681 }
682 
683 static void fas216_set_stc(FAS216_Info *info, unsigned int length)
684 {
685  fas216_writeb(info, REG_STCL, length);
686  fas216_writeb(info, REG_STCM, length >> 8);
687  fas216_writeb(info, REG_STCH, length >> 16);
688 }
689 
690 static unsigned int fas216_get_ctc(FAS216_Info *info)
691 {
692  return fas216_readb(info, REG_CTCL) +
693  (fas216_readb(info, REG_CTCM) << 8) +
694  (fas216_readb(info, REG_CTCH) << 16);
695 }
696 
704 static void fas216_cleanuptransfer(FAS216_Info *info)
705 {
706  unsigned long total, residual, fifo;
707  fasdmatype_t dmatype = info->dma.transfer_type;
708 
709  info->dma.transfer_type = fasdma_none;
710 
711  /*
712  * PIO transfers do not need to be cleaned up.
713  */
714  if (dmatype == fasdma_pio || dmatype == fasdma_none)
715  return;
716 
717  if (dmatype == fasdma_real_all)
718  total = info->scsi.SCp.phase;
719  else
720  total = info->scsi.SCp.this_residual;
721 
722  residual = fas216_get_ctc(info);
723 
724  fifo = fas216_readb(info, REG_CFIS) & CFIS_CF;
725 
726  fas216_log(info, LOG_BUFFER, "cleaning up from previous "
727  "transfer: length 0x%06x, residual 0x%x, fifo %d",
728  total, residual, fifo);
729 
730  /*
731  * If we were performing Data-Out, the transfer counter
732  * counts down each time a byte is transferred by the
733  * host to the FIFO. This means we must include the
734  * bytes left in the FIFO from the transfer counter.
735  */
736  if (info->scsi.phase == PHASE_DATAOUT)
737  residual += fifo;
738 
739  fas216_updateptrs(info, total - residual);
740 }
741 
748 static void fas216_transfer(FAS216_Info *info)
749 {
751  fasdmatype_t dmatype;
752 
753  fas216_log(info, LOG_BUFFER,
754  "starttransfer: buffer %p length 0x%06x reqlen 0x%06x",
755  info->scsi.SCp.ptr, info->scsi.SCp.this_residual,
756  info->scsi.SCp.phase);
757 
758  if (!info->scsi.SCp.ptr) {
759  fas216_log(info, LOG_ERROR, "null buffer passed to "
760  "fas216_starttransfer");
761  print_SCp(&info->scsi.SCp, "SCp: ", "\n");
762  print_SCp(&info->SCpnt->SCp, "Cmnd SCp: ", "\n");
763  return;
764  }
765 
766  /*
767  * If we have a synchronous transfer agreement in effect, we must
768  * use DMA mode. If we are using asynchronous transfers, we may
769  * use DMA mode or PIO mode.
770  */
771  if (info->device[info->SCpnt->device->id].sof)
772  dmatype = fasdma_real_all;
773  else
774  dmatype = fasdma_pio;
775 
776  if (info->scsi.phase == PHASE_DATAOUT)
777  direction = DMA_OUT;
778  else
779  direction = DMA_IN;
780 
781  if (info->dma.setup)
782  dmatype = info->dma.setup(info->host, &info->scsi.SCp,
783  direction, dmatype);
784  info->dma.transfer_type = dmatype;
785 
786  if (dmatype == fasdma_real_all)
787  fas216_set_stc(info, info->scsi.SCp.phase);
788  else
789  fas216_set_stc(info, info->scsi.SCp.this_residual);
790 
791  switch (dmatype) {
792  case fasdma_pio:
793  fas216_log(info, LOG_BUFFER, "PIO transfer");
794  fas216_writeb(info, REG_SOF, 0);
795  fas216_writeb(info, REG_STP, info->scsi.async_stp);
796  fas216_cmd(info, CMD_TRANSFERINFO);
797  fas216_pio(info, direction);
798  break;
799 
800  case fasdma_pseudo:
801  fas216_log(info, LOG_BUFFER, "pseudo transfer");
802  fas216_cmd(info, CMD_TRANSFERINFO | CMD_WITHDMA);
803  info->dma.pseudo(info->host, &info->scsi.SCp,
804  direction, info->SCpnt->transfersize);
805  break;
806 
807  case fasdma_real_block:
808  fas216_log(info, LOG_BUFFER, "block dma transfer");
809  fas216_cmd(info, CMD_TRANSFERINFO | CMD_WITHDMA);
810  break;
811 
812  case fasdma_real_all:
813  fas216_log(info, LOG_BUFFER, "total dma transfer");
814  fas216_cmd(info, CMD_TRANSFERINFO | CMD_WITHDMA);
815  break;
816 
817  default:
818  fas216_log(info, LOG_BUFFER | LOG_ERROR,
819  "invalid FAS216 DMA type");
820  break;
821  }
822 }
823 
830 static void fas216_stoptransfer(FAS216_Info *info)
831 {
832  fas216_checkmagic(info);
833 
834  if (info->dma.transfer_type == fasdma_real_all ||
835  info->dma.transfer_type == fasdma_real_block)
836  info->dma.stop(info->host, &info->scsi.SCp);
837 
838  fas216_cleanuptransfer(info);
839 
840  if (info->scsi.phase == PHASE_DATAIN) {
841  unsigned int fifo;
842 
843  /*
844  * If we were performing Data-In, then the FIFO counter
845  * contains the number of bytes not transferred via DMA
846  * from the on-board FIFO. Read them manually.
847  */
848  fifo = fas216_readb(info, REG_CFIS) & CFIS_CF;
849  while (fifo && info->scsi.SCp.ptr) {
850  *info->scsi.SCp.ptr = fas216_readb(info, REG_FF);
851  fas216_updateptrs(info, 1);
852  fifo--;
853  }
854  } else {
855  /*
856  * After a Data-Out phase, there may be unsent
857  * bytes left in the FIFO. Flush them out.
858  */
859  fas216_cmd(info, CMD_FLUSHFIFO);
860  }
861 }
862 
863 static void fas216_aborttransfer(FAS216_Info *info)
864 {
865  fas216_checkmagic(info);
866 
867  if (info->dma.transfer_type == fasdma_real_all ||
868  info->dma.transfer_type == fasdma_real_block)
869  info->dma.stop(info->host, &info->scsi.SCp);
870 
871  info->dma.transfer_type = fasdma_none;
872  fas216_cmd(info, CMD_FLUSHFIFO);
873 }
874 
875 static void fas216_kick(FAS216_Info *info);
876 
883 static void fas216_disconnect_intr(FAS216_Info *info)
884 {
885  unsigned long flags;
886 
887  fas216_checkmagic(info);
888 
889  fas216_log(info, LOG_CONNECT, "disconnect phase=%02x",
890  info->scsi.phase);
891 
892  msgqueue_flush(&info->scsi.msgs);
893 
894  switch (info->scsi.phase) {
895  case PHASE_SELECTION: /* while selecting - no target */
896  case PHASE_SELSTEPS:
897  fas216_done(info, DID_NO_CONNECT);
898  break;
899 
900  case PHASE_MSGIN_DISCONNECT: /* message in - disconnecting */
901  info->scsi.disconnectable = 1;
902  info->scsi.phase = PHASE_IDLE;
903  info->stats.disconnects += 1;
904  spin_lock_irqsave(&info->host_lock, flags);
905  if (info->scsi.phase == PHASE_IDLE)
906  fas216_kick(info);
907  spin_unlock_irqrestore(&info->host_lock, flags);
908  break;
909 
910  case PHASE_DONE: /* at end of command - complete */
911  fas216_done(info, DID_OK);
912  break;
913 
914  case PHASE_MSGOUT: /* message out - possible ABORT message */
915  if (fas216_get_last_msg(info, info->scsi.msgin_fifo) == ABORT) {
916  info->scsi.aborting = 0;
917  fas216_done(info, DID_ABORT);
918  break;
919  }
920 
921  default: /* huh? */
922  printk(KERN_ERR "scsi%d.%c: unexpected disconnect in phase %s\n",
923  info->host->host_no, fas216_target(info), fas216_drv_phase(info));
924  print_debug_list();
925  fas216_stoptransfer(info);
926  fas216_done(info, DID_ERROR);
927  break;
928  }
929 }
930 
937 static void
938 fas216_reselected_intr(FAS216_Info *info)
939 {
940  unsigned int cfis, i;
941  unsigned char msg[4];
942  unsigned char target, lun, tag;
943 
944  fas216_checkmagic(info);
945 
946  WARN_ON(info->scsi.phase == PHASE_SELECTION ||
947  info->scsi.phase == PHASE_SELSTEPS);
948 
949  cfis = fas216_readb(info, REG_CFIS);
950 
951  fas216_log(info, LOG_CONNECT, "reconnect phase=%02x cfis=%02x",
952  info->scsi.phase, cfis);
953 
954  cfis &= CFIS_CF;
955 
956  if (cfis < 2 || cfis > 4) {
957  printk(KERN_ERR "scsi%d.H: incorrect number of bytes after reselect\n",
958  info->host->host_no);
959  goto bad_message;
960  }
961 
962  for (i = 0; i < cfis; i++)
963  msg[i] = fas216_readb(info, REG_FF);
964 
965  if (!(msg[0] & (1 << info->host->this_id)) ||
966  !(msg[1] & 0x80))
967  goto initiator_error;
968 
969  target = msg[0] & ~(1 << info->host->this_id);
970  target = ffs(target) - 1;
971  lun = msg[1] & 7;
972  tag = 0;
973 
974  if (cfis >= 3) {
975  if (msg[2] != SIMPLE_QUEUE_TAG)
976  goto initiator_error;
977 
978  tag = msg[3];
979  }
980 
981  /* set up for synchronous transfers */
982  fas216_writeb(info, REG_SDID, target);
983  fas216_set_sync(info, target);
984  msgqueue_flush(&info->scsi.msgs);
985 
986  fas216_log(info, LOG_CONNECT, "Reconnected: target %1x lun %1x tag %02x",
987  target, lun, tag);
988 
989  if (info->scsi.disconnectable && info->SCpnt) {
990  info->scsi.disconnectable = 0;
991  if (info->SCpnt->device->id == target &&
992  info->SCpnt->device->lun == lun &&
993  info->SCpnt->tag == tag) {
994  fas216_log(info, LOG_CONNECT, "reconnected previously executing command");
995  } else {
996  queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt);
997  fas216_log(info, LOG_CONNECT, "had to move command to disconnected queue");
998  info->SCpnt = NULL;
999  }
1000  }
1001  if (!info->SCpnt) {
1002  info->SCpnt = queue_remove_tgtluntag(&info->queues.disconnected,
1003  target, lun, tag);
1004  fas216_log(info, LOG_CONNECT, "had to get command");
1005  }
1006 
1007  if (info->SCpnt) {
1008  /*
1009  * Restore data pointer from SAVED data pointer
1010  */
1011  info->scsi.SCp = info->SCpnt->SCp;
1012 
1013  fas216_log(info, LOG_CONNECT, "data pointers: [%p, %X]",
1014  info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
1015  info->scsi.phase = PHASE_MSGIN;
1016  } else {
1017  /*
1018  * Our command structure not found - abort the
1019  * command on the target. Since we have no
1020  * record of this command, we can't send
1021  * an INITIATOR DETECTED ERROR message.
1022  */
1023  fas216_cmd(info, CMD_SETATN);
1024 
1025 #if 0
1026  if (tag)
1027  msgqueue_addmsg(&info->scsi.msgs, 2, ABORT_TAG, tag);
1028  else
1029 #endif
1030  msgqueue_addmsg(&info->scsi.msgs, 1, ABORT);
1031  info->scsi.phase = PHASE_MSGOUT_EXPECT;
1032  info->scsi.aborting = 1;
1033  }
1034 
1035  fas216_cmd(info, CMD_MSGACCEPTED);
1036  return;
1037 
1038  initiator_error:
1039  printk(KERN_ERR "scsi%d.H: error during reselection: bytes",
1040  info->host->host_no);
1041  for (i = 0; i < cfis; i++)
1042  printk(" %02x", msg[i]);
1043  printk("\n");
1044  bad_message:
1045  fas216_cmd(info, CMD_SETATN);
1046  msgqueue_flush(&info->scsi.msgs);
1047  msgqueue_addmsg(&info->scsi.msgs, 1, INITIATOR_ERROR);
1048  info->scsi.phase = PHASE_MSGOUT_EXPECT;
1049  fas216_cmd(info, CMD_MSGACCEPTED);
1050 }
1051 
1052 static void fas216_parse_message(FAS216_Info *info, unsigned char *message, int msglen)
1053 {
1054  int i;
1055 
1056  switch (message[0]) {
1057  case COMMAND_COMPLETE:
1058  if (msglen != 1)
1059  goto unrecognised;
1060 
1061  printk(KERN_ERR "scsi%d.%c: command complete with no "
1062  "status in MESSAGE_IN?\n",
1063  info->host->host_no, fas216_target(info));
1064  break;
1065 
1066  case SAVE_POINTERS:
1067  if (msglen != 1)
1068  goto unrecognised;
1069 
1070  /*
1071  * Save current data pointer to SAVED data pointer
1072  * SCSI II standard says that we must not acknowledge
1073  * this until we have really saved pointers.
1074  * NOTE: we DO NOT save the command nor status pointers
1075  * as required by the SCSI II standard. These always
1076  * point to the start of their respective areas.
1077  */
1078  info->SCpnt->SCp = info->scsi.SCp;
1079  info->SCpnt->SCp.sent_command = 0;
1080  fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER,
1081  "save data pointers: [%p, %X]",
1082  info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
1083  break;
1084 
1085  case RESTORE_POINTERS:
1086  if (msglen != 1)
1087  goto unrecognised;
1088 
1089  /*
1090  * Restore current data pointer from SAVED data pointer
1091  */
1092  info->scsi.SCp = info->SCpnt->SCp;
1093  fas216_log(info, LOG_CONNECT | LOG_MESSAGES | LOG_BUFFER,
1094  "restore data pointers: [%p, 0x%x]",
1095  info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
1096  break;
1097 
1098  case DISCONNECT:
1099  if (msglen != 1)
1100  goto unrecognised;
1101 
1102  info->scsi.phase = PHASE_MSGIN_DISCONNECT;
1103  break;
1104 
1105  case MESSAGE_REJECT:
1106  if (msglen != 1)
1107  goto unrecognised;
1108 
1109  switch (fas216_get_last_msg(info, info->scsi.msgin_fifo)) {
1110  case EXTENDED_MESSAGE | EXTENDED_SDTR << 8:
1111  fas216_handlesync(info, message);
1112  break;
1113 
1114  default:
1115  fas216_log(info, 0, "reject, last message 0x%04x",
1116  fas216_get_last_msg(info, info->scsi.msgin_fifo));
1117  }
1118  break;
1119 
1120  case NOP:
1121  break;
1122 
1123  case EXTENDED_MESSAGE:
1124  if (msglen < 3)
1125  goto unrecognised;
1126 
1127  switch (message[2]) {
1128  case EXTENDED_SDTR: /* Sync transfer negotiation request/reply */
1129  fas216_handlesync(info, message);
1130  break;
1131 
1132  default:
1133  goto unrecognised;
1134  }
1135  break;
1136 
1137  default:
1138  goto unrecognised;
1139  }
1140  return;
1141 
1142 unrecognised:
1143  fas216_log(info, 0, "unrecognised message, rejecting");
1144  printk("scsi%d.%c: message was", info->host->host_no, fas216_target(info));
1145  for (i = 0; i < msglen; i++)
1146  printk("%s%02X", i & 31 ? " " : "\n ", message[i]);
1147  printk("\n");
1148 
1149  /*
1150  * Something strange seems to be happening here -
1151  * I can't use SETATN since the chip gives me an
1152  * invalid command interrupt when I do. Weird.
1153  */
1154 fas216_cmd(info, CMD_NOP);
1155 fas216_dumpstate(info);
1156  fas216_cmd(info, CMD_SETATN);
1157  msgqueue_flush(&info->scsi.msgs);
1158  msgqueue_addmsg(&info->scsi.msgs, 1, MESSAGE_REJECT);
1159  info->scsi.phase = PHASE_MSGOUT_EXPECT;
1160 fas216_dumpstate(info);
1161 }
1162 
1163 static int fas216_wait_cmd(FAS216_Info *info, int cmd)
1164 {
1165  int tout;
1166  int stat;
1167 
1168  fas216_cmd(info, cmd);
1169 
1170  for (tout = 1000; tout; tout -= 1) {
1171  stat = fas216_readb(info, REG_STAT);
1172  if (stat & (STAT_INT|STAT_PARITYERROR))
1173  break;
1174  udelay(1);
1175  }
1176 
1177  return stat;
1178 }
1179 
1180 static int fas216_get_msg_byte(FAS216_Info *info)
1181 {
1182  unsigned int stat = fas216_wait_cmd(info, CMD_MSGACCEPTED);
1183 
1184  if ((stat & STAT_INT) == 0)
1185  goto timedout;
1186 
1187  if ((stat & STAT_BUSMASK) != STAT_MESGIN)
1188  goto unexpected_phase_change;
1189 
1190  fas216_readb(info, REG_INST);
1191 
1192  stat = fas216_wait_cmd(info, CMD_TRANSFERINFO);
1193 
1194  if ((stat & STAT_INT) == 0)
1195  goto timedout;
1196 
1197  if (stat & STAT_PARITYERROR)
1198  goto parity_error;
1199 
1200  if ((stat & STAT_BUSMASK) != STAT_MESGIN)
1201  goto unexpected_phase_change;
1202 
1203  fas216_readb(info, REG_INST);
1204 
1205  return fas216_readb(info, REG_FF);
1206 
1207 timedout:
1208  fas216_log(info, LOG_ERROR, "timed out waiting for message byte");
1209  return -1;
1210 
1211 unexpected_phase_change:
1212  fas216_log(info, LOG_ERROR, "unexpected phase change: status = %02x", stat);
1213  return -2;
1214 
1215 parity_error:
1216  fas216_log(info, LOG_ERROR, "parity error during message in phase");
1217  return -3;
1218 }
1219 
1226 static void fas216_message(FAS216_Info *info)
1227 {
1228  unsigned char *message = info->scsi.message;
1229  unsigned int msglen = 1;
1230  int msgbyte = 0;
1231 
1232  fas216_checkmagic(info);
1233 
1234  message[0] = fas216_readb(info, REG_FF);
1235 
1236  if (message[0] == EXTENDED_MESSAGE) {
1237  msgbyte = fas216_get_msg_byte(info);
1238 
1239  if (msgbyte >= 0) {
1240  message[1] = msgbyte;
1241 
1242  for (msglen = 2; msglen < message[1] + 2; msglen++) {
1243  msgbyte = fas216_get_msg_byte(info);
1244 
1245  if (msgbyte >= 0)
1246  message[msglen] = msgbyte;
1247  else
1248  break;
1249  }
1250  }
1251  }
1252 
1253  if (msgbyte == -3)
1254  goto parity_error;
1255 
1256 #ifdef DEBUG_MESSAGES
1257  {
1258  int i;
1259 
1260  printk("scsi%d.%c: message in: ",
1261  info->host->host_no, fas216_target(info));
1262  for (i = 0; i < msglen; i++)
1263  printk("%02X ", message[i]);
1264  printk("\n");
1265  }
1266 #endif
1267 
1268  fas216_parse_message(info, message, msglen);
1269  fas216_cmd(info, CMD_MSGACCEPTED);
1270  return;
1271 
1272 parity_error:
1273  fas216_cmd(info, CMD_SETATN);
1274  msgqueue_flush(&info->scsi.msgs);
1275  msgqueue_addmsg(&info->scsi.msgs, 1, MSG_PARITY_ERROR);
1276  info->scsi.phase = PHASE_MSGOUT_EXPECT;
1277  fas216_cmd(info, CMD_MSGACCEPTED);
1278  return;
1279 }
1280 
1287 static void fas216_send_command(FAS216_Info *info)
1288 {
1289  int i;
1290 
1291  fas216_checkmagic(info);
1292 
1293  fas216_cmd(info, CMD_NOP|CMD_WITHDMA);
1294  fas216_cmd(info, CMD_FLUSHFIFO);
1295 
1296  /* load command */
1297  for (i = info->scsi.SCp.sent_command; i < info->SCpnt->cmd_len; i++)
1298  fas216_writeb(info, REG_FF, info->SCpnt->cmnd[i]);
1299 
1300  fas216_cmd(info, CMD_TRANSFERINFO);
1301 
1302  info->scsi.phase = PHASE_COMMAND;
1303 }
1304 
1312 static void fas216_send_messageout(FAS216_Info *info, int start)
1313 {
1314  unsigned int tot_msglen = msgqueue_msglength(&info->scsi.msgs);
1315 
1316  fas216_checkmagic(info);
1317 
1318  fas216_cmd(info, CMD_FLUSHFIFO);
1319 
1320  if (tot_msglen) {
1321  struct message *msg;
1322  int msgnr = 0;
1323 
1324  while ((msg = msgqueue_getmsg(&info->scsi.msgs, msgnr++)) != NULL) {
1325  int i;
1326 
1327  for (i = start; i < msg->length; i++)
1328  fas216_writeb(info, REG_FF, msg->msg[i]);
1329 
1330  msg->fifo = tot_msglen - (fas216_readb(info, REG_CFIS) & CFIS_CF);
1331  start = 0;
1332  }
1333  } else
1334  fas216_writeb(info, REG_FF, NOP);
1335 
1336  fas216_cmd(info, CMD_TRANSFERINFO);
1337 
1338  info->scsi.phase = PHASE_MSGOUT;
1339 }
1340 
1349 static void fas216_busservice_intr(FAS216_Info *info, unsigned int stat, unsigned int is)
1350 {
1351  fas216_checkmagic(info);
1352 
1353  fas216_log(info, LOG_BUSSERVICE,
1354  "bus service: stat=%02x is=%02x phase=%02x",
1355  stat, is, info->scsi.phase);
1356 
1357  switch (info->scsi.phase) {
1358  case PHASE_SELECTION:
1359  if ((is & IS_BITS) != IS_MSGBYTESENT)
1360  goto bad_is;
1361  break;
1362 
1363  case PHASE_SELSTEPS:
1364  switch (is & IS_BITS) {
1365  case IS_SELARB:
1366  case IS_MSGBYTESENT:
1367  goto bad_is;
1368 
1369  case IS_NOTCOMMAND:
1370  case IS_EARLYPHASE:
1371  if ((stat & STAT_BUSMASK) == STAT_MESGIN)
1372  break;
1373  goto bad_is;
1374 
1375  case IS_COMPLETE:
1376  break;
1377  }
1378 
1379  default:
1380  break;
1381  }
1382 
1383  fas216_cmd(info, CMD_NOP);
1384 
1385 #define STATE(st,ph) ((ph) << 3 | (st))
1386  /* This table describes the legal SCSI state transitions,
1387  * as described by the SCSI II spec.
1388  */
1389  switch (STATE(stat & STAT_BUSMASK, info->scsi.phase)) {
1390  case STATE(STAT_DATAIN, PHASE_SELSTEPS):/* Sel w/ steps -> Data In */
1391  case STATE(STAT_DATAIN, PHASE_MSGOUT): /* Message Out -> Data In */
1392  case STATE(STAT_DATAIN, PHASE_COMMAND): /* Command -> Data In */
1393  case STATE(STAT_DATAIN, PHASE_MSGIN): /* Message In -> Data In */
1394  info->scsi.phase = PHASE_DATAIN;
1395  fas216_transfer(info);
1396  return;
1397 
1398  case STATE(STAT_DATAIN, PHASE_DATAIN): /* Data In -> Data In */
1399  case STATE(STAT_DATAOUT, PHASE_DATAOUT):/* Data Out -> Data Out */
1400  fas216_cleanuptransfer(info);
1401  fas216_transfer(info);
1402  return;
1403 
1404  case STATE(STAT_DATAOUT, PHASE_SELSTEPS):/* Sel w/ steps-> Data Out */
1405  case STATE(STAT_DATAOUT, PHASE_MSGOUT): /* Message Out -> Data Out */
1406  case STATE(STAT_DATAOUT, PHASE_COMMAND):/* Command -> Data Out */
1407  case STATE(STAT_DATAOUT, PHASE_MSGIN): /* Message In -> Data Out */
1408  fas216_cmd(info, CMD_FLUSHFIFO);
1409  info->scsi.phase = PHASE_DATAOUT;
1410  fas216_transfer(info);
1411  return;
1412 
1413  case STATE(STAT_STATUS, PHASE_DATAOUT): /* Data Out -> Status */
1414  case STATE(STAT_STATUS, PHASE_DATAIN): /* Data In -> Status */
1415  fas216_stoptransfer(info);
1416  case STATE(STAT_STATUS, PHASE_SELSTEPS):/* Sel w/ steps -> Status */
1417  case STATE(STAT_STATUS, PHASE_MSGOUT): /* Message Out -> Status */
1418  case STATE(STAT_STATUS, PHASE_COMMAND): /* Command -> Status */
1419  case STATE(STAT_STATUS, PHASE_MSGIN): /* Message In -> Status */
1420  fas216_cmd(info, CMD_INITCMDCOMPLETE);
1421  info->scsi.phase = PHASE_STATUS;
1422  return;
1423 
1424  case STATE(STAT_MESGIN, PHASE_DATAOUT): /* Data Out -> Message In */
1425  case STATE(STAT_MESGIN, PHASE_DATAIN): /* Data In -> Message In */
1426  fas216_stoptransfer(info);
1427  case STATE(STAT_MESGIN, PHASE_COMMAND): /* Command -> Message In */
1428  case STATE(STAT_MESGIN, PHASE_SELSTEPS):/* Sel w/ steps -> Message In */
1429  case STATE(STAT_MESGIN, PHASE_MSGOUT): /* Message Out -> Message In */
1430  info->scsi.msgin_fifo = fas216_readb(info, REG_CFIS) & CFIS_CF;
1431  fas216_cmd(info, CMD_FLUSHFIFO);
1432  fas216_cmd(info, CMD_TRANSFERINFO);
1433  info->scsi.phase = PHASE_MSGIN;
1434  return;
1435 
1436  case STATE(STAT_MESGIN, PHASE_MSGIN):
1437  info->scsi.msgin_fifo = fas216_readb(info, REG_CFIS) & CFIS_CF;
1438  fas216_cmd(info, CMD_TRANSFERINFO);
1439  return;
1440 
1441  case STATE(STAT_COMMAND, PHASE_MSGOUT): /* Message Out -> Command */
1442  case STATE(STAT_COMMAND, PHASE_MSGIN): /* Message In -> Command */
1443  fas216_send_command(info);
1444  info->scsi.phase = PHASE_COMMAND;
1445  return;
1446 
1447 
1448  /*
1449  * Selection -> Message Out
1450  */
1452  fas216_send_messageout(info, 1);
1453  return;
1454 
1455  /*
1456  * Message Out -> Message Out
1457  */
1460  /*
1461  * If we get another message out phase, this usually
1462  * means some parity error occurred. Resend complete
1463  * set of messages. If we have more than one byte to
1464  * send, we need to assert ATN again.
1465  */
1466  if (info->device[info->SCpnt->device->id].parity_check) {
1467  /*
1468  * We were testing... good, the device
1469  * supports parity checking.
1470  */
1471  info->device[info->SCpnt->device->id].parity_check = 0;
1472  info->device[info->SCpnt->device->id].parity_enabled = 1;
1473  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
1474  }
1475 
1476  if (msgqueue_msglength(&info->scsi.msgs) > 1)
1477  fas216_cmd(info, CMD_SETATN);
1478  /*FALLTHROUGH*/
1479 
1480  /*
1481  * Any -> Message Out
1482  */
1484  fas216_send_messageout(info, 0);
1485  return;
1486 
1487  /* Error recovery rules.
1488  * These either attempt to abort or retry the operation.
1489  * TODO: we need more of these
1490  */
1491  case STATE(STAT_COMMAND, PHASE_COMMAND):/* Command -> Command */
1492  /* error - we've sent out all the command bytes
1493  * we have.
1494  * NOTE: we need SAVE DATA POINTERS/RESTORE DATA POINTERS
1495  * to include the command bytes sent for this to work
1496  * correctly.
1497  */
1498  printk(KERN_ERR "scsi%d.%c: "
1499  "target trying to receive more command bytes\n",
1500  info->host->host_no, fas216_target(info));
1501  fas216_cmd(info, CMD_SETATN);
1502  fas216_set_stc(info, 15);
1503  fas216_cmd(info, CMD_PADBYTES | CMD_WITHDMA);
1504  msgqueue_flush(&info->scsi.msgs);
1505  msgqueue_addmsg(&info->scsi.msgs, 1, INITIATOR_ERROR);
1506  info->scsi.phase = PHASE_MSGOUT_EXPECT;
1507  return;
1508  }
1509 
1510  if (info->scsi.phase == PHASE_MSGIN_DISCONNECT) {
1511  printk(KERN_ERR "scsi%d.%c: disconnect message received, but bus service %s?\n",
1512  info->host->host_no, fas216_target(info),
1513  fas216_bus_phase(stat));
1514  msgqueue_flush(&info->scsi.msgs);
1515  fas216_cmd(info, CMD_SETATN);
1516  msgqueue_addmsg(&info->scsi.msgs, 1, INITIATOR_ERROR);
1517  info->scsi.phase = PHASE_MSGOUT_EXPECT;
1518  info->scsi.aborting = 1;
1519  fas216_cmd(info, CMD_TRANSFERINFO);
1520  return;
1521  }
1522  printk(KERN_ERR "scsi%d.%c: bus phase %s after %s?\n",
1523  info->host->host_no, fas216_target(info),
1524  fas216_bus_phase(stat),
1525  fas216_drv_phase(info));
1526  print_debug_list();
1527  return;
1528 
1529 bad_is:
1530  fas216_log(info, 0, "bus service at step %d?", is & IS_BITS);
1531  fas216_dumpstate(info);
1532  print_debug_list();
1533 
1534  fas216_done(info, DID_ERROR);
1535 }
1536 
1545 static void fas216_funcdone_intr(FAS216_Info *info, unsigned int stat, unsigned int is)
1546 {
1547  unsigned int fifo_len = fas216_readb(info, REG_CFIS) & CFIS_CF;
1548 
1549  fas216_checkmagic(info);
1550 
1551  fas216_log(info, LOG_FUNCTIONDONE,
1552  "function done: stat=%02x is=%02x phase=%02x",
1553  stat, is, info->scsi.phase);
1554 
1555  switch (info->scsi.phase) {
1556  case PHASE_STATUS: /* status phase - read status and msg */
1557  if (fifo_len != 2) {
1558  fas216_log(info, 0, "odd number of bytes in FIFO: %d", fifo_len);
1559  }
1560  /*
1561  * Read status then message byte.
1562  */
1563  info->scsi.SCp.Status = fas216_readb(info, REG_FF);
1564  info->scsi.SCp.Message = fas216_readb(info, REG_FF);
1565  info->scsi.phase = PHASE_DONE;
1566  fas216_cmd(info, CMD_MSGACCEPTED);
1567  break;
1568 
1569  case PHASE_IDLE:
1570  case PHASE_SELECTION:
1571  case PHASE_SELSTEPS:
1572  break;
1573 
1574  case PHASE_MSGIN: /* message in phase */
1575  if ((stat & STAT_BUSMASK) == STAT_MESGIN) {
1576  info->scsi.msgin_fifo = fifo_len;
1577  fas216_message(info);
1578  break;
1579  }
1580 
1581  default:
1582  fas216_log(info, 0, "internal phase %s for function done?"
1583  " What do I do with this?",
1584  fas216_target(info), fas216_drv_phase(info));
1585  }
1586 }
1587 
1588 static void fas216_bus_reset(FAS216_Info *info)
1589 {
1590  neg_t sync_state;
1591  int i;
1592 
1593  msgqueue_flush(&info->scsi.msgs);
1594 
1595  sync_state = neg_invalid;
1596 
1597 #ifdef SCSI2_SYNC
1598  if (info->ifcfg.capabilities & (FASCAP_DMA|FASCAP_PSEUDODMA))
1599  sync_state = neg_wait;
1600 #endif
1601 
1602  info->scsi.phase = PHASE_IDLE;
1603  info->SCpnt = NULL; /* bug! */
1604  memset(&info->scsi.SCp, 0, sizeof(info->scsi.SCp));
1605 
1606  for (i = 0; i < 8; i++) {
1607  info->device[i].disconnect_ok = info->ifcfg.disconnect_ok;
1608  info->device[i].sync_state = sync_state;
1609  info->device[i].period = info->ifcfg.asyncperiod / 4;
1610  info->device[i].stp = info->scsi.async_stp;
1611  info->device[i].sof = 0;
1612  info->device[i].wide_xfer = 0;
1613  }
1614 
1615  info->rst_bus_status = 1;
1616  wake_up(&info->eh_wait);
1617 }
1618 
1626 {
1627  unsigned char inst, is, stat;
1628  int handled = IRQ_NONE;
1629 
1630  fas216_checkmagic(info);
1631 
1632  stat = fas216_readb(info, REG_STAT);
1633  is = fas216_readb(info, REG_IS);
1634  inst = fas216_readb(info, REG_INST);
1635 
1636  add_debug_list(stat, is, inst, info->scsi.phase);
1637 
1638  if (stat & STAT_INT) {
1639  if (inst & INST_BUSRESET) {
1640  fas216_log(info, 0, "bus reset detected");
1641  fas216_bus_reset(info);
1642  scsi_report_bus_reset(info->host, 0);
1643  } else if (inst & INST_ILLEGALCMD) {
1644  fas216_log(info, LOG_ERROR, "illegal command given\n");
1645  fas216_dumpstate(info);
1646  print_debug_list();
1647  } else if (inst & INST_DISCONNECT)
1648  fas216_disconnect_intr(info);
1649  else if (inst & INST_RESELECTED) /* reselected */
1650  fas216_reselected_intr(info);
1651  else if (inst & INST_BUSSERVICE) /* bus service request */
1652  fas216_busservice_intr(info, stat, is);
1653  else if (inst & INST_FUNCDONE) /* function done */
1654  fas216_funcdone_intr(info, stat, is);
1655  else
1656  fas216_log(info, 0, "unknown interrupt received:"
1657  " phase %s inst %02X is %02X stat %02X",
1658  fas216_drv_phase(info), inst, is, stat);
1659  handled = IRQ_HANDLED;
1660  }
1661  return handled;
1662 }
1663 
1664 static void __fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt)
1665 {
1666  int tot_msglen;
1667 
1668  /* following what the ESP driver says */
1669  fas216_set_stc(info, 0);
1670  fas216_cmd(info, CMD_NOP | CMD_WITHDMA);
1671 
1672  /* flush FIFO */
1673  fas216_cmd(info, CMD_FLUSHFIFO);
1674 
1675  /* load bus-id and timeout */
1676  fas216_writeb(info, REG_SDID, BUSID(SCpnt->device->id));
1677  fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout);
1678 
1679  /* synchronous transfers */
1680  fas216_set_sync(info, SCpnt->device->id);
1681 
1682  tot_msglen = msgqueue_msglength(&info->scsi.msgs);
1683 
1684 #ifdef DEBUG_MESSAGES
1685  {
1686  struct message *msg;
1687  int msgnr = 0, i;
1688 
1689  printk("scsi%d.%c: message out: ",
1690  info->host->host_no, '0' + SCpnt->device->id);
1691  while ((msg = msgqueue_getmsg(&info->scsi.msgs, msgnr++)) != NULL) {
1692  printk("{ ");
1693  for (i = 0; i < msg->length; i++)
1694  printk("%02x ", msg->msg[i]);
1695  printk("} ");
1696  }
1697  printk("\n");
1698  }
1699 #endif
1700 
1701  if (tot_msglen == 1 || tot_msglen == 3) {
1702  /*
1703  * We have an easy message length to send...
1704  */
1705  struct message *msg;
1706  int msgnr = 0, i;
1707 
1708  info->scsi.phase = PHASE_SELSTEPS;
1709 
1710  /* load message bytes */
1711  while ((msg = msgqueue_getmsg(&info->scsi.msgs, msgnr++)) != NULL) {
1712  for (i = 0; i < msg->length; i++)
1713  fas216_writeb(info, REG_FF, msg->msg[i]);
1714  msg->fifo = tot_msglen - (fas216_readb(info, REG_CFIS) & CFIS_CF);
1715  }
1716 
1717  /* load command */
1718  for (i = 0; i < SCpnt->cmd_len; i++)
1719  fas216_writeb(info, REG_FF, SCpnt->cmnd[i]);
1720 
1721  if (tot_msglen == 1)
1722  fas216_cmd(info, CMD_SELECTATN);
1723  else
1724  fas216_cmd(info, CMD_SELECTATN3);
1725  } else {
1726  /*
1727  * We have an unusual number of message bytes to send.
1728  * Load first byte into fifo, and issue SELECT with ATN and
1729  * stop steps.
1730  */
1731  struct message *msg = msgqueue_getmsg(&info->scsi.msgs, 0);
1732 
1733  fas216_writeb(info, REG_FF, msg->msg[0]);
1734  msg->fifo = 1;
1735 
1736  fas216_cmd(info, CMD_SELECTATNSTOP);
1737  }
1738 }
1739 
1740 /*
1741  * Decide whether we need to perform a parity test on this device.
1742  * Can also be used to force parity error conditions during initial
1743  * information transfer phase (message out) for test purposes.
1744  */
1745 static int parity_test(FAS216_Info *info, int target)
1746 {
1747 #if 0
1748  if (target == 3) {
1749  info->device[target].parity_check = 0;
1750  return 1;
1751  }
1752 #endif
1753  return info->device[target].parity_check;
1754 }
1755 
1756 static void fas216_start_command(FAS216_Info *info, struct scsi_cmnd *SCpnt)
1757 {
1758  int disconnect_ok;
1759 
1760  /*
1761  * claim host busy
1762  */
1763  info->scsi.phase = PHASE_SELECTION;
1764  info->scsi.SCp = SCpnt->SCp;
1765  info->SCpnt = SCpnt;
1766  info->dma.transfer_type = fasdma_none;
1767 
1768  if (parity_test(info, SCpnt->device->id))
1769  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0] | CNTL1_PTE);
1770  else
1771  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
1772 
1773  /*
1774  * Don't allow request sense commands to disconnect.
1775  */
1776  disconnect_ok = SCpnt->cmnd[0] != REQUEST_SENSE &&
1777  info->device[SCpnt->device->id].disconnect_ok;
1778 
1779  /*
1780  * build outgoing message bytes
1781  */
1782  msgqueue_flush(&info->scsi.msgs);
1783  msgqueue_addmsg(&info->scsi.msgs, 1, IDENTIFY(disconnect_ok, SCpnt->device->lun));
1784 
1785  /*
1786  * add tag message if required
1787  */
1788  if (SCpnt->tag)
1789  msgqueue_addmsg(&info->scsi.msgs, 2, SIMPLE_QUEUE_TAG, SCpnt->tag);
1790 
1791  do {
1792 #ifdef SCSI2_SYNC
1793  if ((info->device[SCpnt->device->id].sync_state == neg_wait ||
1794  info->device[SCpnt->device->id].sync_state == neg_complete) &&
1795  (SCpnt->cmnd[0] == REQUEST_SENSE ||
1796  SCpnt->cmnd[0] == INQUIRY)) {
1797  info->device[SCpnt->device->id].sync_state = neg_inprogress;
1798  msgqueue_addmsg(&info->scsi.msgs, 5,
1800  1000 / info->ifcfg.clockrate,
1801  info->ifcfg.sync_max_depth);
1802  break;
1803  }
1804 #endif
1805  } while (0);
1806 
1807  __fas216_start_command(info, SCpnt);
1808 }
1809 
1810 static void fas216_allocate_tag(FAS216_Info *info, struct scsi_cmnd *SCpnt)
1811 {
1812 #ifdef SCSI2_TAG
1813  /*
1814  * tagged queuing - allocate a new tag to this command
1815  */
1816  if (SCpnt->device->simple_tags && SCpnt->cmnd[0] != REQUEST_SENSE &&
1817  SCpnt->cmnd[0] != INQUIRY) {
1818  SCpnt->device->current_tag += 1;
1819  if (SCpnt->device->current_tag == 0)
1820  SCpnt->device->current_tag = 1;
1821  SCpnt->tag = SCpnt->device->current_tag;
1822  } else
1823 #endif
1824  set_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
1825 
1826  info->stats.removes += 1;
1827  switch (SCpnt->cmnd[0]) {
1828  case WRITE_6:
1829  case WRITE_10:
1830  case WRITE_12:
1831  info->stats.writes += 1;
1832  break;
1833  case READ_6:
1834  case READ_10:
1835  case READ_12:
1836  info->stats.reads += 1;
1837  break;
1838  default:
1839  info->stats.miscs += 1;
1840  break;
1841  }
1842 }
1843 
1844 static void fas216_do_bus_device_reset(FAS216_Info *info,
1845  struct scsi_cmnd *SCpnt)
1846 {
1847  struct message *msg;
1848 
1849  /*
1850  * claim host busy
1851  */
1852  info->scsi.phase = PHASE_SELECTION;
1853  info->scsi.SCp = SCpnt->SCp;
1854  info->SCpnt = SCpnt;
1855  info->dma.transfer_type = fasdma_none;
1856 
1857  fas216_log(info, LOG_ERROR, "sending bus device reset");
1858 
1859  msgqueue_flush(&info->scsi.msgs);
1860  msgqueue_addmsg(&info->scsi.msgs, 1, BUS_DEVICE_RESET);
1861 
1862  /* following what the ESP driver says */
1863  fas216_set_stc(info, 0);
1864  fas216_cmd(info, CMD_NOP | CMD_WITHDMA);
1865 
1866  /* flush FIFO */
1867  fas216_cmd(info, CMD_FLUSHFIFO);
1868 
1869  /* load bus-id and timeout */
1870  fas216_writeb(info, REG_SDID, BUSID(SCpnt->device->id));
1871  fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout);
1872 
1873  /* synchronous transfers */
1874  fas216_set_sync(info, SCpnt->device->id);
1875 
1876  msg = msgqueue_getmsg(&info->scsi.msgs, 0);
1877 
1878  fas216_writeb(info, REG_FF, BUS_DEVICE_RESET);
1879  msg->fifo = 1;
1880 
1881  fas216_cmd(info, CMD_SELECTATNSTOP);
1882 }
1883 
1891 static void fas216_kick(FAS216_Info *info)
1892 {
1893  struct scsi_cmnd *SCpnt = NULL;
1894 #define TYPE_OTHER 0
1895 #define TYPE_RESET 1
1896 #define TYPE_QUEUE 2
1897  int where_from = TYPE_OTHER;
1898 
1899  fas216_checkmagic(info);
1900 
1901  /*
1902  * Obtain the next command to process.
1903  */
1904  do {
1905  if (info->rstSCpnt) {
1906  SCpnt = info->rstSCpnt;
1907  /* don't remove it */
1908  where_from = TYPE_RESET;
1909  break;
1910  }
1911 
1912  if (info->reqSCpnt) {
1913  SCpnt = info->reqSCpnt;
1914  info->reqSCpnt = NULL;
1915  break;
1916  }
1917 
1918  if (info->origSCpnt) {
1919  SCpnt = info->origSCpnt;
1920  info->origSCpnt = NULL;
1921  break;
1922  }
1923 
1924  /* retrieve next command */
1925  if (!SCpnt) {
1926  SCpnt = queue_remove_exclude(&info->queues.issue,
1927  info->busyluns);
1928  where_from = TYPE_QUEUE;
1929  break;
1930  }
1931  } while (0);
1932 
1933  if (!SCpnt) {
1934  /*
1935  * no command pending, so enable reselection.
1936  */
1937  fas216_cmd(info, CMD_ENABLESEL);
1938  return;
1939  }
1940 
1941  /*
1942  * We're going to start a command, so disable reselection
1943  */
1944  fas216_cmd(info, CMD_DISABLESEL);
1945 
1946  if (info->scsi.disconnectable && info->SCpnt) {
1947  fas216_log(info, LOG_CONNECT,
1948  "moved command for %d to disconnected queue",
1949  info->SCpnt->device->id);
1950  queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt);
1951  info->scsi.disconnectable = 0;
1952  info->SCpnt = NULL;
1953  }
1954 
1955  fas216_log_command(info, LOG_CONNECT | LOG_MESSAGES, SCpnt,
1956  "starting");
1957 
1958  switch (where_from) {
1959  case TYPE_QUEUE:
1960  fas216_allocate_tag(info, SCpnt);
1961  case TYPE_OTHER:
1962  fas216_start_command(info, SCpnt);
1963  break;
1964  case TYPE_RESET:
1965  fas216_do_bus_device_reset(info, SCpnt);
1966  break;
1967  }
1968 
1969  fas216_log(info, LOG_CONNECT, "select: data pointers [%p, %X]",
1970  info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
1971 
1972  /*
1973  * should now get either DISCONNECT or
1974  * (FUNCTION DONE with BUS SERVICE) interrupt
1975  */
1976 }
1977 
1978 /*
1979  * Clean up from issuing a BUS DEVICE RESET message to a device.
1980  */
1981 static void fas216_devicereset_done(FAS216_Info *info, struct scsi_cmnd *SCpnt,
1982  unsigned int result)
1983 {
1984  fas216_log(info, LOG_ERROR, "fas216 device reset complete");
1985 
1986  info->rstSCpnt = NULL;
1987  info->rst_dev_status = 1;
1988  wake_up(&info->eh_wait);
1989 }
1990 
1999 static void fas216_rq_sns_done(FAS216_Info *info, struct scsi_cmnd *SCpnt,
2000  unsigned int result)
2001 {
2002  fas216_log_target(info, LOG_CONNECT, SCpnt->device->id,
2003  "request sense complete, result=0x%04x%02x%02x",
2004  result, SCpnt->SCp.Message, SCpnt->SCp.Status);
2005 
2006  if (result != DID_OK || SCpnt->SCp.Status != GOOD)
2007  /*
2008  * Something went wrong. Make sure that we don't
2009  * have valid data in the sense buffer that could
2010  * confuse the higher levels.
2011  */
2012  memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer));
2013 //printk("scsi%d.%c: sense buffer: ", info->host->host_no, '0' + SCpnt->device->id);
2014 //{ int i; for (i = 0; i < 32; i++) printk("%02x ", SCpnt->sense_buffer[i]); printk("\n"); }
2015  /*
2016  * Note that we don't set SCpnt->result, since that should
2017  * reflect the status of the command that we were asked by
2018  * the upper layers to process. This would have been set
2019  * correctly by fas216_std_done.
2020  */
2021  scsi_eh_restore_cmnd(SCpnt, &info->ses);
2022  SCpnt->scsi_done(SCpnt);
2023 }
2024 
2033 static void
2034 fas216_std_done(FAS216_Info *info, struct scsi_cmnd *SCpnt, unsigned int result)
2035 {
2036  info->stats.fins += 1;
2037 
2038  SCpnt->result = result << 16 | info->scsi.SCp.Message << 8 |
2039  info->scsi.SCp.Status;
2040 
2041  fas216_log_command(info, LOG_CONNECT, SCpnt,
2042  "command complete, result=0x%08x", SCpnt->result);
2043 
2044  /*
2045  * If the driver detected an error, we're all done.
2046  */
2047  if (host_byte(SCpnt->result) != DID_OK ||
2048  msg_byte(SCpnt->result) != COMMAND_COMPLETE)
2049  goto done;
2050 
2051  /*
2052  * If the command returned CHECK_CONDITION or COMMAND_TERMINATED
2053  * status, request the sense information.
2054  */
2055  if (status_byte(SCpnt->result) == CHECK_CONDITION ||
2057  goto request_sense;
2058 
2059  /*
2060  * If the command did not complete with GOOD status,
2061  * we are all done here.
2062  */
2063  if (status_byte(SCpnt->result) != GOOD)
2064  goto done;
2065 
2066  /*
2067  * We have successfully completed a command. Make sure that
2068  * we do not have any buffers left to transfer. The world
2069  * is not perfect, and we seem to occasionally hit this.
2070  * It can be indicative of a buggy driver, target or the upper
2071  * levels of the SCSI code.
2072  */
2073  if (info->scsi.SCp.ptr) {
2074  switch (SCpnt->cmnd[0]) {
2075  case INQUIRY:
2076  case START_STOP:
2077  case MODE_SENSE:
2078  break;
2079 
2080  default:
2081  printk(KERN_ERR "scsi%d.%c: incomplete data transfer "
2082  "detected: res=%08X ptr=%p len=%X CDB: ",
2083  info->host->host_no, '0' + SCpnt->device->id,
2084  SCpnt->result, info->scsi.SCp.ptr,
2085  info->scsi.SCp.this_residual);
2086  __scsi_print_command(SCpnt->cmnd);
2087  SCpnt->result &= ~(255 << 16);
2088  SCpnt->result |= DID_BAD_TARGET << 16;
2089  goto request_sense;
2090  }
2091  }
2092 
2093 done:
2094  if (SCpnt->scsi_done) {
2095  SCpnt->scsi_done(SCpnt);
2096  return;
2097  }
2098 
2099  panic("scsi%d.H: null scsi_done function in fas216_done",
2100  info->host->host_no);
2101 
2102 
2104  if (SCpnt->cmnd[0] == REQUEST_SENSE)
2105  goto done;
2106 
2107  scsi_eh_prep_cmnd(SCpnt, &info->ses, NULL, 0, ~0);
2108  fas216_log_target(info, LOG_CONNECT, SCpnt->device->id,
2109  "requesting sense");
2110  init_SCp(SCpnt);
2111  SCpnt->SCp.Message = 0;
2112  SCpnt->SCp.Status = 0;
2113  SCpnt->tag = 0;
2114  SCpnt->host_scribble = (void *)fas216_rq_sns_done;
2115 
2116  /*
2117  * Place this command into the high priority "request
2118  * sense" slot. This will be the very next command
2119  * executed, unless a target connects to us.
2120  */
2121  if (info->reqSCpnt)
2122  printk(KERN_WARNING "scsi%d.%c: losing request command\n",
2123  info->host->host_no, '0' + SCpnt->device->id);
2124  info->reqSCpnt = SCpnt;
2125 }
2126 
2134 static void fas216_done(FAS216_Info *info, unsigned int result)
2135 {
2136  void (*fn)(FAS216_Info *, struct scsi_cmnd *, unsigned int);
2137  struct scsi_cmnd *SCpnt;
2138  unsigned long flags;
2139 
2140  fas216_checkmagic(info);
2141 
2142  if (!info->SCpnt)
2143  goto no_command;
2144 
2145  SCpnt = info->SCpnt;
2146  info->SCpnt = NULL;
2147  info->scsi.phase = PHASE_IDLE;
2148 
2149  if (info->scsi.aborting) {
2150  fas216_log(info, 0, "uncaught abort - returning DID_ABORT");
2151  result = DID_ABORT;
2152  info->scsi.aborting = 0;
2153  }
2154 
2155  /*
2156  * Sanity check the completion - if we have zero bytes left
2157  * to transfer, we should not have a valid pointer.
2158  */
2159  if (info->scsi.SCp.ptr && info->scsi.SCp.this_residual == 0) {
2160  printk("scsi%d.%c: zero bytes left to transfer, but "
2161  "buffer pointer still valid: ptr=%p len=%08x CDB: ",
2162  info->host->host_no, '0' + SCpnt->device->id,
2163  info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
2164  info->scsi.SCp.ptr = NULL;
2165  __scsi_print_command(SCpnt->cmnd);
2166  }
2167 
2168  /*
2169  * Clear down this command as completed. If we need to request
2170  * the sense information, fas216_kick will re-assert the busy
2171  * status.
2172  */
2173  info->device[SCpnt->device->id].parity_check = 0;
2174  clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
2175 
2176  fn = (void (*)(FAS216_Info *, struct scsi_cmnd *, unsigned int))SCpnt->host_scribble;
2177  fn(info, SCpnt, result);
2178 
2179  if (info->scsi.irq) {
2180  spin_lock_irqsave(&info->host_lock, flags);
2181  if (info->scsi.phase == PHASE_IDLE)
2182  fas216_kick(info);
2183  spin_unlock_irqrestore(&info->host_lock, flags);
2184  }
2185  return;
2186 
2187 no_command:
2188  panic("scsi%d.H: null command in fas216_done",
2189  info->host->host_no);
2190 }
2191 
2201 static int fas216_queue_command_lck(struct scsi_cmnd *SCpnt,
2202  void (*done)(struct scsi_cmnd *))
2203 {
2204  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2205  int result;
2206 
2207  fas216_checkmagic(info);
2208 
2209  fas216_log_command(info, LOG_CONNECT, SCpnt,
2210  "received command (%p)", SCpnt);
2211 
2212  SCpnt->scsi_done = done;
2213  SCpnt->host_scribble = (void *)fas216_std_done;
2214  SCpnt->result = 0;
2215 
2216  init_SCp(SCpnt);
2217 
2218  info->stats.queues += 1;
2219  SCpnt->tag = 0;
2220 
2221  spin_lock(&info->host_lock);
2222 
2223  /*
2224  * Add command into execute queue and let it complete under
2225  * whatever scheme we're using.
2226  */
2227  result = !queue_add_cmd_ordered(&info->queues.issue, SCpnt);
2228 
2229  /*
2230  * If we successfully added the command,
2231  * kick the interface to get it moving.
2232  */
2233  if (result == 0 && info->scsi.phase == PHASE_IDLE)
2234  fas216_kick(info);
2235  spin_unlock(&info->host_lock);
2236 
2237  fas216_log_target(info, LOG_CONNECT, -1, "queue %s",
2238  result ? "failure" : "success");
2239 
2240  return result;
2241 }
2242 
2244 
2245 
2251 static void fas216_internal_done(struct scsi_cmnd *SCpnt)
2252 {
2253  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2254 
2255  fas216_checkmagic(info);
2256 
2257  info->internal_done = 1;
2258 }
2259 
2268 static int fas216_noqueue_command_lck(struct scsi_cmnd *SCpnt,
2269  void (*done)(struct scsi_cmnd *))
2270 {
2271  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2272 
2273  fas216_checkmagic(info);
2274 
2275  /*
2276  * We should only be using this if we don't have an interrupt.
2277  * Provide some "incentive" to use the queueing code.
2278  */
2279  BUG_ON(info->scsi.irq);
2280 
2281  info->internal_done = 0;
2282  fas216_queue_command_lck(SCpnt, fas216_internal_done);
2283 
2284  /*
2285  * This wastes time, since we can't return until the command is
2286  * complete. We can't sleep either since we may get re-entered!
2287  * However, we must re-enable interrupts, or else we'll be
2288  * waiting forever.
2289  */
2290  spin_unlock_irq(info->host->host_lock);
2291 
2292  while (!info->internal_done) {
2293  /*
2294  * If we don't have an IRQ, then we must poll the card for
2295  * it's interrupt, and use that to call this driver's
2296  * interrupt routine. That way, we keep the command
2297  * progressing. Maybe we can add some intelligence here
2298  * and go to sleep if we know that the device is going
2299  * to be some time (eg, disconnected).
2300  */
2301  if (fas216_readb(info, REG_STAT) & STAT_INT) {
2302  spin_lock_irq(info->host->host_lock);
2303  fas216_intr(info);
2304  spin_unlock_irq(info->host->host_lock);
2305  }
2306  }
2307 
2308  spin_lock_irq(info->host->host_lock);
2309 
2310  done(SCpnt);
2311 
2312  return 0;
2313 }
2314 
2316 
2317 /*
2318  * Error handler timeout function. Indicate that we timed out,
2319  * and wake up any error handler process so it can continue.
2320  */
2321 static void fas216_eh_timer(unsigned long data)
2322 {
2323  FAS216_Info *info = (FAS216_Info *)data;
2324 
2325  fas216_log(info, LOG_ERROR, "error handling timed out\n");
2326 
2327  del_timer(&info->eh_timer);
2328 
2329  if (info->rst_bus_status == 0)
2330  info->rst_bus_status = -1;
2331  if (info->rst_dev_status == 0)
2332  info->rst_dev_status = -1;
2333 
2334  wake_up(&info->eh_wait);
2335 }
2336 
2337 enum res_find {
2338  res_failed, /* not found */
2339  res_success, /* command on issue queue */
2340  res_hw_abort /* command on disconnected dev */
2341 };
2342 
2350 static enum res_find fas216_find_command(FAS216_Info *info,
2351  struct scsi_cmnd *SCpnt)
2352 {
2353  enum res_find res = res_failed;
2354 
2355  if (queue_remove_cmd(&info->queues.issue, SCpnt)) {
2356  /*
2357  * The command was on the issue queue, and has not been
2358  * issued yet. We can remove the command from the queue,
2359  * and acknowledge the abort. Neither the device nor the
2360  * interface know about the command.
2361  */
2362  printk("on issue queue ");
2363 
2364  res = res_success;
2365  } else if (queue_remove_cmd(&info->queues.disconnected, SCpnt)) {
2366  /*
2367  * The command was on the disconnected queue. We must
2368  * reconnect with the device if possible, and send it
2369  * an abort message.
2370  */
2371  printk("on disconnected queue ");
2372 
2373  res = res_hw_abort;
2374  } else if (info->SCpnt == SCpnt) {
2375  printk("executing ");
2376 
2377  switch (info->scsi.phase) {
2378  /*
2379  * If the interface is idle, and the command is 'disconnectable',
2380  * then it is the same as on the disconnected queue.
2381  */
2382  case PHASE_IDLE:
2383  if (info->scsi.disconnectable) {
2384  info->scsi.disconnectable = 0;
2385  info->SCpnt = NULL;
2386  res = res_hw_abort;
2387  }
2388  break;
2389 
2390  default:
2391  break;
2392  }
2393  } else if (info->origSCpnt == SCpnt) {
2394  /*
2395  * The command will be executed next, but a command
2396  * is currently using the interface. This is similar to
2397  * being on the issue queue, except the busylun bit has
2398  * been set.
2399  */
2400  info->origSCpnt = NULL;
2401  clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
2402  printk("waiting for execution ");
2403  res = res_success;
2404  } else
2405  printk("unknown ");
2406 
2407  return res;
2408 }
2409 
2418 int fas216_eh_abort(struct scsi_cmnd *SCpnt)
2419 {
2420  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2421  int result = FAILED;
2422 
2423  fas216_checkmagic(info);
2424 
2425  info->stats.aborts += 1;
2426 
2427  printk(KERN_WARNING "scsi%d: abort command ", info->host->host_no);
2428  __scsi_print_command(SCpnt->cmnd);
2429 
2430  print_debug_list();
2431  fas216_dumpstate(info);
2432 
2433  printk(KERN_WARNING "scsi%d: abort %p ", info->host->host_no, SCpnt);
2434 
2435  switch (fas216_find_command(info, SCpnt)) {
2436  /*
2437  * We found the command, and cleared it out. Either
2438  * the command is still known to be executing on the
2439  * target, or the busylun bit is not set.
2440  */
2441  case res_success:
2442  printk("success\n");
2443  result = SUCCESS;
2444  break;
2445 
2446  /*
2447  * We need to reconnect to the target and send it an
2448  * ABORT or ABORT_TAG message. We can only do this
2449  * if the bus is free.
2450  */
2451  case res_hw_abort:
2452 
2453 
2454  /*
2455  * We are unable to abort the command for some reason.
2456  */
2457  default:
2458  case res_failed:
2459  printk("failed\n");
2460  break;
2461  }
2462 
2463  return result;
2464 }
2465 
2476 {
2477  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2478  unsigned long flags;
2479  int i, res = FAILED, target = SCpnt->device->id;
2480 
2481  fas216_log(info, LOG_ERROR, "device reset for target %d", target);
2482 
2483  spin_lock_irqsave(&info->host_lock, flags);
2484 
2485  do {
2486  /*
2487  * If we are currently connected to a device, and
2488  * it is the device we want to reset, there is
2489  * nothing we can do here. Chances are it is stuck,
2490  * and we need a bus reset.
2491  */
2492  if (info->SCpnt && !info->scsi.disconnectable &&
2493  info->SCpnt->device->id == SCpnt->device->id)
2494  break;
2495 
2496  /*
2497  * We're going to be resetting this device. Remove
2498  * all pending commands from the driver. By doing
2499  * so, we guarantee that we won't touch the command
2500  * structures except to process the reset request.
2501  */
2502  queue_remove_all_target(&info->queues.issue, target);
2503  queue_remove_all_target(&info->queues.disconnected, target);
2504  if (info->origSCpnt && info->origSCpnt->device->id == target)
2505  info->origSCpnt = NULL;
2506  if (info->reqSCpnt && info->reqSCpnt->device->id == target)
2507  info->reqSCpnt = NULL;
2508  for (i = 0; i < 8; i++)
2509  clear_bit(target * 8 + i, info->busyluns);
2510 
2511  /*
2512  * Hijack this SCSI command structure to send
2513  * a bus device reset message to this device.
2514  */
2515  SCpnt->host_scribble = (void *)fas216_devicereset_done;
2516 
2517  info->rst_dev_status = 0;
2518  info->rstSCpnt = SCpnt;
2519 
2520  if (info->scsi.phase == PHASE_IDLE)
2521  fas216_kick(info);
2522 
2523  mod_timer(&info->eh_timer, jiffies + 30 * HZ);
2524  spin_unlock_irqrestore(&info->host_lock, flags);
2525 
2526  /*
2527  * Wait up to 30 seconds for the reset to complete.
2528  */
2529  wait_event(info->eh_wait, info->rst_dev_status);
2530 
2531  del_timer_sync(&info->eh_timer);
2532  spin_lock_irqsave(&info->host_lock, flags);
2533  info->rstSCpnt = NULL;
2534 
2535  if (info->rst_dev_status == 1)
2536  res = SUCCESS;
2537  } while (0);
2538 
2539  SCpnt->host_scribble = NULL;
2540  spin_unlock_irqrestore(&info->host_lock, flags);
2541 
2542  fas216_log(info, LOG_ERROR, "device reset complete: %s\n",
2543  res == SUCCESS ? "success" : "failed");
2544 
2545  return res;
2546 }
2547 
2556 int fas216_eh_bus_reset(struct scsi_cmnd *SCpnt)
2557 {
2558  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2559  unsigned long flags;
2560  struct scsi_device *SDpnt;
2561 
2562  fas216_checkmagic(info);
2563  fas216_log(info, LOG_ERROR, "resetting bus");
2564 
2565  info->stats.bus_resets += 1;
2566 
2567  spin_lock_irqsave(&info->host_lock, flags);
2568 
2569  /*
2570  * Stop all activity on this interface.
2571  */
2572  fas216_aborttransfer(info);
2573  fas216_writeb(info, REG_CNTL3, info->scsi.cfg[2]);
2574 
2575  /*
2576  * Clear any pending interrupts.
2577  */
2578  while (fas216_readb(info, REG_STAT) & STAT_INT)
2579  fas216_readb(info, REG_INST);
2580 
2581  info->rst_bus_status = 0;
2582 
2583  /*
2584  * For each attached hard-reset device, clear out
2585  * all command structures. Leave the running
2586  * command in place.
2587  */
2588  shost_for_each_device(SDpnt, info->host) {
2589  int i;
2590 
2591  if (SDpnt->soft_reset)
2592  continue;
2593 
2594  queue_remove_all_target(&info->queues.issue, SDpnt->id);
2595  queue_remove_all_target(&info->queues.disconnected, SDpnt->id);
2596  if (info->origSCpnt && info->origSCpnt->device->id == SDpnt->id)
2597  info->origSCpnt = NULL;
2598  if (info->reqSCpnt && info->reqSCpnt->device->id == SDpnt->id)
2599  info->reqSCpnt = NULL;
2600  info->SCpnt = NULL;
2601 
2602  for (i = 0; i < 8; i++)
2603  clear_bit(SDpnt->id * 8 + i, info->busyluns);
2604  }
2605 
2606  info->scsi.phase = PHASE_IDLE;
2607 
2608  /*
2609  * Reset the SCSI bus. Device cleanup happens in
2610  * the interrupt handler.
2611  */
2612  fas216_cmd(info, CMD_RESETSCSI);
2613 
2614  mod_timer(&info->eh_timer, jiffies + HZ);
2615  spin_unlock_irqrestore(&info->host_lock, flags);
2616 
2617  /*
2618  * Wait one second for the interrupt.
2619  */
2620  wait_event(info->eh_wait, info->rst_bus_status);
2621  del_timer_sync(&info->eh_timer);
2622 
2623  fas216_log(info, LOG_ERROR, "bus reset complete: %s\n",
2624  info->rst_bus_status == 1 ? "success" : "failed");
2625 
2626  return info->rst_bus_status == 1 ? SUCCESS : FAILED;
2627 }
2628 
2635 static void fas216_init_chip(FAS216_Info *info)
2636 {
2637  unsigned int clock = ((info->ifcfg.clockrate - 1) / 5 + 1) & 7;
2638  fas216_writeb(info, REG_CLKF, clock);
2639  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
2640  fas216_writeb(info, REG_CNTL2, info->scsi.cfg[1]);
2641  fas216_writeb(info, REG_CNTL3, info->scsi.cfg[2]);
2642  fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout);
2643  fas216_writeb(info, REG_SOF, 0);
2644  fas216_writeb(info, REG_STP, info->scsi.async_stp);
2645  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
2646 }
2647 
2657 {
2658  FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
2659 
2660  spin_lock_irq(info->host->host_lock);
2661 
2662  fas216_checkmagic(info);
2663 
2664  printk("scsi%d.%c: %s: resetting host\n",
2665  info->host->host_no, '0' + SCpnt->device->id, __func__);
2666 
2667  /*
2668  * Reset the SCSI chip.
2669  */
2670  fas216_cmd(info, CMD_RESETCHIP);
2671 
2672  /*
2673  * Ugly ugly ugly!
2674  * We need to release the host_lock and enable
2675  * IRQs if we sleep, but we must relock and disable
2676  * IRQs after the sleep.
2677  */
2678  spin_unlock_irq(info->host->host_lock);
2679  msleep(50 * 1000/100);
2680  spin_lock_irq(info->host->host_lock);
2681 
2682  /*
2683  * Release the SCSI reset.
2684  */
2685  fas216_cmd(info, CMD_NOP);
2686 
2687  fas216_init_chip(info);
2688 
2689  spin_unlock_irq(info->host->host_lock);
2690  return SUCCESS;
2691 }
2692 
2693 #define TYPE_UNKNOWN 0
2694 #define TYPE_NCR53C90 1
2695 #define TYPE_NCR53C90A 2
2696 #define TYPE_NCR53C9x 3
2697 #define TYPE_Am53CF94 4
2698 #define TYPE_EmFAS216 5
2699 #define TYPE_QLFAS216 6
2700 
2701 static char *chip_types[] = {
2702  "unknown",
2703  "NS NCR53C90",
2704  "NS NCR53C90A",
2705  "NS NCR53C9x",
2706  "AMD Am53CF94",
2707  "Emulex FAS216",
2708  "QLogic FAS216"
2709 };
2710 
2711 static int fas216_detect_type(FAS216_Info *info)
2712 {
2713  int family, rev;
2714 
2715  /*
2716  * Reset the chip.
2717  */
2718  fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
2719  udelay(50);
2720  fas216_writeb(info, REG_CMD, CMD_NOP);
2721 
2722  /*
2723  * Check to see if control reg 2 is present.
2724  */
2725  fas216_writeb(info, REG_CNTL3, 0);
2726  fas216_writeb(info, REG_CNTL2, CNTL2_S2FE);
2727 
2728  /*
2729  * If we are unable to read back control reg 2
2730  * correctly, it is not present, and we have a
2731  * NCR53C90.
2732  */
2733  if ((fas216_readb(info, REG_CNTL2) & (~0xe0)) != CNTL2_S2FE)
2734  return TYPE_NCR53C90;
2735 
2736  /*
2737  * Now, check control register 3
2738  */
2739  fas216_writeb(info, REG_CNTL2, 0);
2740  fas216_writeb(info, REG_CNTL3, 0);
2741  fas216_writeb(info, REG_CNTL3, 5);
2742 
2743  /*
2744  * If we are unable to read the register back
2745  * correctly, we have a NCR53C90A
2746  */
2747  if (fas216_readb(info, REG_CNTL3) != 5)
2748  return TYPE_NCR53C90A;
2749 
2750  /*
2751  * Now read the ID from the chip.
2752  */
2753  fas216_writeb(info, REG_CNTL3, 0);
2754 
2755  fas216_writeb(info, REG_CNTL3, CNTL3_ADIDCHK);
2756  fas216_writeb(info, REG_CNTL3, 0);
2757 
2758  fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
2759  udelay(50);
2760  fas216_writeb(info, REG_CMD, CMD_WITHDMA | CMD_NOP);
2761 
2762  fas216_writeb(info, REG_CNTL2, CNTL2_ENF);
2763  fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
2764  udelay(50);
2765  fas216_writeb(info, REG_CMD, CMD_NOP);
2766 
2767  rev = fas216_readb(info, REG_ID);
2768  family = rev >> 3;
2769  rev &= 7;
2770 
2771  switch (family) {
2772  case 0x01:
2773  if (rev == 4)
2774  return TYPE_Am53CF94;
2775  break;
2776 
2777  case 0x02:
2778  switch (rev) {
2779  case 2:
2780  return TYPE_EmFAS216;
2781  case 3:
2782  return TYPE_QLFAS216;
2783  }
2784  break;
2785 
2786  default:
2787  break;
2788  }
2789  printk("family %x rev %x\n", family, rev);
2790  return TYPE_NCR53C9x;
2791 }
2792 
2799 static void fas216_reset_state(FAS216_Info *info)
2800 {
2801  int i;
2802 
2803  fas216_checkmagic(info);
2804 
2805  fas216_bus_reset(info);
2806 
2807  /*
2808  * Clear out all stale info in our state structure
2809  */
2810  memset(info->busyluns, 0, sizeof(info->busyluns));
2811  info->scsi.disconnectable = 0;
2812  info->scsi.aborting = 0;
2813 
2814  for (i = 0; i < 8; i++) {
2815  info->device[i].parity_enabled = 0;
2816  info->device[i].parity_check = 1;
2817  }
2818 
2819  /*
2820  * Drain all commands on disconnected queue
2821  */
2822  while (queue_remove(&info->queues.disconnected) != NULL);
2823 
2824  /*
2825  * Remove executing commands.
2826  */
2827  info->SCpnt = NULL;
2828  info->reqSCpnt = NULL;
2829  info->rstSCpnt = NULL;
2830  info->origSCpnt = NULL;
2831 }
2832 
2841 {
2842  FAS216_Info *info = (FAS216_Info *)host->hostdata;
2843 
2844  info->magic_start = MAGIC;
2845  info->magic_end = MAGIC;
2846  info->host = host;
2847  info->scsi.cfg[0] = host->this_id | CNTL1_PERE;
2848  info->scsi.cfg[1] = CNTL2_ENF | CNTL2_S2FE;
2849  info->scsi.cfg[2] = info->ifcfg.cntl3 |
2851  info->scsi.async_stp = fas216_syncperiod(info, info->ifcfg.asyncperiod);
2852 
2853  info->rst_dev_status = -1;
2854  info->rst_bus_status = -1;
2855  init_waitqueue_head(&info->eh_wait);
2856  init_timer(&info->eh_timer);
2857  info->eh_timer.data = (unsigned long)info;
2858  info->eh_timer.function = fas216_eh_timer;
2859 
2860  spin_lock_init(&info->host_lock);
2861 
2862  memset(&info->stats, 0, sizeof(info->stats));
2863 
2864  msgqueue_initialise(&info->scsi.msgs);
2865 
2866  if (!queue_initialise(&info->queues.issue))
2867  return -ENOMEM;
2868 
2869  if (!queue_initialise(&info->queues.disconnected)) {
2870  queue_free(&info->queues.issue);
2871  return -ENOMEM;
2872  }
2873 
2874  return 0;
2875 }
2876 
2885 int fas216_add(struct Scsi_Host *host, struct device *dev)
2886 {
2887  FAS216_Info *info = (FAS216_Info *)host->hostdata;
2888  int type, ret;
2889 
2890  if (info->ifcfg.clockrate <= 10 || info->ifcfg.clockrate > 40) {
2891  printk(KERN_CRIT "fas216: invalid clock rate %u MHz\n",
2892  info->ifcfg.clockrate);
2893  return -EINVAL;
2894  }
2895 
2896  fas216_reset_state(info);
2897  type = fas216_detect_type(info);
2898  info->scsi.type = chip_types[type];
2899 
2900  udelay(300);
2901 
2902  /*
2903  * Initialise the chip correctly.
2904  */
2905  fas216_init_chip(info);
2906 
2907  /*
2908  * Reset the SCSI bus. We don't want to see
2909  * the resulting reset interrupt, so mask it
2910  * out.
2911  */
2912  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0] | CNTL1_DISR);
2913  fas216_writeb(info, REG_CMD, CMD_RESETSCSI);
2914 
2915  /*
2916  * scsi standard says wait 250ms
2917  */
2918  spin_unlock_irq(info->host->host_lock);
2919  msleep(100*1000/100);
2920  spin_lock_irq(info->host->host_lock);
2921 
2922  fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
2923  fas216_readb(info, REG_INST);
2924 
2925  fas216_checkmagic(info);
2926 
2927  ret = scsi_add_host(host, dev);
2928  if (ret)
2929  fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
2930  else
2931  scsi_scan_host(host);
2932 
2933  return ret;
2934 }
2935 
2937 {
2938  FAS216_Info *info = (FAS216_Info *)host->hostdata;
2939 
2940  fas216_checkmagic(info);
2941  scsi_remove_host(host);
2942 
2943  fas216_writeb(info, REG_CMD, CMD_RESETCHIP);
2944  scsi_host_put(host);
2945 }
2946 
2954 {
2955  FAS216_Info *info = (FAS216_Info *)host->hostdata;
2956 
2957  queue_free(&info->queues.disconnected);
2958  queue_free(&info->queues.issue);
2959 }
2960 
2962 {
2963  return sprintf(buffer,
2964  "\n"
2965  "Chip : %s\n"
2966  " Address: 0x%p\n"
2967  " IRQ : %d\n"
2968  " DMA : %d\n",
2969  info->scsi.type, info->scsi.io_base,
2970  info->scsi.irq, info->scsi.dma);
2971 }
2972 
2974 {
2975  char *p = buffer;
2976 
2977  p += sprintf(p, "\n"
2978  "Command Statistics:\n"
2979  " Queued : %u\n"
2980  " Issued : %u\n"
2981  " Completed : %u\n"
2982  " Reads : %u\n"
2983  " Writes : %u\n"
2984  " Others : %u\n"
2985  " Disconnects: %u\n"
2986  " Aborts : %u\n"
2987  " Bus resets : %u\n"
2988  " Host resets: %u\n",
2989  info->stats.queues, info->stats.removes,
2990  info->stats.fins, info->stats.reads,
2991  info->stats.writes, info->stats.miscs,
2992  info->stats.disconnects, info->stats.aborts,
2993  info->stats.bus_resets, info->stats.host_resets);
2994 
2995  return p - buffer;
2996 }
2997 
2999 {
3000  struct fas216_device *dev;
3001  struct scsi_device *scd;
3002  char *p = buffer;
3003 
3004  p += sprintf(p, "Device/Lun TaggedQ Parity Sync\n");
3005 
3006  shost_for_each_device(scd, info->host) {
3007  dev = &info->device[scd->id];
3008  p += sprintf(p, " %d/%d ", scd->id, scd->lun);
3009  if (scd->tagged_supported)
3010  p += sprintf(p, "%3sabled(%3d) ",
3011  scd->simple_tags ? "en" : "dis",
3012  scd->current_tag);
3013  else
3014  p += sprintf(p, "unsupported ");
3015 
3016  p += sprintf(p, "%3sabled ", dev->parity_enabled ? "en" : "dis");
3017 
3018  if (dev->sof)
3019  p += sprintf(p, "offset %d, %d ns\n",
3020  dev->sof, dev->period * 4);
3021  else
3022  p += sprintf(p, "async\n");
3023  }
3024 
3025  return p - buffer;
3026 }
3027 
3042 
3043 MODULE_AUTHOR("Russell King");
3044 MODULE_DESCRIPTION("Generic FAS216/NCR53C9x driver core");
3045 MODULE_LICENSE("GPL");