These two patches make the NZ90 memory stick import work correctly as a usb-storage
device under RedHat 8 running kernel 2.4.20-18.8. - and will probably work under 2.4.20-20...


nz90-usb-storage.patch:
- the NZ90 doesn't like seeing prevent/allow medium removal commands, so I've just
stopped sending them. I should probably have a little more smarts here (only skip them
when dealing with an NZ90), but I'm a bit lazy... and the NZ is the only USB storage
device I have...


- on the _very_first_ inquiry command after MS-import has started, the NZ90 returns
Unit Attention, Check condition, Transition from not-ready to ready. This (incorrectly,
IMHO) caused the transport system to lock the device. The patch arranges for the INQUIRY
to always trigger a REQUEST SENSE, reading and clearing the condition, and to ignore
the incorrect error status.


kudzu-clie.patch:

- I ran into a problem with updfstab deleting the fstab entry for /dev/cdrom(!) and
recreating it every time the NZ90 connected/disconnected. This is a fairly minor
bug in kudzus' scsi probe - it assumes (incorrectly) that the first entry in /proc/bus/usb-storage
is always scsi host 0.


Incidentally, you will also want to add:
   device clie {
       partition 1
       match hd sony
   }

As the first device entry in your /etc/updfstab.conf.default file.


diff -uNr kernel-2.4.20/linux-2.4.20/drivers/usb/storage/protocol.c 
kernel-2.4.20.new/linux-2.4.20/drivers/usb/storage/protocol.c
--- kernel-2.4.20/linux-2.4.20/drivers/usb/storage/protocol.c   2002-08-02 
18:39:45.000000000 -0600
+++ kernel-2.4.20.new/linux-2.4.20/drivers/usb/storage/protocol.c       2003-08-21 
13:56:39.000000000 -0600
@@ -170,7 +170,12 @@
                usb_stor_scsiSense6to10(srb);
 
        /* send the command to the transport layer */
-       usb_stor_invoke_transport(srb, us);
+
+       if(srb->cmnd[0] == ALLOW_MEDIUM_REMOVAL) {
+               srb->result = GOOD << 1;
+       } else {
+               usb_stor_invoke_transport(srb, us);
+       }
        if (srb->result == GOOD << 1) {
 
                /* Fix the MODE_SENSE data if we translated the command */
diff -uNr kernel-2.4.20/linux-2.4.20/drivers/usb/storage/transport.c 
kernel-2.4.20.new/linux-2.4.20/drivers/usb/storage/transport.c
--- kernel-2.4.20/linux-2.4.20/drivers/usb/storage/transport.c  2003-08-28 
09:26:47.000000000 -0600
+++ kernel-2.4.20.new/linux-2.4.20/drivers/usb/storage/transport.c      2003-08-21 
13:58:35.000000000 -0600
@@ -670,6 +670,7 @@
                        need_auto_sense = 0;
                }
        }
+       if(srb->cmnd[0] == INQUIRY) need_auto_sense = 1;
 
        /*
         * If we have a failure, we're going to do a REQUEST_SENSE 
@@ -788,6 +789,10 @@
                /* If things are really okay, then let's show that */
                if ((srb->sense_buffer[2] & 0xf) == 0x0)
                        srb->result = GOOD << 1;
+               if ((srb->sense_buffer[2] & 0xf) == 0x6 && srb->sense_buffer[12] == 
0x28 && srb->sense_buffer[13] == 0) {
+                       srb->result = GOOD << 1;
+                       srb->sense_buffer[0] = 0;
+               }
        } else /* if (need_auto_sense) */
                srb->result = GOOD << 1;
 
@@ -836,8 +841,13 @@
 
        /* was this a command-completion interrupt? */
        if (us->irqbuf[0] && (us->subclass != US_SC_UFI)) {
-               US_DEBUGP("-- not a command-completion IRQ\n");
-               return;
+               if(us->irqbuf[0] == 0x28) {
+                       /* RAP - look here! */
+                       // us->irqbuf[0] = 0; do nothing for now... 
+               } else {
+                       US_DEBUGP("-- not a command-completion IRQ\n");
+                       return;
+               }
        }
 
        /* was this a wanted interrupt? */
@@ -964,6 +974,7 @@
        if (us->irqdata[0]) {
                US_DEBUGP("CBI IRQ data showed reserved bType %d\n",
                                us->irqdata[0]);
+               if(us->irqdata[0] == 0x28) return(USB_STOR_TRANSPORT_GOOD);
                return USB_STOR_TRANSPORT_ERROR;
        }
 
diff -uNr kudzu-0.99.69/scsi.c kudzu-0.99.69.new/scsi.c
--- kudzu-0.99.69/scsi.c        2002-07-11 12:26:45.000000000 -0600
+++ kudzu-0.99.69.new/scsi.c    2003-08-28 10:00:17.000000000 -0600
@@ -290,7 +290,7 @@
                        *(end + 1) = '\0';
 
                        if (*chptr == '0' || !strcasecmp(chptr, "no")) {
-                           numMissingHosts[numMissing++] = num - 1;
+                           numMissingHosts[numMissing++] = atoi(ent->d_name);
                        }
                    }
                }

Reply via email to