Alan Stern wrote:

>>Are there any plans to backport usb-storage changes to kernel 2.4?
>>    
>>
>One URL is
>       http://www.geocrawler.com/lists/3/SourceForge/2571/475/9524582/
>  
>

Here is an updated version of this patch for the case somebody else 
whants it.


Yuri


diff -u usb-2.5/drivers/usb/storage/Makefile usb-2.4/drivers/usb/storage/Makefile
--- usb-2.5/drivers/usb/storage/Makefile        Fri Sep 27 11:11:13 2002
+++ usb-2.4/drivers/usb/storage/Makefile        Mon Sep 30 10:19:56 2002
@@ -5,8 +5,11 @@
 # Rewritten to use lists instead of if-statements.
 #
 
+O_TARGET       := storage.o
 EXTRA_CFLAGS   := -I../../scsi/
 
+list-multi     := usb-storage.o
+
 obj-$(CONFIG_USB_STORAGE)      += usb-storage.o
 
 usb-storage-obj-$(CONFIG_USB_STORAGE_DEBUG)    += debug.o
@@ -20,6 +23,9 @@
 usb-storage-obj-$(CONFIG_USB_STORAGE_JUMPSHOT) += jumpshot.o raw_bulk.o
 
 usb-storage-objs :=    scsiglue.o protocol.o transport.o usb.o \
-                       initializers.o $(usb-storage-obj-y)
+                       initializers.o $(sort $(usb-storage-obj-y))
 
 include $(TOPDIR)/Rules.make
