Am Mittwoch, 19. September 2001 18:50 schrieb David Brownell:
> > So it is a interface specific setting from the drivers point of view.
>
> Yes, USB has "interface" drivers more than "device" drivers;
> but control messaging is device-wide ... and if we view this
> as special-casing to get safe USB-storage, I suspect we won't
> be seeing many composite storage-plus-something-else style
> devices!

Plus it's much easier to do with a device specific setting.
I wanted to finish this today, but there is not enough time.
It turns out that a device specific flag is doable. In addition usb_alloc_urb 
must take an additional parameter. This of course touches all drivers.

The included patch is completely untested and serial devices won't compile 
with it.

        Regards
                Oliver


----------------------------------------------------------------------------------------
--- linuxvanilla/include/linux/usb.h    Mon Sep 10 23:40:14 2001
+++ linuxusb/include/linux/usb.h        Wed Sep 19 18:42:11 2001
@@ -273,7 +273,7 @@
        int act_altsetting;             /* active alternate setting */
        int num_altsetting;             /* number of alternate settings */
        int max_altsetting;             /* total memory allocated */
-
+
        struct usb_driver *driver;      /* driver */
        void *private_data;
 };
@@ -312,7 +312,7 @@
  * With a device table provide bind() instead of probe().  Then the
  * third bind() parameter will point to a matching entry from this
  * table.  (Null value reserved.)
- *
+ *
  * Terminate the driver's table with an all-zeroes entry.
  * Init the fields you care about; zeroes are not used in comparisons.
  */
@@ -412,8 +412,8 @@
        // void (*suspend)(struct usb_device *dev);
        // void (*resume)(struct usb_device *dev);
 };
-
-/*----------------------------------------------------------------------------*
+
+/*----------------------------------------------------------------------------*
  * New USB Structures                                                        
 *
  
*----------------------------------------------------------------------------*/

@@ -627,6 +627,7 @@

        int have_langid;                /* whether string_langid is valid yet */
        int string_langid;              /* language ID for strings */
+       int gfp_mask;                   /* to control memory allocation */

        void *hcpriv;                   /* Host Controller private data */

