linux/drivers/scsi/imm.c
<<
>>
Prefs
   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 * My unofficial company acronym list is 21 pages long:
   7 *      FLA:    Four letter acronym with built in facility for
   8 *              future expansion to five letters.
   9 */
  10
  11#include <linux/init.h>
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/blkdev.h>
  15#include <linux/parport.h>
  16#include <linux/workqueue.h>
  17#include <linux/delay.h>
  18#include <linux/slab.h>
  19#include <asm/io.h>
  20
  21#include <scsi/scsi.h>
  22#include <scsi/scsi_cmnd.h>
  23#include <scsi/scsi_device.h>
  24#include <scsi/scsi_host.h>
  25
  26/* The following #define is to avoid a clash with hosts.c */
  27#define IMM_PROBE_SPP   0x0001
  28#define IMM_PROBE_PS2   0x0002
  29#define IMM_PROBE_ECR   0x0010
  30#define IMM_PROBE_EPP17 0x0100
  31#define IMM_PROBE_EPP19 0x0200
  32
  33
  34typedef struct {
  35        struct pardevice *dev;  /* Parport device entry         */
  36        int base;               /* Actual port address          */
  37        int base_hi;            /* Hi Base address for ECP-ISA chipset */
  38        int mode;               /* Transfer mode                */
  39        struct scsi_cmnd *cur_cmd;      /* Current queued command       */
  40        struct delayed_work imm_tq;     /* Polling interrupt stuff       */
  41        unsigned long jstart;   /* Jiffies at start             */
  42        unsigned failed:1;      /* Failure flag                 */
  43        unsigned dp:1;          /* Data phase present           */
  44        unsigned rd:1;          /* Read data in data phase      */
  45        unsigned wanted:1;      /* Parport sharing busy flag    */
  46        wait_queue_head_t *waiting;
  47        struct Scsi_Host *host;
  48        struct list_head list;
  49} imm_struct;
  50
  51static void imm_reset_pulse(unsigned int base);
  52static int device_check(imm_struct *dev);
  53
  54#include "imm.h"
  55
  56static inline imm_struct *imm_dev(struct Scsi_Host *host)
  57{
  58        return *(imm_struct **)&host->hostdata;
  59}
  60
  61static DEFINE_SPINLOCK(arbitration_lock);
  62
  63static void got_it(imm_struct *dev)
  64{
  65        dev->base = dev->dev->port->base;
  66        if (dev->cur_cmd)
  67                dev->cur_cmd->SCp.phase = 1;
  68        else
  69                wake_up(dev->waiting);
  70}
  71
  72static void imm_wakeup(void *ref)
  73{
  74        imm_struct *dev = (imm_struct *) ref;
  75        unsigned long flags;
  76
  77        spin_lock_irqsave(&arbitration_lock, flags);
  78        if (dev->wanted) {
  79                parport_claim(dev->dev);
  80                got_it(dev);
  81                dev->wanted = 0;
  82        }
  83        spin_unlock_irqrestore(&arbitration_lock, flags);
  84}
  85
  86static int imm_pb_claim(imm_struct *dev)
  87{
  88        unsigned long flags;
  89        int res = 1;
  90        spin_lock_irqsave(&arbitration_lock, flags);
  91        if (parport_claim(dev->dev) == 0) {
  92                got_it(dev);
  93                res = 0;
  94        }
  95        dev->wanted = res;
  96        spin_unlock_irqrestore(&arbitration_lock, flags);
  97        return res;
  98}
  99
 100static void imm_pb_dismiss(imm_struct *dev)
 101{
 102        unsigned long flags;
 103        int wanted;
 104        spin_lock_irqsave(&arbitration_lock, flags);
 105        wanted = dev->wanted;
 106        dev->wanted = 0;
 107        spin_unlock_irqrestore(&arbitration_lock, flags);
 108        if (!wanted)
 109                parport_release(dev->dev);
 110}
 111
 112static inline void imm_pb_release(imm_struct *dev)
 113{
 114        parport_release(dev->dev);
 115}
 116
 117/* This is to give the imm driver a way to modify the timings (and other
 118 * parameters) by writing to the /proc/scsi/imm/0 file.
 119 * Very simple method really... (Too simple, no error checking :( )
 120 * Reason: Kernel hackers HATE having to unload and reload modules for
 121 * testing...
 122 * Also gives a method to use a script to obtain optimum timings (TODO)
 123 */
 124static inline int imm_proc_write(imm_struct *dev, char *buffer, int length)
 125{
 126        unsigned long x;
 127
 128        if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {
 129                x = simple_strtoul(buffer + 5, NULL, 0);
 130                dev->mode = x;
 131                return length;
 132        }
 133        printk("imm /proc: invalid variable\n");
 134        return (-EINVAL);
 135}
 136
 137static int imm_proc_info(struct Scsi_Host *host, char *buffer, char **start,
 138                        off_t offset, int length, int inout)
 139{
 140        imm_struct *dev = imm_dev(host);
 141        int len = 0;
 142
 143        if (inout)
 144                return imm_proc_write(dev, buffer, length);
 145
 146        len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION);
 147        len +=
 148            sprintf(buffer + len, "Parport : %s\n",
 149                    dev->dev->port->name);
 150        len +=
 151            sprintf(buffer + len, "Mode    : %s\n",
 152                    IMM_MODE_STRING[dev->mode]);
 153
 154        /* Request for beyond end of buffer */
 155        if (offset > len)
 156                return 0;
 157
 158        *start = buffer + offset;
 159        len -= offset;
 160        if (len > length)
 161                len = length;
 162        return len;
 163}
 164
 165#if IMM_DEBUG > 0
 166#define imm_fail(x,y) printk("imm: imm_fail(%i) from %s at line %d\n",\
 167           y, __func__, __LINE__); imm_fail_func(x,y);
 168static inline void
 169imm_fail_func(imm_struct *dev, int error_code)
 170#else
 171static inline void
 172imm_fail(imm_struct *dev, int error_code)
 173#endif
 174{
 175        /* If we fail a device then we trash status / message bytes */
 176        if (dev->cur_cmd) {
 177                dev->cur_cmd->result = error_code << 16;
 178                dev->failed = 1;
 179        }
 180}
 181
 182/*
 183 * Wait for the high bit to be set.
 184 * 
 185 * In principle, this could be tied to an interrupt, but the adapter
 186 * doesn't appear to be designed to support interrupts.  We spin on
 187 * the 0x80 ready bit. 
 188 */
 189static unsigned char imm_wait(imm_struct *dev)
 190{
 191        int k;
 192        unsigned short ppb = dev->base;
 193        unsigned char r;
 194
 195        w_ctr(ppb, 0x0c);
 196
 197        k = IMM_SPIN_TMO;
 198        do {
 199                r = r_str(ppb);
 200                k--;
 201                udelay(1);
 202        }
 203        while (!(r & 0x80) && (k));
 204
 205        /*
 206         * STR register (LPT base+1) to SCSI mapping:
 207         *
 208         * STR      imm     imm
 209         * ===================================
 210         * 0x80     S_REQ   S_REQ
 211         * 0x40     !S_BSY  (????)
 212         * 0x20     !S_CD   !S_CD
 213         * 0x10     !S_IO   !S_IO
 214         * 0x08     (????)  !S_BSY
 215         *
 216         * imm      imm     meaning
 217         * ==================================
 218         * 0xf0     0xb8    Bit mask
 219         * 0xc0     0x88    ZIP wants more data
 220         * 0xd0     0x98    ZIP wants to send more data
 221         * 0xe0     0xa8    ZIP is expecting SCSI command data
 222         * 0xf0     0xb8    end of transfer, ZIP is sending status
 223         */
 224        w_ctr(ppb, 0x04);
 225        if (k)
 226                return (r & 0xb8);
 227
 228        /* Counter expired - Time out occurred */
 229        imm_fail(dev, DID_TIME_OUT);
 230        printk("imm timeout in imm_wait\n");
 231        return 0;               /* command timed out */
 232}
 233
 234static int imm_negotiate(imm_struct * tmp)
 235{
 236        /*
 237         * The following is supposedly the IEEE 1284-1994 negotiate
 238         * sequence. I have yet to obtain a copy of the above standard
 239         * so this is a bit of a guess...
 240         *
 241         * A fair chunk of this is based on the Linux parport implementation
 242         * of IEEE 1284.
 243         *
 244         * Return 0 if data available
 245         *        1 if no data available
 246         */
 247
 248        unsigned short base = tmp->base;
 249        unsigned char a, mode;
 250
 251        switch (tmp->mode) {
 252        case IMM_NIBBLE:
 253                mode = 0x00;
 254                break;
 255        case IMM_PS2:
 256                mode = 0x01;
 257                break;
 2        * 255        case  204
strncmp(w_ctr(ppb, 0
printk(1);
 164
w_ctr(da href="+code=ppb" dlass="sref">ppb, 0
mode) {
 165#if dev-&g/a>(1);
len +=>(ppb, 0
 167           k = (1);
 168static a, imm>(ppb);

imm_f/a>(1);
printk<>(ppb, 0
imm_f/a>(1);
w_ctr(ppb, 0
k)
/* If e=len" c"sref">w_ctr("#L252" id="L252" class="line" name="L1662> 176        if (dev-&gail(dev, DID_TERROR/a>);
len;

);s/scsi/imm.c#L188" id="L188" class="line" 2ame="L1842> 184
inline void ppb = iid imm_faid r_str(ppb);
ppb);
Daid imm_fw(ppb);
Daid 
inline void (imm_struct * dev, iid Dcsi_hiid r_strbase;
k)
imm>(ec href="+code=ppb" ec ss="sref">ppb);
/* If e=len" c/spaclass="sref">imm_id iid iid k)
(ec href="+code=ppb" ec ss="sref">ppb);
off_t(1);
k--;
("imm: imm_fail(%i) from %sECP sync vers/s asef="drstill pre;
n);
imm_vers_
ppb = 
buffer, int lengthnt iid a, (ppb, 0

apparsntlytimiane /scs esi/imm.c#L247" id="L247" class="line" 3ame="L2193> 219imm_id lengthnt iid iid k--;
(da href="+code=ppb" dlass="sref">ppb, 0
buffer, int udelay<>(ppb, 0

Drop
k--;
(da href="+code=ppb" dlass="sref">ppb, 0
buffer, int mode >(ppb, 0

dev-&g>(ppb, 0

apparsntlytimiane /scs esi/imm.c#L247" id="L247" class="line" 3ame="L2263> 226               3retur3 (/* command timed out */
All w
n);well -ash hope! esi/imm.c#L247" id="L247" class="line" 3ame="L2173> 227
imm_nibble_i>nt ppb = 
buffer, int lengthnt a, iid 
k = (ppb, 0
imm_id lengthnt iid iid r = (ppb, 0
k--;
imm>(ppb);

udelay<>(ppb, 0
buffer, int imm>(ppb);

a, mode >(ppb, 0
/* command timed out */
All w
n);well -ash hope! esi/imm.c#L247" id="L247" class="line" 3ame="L2463> 246imm_vers_i>nt ppb = 
buffer, int lengthnt iid dev-&g>(ppb, 0
imm_id lengthnt iid iid dev-&g>(ppb, 0
 2535 buffer, int imm>(da href="+code=ppbr dlass="sref">ppb, 0
(dev-&g>(ppb, 0
/* command timed out */
All w
n);well -ash hope! esi/imm.c#L247" id="L247" class="line" 3ame="L1623> 162        return 3a hre36/imm.c#L233" id="L233" class="line" 3ame="L1633> 163}
imm_
imm_uct *dev, int buffer, int lengthnt ppb = dev->base;
ref="+code=r_str" class="sref">r_str(imma href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 3ame="L2583> 168static 

r & 0xb8);
/* If e=len" c"sref">w_ctr(dev, DID_TERROR/a>);
ppb = ("imm: imm_fail(%i) from &s/s:dn clas clhref=pan>
ref="+code=r_str" clamc#L225" id="L225" class="line" 3ame="L2573> 177               3tmp->base; {
IMM_PS2 232}
rivers2 de=lref="+cod44base" class="sr_32.33ame="L1813> 181
IMM_PS2 216 182IMM_NIBEPP_8216 183mode epp_re;
ppb = dev-&g>(ppb, 0x04);
dev-&gCONFIG_href_IZIPaEPP> 216 /ppb = 
a>, int a, nt a, ppb, 0x04);
/a>, int a, nt ppb = 
a>, int a, nt a, ppb, 0x04);
/a>, int a, nt a, ppb, 0x04);
/a>, int a, nt dev-&g>(ppb, 0x04);
/* If e=len" c"sref">w_ctrr & 0(ppb);
ppb = >(ppb, 0x04);
dev-&gecp_sync(imma href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 3ame="L1983> 198        do {
IMM_PS2:
IMM_PS2:

8 href=utput, lash a loopscsi/imm.c#L224" id="L224" class="line" 4a3e="L2014> 193        unsigne4(mode ref="+code=r_str" class="sref">r_strppb, 0x04);
/a>, int a, nt  197        ppb = ("imm: imm_fail(%i) from &s/s:dbug;
mode ref="+code=r_str" class=.c#L157" id="L157" class="line" 4ame="L2094> 209len;
imm_i>nt imm_uct *dev, int buffer, int lengthnt /* If e=ppb" class="sref">ppb = dev->base;
ref="+code=r_str" class="sref">r_str(imma href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 4ame="L2174> 217/* Counter expired - Time out i/imm.c#L224" id="L224" class="line" 4ame="L2194> 219r & 0xb8);
dev-&gail(dev, DID_TERROR/a>);
/* If e=len" ccsi/imm.c#L157" id="L157" class="line" 4ame="L2264> 226               4retur4 (tmp->base; {
/* Cou class="sref">IMM_PS2:
(k--;
r_strnt ppb, 0x04);
/a>, int a, nt udelay<>(ppb, 0x04);
IMM_PS2:
/* If e=len" c"and timed out */
8 hrefinput, lash a loopscsi/imm.c#L224" id="L224" class="line" 4ame="L2264> 236        ppb = ref="+code=r_str" class="sref">r_strnt ppb, 0x04);
/a>, int a, nt dev-&g>(ppb, 0x04);
IMM_PS2 232}
rivers2 de=lref="+cod44base" class="sr_32.34ame="L2314> 241IMM_PS2 216 242IMM_NIBEPP_8216 243mode epp_re;
ppb = dev-&g>(ppb, 0x04);
dev-&gCONFIG_href_IZIPaEPP> 216 /ppb = 
a>, int a, nt a, ppb, 0x04);
/a>, int a, nt ppb = 
a>, int a, nt a, ppb, 0x04);
/a>, int a, nt a, ppb, 0x04);
/a>, int a, nt dev-&g>(ppb, 0x04);
/* If e=len" c"sref">w_ctrr & 0(ppb);
mode >(ppb, 0x04);
dev-&gecp_sync(imma href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 4ame="L2584> 2        * 2545  161               4udelay<("imm: imm_fail(%i) from &s/s:dbug;
mode ref="+code=r_str" class=.c#L157" id="L157" class="line" 4ame="L1634> 163}
len;
imm_cpppb = a, 
/* If e=ppb" cl="sref">a, a, }
riverss2gth" cf">a, }
riverss3 clac#L157" id="L157" class="line" 4ame="L1664> 176        if (mode >(ppb, 0x04);
k = (1);
/* co"and timed out */
1 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1784> 178               4a, (da href="+code=ppb" dlass="sref">ppb, 0x04);
k = (1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1804> 180}
ppb, 0x04);
imm_f/a>(1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1624> 182ppb, 0x04);
imm_f/a>(1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1744> 184ppb, 0x04);
dev-&g/a>(1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1664> 186mode s1href="+code=devs1gth"ss="sref">r_str(ppb);
k = (da href="+code=ppb" dlass="sref">ppb, 0x04);
a, (1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1694> 189static unsigned4char 48imm_fail" class="sref">imm_fs 232}
riverss2gth"ss="sref">r_str(ppb);
ppb, 0x04);
imm_f/a>(1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 4ame="L1624> 192        unsigne4 shor49code=IMM_NIBBsave" class="srs3232}
riverss3 class="sref">r_str(ppb);


imm_fw(da href="+code=ppb" dlass="sref">ppb, 0x04);
a, /* co"and timed out */
1 usec -siafinits esi/imm.c#L247" id="L247" class="line" 5ame="L2055> 205        dev-&g>(ppb, 0x04);
mode /a>(1);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 5a7e="L2065> 197        k = (ppb, 0x04);
a, (1);
/* co"and timed out */
1 usec -siafinits esi/imm.c#L247" id="L247" class="line" 5a9e="L2065> 199               5ment"50imm_fail" class="sref">imm_f>(ppb, 0x04);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 5ame="L2115> 211imm_fw(da href="+code=ppb" dlass="sref">ppb, 0x04);
/* c"and timed out */
7 usec -siafinits esi/imm.c#L247" id="L247" class="line" 5a3e="L2015> 213


ssimm.c#L212" id="L212" class="line" 5ame="L2145> 224        

r & s1href="+code=devs1gth"ss=i/ib8.rs/scss/scsief">r & s 232}
riverss2gth"ssi/im18m.s/scss/scsief">r & s3232}
riverss3 classi/im30mc#L156" id="L156" class="line" 5ame="L2315> 231        return 5;    53="+code=udelay" classn class1"comment"and timed out */
Connectef= si/imm.c#L247" id="L247" class="line" 5a2e="L2015> 232}
r & s1href="+code=devs1gth"ss=i/ib8.rs/scss/scsief">r & s 232}
riverss2gth"ssi/im18m.s/scss/scsief">r & s3232}
riverss3 classi/im38mc#L156" id="L156" class="line" 5a3e="L2015> 233

Disconnectef= si/imm.c#L247" id="L247" class="line" 5ame="L2145> 234static int /* co"and timed out */
Non/ mess pre;
nt= si/imm.c#L247" id="L247" class="line" 5ame="L2165> 236        inpan cl2}
riversinpan ev" ciate" class="sref">imm_connectcl2}
riversimm_connectss="sref">ppb, 0imm_uct *dev, int flagppb = dev->base;
ppb, 0x04);

Selectn/ mess 0 in compatible /scs= si/imm.c#L247" id="L247" class="line" 5ame="L2435> 243imm_fimm_cpppb, 0x04);

Disconnectnalln/ messs= si/imm.c#L247" id="L247" class="line" 5ame="L2145> 244r & t;base; {
base;_NIBEPP_8216r & t;base; {
base;_NIBEPP_> 216r & t;base; {
base;_NIBEPP_> 232}
rivers2 de=lmc#L156" id="L156" class="line" 5ame="L2485> 248        unsigne5 shor54 len;
ppb, 0x04);

Selectn/ mess 0 in EPP /scs= si/imm.c#L247" id="L247" class="line" 5a9e="L2065> 249        unsigne5 char54(len;
ppb, 0x04);

Selectn/ mess 0 in compatible /scs= si/imm.c#L247" id="L247" class="line" 5ame="L2505> 250
len;
ppb, 0imm_uct *dev, int ppb, 0t;base;

Disconnectnalln/ messs= si/imm.c#L247" id="L247" class="line" 5ame="L2555> 255        case imm_select> *ppb, 0imm_uct *dev, int targ
 2555 (span class="strikimm.c#L193" id="L193" class="line" 5ame="L1605> 160        if (ppb = dev->base;
mode >(ppb, 0x04);
a, dev-&g2}
rivers2k--;
r & 0(ppb);
r & span class="strikimm.).c#L196" id="L196" class="line" 5ame="L1625> 172r & span class="strikimm.)#L233" id="L233" class="line" 5ame="L2545> 174{

k = (ppb, 0x04);
ppb, 0x04);
targ
imm_f/a>(1);
mode >(ppb, 0x04);
k = (ppb, 0x04);
imm_fspan class="strikimm.="sref">dev-&g2}
rivers2/* If e=len" c"sref">w_ctrr & 0(ppb);
r & span class="strikimm.).c#L196" id="L196" class="line" 5ame="L1785> 198        do {
ppb, 0x04);
r & span class="strikimm.) ? 1 :m.c#L157" id="L157" class="line" 6ame="L2046> 204
imm_i>>(ppb, 0imm_uct *dev, int ppb, 0nt (ppb, 0EIO232}
riversEIOimm.c#L193" id="L193" class="line" 6ame="L2106> 210ppb, 0t;base;
imm_fma>(1);
ppb, 0a href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 6a3e="L2016> 213imm_fma>(1);
len;
ppb, 0a href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 6ame="L2056> 215 /imm_f="d_cunkand> *dev, icmd> *k =  *dev, int r_strppb, 0cmd> *base;/ messpan class="stri/ messor_cass="sref">base;hosa> *span class="strikimm.c#L193" id="L193" class="line" 6ame="L2116> 221
r & span class="strikimm.ss=.c"ss="sref">imm_fspan class="strikimm.=<e" class="sref">cmd> *base;cmd_(a>nt imm_fspan class="strikimm.=+= 2c#L156" id="L156" class="line" 6ame="L2146> 224        r & iit *ppb, 0nt cmd> *base;cmnd> *imm_fspan class="strikimm.], 2cc#L156" id="L156" class="line" 6ame="L2056> 225        if (/* If e=len" code=EINVlass="s.c#L157" id="L157" class="line" 6ame="L2166> 226               6retur6 (
imm_complelaoncl2}
riversimm_complelaonss="sev" clBsave" class="srsass_cmnd> *dev, icmd> *, ssi/imm.c#L207" id="L207" class="line" 6ame="L2406> 240

dev, int r_strppb, 0cmd> *base;/ messpan class="stri/ messor_cass="sref">base;hosa> *ppb = dev->base;
dev-&gjiffies> *a, a, fasa> *a, a,  *imm_fdev-&gcmd> *base;cmnd> *r & dev-&gREAD_ 216r & dev-&gREAD_> 210r & dev-&gWRITE_ 216r & dev-&gWRITE_> 210 imm.).c#L196" id="L196" class="line" 6ame="L2446> 254               6break65imm_s#L224" id="L224" class="line" 6ame="L2556> 255        case /* If    * 0xc0     0x88    t i/imm.c#L224" id="L224" class="line" 6ame="L2166> 256               6
 2565 
imm_f>(ppb, 0x04);
r & 0(ppb);

ppb);
jiffies> *a,  *
(r & cmd> *base;SC           ppb, 0fairivers/scsi/imm.>, 0fairods/scs" class="sref">cmd> * 245imm_f/a>(1);
<6 href68afteref="+code=r_strtttttttttan>
Non/ mess pr#L207" id="L207" class="lERROR_RETURN"L2066> 179        }
 179        }
 *base;
a, ppb);
;            mode >(           k = (a,  2 ?"">a,  : 245a, ppb, 0nt cmd> *           ppbppb);
;                       a,  2 ?"">a,  : 227
imm_fspan clas6="str69"+code=bvlass=""sref"" 6ame="">a, ppb, 0ie" class="srsass_cmninods/scs" class="sref">cmd> *        /* If6e=len" c"sref">w_ctr 196
 d="L193" class=ulkhref="drivers/sculk clas45r & 6( d="L193" class=ulkhref="drivers/sculk clas45ppbppb, 0fairivers/scsi/imm.>, 0fairods/scs" class="sref">cmd> * 179        }
r & s7an cl70"+code=bvlass=""sref"douasref">base;SC * *           base;SC           base;SC *++45r & 78e="L70i/imm.c#L237" id="L23 class="line" 6a7id="L196" clasSC           base;SC *.save" class="srthislengthjiffies> *(ppb7/a>, 7EIO232}
riversEIOime="sssssssssssssref">base;SC d="L193" class=sg_virhref="drivers/scsg_virhods/scs" class="srefSC *245imm_fma>(1);
<7 href71afteref="+code=r_strtttttttttssssssss7" class="line" 6ame="L2556> 175        imm_fma>(1);
<7 href71/ mess is not readc to ee"d status v                        * m.c#Lwisefers212"s" 6ame="Lor_c() messy1706> 170#else
len;
 236        base;SCbase;SC                k =  *}
riversEIOii/imm.c#L247" id="L247" claw ME_OUclass=#L224" id="L224" class="line" 6ame="L *2165> 236        span 7lass=72s="strikimm.--c#L193"drivers/scsi/imx04);
r & cmd> ="sref">ppb);
 183r & span7class72"+code=bvlass=""sref"#L207" id="L207" class="lIfid=",o.i/im212" down=="line"6ame="L2r"L237e="L ae" 6a9e="L2 *2165> 236        r &a7p; ii7 *r & cmd> */* If7e=len" code=EINVlass="s.7#L1577 id="L157" class="line" 6ame="L2166> 226               6retur6 (<7 href="+c7n class1"#L157" id="L1577 clas7="line" 6ame="28         22=bvlass=""sref"#L207" id="L207" class="lFINISH_RETURN"L2066> 179        }
 175         242 242 170#else
 179        }
dworkv, int r_str        }

imm_co7plela73ppb" class="sref">ppb, 0>dev, int r_strppb               6retur6 (<7 hc#L252"7id="L252" class="line" 679e="L73m_cpdev, icmd> *base;
, ssi/imm.cosass_cmndass="sref">dScocmHclass="line" 6ame=ScocmHclacc#L156" id="L156" cl class="line" 6ame="L2456> s="sref">base;cmnd> * 45 162        return 6a hre66er7     * of7IEEE 1284.
ppengi">imm_f="d_cunkand>ppengi">ods/scs" class="sref">cmd> *devme="L2_47" ied_workint base;
devtqint 82ppb<7a> = 7a href="+code=28         * 179        }
 *c#L 09        }
a, 7a hrr7f="+code=r_strswitchf">dev-&gREAD_cmnd> * *c#L*c#L 16ame="L1616ff 167           fasa>7*imm_fdcaseccs" class="srefDID_NO_CONNECTmd> *           "="+:="L2.c#L212atmm.c#L237%i\n"066> 17_c id="L196" clasSC               6retur6 (<7code=mode7 class="ef">r & 7a hre7="+code=bvlass=""sref"blask82dcaseccs" class="srefDID_BUS_BUSYmd> *"="+:=BUS=BUSY - EPPe" 6aoutldeji="L2\n"066> 17a26               6retur6 (<7code=mode7pan>

dcaseccs" class="srefDID_TIME_OUTmd> *
"="+:=unknown== 6aout\n"066> 17a26               6retur6 (<7cfail" cl7ss="sref">imm_f>(}
riversEIOiblask82r           "="+:=t"line" abort\n"066> 17a26               6retur6 (<7/scsi/imm7an>
r           "="+:=parity e="L2 (???)\n"066> 17a26               6retur6 (<7/    *   7    1 if no data availab7i/imm76s="strikimm.--c#L193"blask82 :7           
"="+:=in/imnalupationpe="L2\n"066> 17a26               6retur6 (<7/hc#L252"7pan>
 :7           "="+:=t"line" de=ba2.c#L21\n"066> 17a26               6retur6 (<7code=udel7y" class"sresave" class=7srtim7_afteref="+code=r_strtblask82 :7           d rin/kint "="+:=bad si/imrupt (???)\n"066> 17a26               6retur6 (<7href="dri7ers/scsian>
"="+:=bad rne" 6ame=" (%02x)\n"066> 17,7           
 *c#L*c#L 16ame="L1616ff 82
         251        switch 6imm_f/a>(1);
<7 href78afteref="+coddouasref">base;SCdevef">ppb, 0a href="+code=DID_TIME_OUcc#L193" id="L193" class="line" 6a3e="L2016> 213devpbDID_mislass="line" 6ame>devpbDID_mislcc#L193" id="L193" class="line" 6a3e="L2016> 213mode >(depin_lock_irqsavss="line" 6ame="epin_lock_irqsavscc#L193" id="L193" c class="line" 6ame="L2456> OUcc#L193" id="L193" cla_lockss="line" 6ame="L24_lockmdor_c id="L196" clasranslass="line" 6ameransl56> 213k = (ppb, 0
base;NULL="line" 6ame="LNULL56> 45base;SCimm_f="d_cunkan+cocmdo">cc#L193" id="L193" cSCppb, 0epin_unlock_irqe="Lorss="line" 6ame="epin_unlock_irqe="Lorscc#L193" id="L193" c class="line" 6ame="L2456> OUcc#L193" id="L193" cla_lockss="line" 6ame="L24_lockmdor_c id="L196" clasranslass="line" 6ameransl56> 21382        imm_fspan clas7="str79"+coda>}
riversimm_complelaonss="seengi">imm_f="d_cunkand>ppengi">ods/scs" class="sref>dev, int r_strdev, icmd> */* If7e=len" c"sref">w_ctrdev->base;
a,  *r & 7(, ssi/imm.c#L207" id="L207" class="lFi claME_OUcali/imm.e="L2ss="atdmay ticssoc2urrL2586> 178               6 178               6r & s8an cl80"+code=bvlass=""sref"L2166> 226               6retur6 (<8 4de=mode8co.c#L252" id="L252" cla8me="L806> 255        case base;SC 179        }
r & 88e="L80i/imm.c#L237" id="L23ime_afterss="sref">ppb);
jiffies> *a,  * *  167            175        ppb8/a>, 80 thenatake a rest.i/imm.c#L224" id="L224" cl class="liWe7e="Lif"L237" class=secoref=6> 242 178               6imm_fma>(1);
<8 href81Told to ;chedulsi/imm.c#L207" id="L2" 6ame=" class="l2066> 179        }
cmd> *imm_fma>(1);
<8 href81"+code=bvlass=""sref"" 6ame="L2166> 226               6retur6 (<8+code=EIN8lass="sref">len;
 * 179        }
dcasec1:7           k =  *}
riversEIOiiref">base;SCspan 8lass=826> 251        switch 6 179        }
           r & span8class82"+code=bvlass=""sref"scsiss="sref">ppb, 0a href="+code=Deelr &a8p; ii8 *cmd> */* If8e=len" code=EINVlass="s.8#L1578 id="L157" class="line" 6ame="L2166> 226               6retur6 (<8 href="+c8n class1"#L157" id="L1578 clas82ppb" class="sssssssss28        }
riversEIOii/imm.c#L247" id="L247" cPhasec3 - Rass="linaccepL aec#L224" 02066> 179        }
r            255        case ppb, 0a href="+code=Deend_c#L224"cc#L193" id="L193" cSC
imm_co8plela83i/imm.c#L237" id="L237id="L196" clasSC}
riversEIOii/imm.c#L247" id="L247" cPhasec4 - S216puscatter/ga.c#L buff;
# 02066> 179        }
r           +cocmbufflee" class="srsass+cocmbuffleecc#L193" id="L193" cSC * > d="L193" class=scocmsglilass="line" 6ame=scocmsglilacc#L193" id="L193" cSC
 *.save" class="srthislengthjiffies> * d="L193" class=sg_virhref="drivers/scsg_virhods/scs" class="srefSC *245ppb<8a> = 84id="L157" class="line}e" 6a167            *s="sref">base;NULL="line" 6ame="LNULL56> 45               6retur6 (<8.hc#L252"8e=ppb" cl="sref">a, 8a hrr84m_cpa,  d="L193" class=NULL="line" 6ame="LNULL56> 45fasa>8* d="L193" class=scocmsg_c#unass="line" 6ame=scocmsg_c#unacc#L193" id="L193" cSCimm_fbase;SCr & 8a hre8="+code=bvlass=""sref" class="cs" class="srefSC 236                   


span 8lass=826> 251       8    179       8       6retur6 (<7/scsi/8mm7an8
r & cmd> ="sref">ppb);
base;
r &rs/L21amdor_c id="L19i" id="L110scsi1 :scsi/imm.c#L237" id="L237" ="226       8   base;
r &rs/L21amdor_c id="L19i" id="L120scsi0/scsi/imm.ne" BURST_SIZE446> : 227<8a>       8       6retur6 (<7/    *8  7  861 if no data availab7i/imm786> 196<8a>base;


 =  *}
riversEIOiiref">base;SCspan 8lass=826> 251       8       6retur6 (<7code=u8el7y"8class"sresave" class=7e="L285oua> * 236
 : 227<8a>       8   
 : 227<8a>        ass="co5ment"58/i7chc#L282"7pa87
       8dev" claionrsimm_complelaonss=ev" claionlass="line" 6ame=scocmsglilacc#L193" id="L193" cSCimm_fma>(1);
<7 href71afteref="6mm_fa6csi/imm.c#L237" id="L237" ="226       8       6ment"60       8ass="co6ment"61="7code=m8de7=t88ss="ef">r & 8a hre8="fteref="6mm_fa6si/imm.ne" BURST_SIZE446> : 227<8a>{

}
riversEIOiiref">base;SCmodss="line" 6ame="phlascmd>++45       8ass="co6ment"61="7cc#L248" 7f"88
 * 236base;
base;
base;
       8ass="co5ment"58/i7     *80x70 89sref">imm_fma>(1);
<7 href71afteref="+ence85i/imm.c#L237" id="L237id="L196" clasx04);
r & 8a hre8="fteref="+ence85i/imm.c#L237" id="L237id="L196" clasx04);
/*8If7e=89n" code=EINVlass="s.8#L1578 i*imm_co8plela83i/imm.c#L237" id="L237id="L196" clasSC}
riversEIOii/i8m.c#L24cPhatus/isefasec5 - Pre-Ds="liline" 6astagL *2165> 236<9a>       9       6 * 236<9a2       9 span c6ass="62ri7     *9IB8sa90" class="srbulkhref=8drive85id="L157" cld="L20icsiss="sref">ppb, 0fairods/scs" class="s" != ( class=7line")"L130""id="L157" class="line}e" 6a167<9a>       9       6ment"60r & s8>imm_co8plela83i/imm.c#code=+code=mics" class="sref>devfairivers/scsi/imm.>, 0fairods/scs" class="sref">cmd> *       9case ppb<8ai/imm.c#L237" id="L237" ="226<9a6       9css="co6ment"64="7 href=9" 8d#90
r & 8> *, 0fairods/scs" class="sre+cevme="L2_47" ied_w clasif">a,  *( *ppb, 0fairods/scs" class="s" == ( class=7line")"L130"ass="line" 6ame="L *2165> 236<9a>       9       6imm_fma>(1);
<7 href71afteref="+ence85i/imm.c#ss="inrsimm_complelaonss=inlass="line" 6ame=sco>, 0fairods/scs" class="sre+cevme="L2_47" ied_wm.L237" = 0_c id="L19vtqint dev-&gREAD_cmnd> *r &ofasa clcaseccs" class="srefDID <<ne" 6+8) ||"ef">r & clasif">a, imm_fma>(1);
<8ai/imm.c#L237" id="L237" ="226<9a>       9       6retur6 (<8+code=9IN8la9s="sref">len;
base;
base;
       9 = , ssi/imm.nish7" class="lPhasec1 - CIME_OUif"02066> 179<9a>       9switch 6 183<9a>       9   r &amavailav7ilabl77s="strikimm.-default:7<9a>       9   r &a84);
 17a26<9a>/*9If8e=9en" code=EINVlai/imm.c#L237" id="L237" ="226<9a>       9       6retur6 (<8 href=9+c8n 9lass1"#L157" i6mm_fa6csi/imm.c#L237" id="L237" ="226<9a>       9       9ass="co6ment"64de8chc#L292"8d=9L196" class="line" 6a8e="L2825> 199<9a>       9       5imm_fspan clas7="str79"+coda>queue224">, _l OUcc#L193" id="Loda>queue224">, _l Os rinitdev, icmd> * 17,7<9a>       9}
)nitdev, icm" class="line" 6ame="L1616=0172<9a>       9          9if (gi">ods/scs" class="sref>dev, int r_strd=error_css="sref">ef>d=erlass="line" 6ame=scocmsglilacc#L193" id="L193lasSC 17a26<9a> 174<9a>
ri/imref8"+cod80id="L157" claimm_connectss="sref
       9case queue224">, uot;="+:=bad si/imrupt (???)\n"066> 17a26<9a>       9case 
       9       6retur6 (<8hr" cl9ss8at9" class="sref"ai/imm.c#L237" id="L237" ="226<9a>       9       5a,        9}
       9   der_c.save" class="srthis+cocmdo">gt;si/imm.c#L237" id="L237" ="226<9a>       9   cmd> *, ssi/imavailavid="L2osaing"class="lPhasec1 - CIME_OUif"02066> 179<9a>
 179<9a>
 255<9a>tqror_css="sref">ef>dtq" id="L/imrupt (???)\n"066> 17a26<9a>       9   modss="line" 6ame="phlascmd>++45<9a> = (ef>dbDIcss="vfairivers/scsi/imm.>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<9a>
       9ass="co6ment"64de8c    *9of8sa9e" cla>imm_fsf">cmd> *, Ucc#L193" id="Loda>queue224">, s="s"i/imm.c#L237" id="L237" ="226<9a> 174<9a> 175<9a>       9 175<9a>       9   
imm_fma>(1);
<8 href81* ="L20ll disk2osains.  id="ddsec2 ocm here,mart itan culm="l0llyme="s some op"drrsclaons iL2556> 175<9a>
imm_fma>(1);
<8 href81* b2 docm pa sd.c.  Evenri/iitagetd=fixedsec2re,mm.c# will stillme="s some op"drrsclaons iL2556> 175<9a>
imm_fma>(1);
<8 href81* wors.me="s some op"drrsclaons iL2556> 175<9a>ppb8/a>, 80class="lPhasec1 - CIME_OUif"02066> 179<9_kimm.-ca9ass="co5ment"58/i7n_lock9ir7sa96" cla>imm_fspan clas7="str79"+coda>bios="ra"ror_css="sref">ef>dbios="ra"s rinit, int , int r_str 17,7<9a>       9          9       6retur6 (<7/scsi/9mm7an9
       9          9       6retur6 (<7/    *9  7  96b" class="sre 17a26<9a>       9   

 =  * 17a26<9a>       9          9       6retur6 (<7code=u9el7y"9class"sresave"6mm_fa6csi/imm.c#L237" id="L237" ="226<9a> 174<9a>       9       6retur6 (<7href="9ri7er9/scsia>imm_fspan clas7="str79"+coda>aboi/imm.c#L193" id=oda>aboi/s rinitdev, icmd> *       9   
gi">ods/scs" class="sref>dev, int r_strd=error_css="sref">ef>d=erlass="line" 6ame=scocmsglilacc#L193" id="L193lasSC 17a26<9a>       9    = ( 175<9a>       9ass="co5ment"58/i7chc#L292"7pa97
imm_fma>(1);
<8 href8111111111* Tc2re is no method ="L20boi/="lP224">, s since Iomegame="s some op"drrsclaons iL2556> 175<9a>ppb8/a>, 80 thenata*E_OUcatiedsec2 SCSI_MESSAGE ="62 high pa ec2  clasfahise="s some op"drrsclaons iL2556> 175<9a>       9 179<9a>       9switch 6       9       6ment"60base;SCr class=8( d="L193" class=h80=r_str" clas!casec0:ass="lForget ec2 problemie" 6ame=keup" idims"par="L2202066> 179<9a>       9="drive6ment"60="7n    *9si/imm.c#L237" id="L237" ="226<9a>       9ass="co6ment"61="7cc#L249" 7f"98
si/imm.c#L237" id="L237" ="226<9a>imm_fmaai/imm.c#L237" id="L237" ="226<9a>       9dreset_pulC/*9If7e=991 if id="L157" class="line}e" 6a167<9a> = ( >10a>expired - Time out 7/imm.78L237" id="L237id="L196" clasx04);
10a  0xa8    ZIP"line" 6ame=scou=elaya href="driversu=elaylasx05L/imrupt (???)\n"066> 17a26<10a2       10aspan c6ass="62ri7     *10asp>10a  0xb8    e* clas7="str79"+cL237" id="L237id="L196" clasx04);
/*10a  >10a1 if no data availab7i/imm786> 196<10a6       10ass="co6ment"64="7 href=10ass>10a6csia>imm_fspan clas7="str79"+coda>reseta href="driversef>dresets rinitdev, icmd> *ods/scs" class="sref>dev, int r_strd=error_css="sref">ef>d=erlass="line" 6ame=scocmsglilacc#L193" id="L193lasSC 17a26<10a9       10a      510a9 if no data availab7i/imm786> 196<101>       10ass="co6ment"64  8n_lock10ass>10asbase;SC 196<1011       10       610asref">imm_fef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<10a2       10}
 d="L193" class=h80=r_str" clas!casec0:ass="lForget ec2 problemie" 6ame=keup" idims"par="L2202066> 179<10a3       10ass="co6ment"64de8code=m10ass>10a expired - Time out 7/imm.786> 174<10a4       10       6retur6 (<8+code=10   >10a0 if data avaplela83i/imm.c#oss=ev="L20ror_css="sref">ef>dcd="L20lass="line" 6ame=sco>, 0fairods/scs" class="sref">cmd> * d="L19ONNECTm_NORMAps="s"imrupt (???)\n"066> 17a26<10a5       10dreset_pulC10a
, ssi/imavrthi settle =elayie" 6ame=keup" idims"par="L2202066> 179<10a7       10}
ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<10a8       10   10a196" class="line" 5a7e="L178m=elaya href="driversm=elaylasx0qinmm_f10a" class="sref6mm_fa6si/imm.c#L237" id="L237" ="226<102>       10ass="co6ment"64de8code=k10ass>10asasssai/imm.c#L237" id="L237" ="226<1021       10switch 610asref"i/imm.c#L237" id="L237" ="226<10a2       10}
imm_fspan clas7="str79"+cavrthi_cid="_c.save" class="srthi_cid="lass="line" 6ame=scooda>gi">ods/scs" class="sref>dev, int r_str 196<1023       10   10a3 if id="L157" class="line}e" 6a167<1024       10   10a0 if data avape out 7/imm.79a>, ssi/imT.c# rout"62 looks ="L20mavrthi ec3 ec2n"at"empts" iduse EPP 6ame=keup" idims"par="L2202066> 179<1025       10ass="co6ment"64de8nt">/*10ass>10a 0xc0>imm_fma>(1);
<8 href811111111111 idsec3 acPhasec3. If20ll goes as planne3 ec2n"EPP is available.ie" 6ame=keup" idims"par="L2202066> 179<1026       10       6retur6 (<8 href=10   >10a">modss="line" 6ame="phlascmd>++45<10a7       1010a196" class="lpan clas7="str79"+clooCcmd> *cmd> *cmd> *cmd> *10a" class="sref class=7line" clas7="str79"+cl       10}
r & ooCr & ooCr & ooC10}234" class="line" 6a7ee on85ppb" class="ssssssAt"empt" iduse EPP ="L2Test Unitc#L24yie" 6ame=keup" idims"par="L2202066> 179<1034       10="drive6s/scs62len;
10}L233" class="line" 68necta81id="L157" class=f="+code=douasref">base;
10}">modss="line" 6ame="phlascmd>++45<1037       10       6retur6 (<8hr" cl10   >10}
cmd> *10}
ef>dcd="L20lass="line" 6ame=sco>, 0fairods/scs" class="sref">cmd> * d="L19ONNECTm_EPP_MAYBEs="s"imrupt (???)\n"066> 17a26<1039       10       510} expired - Time out 8R cla83IO232}
riversESelL20ssCSIcavrthi e" 6ame=keup" idims"par="L2202066> 179<104>       10}
len;
gelL20s/scs" class="sref>delL20lass="line" 6ame=sco>, 0fairods/scs" class="sref">cmd> *10}182" class="line" 6a7 i/o inaef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<1042       10   10}" class="srimm_disco8necta81icd=t"6ueimrupt (???)\n"066> 17a26<1043       10ass="co6ment"64de8     *10ass>10}sref">imm_fma>(1);
<8ai/imm.c#L237" id="L237" ="226<10}4       10ass="co6ment"64de8href="10ass>10}scsi"sre!f">r &a84);
10}L233" class="line" 68necta81clas7="str79"+clooCcmd> *base;
 17a26<10}6       10   10}">modss="line" 6ame="phlascmd>++45<1047       10ass="co6ment"64de8.c#L2410ass>10}
 * : 227<10}9       10ass="co6ment"64de8.fail"10ass>10} =  *10as/a> = r & r & clasif">a, r & clasif">a, ef>dou0lass="line" 6ame=sco>, 0fairods/scs" class="sre+cevme="L2_47" ied_wL237" id="L237id="L196" c[ ||"ef">r & clasif">a, 10a  0xb8    end of tra7i/imm795> 183<10a3       10       6ment"6010asref">imm_fma>(1);
<8i/im!"line" 6ame=scoPhatusss_cmndass="srefhatuss="s)"id="L157" class="line}e" 6a167<1054       10ass="co6ment"64de8cref="10ass>10a" class="srimm_uct *ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<1055       10ef>dcd="L20lass="line" 6ame=sco>, 0fairods/scs" class="sref">cmd> * d="L19ONNECTm_EPP_MAYBEs="s"imrupt (???)\n"066> 17a26<1056       10   10a225" class="line" 6a8necta81id="L157" class=of>dreset_pulC10a248" class="line" 6a8e="L284i/imm.c#L237" idu=elaya href="driversu=elaylasx0q000cimrupt (???)\n"066> 17a26<1058       10if (ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<1059       10"+code=6mm_fa672"8cfail"10"+c>10a  17a26<106>       10ass="co5ment"58/i7n_lock10ass>10as10asref">imm_fma>(1);
<7 href71afteref="+ence85i/imm.c#f="+code=douasref">base;
cmd> *10aimmef">r & s8>imm_co8ai/imm.c#L237" id="L237" ="226<1064       10    17a26<10a5       10       6retur6 (<7/    *10   >10aL233" class="line" 68necta81i6mm_fa6-10aass1"#L157" id="L1578 clas82ppb" class="sssssssss28<10a7       10   10aimm.an>
10a =  *10 182" class="line" 6a7 i/o inadevdevlasx04);
10 " class="srimm_disco8necta81id="L157" class="_c.save" class=ks="s-- class="line" 6ame="L1606> 160<1073       10   10 immef">r & s8>imm_co8plela83i/imm.c#u=elaya href="driversu=elaylasx0qint 10 " class="srimm_uctr & clasif">a, 10 1 if no data availab7i/imm786> 196<1076       10   10 ass1"#L157" id="L1578 ||"ef">r & clasif">a, 10 196" class="line" 5a8i/im83id="L157" cla clasif">a, ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<108>       10ef>dcd="L20lass="line" 6ame=sco>, 0fairods/scs" class="sref">cmd> * d="L19ONNECTm_EPP_MAYBEs="s"imrupt (???)\n"066> 17a26<1081       10switch 610<182" class="line" 6a7 i/o ina10<" class="srimm_disco8necta81id="L157" class=u=elaya href="driversu=elaylasx0q000cimrupt (???)\n"066> 17a26<1083       10ass="co6ment"61="7code=m10ass>10r & s8>imm_co8plela83i/imm.c#code=iscd="L20ror_css="sref">ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<1084       10f="driv6rs/sc6710<" class="srimm_uct *10<225" class="line" 6a8necta81i> *base;
cmd> *1010< 10a182" class="line" 6a7 i/o ina6mm_fa6-10a" class="srimm_disco8 clas82ppb" class="sssssssss28<1093       10ass="co5ment"58="7code=m10ass>10a234" class="line" 6a7elela83i/imm.c#code=iscd="L20ror_css="sref">ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<1094       10       6ment"6010ascsi"sre!f">r &a84);
 17a26<1095       10   /*10   >10aL233" class="line" 68nectn/kint  17,7<1096       10ass="co6ment"64="7 href=10ass>10a225" class="line" 6a8necta4);
cmd> *base;
 17a26<1097       10ass="co6ment"64="7 c#L2410ass>10aimm.an>
ef>dcd="L20lass="line" 6ame=sco>, 0fairods/scs" class="sref">cmd> * d="L19ONNECTm_EPP_MAYBEs="s"imrupt (???)\n"066> 17a26<1098       10ass="co6ment"64="7 h   *10ass>10a
dreset_pulC10a =  * >110s48" class="line" 6a8elela83i/imm.c#code=iscd="L20ror_css="sref">ef>d=iscd="L20lass="line" 6ame=sco>, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<11a1       11ass="co5ment"58/i7     *11ass>110sref">imm_f 17a26<11a2       11aspan c6ass="62ri7     *11asp>110" class="srimm_disco86mm_fa6csi/imm.c#L237" id="L237" ="226<1103       11ass="co5ment"58="7code=m11ass>11a
/*11a  >110L233" class="6mm_fa6- 175<1109       11a      5110de=7lass="s-ref">ppb8/a>, 80c odarannnotEdeal with highmem, somm.c# causes all IO pages ="L2m.c# ="L193="s some op"drrsclaons iL2556> 175<111>       11ass="co6ment"64  8n_lock11ass>111  0x98    ZIP wants 8Placs80*P idresidm pa low memory (hence mapped)93="s some op"drrsclaons iL2556> 175<1111       11       611asref"ass="s-ref">ppb8/a>, 80class="lPhasec1 - CIME_OUif"02066> 179<1as2       11}
imm_fspan clas7="str79"+cef>dadjust>queueror_css="sref">ef>dadjust>queues rinit, int 1113 if id="L157" class="line}e" 6a167<11a4       11       6retur6 (<8+code=11   >11a0 if data avaplela83i/imm.c#blk>queue_b"u,ce_limi0ror_css="sref">blk>queue_b"u,ce_limi0lass="line" 6ame=sco>, queueror_css="sref">request>queues="sref">cmd> *BLK_BOUNCE_HIGHs="s"imrupt (???)\n"066> 17a26<11a5       111117 if no data availab7i/imm786> 196<11a8       11   11a196" >imm_fsitd"emplatr_c.save" class=ef>d"emplatraonscs id="L157" class="line}e" 6a167<11a9       11ass="co6ment"64de8c(11a" class="srefhis46 d="L19THIS MODULEs="srd="L157" class="line}e" 6a167<112>       11ass="co6ment"64de8code=k11ass>1120 class="srefhis46dproc_infosssssss id="L19ef>dproc_infos="srd="L157" class="line}e" 6a167<1122       11}
, Ucc#L193" id="Lqueue224">, s="sss="line" 6= /las7="str79"+cef>dqueue224">, Ucc#L193" id="Loda>queue224">, s="s=" (%02x)\n"066> 17,7<1124       11   11a0 if data avahis46aboi/_h>, levaboi/_h>, lev if data av= /las7="str79"+cef>daboi/imm.c#L193" id=oda>aboi/s ri=" (%02x)\n"066> 17,7<1125       11ass="co6ment"64de8nt">/*11ass>1125 if data avahis46busdreset_h>, levbusdreset_h>, lev if dat= /las7="str79"+cef>dreseta href="driversef>dresets ri=" (%02x)\n"066> 17,7<1126       11       6retur6 (<8 href=11   >1126 if data avahis46="L1_reset_h>, lev="L1_reset_h>, lev if da= /las7="str79"+cef>dreseta href="driversef>dresets ri=" (%02x)\n"066> 17,7<1127       11bios_="ra"25" class="line" = /las7="str79"+cef>dbios="ra"ror_css="sref">ef>dbios="ra"s ri=" (%02x)\n"066> 17,7<1128       11ass="co6ment"64de8chc#L211ass>11a196" class="lhis46 17,7<1129       11       5112" class="srefhis46 d="L19SG_Asps ri=" (%02x)\n"066> 17,7<113>       11}
 d="L19cmd_per_lun25" class="line"= 1=" (%02x)\n"066> 17,7<1131       11   1131 class="srefhis461132 class="srefhis46queueror_css="sref">can>queue25" class="line" 6= 1=" (%02x)\n"066> 17,7<1133       11"+code=6mm_fa672"8 ode=m11"+c>1133 class="srefhis46dadjust>queueror_css="sref">ef>dadjust>queues ri=" (%02x)\n"066> 17,7<1134       11="drive6s/scs621131 if no data availab7i/imm786> 196<1136       11case 113
imm_fma>(1);
<8 href8/***************************************************************************ass="lPhasec1 - CIME_OUif"02066> 179<1a37       11       6retur6 (<8hr" cl11   >113
imm_fma>(1);
<8 href81*                   P"rallel  untiprob="lProut"62s                        *ass="lPhasec1 - CIME_OUif"02066> 179<1a38       11ass="co6ment"64de8 hc#L211ass>113
imm_fma>(1);
<8 href81***************************************************************************lass="lPhasec1 - CIME_OUif"02066> 179<1a39       11       51139 if no data availab7i/imm786> 196<114>       11}
imm_fsclas7="str79"+cLIST_HEADaseccs" class="LIST_HEADlass="line" 6ame=scoef>d="L1rss_cmndass="sreef>d="L1rs="s"imrupt (???)\n"066> 17a26<11}1       11   114sref"i/imm.c#L237" id="L237" ="226<1142       11   114" cla>imm_fspan clas7="str79"+c__ef>dattachss_cmndass="sre__ef>dattachs rinit, int 1143 if id="L157" class="line}e" 6a167<11}4       11ass="co6ment"64de8href="11ass>11}scsi"sre!f">rit 17a26<11}5       11ass="co6ment"64de8h    *11ass>11}L233" class=""line" 6ame=scoef>dgi">ods/scs" class="sref>dev, int r_str 17a26<11}6       11   114
DECLARE_WAIT_QUEUE_HEAD_ONSTACKlass="line" 6ame=scowaitc ri href="driverswaitc rs="s"imrupt (???)\n"066> 17a26<11}7       11ass="co6ment"64de8.c#L2411ass>114 = (DEFINE_WAITlass="line" 6ame=scowaiti href="driverswaits="s"imrupt (???)\n"066> 17a26<11}8       11       6retur6 (<8.hc#L211   >114196" class="lpan clas7="str79"+c untrss_cmndass="sre untrtr 17a26<11}9       11ass="co6ment"64de8.fail"11ass>11} = cmd> * 17a26<115>       11ass="co6ment"64de8co#L1911ass>11as/a> =  17a26<1151       11="drive6s/scs62115sref"i/imm.c#L237" id="L237" ="226<1152       11ass="co6ment"64de8c    *11ass>115  0xb8    e* clas7="str79"+cinit_waitqueue_hea Ucc#L193" id="Lonit_waitqueue_hea lass=+cevme="L2_47" ied_wwaitc ri href="driverswaitc rs="s"imrupt (???)\n"066> 17a26<11a3       11       6ment"60115 expired - Time out 7/imm.786> 174<1154       11ass="co6ment"64de8cref="11ass>1150 if data avaplela83i/imm.c#=error_css="sref">r_strgi">ods/scs" class="sref>dev, i)ref">cmd> * d="L19GFP_KERNEps="s"imrupt (???)\n"066> 17a26<11a5       11r_str 196<1156       11   11a225" class="line" 6a86mm_fa6- 17a26<1157       11115196" class="line" 6a8e="L2825> 199<1159       11"+code=6mm_fa672"8cfail"11"+c>115 expired - Time out 7/imm.78L157" claimm_connectss="sref
 : 227<116>       11ass="co5ment"58/i7n_lock11ass>116>expired - Time out 7/imm.78f="+code=douasref">base;
93" AUTODETECT" idimrupt (???)\n"066> 17a26<1161       11   116  0xa8    ZIP"line" 6ame=scoINIT_LIST_HEADaseccs" class="INIT_LIST_HEADlass=+cevme="L2_47" ied_wf="+code=douasref">base;
 17a26<1162       11       6retur6 (<7/scsi/11   >116  0xb8    end of tra7i/imm795> 183<1163       11ass="co5ment"58/i7node=m11ass>116
base;
r_str d="L193" class=scsi/imm.c#L237"ref>wakeuCwakeuCs ri=" (%02x)\n"066> 17,7<1164       11    d="L193" class=s0=scsi/imm.c#L237">, 0fairods/scs" class="s"imrupt (???)\n"066> 17a26<11a5       11       6retur6 (<7/    *11   >1161 if no data availab7i/imm786> 196<1166       11ass="co5ment"58/i7node=m11ass>11aass1"#L157" ii/im!"line" 6ame=sco=error_css="sref">r_str;
r_str 196<11a7       11   11aimm.an>
cmd> *ou0lassimrupt (???)\n"066> 17a26<11a8       11       6retur6 (<7/hc#L211   >11a196" class="line" 6a8e="L2825> 199<11a9       11ass="co5ment"58/i7nfail"11ass>1169 if no data availab7i/imm786> 196<117>       11   11  /a> =  179<1a71       11       6retur6 (<7code=u11   >117sref"ass="s-ref">ppb8/a>, 8000000000* registe+s. [ CTR ec3 ECP ]ass="lPhasec1 - CIME_OUif"02066> 179<1a72       11ass="co5ment"58/i7code=u11ass>11 " claass="s-ref">ppb8/a>, 8000000000*lass="lPhasec1 - CIME_OUif"02066> 179<1a73       11   117
1170 if data avaplela83i/imm.c#=error_css="sref">r_str;
 17a26<11 5       11ass="co5ment"58/i7c    *11ass>117L233" class=""line" 6ame=scopre6"Le_to_waiti href="driverspre6"Le_to_waitlass=+cevme="L2_47" ied_wwaitc ri href="driverswaitc rs="sre+cevme="L2_47" ied_wwaiti href="driverswaits="s=scsi/imm.c#L237"TASK_UNINTERRUPTIBLEtL193"4> d="L19TASK_UNINTERRUPTIBLEs="s"imrupt (???)\n"066> 17a26<1176       11   117ass1"#L157" ii/imcsi/imm.c#L237"ref>pb_claimpb_claimlass="line" 6ame=sco=error_css="sref">r_str 196<11 7       11   117imm.an>
scheeulr_timeou0lass=30* plela83i/imm.c#HZror_css="sref">HZs="s"imrupt (???)\n"066> 17a26<1178       11ass="co5ment"58/i7chc#L211ass>11 196" class="li/imref8"+cod80id="L157" claimm_connectss="sref
       1111<182" class="line" 6a7 i/o ina 17a26<1182       11       6ment"6011<" class="srimm_disco8csi/imm.c#L237"ref>pb_dismi6rss_cmndass="sreref>pb_dismi6rlass="line" 6ame=sco=error_css="sref">r_str 17a26<1183       11ass="co6ment"61="7code=m11ass>11r & s8plela83i/imm.c#=error_css="sref">r_str;
 d="L193" classimrupt (???)\n"066> 17a26<1184       11f="driv6rs/sc6711<" class="srimm_uct 17a26<1185       11ass="co6ment"61="7c    *11ass>11cmd> *11<225" class="l clas82ppb" class="sssssssss28<1187       11ass="co6ment"61="7cc#L2411ass>118 = (r_str;
 d="L193" classimrupt (???)\n"066> 17a26<1188       11ass="co6ment"64de7_h   *11ass>118196" class="line" 5a7e="L178finish_waiti href="driversfinish_waitlass=+cevme="L2_47" ied_wwaitc ri href="driverswaitc rs="sre+cevme="L2_47" ied_wwaiti href="driverswaits="shimrupt (???)\n"066> 17a26<1189       11ass="co6ment"64de7_(118 expired - Time out 7/imm.78ivers/scsi/i0m.c#L196" idgt;       11ass="co6ment"61="7     *11ass>119>expired - Time out 7/imm.78f="+code=douasref">base;
119  0xa8    ZIP"line" 6ame=scoL237" id="L237id="L196" clasx04);
119  0xb8    e* clas7="str79"+cmverrss_cmndass="sremverrs="sgt;rr_str" clas!casec0:ass="lMver detecaiondworks up ec2 chain of spee s=ad sid="L157" class="line}e" 6a167<1195       11   /*11   >119 0xc0>imm_fma>(1);
<8 href8111111111imT.c# avoid# a"7nstyli/-ec2n-else-i/-... trees=ad sid="L157" class="line}e" 6a167<1196       11ass="co6ment"64="7 href=11ass>119
imm_fma>(1);
<8 href8111111111ilass="lPhasec1 - CIME_OUif"02066> 179<1a97       11ass="co6ment"64="7 c#L2411ass>119 = (r_str;
 d="L1993" NIBBLEs="s class="line" 6ame="L1606> 160<1198       11ass="co6ment"64="7 h   *11ass>119196" class="line" 6a8e="L2825> 199<1199       11       511a =  d="L19PARPORT MODE_TRISTATEtr 196<12a>       12a>     5 >120s48" class="line" 6a8elela83i/imm.c#=error_css="sref">r_str;
120sref"i/imm.c#L237" id="L237" ="226<12a2       12aspan c6ass="62ri7     *12asp>120" class="srimr_str" clas!casec0:ass="lDon2 cd=figuraaiondilass="lPhasec1 - CIME_OUif"02066> 179<1203       12ass="co5ment"58="7code=m12ass>120 expired - Time out 7/imm.786> 174<12a4       12a      6ment"601200 if data avaplela83i/imm.c#ervonitss_cmndass="sreref>onitlass="line" 6ame=sco=error_css="sref">r_str 17a26<1205       12a  /*12a  >1201 if no data availab7i/imm786> 196<12a6       12ass="co6ment"64="7 href=12ass>120
pb_releSCr_str 17a26<1207       12ass="co6ment"64="7 c#L2412ass>1207 if no data availab7i/imm786> 196<12a8       12ass="co6ment"64="7 h   *12ass>120196" class="li/imref8"+cod80id="erv 196<12a9       12a      5120 cmd> *121
>modss="line" 6ame="phlascmd>++45<1211       12       61211 class="srimr_str" clas!casec0:ass="lnow ec2 glue ... ilass="lPhasec1 - CIME_OUif"02066> 179<12s2       12}
 d="L1993" NIBBLEs="s ||8elela83i/imm.c#=error_css="sref">r_str;
121immef">r & s8plela83i/imm.c# untrss_cmndass="sre untrtr 17a26<1214       12       6retur6 (<8+code=12   >12a0 if data avaelsemrupt (???)\n"066> 17a26<1215       12modss="line" 6ame="phlascmd>++45<12a7       12}
INIT_DELAYED_WORKlass=+cevme="L2_47" ied_w=error_css="sref">r_str;
tqs="s=scsi/imm.c#L237"ref>onterruptss_cmndass="sreref>onterrupttr 17a26<12a8       12   121196" class="line" 6a8e="L2825> 199<12a9       12ass="co6ment"64de8c(121 expired - Time out 7/imm.78erv 17a26<122>       12ass="co6ment"64de8code=k12ass>122>expired - Time out 7/imm.78qe="Lorscc#L193" id="L193" cs csi/imm.c#L237"itd"emplatr_c.save" class=ef>d"emplatraons, iizeof="line" 6ame=scooda>gi">ods/scs" class="sref>dev, i *)int  196<1222       12}
cmd> *;
1220 if data avaplela83i/imm.c#qe="Lorscc#L193" id="L193" a>;
/*12ass>122L233" class=""line" 6ame=scoqe="Lorscc#L193" id="L193" a>;
a, dma_channe aonscs -si/imm.ne" BURST_SIZE446> : 227<1226       12       6retur6 (<8 href=12   >122
;
 : 227<1227       12gi">ods/scs" class="sref>dev, i **)+cevme="L2_47" ied_wqe="Lorscc#L193" id="L193" a>;
 : 227<1228       12ass="co6ment"64de8chc#L212ass>122196" class="line" 5a7e="L178=error_css="sref">r_str;
 17a26<1229       12       5122 expired - Time out 7/imm.78li="_add_tai clasif">a, r_str;
d="L1rss_cmndass="sreef>d="L1rs="s"imrupt (???)\n"066> 17a26<123>       12}
 d="L193" class"imrupt (???)\n"066> 17a26<1231       12   1231 class="srefi/imref8"+cod80id="erv 196<1232       12if (cmd> * 17a26<1233       12"+code=6mm_fa672"8 ode=m12"+c>123
qe="lass="line" 6ame=scoqe="Lorscc#L193" id="L193" "imrupt (???)\n"066> 17a26<1234       12="drive6s/scs621231 if no data availab7i/imm786> 196<1236       12case 123
">cmd> * 196<1237       12       6retur6 (<8hr" cl12   >123 = (r_str;
 17a26<1238       12ass="co6ment"64de8 hc#L212ass>123196" class="line" 5a7e="L178itsc 17a26<1239       12       51239 if f">cmd> *124>expired - Time out 7/imm.786"L unt_unregiste+,mSCr_str;
r_str 17a26<12}1       12   124sref"f">cmd> *r_str 17a26<1243       12ass="co6ment"64de8     *12ass>1243 if data ava6mm_fa6ref8"+cod80id="erv 17a26<1244       12ass="co6ment"64de8href="12ass>12}scsi" clas82ppb" class="sssssssss28<12}5       12ass="co6ment"64de8h    *12ass>1241 if no data availab7i/imm786> 196<12}6       12   124
imm_fsvoid clas7="str79"+cef>dattachss_cmndass="sreif>dattachs rinit, int 124 id="L157" class="line}e" 6a167<12}8       12       6retur6 (<8.hc#L212   >124196" class="line" 5a7e="L178__ef>dattachss_cmndass="sre__ef>dattachs rin 12}  clas82ppb" class="sssssssss28<125>       12ass="co6ment"64de8co#L1912ass>125
>modss="line" 6ame="phlascmd>++45<1251       12="drive6s/scs62125sref">imm_fsvoid clas7="str79"+cef>ddetachss_cmndass="sreif>ddetachs rinit, int 125  0xbid="L157" class="line}e" 6a167<12a3       12       6ment"60125
ods/scs" class="sref>dev, i * : 227<1254       12ass="co6ment"64de8cref="12ass>1250 if data avaplela83i/imm.c#r_strd="L1rss_cmndass="sreef>d="L1rs="s="clas7="str79"+cli="Lorscc#L193" idli="s="s" id="L157" class="line}e" 6a167<12a5       1212a225" class="line" 6a8= (r_str;
 17a26<1257       12qe="lass="line" 6ame=sco=error_css="sref">r_str;
 17a26<1258       12if (scr_str;
 17a26<1259       12"+code=6mm_fa672"8cfail"12"+c>125 r_str;
r_str 17a26<126>       12ass="co5ment"58/i7n_lock12ass>126s233" class="line" 68necta81idlas7="str79"+ckfrer_c.save" class=kfrerlass="line" 6ame=sco=error_css="sref">r_str 17a26<1261       12   126182" class="line" 6a7 i/o inabreakimrupt (???)\n"066> 17a26<1262       12       6retur6 (<7/scsi/12   >126" class="srimm_disco8 clas82ppb" class="sssssssss28<1263       12ass="co5ment"58/i7node=m12ass>126
126scsi" clas82ppb" class="sssssssss28<12a5       12       6retur6 (<7/    *12   >1261 if no data availab7i/imm786> 196<1266       12ass="co5ment"58/i7node=m12ass>126
imm_fsitddilab7_c.save" class=ef>ddilab7aonscs id="L157" class="line}e" 6a167<12a7       12   126 = (his46dattachss_cmndass="sreif>dattachs ri=" (%02x)\n"066> 17,7<12a9       12ass="co5ment"58/i7nfail"12ass>126" class="srefhis46ddetachss_cmndass="sreif>ddetachs ri=" (%02x)\n"066> 17,7<127>       12   12  /a> }si/imm.c#L237" id="L237" ="226<1271       12       6retur6 (<7code=u12   >127sref"i/imm.c#L237" id="L237" ="226<1272       12ass="co5ment"58/i7code=u12ass>127" cla>imm_fspan clas7="str79"+c__enitss_cmndass="sre_>onitlassrclas7="str79"+cef>ddilab7>onitss_cmndass="sreref>dilab7>onitlass=voidhclass="line" 6ame="L1606> 160<1273       12   1273 if id="L157" class="line}e" 6a167<12 4       12       6retur6 (<7href="12   >1270 if data avaplela83i/imm.c#is="sssssssss id="L196" clas rin/kint  17a26<12 5       12ass="co5ment"58/i7c    *12ass>127L233" class="6mm_fa6ref8"+cod80id="6"L unt_registe+,milab7_c.save" class=6"L unt_registe+,milab7lass=+cevme="L2_47" ied_wef>ddilab7_c.save" class=ef>ddilab7aonshimrupt (???)\n"066> 17a26<12 6       12   1276csia clas82ppb" class="sssssssss28<12 7       12   1277 if no data availab7i/imm786> 196<1278       12ass="co5ment"58/i7chc#L212ass>127196" >imm_fsvoid clas7="str79"+c__exitss_cmndass="sre_>exitlassrclas7="str79"+cef>ddilab7>exitss_cmndass="sreef>ddilab7>exitlass=voidhclass="line" 6ame="L1606> 160<1279       12       12ddilab7_c.save" class=ef>ddilab7aonshimrupt (???)\n"066> 17a26<1281       12switch 612<182"  clas82ppb" class="sssssssss28<1282       12       6ment"60128  0xb8    end of tra7i/imm795> 183<1283       12ass="co6ment"61="7code=m12ass>12onitss_cmndass="sremveulr>onitlass="line" 6ame=scoef>ddilab7>onitss_cmndass="sreref>dilab7>onitlasshimrupt (???)\n"066> 17a26<1284       12f="driv6rs/sc6712<" clae="L2_47" ied_wmveulr>exitss_cmndass="sremveulr>exitlass="line" 6ame=scoef>ddilab7>exitss_cmndass="sreef>ddilab7>exitlasshimrupt (???)\n"066> 17a26<1285       12ass="co6ment"61="7c    *12ass>1281 if no data availab7i/imm786> 196<1286       12="drive6ment"60="7n    *12="d>128
">cmd> * d="L19MODULE_LICENSEs rin/kint  17a26<1287       12ass="co6ment"61="7cc#L2412ass>128 
The original LXR software by ec2 rupt (???http://sourceforge.net/projects/lx+">LXR asecunitys="s="m.c# experic0:aal v="liondby rupt (???mailto:lx+@t"6ux.no">lx+@t"6ux.nos="s.
lx+.t"6ux.no kindly ="L1eddby rupt (???http://www.redpill-t"6pro.no">Redpill L"6pro ASs="s="provider of L"6ux cd=sultc r ec3 operaaions serrthis since 1995.