+
+usb-storage.o: $(usb-storage-objs)
+       $(LD) -r -o $@ $(usb-storage-objs)
diff -u usb-2.5/drivers/usb/storage/debug.c usb-2.4/drivers/usb/storage/debug.c
--- usb-2.5/drivers/usb/storage/debug.c Fri Sep 27 11:11:13 2002
+++ usb-2.4/drivers/usb/storage/debug.c Mon Sep 30 10:20:09 2002
@@ -218,17 +218,157 @@
                unsigned char asc,
                unsigned char ascq) {
 
-       const char *what, *keystr;
+       char *keys[] = {
+               "No Sense",
+               "Recovered Error",
+               "Not Ready",
+               "Medium Error",
+               "Hardware Error",
+               "Illegal Request",
+               "Unit Attention",
+               "Data Protect",
+               "Blank Check",
+               "Vendor Specific",
+               "Copy Aborted",
+               "Aborted Command",
+               "(Obsolete)",
+               "Volume Overflow",
+               "Miscompare"
+       };
 
-       keystr = scsi_sense_key_string(key);
-       what = scsi_extd_sense_format(asc, ascq);
+       unsigned short qual = asc;
 
-       if (keystr == NULL)
+       char *what = 0;
+       char *keystr = 0;
+
+       qual <<= 8;
+       qual |= ascq;
+
+       if (key>0x0E)
                keystr = "(Unknown Key)";
-       if (what == NULL)
+       else
+               keystr = keys[key];
+
+       switch (qual) {
+
+       case 0x0000: what="no additional sense information"; break;
+       case 0x0001: what="filemark detected"; break;
+       case 0x0002: what="end of partition/medium detected"; break;
+       case 0x0003: what="setmark detected"; break;
+       case 0x0004: what="beginning of partition/medium detected"; break;
+       case 0x0005: what="end of data detected"; break;
+       case 0x0006: what="I/O process terminated"; break;
+       case 0x0011: what="audio play operation in progress"; break;
+       case 0x0012: what="audio play operation paused"; break;
+       case 0x0013: what="audio play operation stopped due to error"; break;
+       case 0x0014: what="audio play operation successfully completed"; break;
+       case 0x0015: what="no current audio status to return"; break;
+       case 0x0016: what="operation in progress"; break;
+       case 0x0017: what="cleaning requested"; break;
+       case 0x0100: what="no index/sector signal"; break;
+       case 0x0200: what="no seek complete"; break;
+       case 0x0300: what="peripheral device write fault"; break;
+       case 0x0301: what="no write current"; break;
+       case 0x0302: what="excessive write errors"; break;
+       case 0x0400: what="LUN not ready, cause not reportable"; break;
+       case 0x0401: what="LUN in process of becoming ready"; break;
+       case 0x0402: what="LUN not ready, initializing cmd. required"; break;
+       case 0x0403: what="LUN not ready, manual intervention required"; break;
+       case 0x0404: what="LUN not ready, format in progress"; break;
+       case 0x0405: what="LUN not ready, rebuild in progress"; break;
+       case 0x0406: what="LUN not ready, recalculation in progress"; break;
+       case 0x0407: what="LUN not ready, operation in progress"; break;
+       case 0x0408: what="LUN not ready, long write in progress"; break;
+       case 0x0500: what="LUN doesn't respond to selection"; break;
+       case 0x0A00: what="error log overflow"; break;
+       case 0x0C04: what="compression check miscompare error"; break;
+       case 0x0C05: what="data expansion occurred during compression"; break;
+       case 0x0C06: what="block not compressible"; break;
+       case 0x1102: what="error too long to correct"; break;
+       case 0x1106: what="CIRC unrecovered error"; break;
+       case 0x1107: what="data resynchronization error"; break;
+       case 0x110D: what="decompression CRC error"; break;
+       case 0x110E: what="can't decompress using declared algorithm"; break;
+       case 0x110F: what="error reading UPC/EAN number"; break;
+       case 0x1110: what="error reading ISRC number"; break;
+       case 0x1200: what="address mark not found for ID field"; break;
+       case 0x1300: what="address mark not found for data field"; break;
+       case 0x1403: what="end of data not found"; break;
+       case 0x1404: what="block sequence error"; break;
+       case 0x1600: what="data sync mark error"; break;
+       case 0x1601: what="data sync error: data rewritten"; break;
+       case 0x1602: what="data sync error: recommend rewrite"; break;
+       case 0x1603: what="data sync error: data auto-reallocated"; break;
+       case 0x1604: what="data sync error: recommend reassignment"; break;
+       case 0x1900: what="defect list error"; break;
+       case 0x1901: what="defect list not available"; break;
+       case 0x1902: what="defect list error in primary list"; break;
+       case 0x1903: what="defect list error in grown list"; break;
+       case 0x1C00: what="defect list not found"; break;
+       case 0x2000: what="invalid command operation code"; break;
+       case 0x2400: what="invalid field in CDB"; break;
+       case 0x2703: what="associated write protect"; break;
+       case 0x2800: what="not ready to ready transition"; break;
+       case 0x2900: what="device reset occurred"; break;
+       case 0x2903: what="bus device reset function occurred"; break;
+       case 0x2904: what="device internal reset"; break;
+       case 0x2B00: what="copy can't execute / host can't disconnect"; break;
+       case 0x2C00: what="command sequence error"; break;
+       case 0x2C03: what="current program area is not empty"; break;
+       case 0x2C04: what="current program area is empty"; break;
+       case 0x2F00: what="commands cleared by another initiator"; break;
+       case 0x3001: what="can't read medium: unknown format"; break;
+       case 0x3002: what="can't read medium: incompatible format"; break;
+       case 0x3003: what="cleaning cartridge installed"; break;
+       case 0x3004: what="can't write medium: unknown format"; break;
+       case 0x3005: what="can't write medium: incompatible format"; break;
+       case 0x3006: what="can't format medium: incompatible medium"; break;
+       case 0x3007: what="cleaning failure"; break;
+       case 0x3008: what="can't write: application code mismatch"; break;
+       case 0x3009: what="current session not fixated for append"; break;
+       case 0x3201: what="defect list update failure"; break;
+       case 0x3400: what="enclosure failure"; break;
+       case 0x3500: what="enclosure services failure"; break;
+       case 0x3502: what="enclosure services unavailable"; break;
+       case 0x3503: what="enclosure services transfer failure"; break;
+       case 0x3504: what="enclosure services transfer refused"; break;
+       case 0x3A00: what="media not present"; break;
+       case 0x3B0F: what="end of medium reached"; break;
+       case 0x3F02: what="changed operating definition"; break;
+       case 0x4100: what="data path failure (should use 40 NN)"; break;
+       case 0x4A00: what="command phase error"; break;
+       case 0x4B00: what="data phase error"; break;
+       case 0x5100: what="erase failure"; break;
+       case 0x5200: what="cartridge fault"; break;
+       case 0x6300: what="end of user area encountered on this track"; break;
+       case 0x6600: what="automatic document feeder cover up"; break;
+       case 0x6601: what="automatic document feeder lift up"; break;
+       case 0x6602: what="document jam in auto doc feeder"; break;
+       case 0x6603: what="document miss feed auto in doc feeder"; break;
+       case 0x6700: what="configuration failure"; break;
+       case 0x6701: what="configuration of incapable LUN's failed"; break;
+       case 0x6702: what="add logical unit failed"; break;
+       case 0x6706: what="attachment of logical unit failed"; break;
+       case 0x6707: what="creation of logical unit failed"; break;
+       case 0x6900: what="data loss on logical unit"; break;
+       case 0x6E00: what="command to logical unit failed"; break;
+       case 0x7100: what="decompression exception long algorithm ID"; break;
+       case 0x7204: what="empty or partially written reserved track"; break;
+       case 0x7300: what="CD control error"; break;
+
+       default:
+               if (asc==0x40) {
+                       US_DEBUGP("%s: diagnostic failure on component"
+                         " %02X\n", keystr, ascq);
+                       return;
+               }
+               if (asc==0x70) {
+                       US_DEBUGP("%s: decompression exception short"
+                         " algorithm ID of %02X\n", keystr, ascq);
+                       return;
+               }
                what = "(unknown ASC/ASCQ)";
+       }
 
-       US_DEBUGP("%s: ", keystr);
-       US_DEBUGPX(what, ascq);
-       US_DEBUGPX("\n");
+       US_DEBUGP("%s: %s\n", keystr, what);
 }