diff -u linuxvanilla/drivers/usb/bluetooth.c linuxusb/drivers/usb/bluetooth.c
--- linuxvanilla/drivers/usb/bluetooth.c        Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/bluetooth.c    Wed Sep 19 18:55:43 2001
@@ -1108,7 +1108,7 @@

        /* create our control out urb pool */
        for (i = 0; i < NUM_CONTROL_URBS; ++i) {
-               struct urb  *urb = usb_alloc_urb(0);
+               struct urb  *urb = usb_alloc_urb(0,GFP_KERNEL);
                if (urb == NULL) {
                        err("No free urbs available");
                        goto probe_error;
@@ -1119,7 +1119,7 @@

        /* set up the endpoint information */
        endpoint = bulk_in_endpoint[0];
-       bluetooth->read_urb = usb_alloc_urb (0);
+       bluetooth->read_urb = usb_alloc_urb (0,GFP_KERNEL);
        if (!bluetooth->read_urb) {
                err("No free urbs available");
                goto probe_error;
@@ -1139,7 +1139,7 @@

        /* create our write urb pool */ 
        for (i = 0; i < NUM_BULK_URBS; ++i) {
-               struct urb  *urb = usb_alloc_urb(0);
+               struct urb  *urb = usb_alloc_urb(0,GFP_KERNEL);
                if (urb == NULL) {
                        err("No free urbs available");
                        goto probe_error;
@@ -1155,7 +1155,7 @@
        bluetooth->bulk_out_buffer_size = endpoint->wMaxPacketSize * 2;

        endpoint = interrupt_in_endpoint[0];
-       bluetooth->interrupt_in_urb = usb_alloc_urb(0);
+       bluetooth->interrupt_in_urb = usb_alloc_urb(0,GFP_KERNEL);
        if (!bluetooth->interrupt_in_urb) {
                err("No free urbs available");
                goto probe_error;
diff -u linuxvanilla/drivers/usb/dabusb.c linuxusb/drivers/usb/dabusb.c
--- linuxvanilla/drivers/usb/dabusb.c   Mon Sep 10 23:39:59 2001
+++ linuxusb/drivers/usb/dabusb.c       Wed Sep 19 18:56:35 2001
@@ -226,7 +226,7 @@
                }
                memset (b, sizeof (buff_t), 0);
                b->s = s;
-               b->purb = usb_alloc_urb(packets);
+               b->purb = usb_alloc_urb(packets,GFP_KERNEL);
                if (!b->purb) {
                        err("usb_alloc_urb == NULL");
                        kfree (b);
diff -u linuxvanilla/drivers/usb/hub.c linuxusb/drivers/usb/hub.c
--- linuxvanilla/drivers/usb/hub.c      Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/hub.c  Wed Sep 19 18:57:16 2001
@@ -257,7 +257,7 @@
        if (maxp > sizeof(hub->buffer))
                maxp = sizeof(hub->buffer);
 
-       hub->urb = usb_alloc_urb(0);
+       hub->urb = usb_alloc_urb(0,GFP_KERNEL);
        if (!hub->urb) {
                err("couldn't allocate interrupt urb");
                kfree(hub->descriptor);
diff -u linuxvanilla/drivers/usb/ibmcam.c linuxusb/drivers/usb/ibmcam.c
--- linuxvanilla/drivers/usb/ibmcam.c   Mon Sep 10 23:39:45 2001
+++ linuxusb/drivers/usb/ibmcam.c       Wed Sep 19 18:57:53 2001
@@ -2181,7 +2181,7 @@
                int j, k;
                urb_t *urb;
 
-               urb = usb_alloc_urb(FRAMES_PER_DESC);
+               urb = usb_alloc_urb(FRAMES_PER_DESC,GFP_KERNEL);
                if (urb == NULL) {
                        printk(KERN_ERR "ibmcam_init_isoc: usb_init_isoc() failed.\n");
                        return -ENOMEM;
diff -u linuxvanilla/drivers/usb/kaweth.c linuxusb/drivers/usb/kaweth.c
--- linuxvanilla/drivers/usb/kaweth.c   Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/kaweth.c       Wed Sep 19 18:59:20 2001
@@ -876,8 +876,8 @@
        
        kaweth_dbg("Initializing net device.");
 
-       kaweth->tx_urb = usb_alloc_urb(0);
-       kaweth->rx_urb = usb_alloc_urb(0);
+       kaweth->tx_urb = usb_alloc_urb(0,GFP_KERNEL);
+       kaweth->rx_urb = usb_alloc_urb(0,GFP_KERNEL);

        kaweth->net = init_etherdev(0, 0);
        if (!kaweth->net) {
@@ -1020,7 +1020,7 @@
         int retv;
         int length;

-        urb = usb_alloc_urb(0);
+        urb = usb_alloc_urb(0,GFP_KERNEL);
         if (!urb)
                 return -ENOMEM;
 
diff -u linuxvanilla/drivers/usb/mdc800.c linuxusb/drivers/usb/mdc800.c
--- linuxvanilla/drivers/usb/mdc800.c   Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/mdc800.c       Wed Sep 19 19:00:07 2001
@@ -934,9 +934,9 @@
        try (mdc800->write_urb_buffer=kmalloc (8, GFP_KERNEL));
        try (mdc800->download_urb_buffer=kmalloc (64, GFP_KERNEL));

-       try (mdc800->irq_urb=usb_alloc_urb (0));
-       try (mdc800->download_urb=usb_alloc_urb (0));
-       try (mdc800->write_urb=usb_alloc_urb (0));
+       try (mdc800->irq_urb=usb_alloc_urb (0,GFP_KERNEL));
+       try (mdc800->download_urb=usb_alloc_urb (0,GFP_KERNEL));
+       try (mdc800->write_urb=usb_alloc_urb (0, GFP_KERNEL));
 
        /* Register the driver */
        if (usb_register (&mdc800_usb_driver) < 0)
diff -u linuxvanilla/drivers/usb/ov511.c linuxusb/drivers/usb/ov511.c
--- linuxvanilla/drivers/usb/ov511.c    Mon Sep 10 23:39:45 2001
+++ linuxusb/drivers/usb/ov511.c        Wed Sep 19 19:01:23 2001
@@ -1931,7 +1931,7 @@
        ov511_set_packet_size(ov511, size);
 
        for (n = 0; n < OV511_NUMSBUF; n++) {
-               urb = usb_alloc_urb(FRAMES_PER_DESC);
+               urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
        
                if (!urb) {
                        err("init isoc: usb_alloc_urb ret. NULL");
diff -u linuxvanilla/drivers/usb/pwc-if.c linuxusb/drivers/usb/pwc-if.c
--- linuxvanilla/drivers/usb/pwc-if.c   Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/pwc-if.c       Wed Sep 19 19:01:59 2001
@@ -800,7 +800,7 @@

        ret = 0;
        for (i = 0; i < MAX_ISO_BUFS; i++) {
-               urb = usb_alloc_urb(ISO_FRAMES_PER_DESC);
+               urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
                if (urb == NULL) {
                        Err("Failed to allocate urb %d\n", i);
                        ret = -ENOMEM;
diff -u linuxvanilla/drivers/usb/se401.c linuxusb/drivers/usb/se401.c
--- linuxvanilla/drivers/usb/se401.c    Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/se401.c        Wed Sep 19 19:03:57 2001
@@ -643,7 +643,7 @@
        }
 
        for (i=0; i<SE401_NUMSBUF; i++) {
-               urb=usb_alloc_urb(0);
+               urb=usb_alloc_urb(0, GFP_KERNEL);
                if(!urb)
                        return ENOMEM;
 
@@ -1465,7 +1465,7 @@
        se401->readcount=0;

        /* Start interrupt transfers for snapshot button */
-       se401->inturb=usb_alloc_urb(0);
+       se401->inturb=usb_alloc_urb(0, GFP_KERNEL);
        if (!se401->inturb) {
                info("Allocation of inturb failed");
                return 1;
Common subdirectories: linuxvanilla/drivers/usb/serial and 
linuxusb/drivers/usb/serial
Common subdirectories: linuxvanilla/drivers/usb/storage and 
linuxusb/drivers/usb/storage
diff -u linuxvanilla/drivers/usb/usb-ohci.c linuxusb/drivers/usb/usb-ohci.c
--- linuxvanilla/drivers/usb/usb-ohci.c Mon Sep 10 23:39:59 2001
+++ linuxusb/drivers/usb/usb-ohci.c     Wed Sep 19 19:13:50 2001
@@ -602,7 +602,7 @@
 
        /* allocate the private part of the URB */
        urb_priv = kmalloc (sizeof (urb_priv_t) + size * sizeof (td_t *), 
-                                                       in_interrupt() ? GFP_ATOMIC : 
GFP_KERNEL);
+                                                       in_interrupt() ? GFP_ATOMIC : 
+urb->dev->gfp_mask);
        if (!urb_priv) {
                usb_dec_dev_use (urb->dev);     
                return -ENOMEM;
@@ -800,7 +800,8 @@
 {
        struct ohci_device * dev;

-       dev = dev_alloc ((struct ohci *) usb_dev->bus->hcpriv, ALLOC_FLAGS);
+       dev = dev_alloc ((struct ohci *) usb_dev->bus->hcpriv,
+                               in_interrupt() ? GFP_ATOMIC : usb_dev->gfp_mask);
        if (!dev)
                return -ENOMEM;

diff -u linuxvanilla/drivers/usb/usb-ohci.h linuxusb/drivers/usb/usb-ohci.h
--- linuxvanilla/drivers/usb/usb-ohci.h Mon Sep 10 23:39:59 2001
+++ linuxusb/drivers/usb/usb-ohci.h     Wed Sep 19 19:12:18 2001
@@ -439,7 +439,7 @@
 
 /*-------------------------------------------------------------------------*/
 
-#define ALLOC_FLAGS (in_interrupt () ? GFP_ATOMIC : GFP_KERNEL)
+#define ALLOC_FLAGS (in_interrupt () ? GFP_ATOMIC : urb->dev->gfp_mask)

 #ifdef DEBUG
 #      define OHCI_MEM_FLAGS   SLAB_POISON
diff -u linuxvanilla/drivers/usb/usb-skeleton.c 
linuxusb/drivers/usb/usb-skeleton.c
--- linuxvanilla/drivers/usb/usb-skeleton.c     Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/usb-skeleton.c Wed Sep 19 19:04:44 2001
@@ -536,7 +536,7 @@
                if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
                    ((endpoint->bmAttributes & 3) == 0x02)) {
                        /* we found a bulk out endpoint */
-                       dev->write_urb = usb_alloc_urb(0);
+                       dev->write_urb = usb_alloc_urb(0, GFP_KERNEL);
                        if (!dev->write_urb) {
                                err("No free urbs available");
                                goto error;
diff -u linuxvanilla/drivers/usb/usb-uhci.c linuxusb/drivers/usb/usb-uhci.c
--- linuxvanilla/drivers/usb/usb-uhci.c Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/usb-uhci.c     Wed Sep 19 19:19:29 2001
@@ -86,7 +86,7 @@
 #endif
 
 #define SLAB_FLAG     (in_interrupt ()? SLAB_ATOMIC : SLAB_KERNEL)
-#define KMALLOC_FLAG  (in_interrupt ()? GFP_ATOMIC : GFP_KERNEL)
+#define KMALLOC_FLAG  (in_interrupt ()? GFP_ATOMIC : urb->dev->gfp_mask)
 
 /* CONFIG_USB_UHCI_HIGH_BANDWITH turns on Full Speed Bandwidth
  * Reclamation: feature that puts loop on descriptor loop when
diff -u linuxvanilla/drivers/usb/usb.c linuxusb/drivers/usb/usb.c
--- linuxvanilla/drivers/usb/usb.c      Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/usb.c  Wed Sep 19 18:52:34 2001
@@ -941,6 +941,7 @@

        dev->bus = bus;
        dev->parent = parent;
+       dev->gfp_mask = GFP_KERNEL;
        atomic_set(&dev->refcnt, 1);
        INIT_LIST_HEAD(&dev->inodes);
        INIT_LIST_HEAD(&dev->filelist);
@@ -985,12 +986,12 @@
  *
  *     The driver should call usb_free_urb() when it is finished with the urb.
  */
-urb_t *usb_alloc_urb(int iso_packets)
+urb_t *usb_alloc_urb(int iso_packets, int gfp_mask)
 {
        urb_t *urb;

        urb = (urb_t *)kmalloc(sizeof(urb_t) + iso_packets * 
sizeof(iso_packet_descriptor_t),
-             in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
+             gfp_mask);
        if (!urb) {
                err("alloc_urb: kmalloc failed");
                return NULL;
@@ -1112,7 +1113,7 @@
        int retv;
        int length;

-       urb = usb_alloc_urb(0);
+       urb = usb_alloc_urb(0, usb_dev->gfp_mask);
        if (!urb)
                return -ENOMEM;
   
@@ -1201,7 +1202,7 @@
        if (len < 0)
                return -EINVAL;
 
-       urb=usb_alloc_urb(0);
+       urb=usb_alloc_urb(0, usb_dev->gfp_mask);
        if (!urb)
                return -ENOMEM;

diff -u linuxvanilla/drivers/usb/usbnet.c linuxusb/drivers/usb/usbnet.c
--- linuxvanilla/drivers/usb/usbnet.c   Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/usbnet.c       Wed Sep 19 19:06:39 2001
@@ -1204,7 +1204,7 @@
                skb = skb2;
        }
 
-       if (!(urb = usb_alloc_urb (0))) {
+       if (!(urb = usb_alloc_urb (0, in_interrupt () ? GFP_ATOMIC : GFP_KERNEL))) {
                dbg ("no urb");
                goto drop;
        }
@@ -1338,7 +1338,7 @@
                        struct urb      *urb;
                        int             i;
                        for (i = 0; i < 3 && dev->rxq.qlen < RX_QLEN; i++) {
-                               if ((urb = usb_alloc_urb (0)) != 0)
+                               if ((urb = usb_alloc_urb (0, GFP_ATOMIC)) != 0)
                                        rx_submit (dev, urb, GFP_ATOMIC);
                        }
                        if (temp != dev->rxq.qlen)
diff -u linuxvanilla/drivers/usb/usbvideo.c linuxusb/drivers/usb/usbvideo.c
--- linuxvanilla/drivers/usb/usbvideo.c Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/usbvideo.c     Wed Sep 19 19:07:24 2001
@@ -1094,7 +1094,7 @@

        down(&uvd->lock);
        for (i=0; i < USBVIDEO_NUMSBUF; i++) {
-               uvd->sbuf[i].urb = usb_alloc_urb(FRAMES_PER_DESC);
+               uvd->sbuf[i].urb = usb_alloc_urb(FRAMES_PER_DESC, GFP_KERNEL);
                if (uvd->sbuf[i].urb == NULL) {
                        err("usb_alloc_urb(%d.) failed.", FRAMES_PER_DESC);
                        uvd->uvd_used = 0;
diff -u linuxvanilla/drivers/usb/storage/datafab.c 
linuxusb/drivers/usb/storage/datafab.c
--- linuxvanilla/drivers/usb/storage/datafab.c  Mon Sep 10 23:39:59 2001
+++ linuxusb/drivers/usb/storage/datafab.c      Wed Sep 19 14:24:41 2001
@@ -208,7 +208,7 @@

                if (use_sg) {
                        sg = (struct scatterlist *) dest;
-                       buffer = kmalloc(len, GFP_KERNEL);
+                       buffer = kmalloc(len, GFP_NOIO);
                        if (buffer == NULL)
                                return USB_STOR_TRANSPORT_ERROR;
                        ptr = buffer;
@@ -333,7 +333,7 @@
 
                if (use_sg) {
                        sg = (struct scatterlist *) src;
-                       buffer = kmalloc(len, GFP_KERNEL);
+                       buffer = kmalloc(len, GFP_NOIO);
                        if (buffer == NULL)
                                return USB_STOR_TRANSPORT_ERROR;
                        ptr = buffer;
@@ -665,7 +665,7 @@
        };
 
        if (!us->extra) {
-               us->extra = kmalloc(sizeof(struct datafab_info), GFP_KERNEL);
+               us->extra = kmalloc(sizeof(struct datafab_info), GFP_NOIO);
                if (!us->extra) {
                        US_DEBUGP("datafab_transport:  Gah! Can't allocate storage for 
Datafab 
info struct!\n");
                        return USB_STOR_TRANSPORT_ERROR;
diff -u linuxvanilla/drivers/usb/storage/jumpshot.c 
linuxusb/drivers/usb/storage/jumpshot.c
--- linuxvanilla/drivers/usb/storage/jumpshot.c Mon Sep 10 23:39:59 2001
+++ linuxusb/drivers/usb/storage/jumpshot.c     Wed Sep 19 14:26:50 2001
@@ -284,7 +284,7 @@

                 if (use_sg) {
                         sg = (struct scatterlist *) dest;
-                        buffer = kmalloc(len, GFP_KERNEL);
+                        buffer = kmalloc(len, GFP_NOIO);
                         if (buffer == NULL)
                                 return USB_STOR_TRANSPORT_ERROR;
                         ptr = buffer;
@@ -399,7 +399,7 @@
 
                 if (use_sg) {
                         sg = (struct scatterlist *) src;
-                        buffer = kmalloc(len, GFP_KERNEL);
+                        buffer = kmalloc(len, GFP_NOIO);
                         if (buffer == NULL)
                                 return USB_STOR_TRANSPORT_ERROR;
                         ptr = buffer;
@@ -665,7 +665,7 @@

 
        if (!us->extra) {
-               us->extra = kmalloc(sizeof(struct jumpshot_info), GFP_KERNEL);
+               us->extra = kmalloc(sizeof(struct jumpshot_info), GFP_NOIO);
                if (!us->extra) {
                        US_DEBUGP("jumpshot_transport:  Gah! Can't allocate storage 
for jumpshot 
info struct!\n");
                        return USB_STOR_TRANSPORT_ERROR;
diff -u linuxvanilla/drivers/usb/storage/sddr09.c 
linuxusb/drivers/usb/storage/sddr09.c
--- linuxvanilla/drivers/usb/storage/sddr09.c   Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/storage/sddr09.c       Wed Sep 19 14:29:52 2001
@@ -303,7 +303,7 @@

        if (use_sg) {
                sg = (struct scatterlist *)content;
-               buffer = kmalloc(len, GFP_KERNEL);
+               buffer = kmalloc(len, GFP_NOIO);
                if (buffer == NULL)
                        return USB_STOR_TRANSPORT_ERROR;
                ptr = buffer;
@@ -630,16 +630,16 @@
 
        alloc_blocks = (alloc_len + (1<<17) - 1) >> 17;
        sg = kmalloc(alloc_blocks*sizeof(struct scatterlist),
-               GFP_KERNEL);
+               GFP_NOIO);
        if (sg == NULL)
                return 0;

        for (i=0; i<alloc_blocks; i++) {
                if (i<alloc_blocks-1) {
-                       sg[i].address = kmalloc( (1<<17), GFP_KERNEL );
+                       sg[i].address = kmalloc( (1<<17), GFP_NOIO );
                        sg[i].length = (1<<17);
                } else {
-                       sg[i].address = kmalloc(alloc_len, GFP_KERNEL);
+                       sg[i].address = kmalloc(alloc_len, GFP_NOIO);
                        sg[i].length = alloc_len;
                }
                alloc_len -= sg[i].length;
@@ -670,8 +670,8 @@
                kfree(info->lba_to_pba);
        if (info->pba_to_lba)
                kfree(info->pba_to_lba);
-       info->lba_to_pba = kmalloc(numblocks*sizeof(int), GFP_KERNEL);
-       info->pba_to_lba = kmalloc(numblocks*sizeof(int), GFP_KERNEL);
+       info->lba_to_pba = kmalloc(numblocks*sizeof(int), GFP_NOIO);
+       info->pba_to_lba = kmalloc(numblocks*sizeof(int), GFP_NOIO);

        if (info->lba_to_pba == NULL || info->pba_to_lba == NULL) {
                if (info->lba_to_pba != NULL)
@@ -840,7 +840,7 @@

        if (!us->extra) {
                us->extra = kmalloc(
-                       sizeof(struct sddr09_card_info), GFP_KERNEL);
+                       sizeof(struct sddr09_card_info), GFP_NOIO);
                if (!us->extra)
                        return USB_STOR_TRANSPORT_ERROR;
                memset(us->extra, 0, sizeof(struct sddr09_card_info));
diff -u linuxvanilla/drivers/usb/storage/shuttle_usbat.c 
linuxusb/drivers/usb/storage/shuttle_usbat.c
--- linuxvanilla/drivers/usb/storage/shuttle_usbat.c    Mon Sep 10 23:39:45 2001
+++ linuxusb/drivers/usb/storage/shuttle_usbat.c        Wed Sep 19 14:30:56 2001
@@ -681,7 +681,7 @@

        len = (65535/srb->transfersize) * srb->transfersize;
        US_DEBUGP("Max read is %d bytes\n", len);
-       buffer = kmalloc(len, GFP_KERNEL);
+       buffer = kmalloc(len, GFP_NOIO);
        if (buffer == NULL) // bloody hell!
                return USB_STOR_TRANSPORT_FAILED;
        sector = short_pack(data[7+3], data[7+2]);
diff -u linuxvanilla/drivers/usb/storage/transport.c 
linuxusb/drivers/usb/storage/transport.c
--- linuxvanilla/drivers/usb/storage/transport.c        Mon Sep 10 23:40:12 2001
+++ linuxusb/drivers/usb/storage/transport.c    Wed Sep 19 14:31:20 2001
@@ -388,7 +388,7 @@
        devrequest *dr;
 
        /* allocate the device request structure */
-       dr = kmalloc(sizeof(devrequest), GFP_KERNEL);
+       dr = kmalloc(sizeof(devrequest), GFP_NOIO);
        if (!dr)
                return -ENOMEM;
 
diff -u linuxvanilla/drivers/usb/storage/usb.c 
linuxusb/drivers/usb/storage/usb.c
--- linuxvanilla/drivers/usb/storage/usb.c      Mon Sep 10 23:39:45 2001
+++ linuxusb/drivers/usb/storage/usb.c  Wed Sep 19 19:27:04 2001
@@ -495,7 +495,7 @@
        down(&(ss->irq_urb_sem));
 
        /* allocate the URB */
-       ss->irq_urb = usb_alloc_urb(0);
+       ss->irq_urb = usb_alloc_urb(0, GFP_KERNEL);
        if (!ss->irq_urb) {
                up(&(ss->irq_urb_sem));
                US_DEBUGP("couldn't allocate interrupt URB");
@@ -710,7 +710,7 @@
                }

                /* allocate the URB we're going to use */
-               ss->current_urb = usb_alloc_urb(0);
+               ss->current_urb = usb_alloc_urb(0,GFP_KERNEL);
                if (!ss->current_urb) {
                        usb_dec_dev_use(dev);
                        return NULL;
@@ -734,9 +734,10 @@
                        return NULL;
                }
                memset(ss, 0, sizeof(struct us_data));
+               dev->gfp_mask = GFP_NOIO;

                /* allocate the URB we're going to use */
-               ss->current_urb = usb_alloc_urb(0);
+               ss->current_urb = usb_alloc_urb(0,GFP_KERNEL);
                if (!ss->current_urb) {
                        kfree(ss);
                        usb_dec_dev_use(dev);
@@ -759,10 +760,10 @@

                /* copy over the endpoint data */
                if (ep_in)
-                       ss->ep_in = ep_in->bEndpointAddress & 
+                       ss->ep_in = ep_in->bEndpointAddress &
                                USB_ENDPOINT_NUMBER_MASK;
                if (ep_out)
-                       ss->ep_out = ep_out->bEndpointAddress & 
+                       ss->ep_out = ep_out->bEndpointAddress &
                                USB_ENDPOINT_NUMBER_MASK;
                ss->ep_int = ep_int;
 
@@ -796,7 +797,7 @@
                /* copy the GUID we created before */
                memcpy(ss->guid, guid, sizeof(guid));
 
-               /*
+               /*
                 * Set the handler pointers based on the protocol
                 * Again, this data is persistant across reattachments
                 */

_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to