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