diff -u usb-2.5/drivers/usb/storage/isd200.c usb-2.4/drivers/usb/storage/isd200.c
--- usb-2.5/drivers/usb/storage/isd200.c        Fri Sep 27 11:11:13 2002
+++ usb-2.4/drivers/usb/storage/isd200.c        Mon Sep 30 10:20:18 2002
@@ -49,7 +49,7 @@
 #include "scsiglue.h"
 #include "isd200.h"
 
-#include <linux/jiffies.h>
+#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 #include <linux/hdreg.h>
diff -u usb-2.5/drivers/usb/storage/scsiglue.c usb-2.4/drivers/usb/storage/scsiglue.c
--- usb-2.5/drivers/usb/storage/scsiglue.c      Fri Sep 27 17:59:47 2002
+++ usb-2.4/drivers/usb/storage/scsiglue.c      Mon Sep 30 10:20:23 2002
@@ -117,7 +117,6 @@
         * notification that it has exited.
         */
        US_DEBUGP("-- sending exit command to thread\n");
-       BUG_ON(atomic_read(&us->sm_state) != US_STATE_IDLE);
        us->srb = NULL;
        up(&(us->sema));
        wait_for_completion(&(us->notify));
@@ -147,8 +146,6 @@
        srb->host_scribble = (unsigned char *)us;
 
        /* enqueue the command */
-       BUG_ON(atomic_read(&us->sm_state) != US_STATE_IDLE);
-       BUG_ON(us->srb != NULL);
        srb->scsi_done = done;
        us->srb = srb;
 
