imm.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:31k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* imm.c   --  low level driver for the IOMEGA MatchMaker
  2.  * parallel port SCSI host adapter.
  3.  * 
  4.  * (The IMM is the embedded controller in the ZIP Plus drive.)
  5.  * 
  6.  * Current Maintainer: David Campbell (Perth, Western Australia)
  7.  *                     campbell@torque.net
  8.  *
  9.  * My unoffical company acronym list is 21 pages long:
  10.  *      FLA:    Four letter acronym with built in facility for
  11.  *              future expansion to five letters.
  12.  */
  13. #include <linux/config.h>
  14. /* The following #define is to avoid a clash with hosts.c */
  15. #define IMM_CODE 1
  16. #define IMM_PROBE_SPP   0x0001
  17. #define IMM_PROBE_PS2   0x0002
  18. #define IMM_PROBE_ECR   0x0010
  19. #define IMM_PROBE_EPP17 0x0100
  20. #define IMM_PROBE_EPP19 0x0200
  21. void imm_reset_pulse(unsigned int base);
  22. static int device_check(int host_no);
  23. #include <linux/blk.h>
  24. #include <asm/io.h>
  25. #include <linux/parport.h>
  26. #include "sd.h"
  27. #include "hosts.h"
  28. typedef struct {
  29.     struct pardevice *dev; /* Parport device entry         */
  30.     int base; /* Actual port address          */
  31.     int base_hi; /* Hi Base address for ECP-ISA chipset */
  32.     int mode; /* Transfer mode                */
  33.     int host; /* Host number (for proc)       */
  34.     Scsi_Cmnd *cur_cmd; /* Current queued command       */
  35.     struct tq_struct imm_tq; /* Polling interrupt stuff       */
  36.     unsigned long jstart; /* Jiffies at start             */
  37.     unsigned failed:1; /* Failure flag                 */
  38.     unsigned dp:1; /* Data phase present           */
  39.     unsigned rd:1; /* Read data in data phase      */
  40.     unsigned p_busy:1; /* Parport sharing busy flag    */
  41. } imm_struct;
  42. #define IMM_EMPTY 
  43. { dev: NULL,
  44. base: -1,
  45. base_hi: 0,
  46. mode: IMM_AUTODETECT,
  47. host: -1,
  48. cur_cmd: NULL,
  49. imm_tq: { routine: imm_interrupt },    
  50. jstart: 0,
  51. failed: 0,
  52. dp: 0,
  53. rd: 0,
  54. p_busy: 0
  55. }
  56. #include "imm.h"
  57. #define NO_HOSTS 4
  58. static imm_struct imm_hosts[NO_HOSTS] =
  59. {IMM_EMPTY, IMM_EMPTY, IMM_EMPTY, IMM_EMPTY};
  60. #define IMM_BASE(x) imm_hosts[(x)].base
  61. #define IMM_BASE_HI(x)     imm_hosts[(x)].base_hi
  62. int parbus_base[NO_HOSTS] =
  63. {0x03bc, 0x0378, 0x0278, 0x0000};
  64. void imm_wakeup(void *ref)
  65. {
  66.     imm_struct *imm_dev = (imm_struct *) ref;
  67.     if (!imm_dev->p_busy)
  68. return;
  69.     if (parport_claim(imm_dev->dev)) {
  70. printk("imm: bug in imm_wakeupn");
  71. return;
  72.     }
  73.     imm_dev->p_busy = 0;
  74.     imm_dev->base = imm_dev->dev->port->base;
  75.     if (imm_dev->cur_cmd)
  76. imm_dev->cur_cmd->SCp.phase++;
  77.     return;
  78. }
  79. int imm_release(struct Scsi_Host *host)
  80. {
  81.     int host_no = host->unique_id;
  82.     printk("Releasing imm%in", host_no);
  83.     parport_unregister_device(imm_hosts[host_no].dev);
  84.     return 0;
  85. }
  86. static int imm_pb_claim(int host_no)
  87. {
  88.     if (parport_claim(imm_hosts[host_no].dev)) {
  89. imm_hosts[host_no].p_busy = 1;
  90. return 1;
  91.     }
  92.     if (imm_hosts[host_no].cur_cmd)
  93. imm_hosts[host_no].cur_cmd->SCp.phase++;
  94.     return 0;
  95. }
  96. #define imm_pb_release(x) parport_release(imm_hosts[(x)].dev)
  97. /***************************************************************************
  98.  *                   Parallel port probing routines                        *
  99.  ***************************************************************************/
  100. static Scsi_Host_Template driver_template = IMM;
  101. #include  "scsi_module.c"
  102. int imm_detect(Scsi_Host_Template * host)
  103. {
  104.     struct Scsi_Host *hreg;
  105.     int ports;
  106.     int i, nhosts, try_again;
  107.     struct parport *pb;
  108.     /*
  109.      * unlock to allow the lowlevel parport driver to probe
  110.      * the irqs
  111.      */
  112.     spin_unlock_irq(&io_request_lock);
  113.     pb = parport_enumerate();
  114.     printk("imm: Version %sn", IMM_VERSION);
  115.     nhosts = 0;
  116.     try_again = 0;
  117.     if (!pb) {
  118. printk("imm: parport reports no devices.n");
  119. spin_lock_irq(&io_request_lock);
  120. return 0;
  121.     }
  122.   retry_entry:
  123.     for (i = 0; pb; i++, pb = pb->next) {
  124. int modes, ppb;
  125. imm_hosts[i].dev =
  126.     parport_register_device(pb, "imm", NULL, imm_wakeup,
  127.     NULL, 0, (void *) &imm_hosts[i]);
  128. if (!imm_hosts[i].dev)
  129.     continue;
  130. /* Claim the bus so it remembers what we do to the control
  131.  * registers. [ CTR and ECP ]
  132.  */
  133. if (imm_pb_claim(i)) {
  134.     unsigned long now = jiffies;
  135.     while (imm_hosts[i].p_busy) {
  136. schedule(); /* We are safe to schedule here */
  137. if (time_after(jiffies, now + 3 * HZ)) {
  138.     printk(KERN_ERR "imm%d: failed to claim parport because a "
  139.       "pardevice is owning the port for too longtime!n",
  140.    i);
  141.     parport_unregister_device (imm_hosts[i].dev);
  142.     spin_lock_irq(&io_request_lock);
  143.     return 0;
  144. }
  145.     }
  146. }
  147. ppb = IMM_BASE(i) = imm_hosts[i].dev->port->base;
  148. IMM_BASE_HI(i) = imm_hosts[i].dev->port->base_hi;
  149. w_ctr(ppb, 0x0c);
  150. modes = imm_hosts[i].dev->port->modes;
  151. /* Mode detection works up the chain of speed
  152.  * This avoids a nasty if-then-else-if-... tree
  153.  */
  154. imm_hosts[i].mode = IMM_NIBBLE;
  155. if (modes & PARPORT_MODE_TRISTATE)
  156.     imm_hosts[i].mode = IMM_PS2;
  157. /* Done configuration */
  158. imm_pb_release(i);
  159. if (imm_init(i)) {
  160.     parport_unregister_device(imm_hosts[i].dev);
  161.     continue;
  162. }
  163. /* now the glue ... */
  164. switch (imm_hosts[i].mode) {
  165. case IMM_NIBBLE:
  166.     ports = 3;
  167.     break;
  168. case IMM_PS2:
  169.     ports = 3;
  170.     break;
  171. case IMM_EPP_8:
  172. case IMM_EPP_16:
  173. case IMM_EPP_32:
  174.     ports = 8;
  175.     break;
  176. default: /* Never gets here */
  177.     continue;
  178. }
  179. host->can_queue = IMM_CAN_QUEUE;
  180. host->sg_tablesize = imm_sg;
  181. hreg = scsi_register(host, 0);
  182. if(hreg == NULL)
  183. continue;
  184. hreg->io_port = pb->base;
  185. hreg->n_io_port = ports;
  186. hreg->dma_channel = -1;
  187. hreg->unique_id = i;
  188. imm_hosts[i].host = hreg->host_no;
  189. nhosts++;
  190.     }
  191.     if (nhosts == 0) {
  192. if (try_again == 1) {
  193.     spin_lock_irq(&io_request_lock);
  194.     return 0;
  195. }
  196. try_again = 1;
  197. goto retry_entry;
  198.     } else {
  199. spin_lock_irq (&io_request_lock);
  200. return 1; /* return number of hosts detected */
  201.     }
  202. }
  203. /* This is to give the imm driver a way to modify the timings (and other
  204.  * parameters) by writing to the /proc/scsi/imm/0 file.
  205.  * Very simple method really... (To simple, no error checking :( )
  206.  * Reason: Kernel hackers HATE having to unload and reload modules for
  207.  * testing...
  208.  * Also gives a method to use a script to obtain optimum timings (TODO)
  209.  */
  210. static inline int imm_proc_write(int hostno, char *buffer, int length)
  211. {
  212.     unsigned long x;
  213.     if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {
  214. x = simple_strtoul(buffer + 5, NULL, 0);
  215. imm_hosts[hostno].mode = x;
  216. return length;
  217.     }
  218.     printk("imm /proc: invalid variablen");
  219.     return (-EINVAL);
  220. }
  221. int imm_proc_info(char *buffer, char **start, off_t offset,
  222.   int length, int hostno, int inout)
  223. {
  224.     int i;
  225.     int len = 0;
  226.     for (i = 0; i < 4; i++)
  227. if (imm_hosts[i].host == hostno)
  228.     break;
  229.     if (inout)
  230. return imm_proc_write(i, buffer, length);
  231.     len += sprintf(buffer + len, "Version : %sn", IMM_VERSION);
  232.     len += sprintf(buffer + len, "Parport : %sn", imm_hosts[i].dev->port->name);
  233.     len += sprintf(buffer + len, "Mode    : %sn", IMM_MODE_STRING[imm_hosts[i].mode]);
  234.     /* Request for beyond end of buffer */
  235.     if (offset > len)
  236. return 0;
  237.     *start = buffer + offset;
  238.     len -= offset;
  239.     if (len > length)
  240. len = length;
  241.     return len;
  242. }
  243. #if IMM_DEBUG > 0
  244. #define imm_fail(x,y) printk("imm: imm_fail(%i) from %s at line %dn",
  245.    y, __FUNCTION__, __LINE__); imm_fail_func(x,y);
  246. static inline void imm_fail_func(int host_no, int error_code)
  247. #else
  248. static inline void imm_fail(int host_no, int error_code)
  249. #endif
  250. {
  251.     /* If we fail a device then we trash status / message bytes */
  252.     if (imm_hosts[host_no].cur_cmd) {
  253. imm_hosts[host_no].cur_cmd->result = error_code << 16;
  254. imm_hosts[host_no].failed = 1;
  255.     }
  256. }
  257. /*
  258.  * Wait for the high bit to be set.
  259.  * 
  260.  * In principle, this could be tied to an interrupt, but the adapter
  261.  * doesn't appear to be designed to support interrupts.  We spin on
  262.  * the 0x80 ready bit. 
  263.  */
  264. static unsigned char imm_wait(int host_no)
  265. {
  266.     int k;
  267.     unsigned short ppb = IMM_BASE(host_no);
  268.     unsigned char r;
  269.     w_ctr(ppb, 0x0c);
  270.     k = IMM_SPIN_TMO;
  271.     do {
  272. r = r_str(ppb);
  273. k--;
  274. udelay(1);
  275.     }
  276.     while (!(r & 0x80) && (k));
  277.     /*
  278.      * STR register (LPT base+1) to SCSI mapping:
  279.      *
  280.      * STR      imm     imm
  281.      * ===================================
  282.      * 0x80     S_REQ   S_REQ
  283.      * 0x40     !S_BSY  (????)
  284.      * 0x20     !S_CD   !S_CD
  285.      * 0x10     !S_IO   !S_IO
  286.      * 0x08     (????)  !S_BSY
  287.      *
  288.      * imm      imm     meaning
  289.      * ==================================
  290.      * 0xf0     0xb8    Bit mask
  291.      * 0xc0     0x88    ZIP wants more data
  292.      * 0xd0     0x98    ZIP wants to send more data
  293.      * 0xe0     0xa8    ZIP is expecting SCSI command data
  294.      * 0xf0     0xb8    end of transfer, ZIP is sending status
  295.      */
  296.     w_ctr(ppb, 0x04);
  297.     if (k)
  298. return (r & 0xb8);
  299.     /* Counter expired - Time out occurred */
  300.     imm_fail(host_no, DID_TIME_OUT);
  301.     printk("imm timeout in imm_waitn");
  302.     return 0; /* command timed out */
  303. }
  304. static int imm_negotiate(imm_struct * tmp)
  305. {
  306.     /*
  307.      * The following is supposedly the IEEE 1284-1994 negotiate
  308.      * sequence. I have yet to obtain a copy of the above standard
  309.      * so this is a bit of a guess...
  310.      *
  311.      * A fair chunk of this is based on the Linux parport implementation
  312.      * of IEEE 1284.
  313.      *
  314.      * Return 0 if data available
  315.      *        1 if no data available
  316.      */
  317.     unsigned short base = tmp->base;
  318.     unsigned char a, mode;
  319.     switch (tmp->mode) {
  320.     case IMM_NIBBLE:
  321. mode = 0x00;
  322. break;
  323.     case IMM_PS2:
  324. mode = 0x01;
  325. break;
  326.     default:
  327. return 0;
  328.     }
  329.     w_ctr(base, 0x04);
  330.     udelay(5);
  331.     w_dtr(base, mode);
  332.     udelay(100);
  333.     w_ctr(base, 0x06);
  334.     udelay(5);
  335.     a = (r_str(base) & 0x20) ? 0 : 1;
  336.     udelay(5);
  337.     w_ctr(base, 0x07);
  338.     udelay(5);
  339.     w_ctr(base, 0x06);
  340.     if (a) {
  341. printk("IMM: IEEE1284 negotiate indicates no data available.n");
  342. imm_fail(tmp->host, DID_ERROR);
  343.     }
  344.     return a;
  345. }
  346. /* 
  347.  * Clear EPP timeout bit. 
  348.  */
  349. static inline void epp_reset(unsigned short ppb)
  350. {
  351.     int i;
  352.     i = r_str(ppb);
  353.     w_str(ppb, i);
  354.     w_str(ppb, i & 0xfe);
  355. }
  356. /* 
  357.  * Wait for empty ECP fifo (if we are in ECP fifo mode only)
  358.  */
  359. static inline void ecp_sync(unsigned short hostno)
  360. {
  361.     int i, ppb_hi=IMM_BASE_HI(hostno);
  362.     if (ppb_hi == 0) return;
  363.     if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */
  364.         for (i = 0; i < 100; i++) {
  365.     if (r_ecr(ppb_hi) & 0x01)
  366.         return;
  367.     udelay(5);
  368. }
  369.         printk("imm: ECP sync failed as data still present in FIFO.n");
  370.     }
  371. }
  372. static int imm_byte_out(unsigned short base, const char *buffer, int len)
  373. {
  374.     int i;
  375.     w_ctr(base, 0x4); /* apparently a sane mode */
  376.     for (i = len >> 1; i; i--) {
  377. w_dtr(base, *buffer++);
  378. w_ctr(base, 0x5); /* Drop STROBE low */
  379. w_dtr(base, *buffer++);
  380. w_ctr(base, 0x0); /* STROBE high + INIT low */
  381.     }
  382.     w_ctr(base, 0x4); /* apparently a sane mode */
  383.     return 1; /* All went well - we hope! */
  384. }
  385. static int imm_nibble_in(unsigned short base, char *buffer, int len)
  386. {
  387.     unsigned char l;
  388.     int i;
  389.     /*
  390.      * The following is based on documented timing signals
  391.      */
  392.     w_ctr(base, 0x4);
  393.     for (i = len; i; i--) {
  394. w_ctr(base, 0x6);
  395. l = (r_str(base) & 0xf0) >> 4;
  396. w_ctr(base, 0x5);
  397. *buffer++ = (r_str(base) & 0xf0) | l;
  398. w_ctr(base, 0x4);
  399.     }
  400.     return 1; /* All went well - we hope! */
  401. }
  402. static int imm_byte_in(unsigned short base, char *buffer, int len)
  403. {
  404.     int i;
  405.     /*
  406.      * The following is based on documented timing signals
  407.      */
  408.     w_ctr(base, 0x4);
  409.     for (i = len; i; i--) {
  410. w_ctr(base, 0x26);
  411. *buffer++ = r_dtr(base);
  412. w_ctr(base, 0x25);
  413.     }
  414.     return 1; /* All went well - we hope! */
  415. }
  416. static int imm_out(int host_no, char *buffer, int len)
  417. {
  418.     int r;
  419.     unsigned short ppb = IMM_BASE(host_no);
  420.     r = imm_wait(host_no);
  421.     /*
  422.      * Make sure that:
  423.      * a) the SCSI bus is BUSY (device still listening)
  424.      * b) the device is listening
  425.      */
  426.     if ((r & 0x18) != 0x08) {
  427. imm_fail(host_no, DID_ERROR);
  428. printk("IMM: returned SCSI status %2xn", r);
  429. return 0;
  430.     }
  431.     switch (imm_hosts[host_no].mode) {
  432.     case IMM_EPP_32:
  433.     case IMM_EPP_16:
  434.     case IMM_EPP_8:
  435. epp_reset(ppb);
  436. w_ctr(ppb, 0x4);
  437. #ifdef CONFIG_SCSI_IZIP_EPP16
  438. if (!(((long) buffer | len) & 0x01))
  439.     outsw(ppb + 4, buffer, len >> 1);
  440. #else
  441. if (!(((long) buffer | len) & 0x03))
  442.     outsl(ppb + 4, buffer, len >> 2);
  443. #endif
  444. else
  445.     outsb(ppb + 4, buffer, len);
  446. w_ctr(ppb, 0xc);
  447. r = !(r_str(ppb) & 0x01);
  448. w_ctr(ppb, 0xc);
  449. ecp_sync(host_no);
  450. break;
  451.     case IMM_NIBBLE:
  452.     case IMM_PS2:
  453. /* 8 bit output, with a loop */
  454. r = imm_byte_out(ppb, buffer, len);
  455. break;
  456.     default:
  457. printk("IMM: bug in imm_out()n");
  458. r = 0;
  459.     }
  460.     return r;
  461. }
  462. static int imm_in(int host_no, char *buffer, int len)
  463. {
  464.     int r;
  465.     unsigned short ppb = IMM_BASE(host_no);
  466.     r = imm_wait(host_no);
  467.     /*
  468.      * Make sure that:
  469.      * a) the SCSI bus is BUSY (device still listening)
  470.      * b) the device is sending data
  471.      */
  472.     if ((r & 0x18) != 0x18) {
  473. imm_fail(host_no, DID_ERROR);
  474. return 0;
  475.     }
  476.     switch (imm_hosts[host_no].mode) {
  477.     case IMM_NIBBLE:
  478. /* 4 bit input, with a loop */
  479. r = imm_nibble_in(ppb, buffer, len);
  480. w_ctr(ppb, 0xc);
  481. break;
  482.     case IMM_PS2:
  483. /* 8 bit input, with a loop */
  484. r = imm_byte_in(ppb, buffer, len);
  485. w_ctr(ppb, 0xc);
  486. break;
  487.     case IMM_EPP_32:
  488.     case IMM_EPP_16:
  489.     case IMM_EPP_8:
  490. epp_reset(ppb);
  491. w_ctr(ppb, 0x24);
  492. #ifdef CONFIG_SCSI_IZIP_EPP16
  493. if (!(((long) buffer | len) & 0x01))
  494.     insw(ppb + 4, buffer, len >> 1);
  495. #else
  496. if (!(((long) buffer | len) & 0x03))
  497.     insl(ppb + 4, buffer, len >> 2);
  498. #endif
  499. else
  500.     insb(ppb + 4, buffer, len);
  501. w_ctr(ppb, 0x2c);
  502. r = !(r_str(ppb) & 0x01);
  503. w_ctr(ppb, 0x2c);
  504. ecp_sync(host_no);
  505. break;
  506.     default:
  507. printk("IMM: bug in imm_ins()n");
  508. r = 0;
  509. break;
  510.     }
  511.     return r;
  512. }
  513. static int imm_cpp(unsigned short ppb, unsigned char b)
  514. {
  515.     /*
  516.      * Comments on udelay values refer to the
  517.      * Command Packet Protocol (CPP) timing diagram.
  518.      */
  519.     unsigned char s1, s2, s3;
  520.     w_ctr(ppb, 0x0c);
  521.     udelay(2); /* 1 usec - infinite */
  522.     w_dtr(ppb, 0xaa);
  523.     udelay(10); /* 7 usec - infinite */
  524.     w_dtr(ppb, 0x55);
  525.     udelay(10); /* 7 usec - infinite */
  526.     w_dtr(ppb, 0x00);
  527.     udelay(10); /* 7 usec - infinite */
  528.     w_dtr(ppb, 0xff);
  529.     udelay(10); /* 7 usec - infinite */
  530.     s1 = r_str(ppb) & 0xb8;
  531.     w_dtr(ppb, 0x87);
  532.     udelay(10); /* 7 usec - infinite */
  533.     s2 = r_str(ppb) & 0xb8;
  534.     w_dtr(ppb, 0x78);
  535.     udelay(10); /* 7 usec - infinite */
  536.     s3 = r_str(ppb) & 0x38;
  537.     /*
  538.      * Values for b are:
  539.      * 0000 00aa    Assign address aa to current device
  540.      * 0010 00aa    Select device aa in EPP Winbond mode
  541.      * 0010 10aa    Select device aa in EPP mode
  542.      * 0011 xxxx    Deselect all devices
  543.      * 0110 00aa    Test device aa
  544.      * 1101 00aa    Select device aa in ECP mode
  545.      * 1110 00aa    Select device aa in Compatible mode
  546.      */
  547.     w_dtr(ppb, b);
  548.     udelay(2); /* 1 usec - infinite */
  549.     w_ctr(ppb, 0x0c);
  550.     udelay(10); /* 7 usec - infinite */
  551.     w_ctr(ppb, 0x0d);
  552.     udelay(2); /* 1 usec - infinite */
  553.     w_ctr(ppb, 0x0c);
  554.     udelay(10); /* 7 usec - infinite */
  555.     w_dtr(ppb, 0xff);
  556.     udelay(10); /* 7 usec - infinite */
  557.     /*
  558.      * The following table is electrical pin values.
  559.      * (BSY is inverted at the CTR register)
  560.      *
  561.      *       BSY  ACK  POut SEL  Fault
  562.      * S1    0    X    1    1    1
  563.      * S2    1    X    0    1    1
  564.      * S3    L    X    1    1    S
  565.      *
  566.      * L => Last device in chain
  567.      * S => Selected
  568.      *
  569.      * Observered values for S1,S2,S3 are:
  570.      * Disconnect => f8/58/78
  571.      * Connect    => f8/58/70
  572.      */
  573.     if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x30))
  574. return 1; /* Connected */
  575.     if ((s1 == 0xb8) && (s2 == 0x18) && (s3 == 0x38))
  576. return 0; /* Disconnected */
  577.     return -1; /* No device present */
  578. }
  579. static inline int imm_connect(int host_no, int flag)
  580. {
  581.     unsigned short ppb = IMM_BASE(host_no);
  582.     imm_cpp(ppb, 0xe0); /* Select device 0 in compatible mode */
  583.     imm_cpp(ppb, 0x30); /* Disconnect all devices */
  584.     if ((imm_hosts[host_no].mode == IMM_EPP_8) ||
  585. (imm_hosts[host_no].mode == IMM_EPP_16) ||
  586. (imm_hosts[host_no].mode == IMM_EPP_32))
  587. return imm_cpp(ppb, 0x28); /* Select device 0 in EPP mode */
  588.     return imm_cpp(ppb, 0xe0); /* Select device 0 in compatible mode */
  589. }
  590. static void imm_disconnect(int host_no)
  591. {
  592.     unsigned short ppb = IMM_BASE(host_no);
  593.     imm_cpp(ppb, 0x30); /* Disconnect all devices */
  594. }
  595. static int imm_select(int host_no, int target)
  596. {
  597.     int k;
  598.     unsigned short ppb = IMM_BASE(host_no);
  599.     /*
  600.      * Firstly we want to make sure there is nothing
  601.      * holding onto the SCSI bus.
  602.      */
  603.     w_ctr(ppb, 0xc);
  604.     k = IMM_SELECT_TMO;
  605.     do {
  606. k--;
  607.     } while ((r_str(ppb) & 0x08) && (k));
  608.     if (!k)
  609. return 0;
  610.     /*
  611.      * Now assert the SCSI ID (HOST and TARGET) on the data bus
  612.      */
  613.     w_ctr(ppb, 0x4);
  614.     w_dtr(ppb, 0x80 | (1 << target));
  615.     udelay(1);
  616.     /*
  617.      * Deassert SELIN first followed by STROBE
  618.      */
  619.     w_ctr(ppb, 0xc);
  620.     w_ctr(ppb, 0xd);
  621.     /*
  622.      * ACK should drop low while SELIN is deasserted.
  623.      * FAULT should drop low when the SCSI device latches the bus.
  624.      */
  625.     k = IMM_SELECT_TMO;
  626.     do {
  627. k--;
  628.     }
  629.     while (!(r_str(ppb) & 0x08) && (k));
  630.     /*
  631.      * Place the interface back into a sane state (status mode)
  632.      */
  633.     w_ctr(ppb, 0xc);
  634.     return (k) ? 1 : 0;
  635. }
  636. static int imm_init(int host_no)
  637. {
  638.     int retv;
  639. #if defined(CONFIG_PARPORT) || defined(CONFIG_PARPORT_MODULE)
  640.     if (imm_pb_claim(host_no))
  641. while (imm_hosts[host_no].p_busy)
  642.     schedule(); /* We can safe schedule here */
  643. #endif
  644.     retv = imm_connect(host_no, 0);
  645.     if (retv == 1) {
  646. imm_reset_pulse(IMM_BASE(host_no));
  647. udelay(1000); /* Delay to allow devices to settle */
  648. imm_disconnect(host_no);
  649. udelay(1000); /* Another delay to allow devices to settle */
  650. retv = device_check(host_no);
  651. imm_pb_release(host_no);
  652. return retv;
  653.     }
  654.     imm_pb_release(host_no);
  655.     return 1;
  656. }
  657. static inline int imm_send_command(Scsi_Cmnd * cmd)
  658. {
  659.     int host_no = cmd->host->unique_id;
  660.     int k;
  661.     /* NOTE: IMM uses byte pairs */
  662.     for (k = 0; k < cmd->cmd_len; k += 2)
  663. if (!imm_out(host_no, &cmd->cmnd[k], 2))
  664.     return 0;
  665.     return 1;
  666. }
  667. /*
  668.  * The bulk flag enables some optimisations in the data transfer loops,
  669.  * it should be true for any command that transfers data in integral
  670.  * numbers of sectors.
  671.  * 
  672.  * The driver appears to remain stable if we speed up the parallel port
  673.  * i/o in this function, but not elsewhere.
  674.  */
  675. static int imm_completion(Scsi_Cmnd * cmd)
  676. {
  677.     /* Return codes:
  678.      * -1     Error
  679.      *  0     Told to schedule
  680.      *  1     Finished data transfer
  681.      */
  682.     int host_no = cmd->host->unique_id;
  683.     unsigned short ppb = IMM_BASE(host_no);
  684.     unsigned long start_jiffies = jiffies;
  685.     unsigned char r, v;
  686.     int fast, bulk, status;
  687.     v = cmd->cmnd[0];
  688.     bulk = ((v == READ_6) ||
  689.     (v == READ_10) ||
  690.     (v == WRITE_6) ||
  691.     (v == WRITE_10));
  692.     /*
  693.      * We only get here if the drive is ready to comunicate,
  694.      * hence no need for a full imm_wait.
  695.      */
  696.     w_ctr(ppb, 0x0c);
  697.     r = (r_str(ppb) & 0xb8);
  698.     /*
  699.      * while (device is not ready to send status byte)
  700.      *     loop;
  701.      */
  702.     while (r != (unsigned char) 0xb8) {
  703. /*
  704.  * If we have been running for more than a full timer tick
  705.  * then take a rest.
  706.  */
  707. if (time_after(jiffies, start_jiffies + 1))
  708.     return 0;
  709. /*
  710.  * FAIL if:
  711.  * a) Drive status is screwy (!ready && !present)
  712.  * b) Drive is requesting/sending more data than expected
  713.  */
  714. if (((r & 0x88) != 0x88) || (cmd->SCp.this_residual <= 0)) {
  715.     imm_fail(host_no, DID_ERROR);
  716.     return -1; /* ERROR_RETURN */
  717. }
  718. /* determine if we should use burst I/O */
  719. if (imm_hosts[host_no].rd == 0) {
  720.     fast = (bulk && (cmd->SCp.this_residual >= IMM_BURST_SIZE)) ? IMM_BURST_SIZE : 2;
  721.     status = imm_out(host_no, cmd->SCp.ptr, fast);
  722. } else {
  723.     fast = (bulk && (cmd->SCp.this_residual >= IMM_BURST_SIZE)) ? IMM_BURST_SIZE : 1;
  724.     status = imm_in(host_no, cmd->SCp.ptr, fast);
  725. }
  726. cmd->SCp.ptr += fast;
  727. cmd->SCp.this_residual -= fast;
  728. if (!status) {
  729.     imm_fail(host_no, DID_BUS_BUSY);
  730.     return -1; /* ERROR_RETURN */
  731. }
  732. if (cmd->SCp.buffer && !cmd->SCp.this_residual) {
  733.     /* if scatter/gather, advance to the next segment */
  734.     if (cmd->SCp.buffers_residual--) {
  735. cmd->SCp.buffer++;
  736. cmd->SCp.this_residual = cmd->SCp.buffer->length;
  737. cmd->SCp.ptr = cmd->SCp.buffer->address;
  738. /*
  739.  * Make sure that we transfer even number of bytes
  740.  * otherwise it makes imm_byte_out() messy.
  741.  */
  742. if (cmd->SCp.this_residual & 0x01)
  743.     cmd->SCp.this_residual++;
  744.     }
  745. }
  746. /* Now check to see if the drive is ready to comunicate */
  747. w_ctr(ppb, 0x0c);
  748. r = (r_str(ppb) & 0xb8);
  749. /* If not, drop back down to the scheduler and wait a timer tick */
  750. if (!(r & 0x80))
  751.     return 0;
  752.     }
  753.     return 1; /* FINISH_RETURN */
  754. }
  755. /* deprecated synchronous interface */
  756. int imm_command(Scsi_Cmnd * cmd)
  757. {
  758.     static int first_pass = 1;
  759.     int host_no = cmd->host->unique_id;
  760.     if (first_pass) {
  761. printk("imm: using non-queuing interfacen");
  762. first_pass = 0;
  763.     }
  764.     if (imm_hosts[host_no].cur_cmd) {
  765. printk("IMM: bug in imm_commandn");
  766. return 0;
  767.     }
  768.     imm_hosts[host_no].failed = 0;
  769.     imm_hosts[host_no].jstart = jiffies;
  770.     imm_hosts[host_no].cur_cmd = cmd;
  771.     cmd->result = DID_ERROR << 16; /* default return code */
  772.     cmd->SCp.phase = 0;
  773.     imm_pb_claim(host_no);
  774.     while (imm_engine(&imm_hosts[host_no], cmd))
  775. schedule();
  776.     if (cmd->SCp.phase) /* Only disconnect if we have connected */
  777. imm_disconnect(cmd->host->unique_id);
  778.     imm_pb_release(host_no);
  779.     imm_hosts[host_no].cur_cmd = 0;
  780.     return cmd->result;
  781. }
  782. /*
  783.  * Since the IMM itself doesn't generate interrupts, we use
  784.  * the scheduler's task queue to generate a stream of call-backs and
  785.  * complete the request when the drive is ready.
  786.  */
  787. static void imm_interrupt(void *data)
  788. {
  789.     imm_struct *tmp = (imm_struct *) data;
  790.     Scsi_Cmnd *cmd = tmp->cur_cmd;
  791.     unsigned long flags;
  792.     if (!cmd) {
  793. printk("IMM: bug in imm_interruptn");
  794. return;
  795.     }
  796.     if (imm_engine(tmp, cmd)) {
  797. tmp->imm_tq.data = (void *) tmp;
  798. tmp->imm_tq.sync = 0;
  799. queue_task(&tmp->imm_tq, &tq_timer);
  800. return;
  801.     }
  802.     /* Command must of completed hence it is safe to let go... */
  803. #if IMM_DEBUG > 0
  804.     switch ((cmd->result >> 16) & 0xff) {
  805.     case DID_OK:
  806. break;
  807.     case DID_NO_CONNECT:
  808. printk("imm: no device at SCSI ID %in", cmd->target);
  809. break;
  810.     case DID_BUS_BUSY:
  811. printk("imm: BUS BUSY - EPP timeout detectedn");
  812. break;
  813.     case DID_TIME_OUT:
  814. printk("imm: unknown timeoutn");
  815. break;
  816.     case DID_ABORT:
  817. printk("imm: told to abortn");
  818. break;
  819.     case DID_PARITY:
  820. printk("imm: parity error (???)n");
  821. break;
  822.     case DID_ERROR:
  823. printk("imm: internal driver errorn");
  824. break;
  825.     case DID_RESET:
  826. printk("imm: told to reset devicen");
  827. break;
  828.     case DID_BAD_INTR:
  829. printk("imm: bad interrupt (???)n");
  830. break;
  831.     default:
  832. printk("imm: bad return code (%02x)n", (cmd->result >> 16) & 0xff);
  833.     }
  834. #endif
  835.     if (cmd->SCp.phase > 1)
  836. imm_disconnect(cmd->host->unique_id);
  837.     if (cmd->SCp.phase > 0)
  838. imm_pb_release(cmd->host->unique_id);
  839.     spin_lock_irqsave(&io_request_lock, flags);
  840.     tmp->cur_cmd = 0;
  841.     cmd->scsi_done(cmd);
  842.     spin_unlock_irqrestore(&io_request_lock, flags);
  843.     return;
  844. }
  845. static int imm_engine(imm_struct * tmp, Scsi_Cmnd * cmd)
  846. {
  847.     int host_no = cmd->host->unique_id;
  848.     unsigned short ppb = IMM_BASE(host_no);
  849.     unsigned char l = 0, h = 0;
  850.     int retv, x;
  851.     /* First check for any errors that may of occurred
  852.      * Here we check for internal errors
  853.      */
  854.     if (tmp->failed)
  855. return 0;
  856.     switch (cmd->SCp.phase) {
  857.     case 0: /* Phase 0 - Waiting for parport */
  858. if ((jiffies - tmp->jstart) > HZ) {
  859.     /*
  860.      * We waited more than a second
  861.      * for parport to call us
  862.      */
  863.     imm_fail(host_no, DID_BUS_BUSY);
  864.     return 0;
  865. }
  866. return 1; /* wait until imm_wakeup claims parport */
  867. /* Phase 1 - Connected */
  868.     case 1:
  869. imm_connect(host_no, CONNECT_EPP_MAYBE);
  870. cmd->SCp.phase++;
  871. /* Phase 2 - We are now talking to the scsi bus */
  872.     case 2:
  873. if (!imm_select(host_no, cmd->target)) {
  874.     imm_fail(host_no, DID_NO_CONNECT);
  875.     return 0;
  876. }
  877. cmd->SCp.phase++;
  878. /* Phase 3 - Ready to accept a command */
  879.     case 3:
  880. w_ctr(ppb, 0x0c);
  881. if (!(r_str(ppb) & 0x80))
  882.     return 1;
  883. if (!imm_send_command(cmd))
  884.     return 0;
  885. cmd->SCp.phase++;
  886. /* Phase 4 - Setup scatter/gather buffers */
  887.     case 4:
  888. if (cmd->use_sg) {
  889.     /* if many buffers are available, start filling the first */
  890.     cmd->SCp.buffer = (struct scatterlist *) cmd->request_buffer;
  891.     cmd->SCp.this_residual = cmd->SCp.buffer->length;
  892.     cmd->SCp.ptr = cmd->SCp.buffer->address;
  893. } else {
  894.     /* else fill the only available buffer */
  895.     cmd->SCp.buffer = NULL;
  896.     cmd->SCp.this_residual = cmd->request_bufflen;
  897.     cmd->SCp.ptr = cmd->request_buffer;
  898. }
  899. cmd->SCp.buffers_residual = cmd->use_sg;
  900. cmd->SCp.phase++;
  901. if (cmd->SCp.this_residual & 0x01)
  902.     cmd->SCp.this_residual++;
  903. /* Phase 5 - Pre-Data transfer stage */
  904.     case 5:
  905. /* Spin lock for BUSY */
  906. w_ctr(ppb, 0x0c);
  907. if (!(r_str(ppb) & 0x80))
  908.     return 1;
  909. /* Require negotiation for read requests */
  910. x = (r_str(ppb) & 0xb8);
  911. tmp->rd = (x & 0x10) ? 1 : 0;
  912. tmp->dp = (x & 0x20) ? 0 : 1;
  913. if ((tmp->dp) && (tmp->rd))
  914.     if (imm_negotiate(tmp))
  915. return 0;
  916. cmd->SCp.phase++;
  917. /* Phase 6 - Data transfer stage */
  918.     case 6:
  919. /* Spin lock for BUSY */
  920. w_ctr(ppb, 0x0c);
  921. if (!(r_str(ppb) & 0x80))
  922.     return 1;
  923. if (tmp->dp) {
  924.     retv = imm_completion(cmd);
  925.     if (retv == -1)
  926. return 0;
  927.     if (retv == 0)
  928. return 1;
  929. }
  930. cmd->SCp.phase++;
  931. /* Phase 7 - Post data transfer stage */
  932.     case 7:
  933. if ((tmp->dp) && (tmp->rd)) {
  934.     if ((tmp->mode == IMM_NIBBLE) || (tmp->mode == IMM_PS2)) {
  935. w_ctr(ppb, 0x4);
  936. w_ctr(ppb, 0xc);
  937. w_ctr(ppb, 0xe);
  938. w_ctr(ppb, 0x4);
  939.     }
  940. }
  941. cmd->SCp.phase++;
  942. /* Phase 8 - Read status/message */
  943.     case 8:
  944. /* Check for data overrun */
  945. if (imm_wait(host_no) != (unsigned char) 0xb8) {
  946.     imm_fail(host_no, DID_ERROR);
  947.     return 0;
  948. }
  949. if (imm_negotiate(tmp))
  950.     return 0;
  951. if (imm_in(host_no, &l, 1)) { /* read status byte */
  952.     /* Check for optional message byte */
  953.     if (imm_wait(host_no) == (unsigned char) 0xb8)
  954. imm_in(host_no, &h, 1);
  955.     cmd->result = (DID_OK << 16) + (l & STATUS_MASK);
  956. }
  957. if ((tmp->mode == IMM_NIBBLE) || (tmp->mode == IMM_PS2)) {
  958.     w_ctr(ppb, 0x4);
  959.     w_ctr(ppb, 0xc);
  960.     w_ctr(ppb, 0xe);
  961.     w_ctr(ppb, 0x4);
  962. }
  963. return 0; /* Finished */
  964. break;
  965.     default:
  966. printk("imm: Invalid scsi phasen");
  967.     }
  968.     return 0;
  969. }
  970. int imm_queuecommand(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
  971. {
  972.     int host_no = cmd->host->unique_id;
  973.     if (imm_hosts[host_no].cur_cmd) {
  974. printk("IMM: bug in imm_queuecommandn");
  975. return 0;
  976.     }
  977.     imm_hosts[host_no].failed = 0;
  978.     imm_hosts[host_no].jstart = jiffies;
  979.     imm_hosts[host_no].cur_cmd = cmd;
  980.     cmd->scsi_done = done;
  981.     cmd->result = DID_ERROR << 16; /* default return code */
  982.     cmd->SCp.phase = 0; /* bus free */
  983.     imm_pb_claim(host_no);
  984.     imm_hosts[host_no].imm_tq.data = imm_hosts + host_no;
  985.     imm_hosts[host_no].imm_tq.sync = 0;
  986.     queue_task(&imm_hosts[host_no].imm_tq, &tq_immediate);
  987.     mark_bh(IMMEDIATE_BH);
  988.     return 0;
  989. }
  990. /*
  991.  * Apparently the disk->capacity attribute is off by 1 sector 
  992.  * for all disk drives.  We add the one here, but it should really
  993.  * be done in sd.c.  Even if it gets fixed there, this will still
  994.  * work.
  995.  */
  996. int imm_biosparam(Disk * disk, kdev_t dev, int ip[])
  997. {
  998.     ip[0] = 0x40;
  999.     ip[1] = 0x20;
  1000.     ip[2] = (disk->capacity + 1) / (ip[0] * ip[1]);
  1001.     if (ip[2] > 1024) {
  1002. ip[0] = 0xff;
  1003. ip[1] = 0x3f;
  1004. ip[2] = (disk->capacity + 1) / (ip[0] * ip[1]);
  1005.     }
  1006.     return 0;
  1007. }
  1008. int imm_abort(Scsi_Cmnd * cmd)
  1009. {
  1010.     int host_no = cmd->host->unique_id;
  1011.     /*
  1012.      * There is no method for aborting commands since Iomega
  1013.      * have tied the SCSI_MESSAGE line high in the interface
  1014.      */
  1015.     switch (cmd->SCp.phase) {
  1016.     case 0: /* Do not have access to parport */
  1017.     case 1: /* Have not connected to interface */
  1018. imm_hosts[host_no].cur_cmd = NULL; /* Forget the problem */
  1019. return SUCCESS;
  1020. break;
  1021.     default: /* SCSI command sent, can not abort */
  1022. return FAILED;
  1023. break;
  1024.     }
  1025. }
  1026. void imm_reset_pulse(unsigned int base)
  1027. {
  1028.     w_ctr(base, 0x04);
  1029.     w_dtr(base, 0x40);
  1030.     udelay(1);
  1031.     w_ctr(base, 0x0c);
  1032.     w_ctr(base, 0x0d);
  1033.     udelay(50);
  1034.     w_ctr(base, 0x0c);
  1035.     w_ctr(base, 0x04);
  1036. }
  1037. int imm_reset(Scsi_Cmnd * cmd)
  1038. {
  1039.     int host_no = cmd->host->unique_id;
  1040.     if (cmd->SCp.phase)
  1041. imm_disconnect(host_no);
  1042.     imm_hosts[host_no].cur_cmd = NULL; /* Forget the problem */
  1043.     imm_connect(host_no, CONNECT_NORMAL);
  1044.     imm_reset_pulse(IMM_BASE(host_no));
  1045.     udelay(1000); /* device settle delay */
  1046.     imm_disconnect(host_no);
  1047.     udelay(1000); /* device settle delay */
  1048.     return SUCCESS;
  1049. }
  1050. static int device_check(int host_no)
  1051. {
  1052.     /* This routine looks for a device and then attempts to use EPP
  1053.        to send a command. If all goes as planned then EPP is available. */
  1054.     static char cmd[6] =
  1055.     {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  1056.     int loop, old_mode, status, k, ppb = IMM_BASE(host_no);
  1057.     unsigned char l;
  1058.     old_mode = imm_hosts[host_no].mode;
  1059.     for (loop = 0; loop < 8; loop++) {
  1060. /* Attempt to use EPP for Test Unit Ready */
  1061. if ((ppb & 0x0007) == 0x0000)
  1062.     imm_hosts[host_no].mode = IMM_EPP_32;
  1063.       second_pass:
  1064. imm_connect(host_no, CONNECT_EPP_MAYBE);
  1065. /* Select SCSI device */
  1066. if (!imm_select(host_no, loop)) {
  1067.     imm_disconnect(host_no);
  1068.     continue;
  1069. }
  1070. printk("imm: Found device at ID %i, Attempting to use %sn", loop,
  1071.        IMM_MODE_STRING[imm_hosts[host_no].mode]);
  1072. /* Send SCSI command */
  1073. status = 1;
  1074. w_ctr(ppb, 0x0c);
  1075. for (l = 0; (l < 3) && (status); l++)
  1076.     status = imm_out(host_no, &cmd[l << 1], 2);
  1077. if (!status) {
  1078.             imm_disconnect(host_no);
  1079.             imm_connect(host_no, CONNECT_EPP_MAYBE);
  1080.             imm_reset_pulse(IMM_BASE(host_no));
  1081.             udelay(1000);
  1082.             imm_disconnect(host_no);
  1083.             udelay(1000);
  1084.             if (imm_hosts[host_no].mode == IMM_EPP_32) {
  1085.                 imm_hosts[host_no].mode = old_mode;
  1086.                 goto second_pass;
  1087.             }
  1088.     printk("imm: Unable to establish communication, aborting driver load.n");
  1089.     return 1;
  1090. }
  1091. w_ctr(ppb, 0x0c);
  1092. k = 1000000; /* 1 Second */
  1093. do {
  1094.     l = r_str(ppb);
  1095.     k--;
  1096.     udelay(1);
  1097. } while (!(l & 0x80) && (k));
  1098. l &= 0xb8;
  1099. if (l != 0xb8) {
  1100.     imm_disconnect(host_no);
  1101.     imm_connect(host_no, CONNECT_EPP_MAYBE);
  1102.     imm_reset_pulse(IMM_BASE(host_no));
  1103.     udelay(1000);
  1104.     imm_disconnect(host_no);
  1105.     udelay(1000);
  1106.     if (imm_hosts[host_no].mode == IMM_EPP_32) {
  1107. imm_hosts[host_no].mode = old_mode;
  1108. goto second_pass;
  1109.     }
  1110.     printk("imm: Unable to establish communication, aborting driver load.n");
  1111.     return 1;
  1112. }
  1113. imm_disconnect(host_no);
  1114. printk("imm: Communication established at 0x%x with ID %i using %sn", ppb, loop,
  1115.        IMM_MODE_STRING[imm_hosts[host_no].mode]);
  1116. imm_connect(host_no, CONNECT_EPP_MAYBE);
  1117. imm_reset_pulse(IMM_BASE(host_no));
  1118. udelay(1000);
  1119. imm_disconnect(host_no);
  1120. udelay(1000);
  1121. return 0;
  1122.     }
  1123.     printk("imm: No devices found, aborting driver load.n");
  1124.     return 1;
  1125. }
  1126. MODULE_LICENSE("GPL");