@@ -189,7 +186,6 @@
        int result;
 
        US_DEBUGP("device_reset() called\n" );
-       BUG_ON(atomic_read(&us->sm_state) != US_STATE_IDLE);
 
        /* set the state and release the lock */
        atomic_set(&us->sm_state, US_STATE_RESETTING);
@@ -252,6 +248,7 @@
        for (i = 0; i < pusb_dev_save->actconfig->bNumInterfaces; i++) {
                struct usb_interface *intf =
                        &pusb_dev_save->actconfig->interface[i];
+               const struct usb_device_id *id;
 
                /* if this is an unclaimed interface, skip it */
                if (!intf->driver) {
@@ -262,8 +259,11 @@
 
                /* simulate a disconnect and reconnect for all interfaces */
                US_DEBUGPX("simulating disconnect/reconnect.\n");
-               usb_device_remove (&intf->dev);
-               usb_device_probe (&intf->dev);
+               down(&intf->driver->serialize);
+               intf->driver->disconnect(pusb_dev_save, intf->private_data);
+               id = usb_match_id(pusb_dev_save, intf, intf->driver->id_table);
+               intf->driver->probe(pusb_dev_save, i, id);
+               up(&intf->driver->serialize);
        }
        US_DEBUGP("bus_reset() complete\n");
        scsi_lock(srb->host);
@@ -373,6 +373,7 @@
        .present =              0,
        .unchecked_isa_dma =    FALSE,
        .use_clustering =       TRUE,
+       .use_new_eh_code =      TRUE,
        .emulated =             TRUE
 };
 
diff -u usb-2.5/drivers/usb/storage/sddr55.c usb-2.4/drivers/usb/storage/sddr55.c
--- usb-2.5/drivers/usb/storage/sddr55.c        Sat Sep 28 10:20:41 2002
+++ usb-2.4/drivers/usb/storage/sddr55.c        Sat Sep 28 12:30:01 2002
@@ -31,7 +31,7 @@
 #include "debug.h"
 #include "sddr55.h"
 
-#include <linux/jiffies.h>
+#include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/slab.h>
 
diff -u usb-2.5/drivers/usb/storage/transport.c usb-2.4/drivers/usb/storage/transport.c
--- usb-2.5/drivers/usb/storage/transport.c     Sat Sep 28 10:20:41 2002
+++ usb-2.4/drivers/usb/storage/transport.c     Mon Sep 30 10:20:33 2002
@@ -429,7 +429,7 @@
        us->current_urb->transfer_flags = USB_ASYNC_UNLINK;
 
        /* submit the URB */
-       status = usb_submit_urb(us->current_urb, GFP_NOIO);
+       status = usb_submit_urb(us->current_urb);
        if (status) {
                /* something went wrong */
                return status;
@@ -860,14 +860,12 @@
 void usb_stor_abort_transport(struct us_data *us)
 {
        struct Scsi_Host *host;
-       int state = atomic_read(&us->sm_state);
 
        US_DEBUGP("usb_stor_abort_transport called\n");
 
        /* Normally the current state is RUNNING.  If the control thread
         * hasn't even started processing this command, the state will be
         * IDLE.  Anything else is a bug. */
-       BUG_ON((state != US_STATE_RUNNING && state != US_STATE_IDLE));
 
        /* set state to abort and release the lock */
        atomic_set(&us->sm_state, US_STATE_ABORTING);
diff -u usb-2.5/drivers/usb/storage/usb.c usb-2.4/drivers/usb/storage/usb.c
--- usb-2.5/drivers/usb/storage/usb.c   Fri Sep 27 17:32:41 2002
+++ usb-2.4/drivers/usb/storage/usb.c   Mon Sep 30 10:20:39 2002
@@ -103,10 +103,10 @@
 struct us_data *us_list;
 struct semaphore us_list_semaphore;
 
-static int storage_probe(struct usb_interface *iface,
-                        const struct usb_device_id *id);
+static void * storage_probe(struct usb_device *dev, unsigned int ifnum,
+                           const struct usb_device_id *id);
 
-static void storage_disconnect(struct usb_interface *iface);
+static void storage_disconnect(struct usb_device *dev, void *ptr);
 
 /* The entries in this table, except for final ones here
  * (USB_MASS_STORAGE_CLASS and the empty entry), correspond,
@@ -313,9 +313,8 @@
        /* avoid getting signals */
        spin_lock_irq(&current->sigmask_lock);
        flush_signals(current);
-       current->flags |= PF_IOTHREAD;
        sigfillset(&current->blocked);
-       recalc_sigpending();
+       recalc_sigpending(current);
        spin_unlock_irq(&current->sigmask_lock);
 
        /* set our name for identification purposes */
@@ -535,7 +534,7 @@
 
        /* allocate the URB we're going to use */
        US_DEBUGP("Allocating URB\n");
-       ss->current_urb = usb_alloc_urb(0, GFP_KERNEL);
+       ss->current_urb = usb_alloc_urb(0);
        if (!ss->current_urb) {
                US_DEBUGP("allocation failed\n");
                return 2;
@@ -549,7 +548,7 @@
                down(&(ss->irq_urb_sem));
 
                /* allocate the URB */
-               ss->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
+               ss->irq_urb = usb_alloc_urb(0);
                if (!ss->irq_urb) {
                        up(&(ss->irq_urb_sem));
                        US_DEBUGP("couldn't allocate interrupt URB");
@@ -568,7 +567,7 @@
                        maxp, usb_stor_CBI_irq, ss, ss->ep_int->bInterval); 
 
                /* submit the URB for processing */
-               result = usb_submit_urb(ss->irq_urb, GFP_KERNEL);
+               result = usb_submit_urb(ss->irq_urb);
                US_DEBUGP("usb_submit_urb() returns %d\n", result);
                if (result) {
                        up(&(ss->irq_urb_sem));
@@ -618,16 +617,14 @@
 
        /* mark the device as gone */
        ss->flags &= ~ US_FL_DEV_ATTACHED;
-       usb_put_dev(ss->pusb_dev);
+       usb_dec_dev_use(ss->pusb_dev);
        ss->pusb_dev = NULL;
 }
 
 /* Probe to see if a new device is actually a SCSI device */
-static int storage_probe(struct usb_interface *intf,
-                        const struct usb_device_id *id)
+static void * storage_probe(struct usb_device *dev, unsigned int ifnum,
+                           const struct usb_device_id *id)
 {
-       struct usb_device *dev = interface_to_usbdev(intf);
-       int ifnum = intf->altsetting->bInterfaceNumber;
        int i;
        const int id_index = id - storage_usb_ids; 
        char mf[USB_STOR_STRING_LEN];                /* manufacturer */
@@ -652,6 +649,7 @@
        /* the altsetting on the interface we're probing that matched our
         * usb_match_id table
         */
+       struct usb_interface *intf = dev->actconfig->interface;
        struct usb_interface_descriptor *altsetting =
                intf[ifnum].altsetting + intf[ifnum].act_altsetting;
        US_DEBUGP("act_altsetting is %d\n", intf[ifnum].act_altsetting);
@@ -681,7 +679,7 @@
                        US_DEBUGP("Product: %s\n", unusual_dev->productName);
        } else
                /* no, we can't support it */
-               return -EIO;
+               return NULL;
 
        /* At this point, we know we've got a live one */
        US_DEBUGP("USB Mass Storage device detected\n");
@@ -729,7 +727,7 @@
                } else if (result != 0) {
                        /* it's not a stall, but another error -- time to bail */
                        US_DEBUGP("-- Unknown error.  Rejecting device\n");
-                       return -EIO;
+                       return NULL;
                }
        }
 #endif
@@ -737,11 +735,11 @@
        /* Do some basic sanity checks, and bail if we find a problem */
        if (!ep_in || !ep_out || (protocol == US_PR_CBI && !ep_int)) {
                US_DEBUGP("Endpoint sanity check failed! Rejecting dev.\n");
-               return -EIO;
+               return NULL;
        }
 
        /* At this point, we've decided to try to use the device */
-       usb_get_dev(dev);
+       usb_inc_dev_use(dev);
 
        /* clear the GUID and fetch the strings */
        GUID_CLEAR(guid);
@@ -815,8 +813,8 @@
                if ((ss = (struct us_data *)kmalloc(sizeof(struct us_data), 
                                                    GFP_KERNEL)) == NULL) {
                        printk(KERN_WARNING USB_STORAGE "Out of memory\n");
-                       usb_put_dev(dev);
-                       return -ENOMEM;
+                       usb_dec_dev_use(dev);
+                       return NULL;
                }
                memset(ss, 0, sizeof(struct us_data));
                new_device = 1;
@@ -1061,7 +1059,7 @@
 
                /* now register  - our detect function will be called */
                ss->htmplt.module = THIS_MODULE;
-               result = scsi_register_host(&(ss->htmplt));
+               result = scsi_register_module(MODULE_SCSI_HA, &(ss->htmplt));
                if (result) {
                        printk(KERN_WARNING USB_STORAGE
                                "Unable to register the scsi host\n");
@@ -1092,9 +1090,8 @@
        printk(KERN_DEBUG 
               "USB Mass Storage device found at %d\n", dev->devnum);
 
-       /* save a pointer to our structure */
-       dev_set_drvdata (&intf->dev, ss);
-       return 0;
+       /* return a pointer for the disconnect function */
+       return ss;
 
        /* we come here if there are any problems */
        /* ss->dev_semaphore must be locked */
@@ -1104,18 +1101,16 @@
        up(&ss->dev_semaphore);
        if (new_device)
                kfree(ss);
-       return -EIO;
+       return NULL;
 }
 
 /* Handle a disconnect event from the USB core */
-static void storage_disconnect(struct usb_interface *intf)
+static void storage_disconnect(struct usb_device *dev, void *ptr)
 {
-       struct us_data *ss = dev_get_drvdata (&intf->dev);
+       struct us_data *ss = ptr;
 
        US_DEBUGP("storage_disconnect() called\n");
 
-       dev_set_drvdata (&intf->dev, NULL);
-
        /* this is the odd case -- we disconnected but weren't using it */
        if (!ss) {
                US_DEBUGP("-- device was not in use\n");
@@ -1168,7 +1163,7 @@
         */
        for (next = us_list; next; next = next->next) {
                US_DEBUGP("-- calling scsi_unregister_host()\n");
-               scsi_unregister_host(&(next->htmplt));
+               scsi_unregister_module(MODULE_SCSI_HA, &(next->htmplt));
        }
 
        /* While there are still structures, free them.  Note that we are
diff -u usb-2.5/drivers/usb/storage/usb.h usb-2.4/drivers/usb/storage/usb.h
--- usb-2.5/drivers/usb/storage/usb.h   Fri Sep 27 11:11:13 2002
+++ usb-2.4/drivers/usb/storage/usb.h   Mon Sep 30 10:20:40 2002
@@ -204,8 +204,8 @@
 
 /* The scsi_lock() and scsi_unlock() macros protect the sm_state and the
  * single queue element srb for write access */
-#define scsi_unlock(host)      spin_unlock_irq(host->host_lock)
-#define scsi_lock(host)                spin_lock_irq(host->host_lock)
-#define sg_address(psg)                (page_address((psg).page) + (psg).offset)
+#define scsi_unlock(host)      spin_unlock_irq(&io_request_lock)
+#define scsi_lock(host)                spin_lock_irq(&io_request_lock)
+#define sg_address(sg)         ((sg).address)
 
 #endif





-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to