<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From: Greg KH &lt;greg@kroah.com&gt;
To: torvalds@transmeta.com
Cc: linux-usb-devel@lists.sourceforge.net
Subject: [PATCH 11 of 16] USB usbkbd driver change

Hi,

Here's a patch against 2.5.3-pre3 for the USB usbkbd driver that
converts it to dynamically allocate its urbs.

thanks,

greg k-h



diff -Nru a/drivers/usb/usbkbd.c b/drivers/usb/usbkbd.c
--- a/drivers/usb/usbkbd.c	Tue Jan 22 12:54:24 2002
+++ b/drivers/usb/usbkbd.c	Tue Jan 22 12:54:24 2002
@@ -73,7 +73,7 @@
 	struct usb_device *usbdev;
 	unsigned char new[8];
 	unsigned char old[8];
-	struct urb irq, led;
+	struct urb *irq, *led;
 	struct usb_ctrlrequest dr;
 	unsigned char leds, newleds;
 	char name[128];
@@ -121,15 +121,15 @@
 		       (!!test_bit(LED_SCROLLL, dev-&gt;led) &lt;&lt; 2) | (!!test_bit(LED_CAPSL,   dev-&gt;led) &lt;&lt; 1) |
 		       (!!test_bit(LED_NUML,    dev-&gt;led));
 
-	if (kbd-&gt;led.status == -EINPROGRESS)
+	if (kbd-&gt;led-&gt;status == -EINPROGRESS)
 		return 0;
 
 	if (kbd-&gt;leds == kbd-&gt;newleds)
 		return 0;
 
 	kbd-&gt;leds = kbd-&gt;newleds;
-	kbd-&gt;led.dev = kbd-&gt;usbdev;
-	if (usb_submit_urb(&amp;kbd-&gt;led))
+	kbd-&gt;led-&gt;dev = kbd-&gt;usbdev;
+	if (usb_submit_urb(kbd-&gt;led))
 		err("usb_submit_urb(leds) failed");
 
 	return 0;
@@ -146,8 +146,8 @@
 		return;
 
 	kbd-&gt;leds = kbd-&gt;newleds;
-	kbd-&gt;led.dev = kbd-&gt;usbdev;
-	if (usb_submit_urb(&amp;kbd-&gt;led))
+	kbd-&gt;led-&gt;dev = kbd-&gt;usbdev;
+	if (usb_submit_urb(kbd-&gt;led))
 		err("usb_submit_urb(leds) failed");
 }
 
@@ -158,8 +158,8 @@
 	if (kbd-&gt;open++)
 		return 0;
 
-	kbd-&gt;irq.dev = kbd-&gt;usbdev;
-	if (usb_submit_urb(&amp;kbd-&gt;irq))
+	kbd-&gt;irq-&gt;dev = kbd-&gt;usbdev;
+	if (usb_submit_urb(kbd-&gt;irq))
 		return -EIO;
 
 	return 0;
@@ -170,7 +170,7 @@
 	struct usb_kbd *kbd = dev-&gt;private;
 
 	if (!--kbd-&gt;open)
-		usb_unlink_urb(&amp;kbd-&gt;irq);
+		usb_unlink_urb(kbd-&gt;irq);
 }
 
 static void *usb_kbd_probe(struct usb_device *dev, unsigned int ifnum,
@@ -201,6 +201,18 @@
 	if (!(kbd = kmalloc(sizeof(struct usb_kbd), GFP_KERNEL))) return NULL;
 	memset(kbd, 0, sizeof(struct usb_kbd));
 
+	kbd-&gt;irq = usb_alloc_urb(0);
+	if (!kbd-&gt;irq) {
+		kfree(kbd);
+		return NULL;
+	}
+	kbd-&gt;led = usb_alloc_urb(0);
+	if (!kbd-&gt;led) {
+		usb_free_urb(kbd-&gt;irq);
+		kfree(kbd);
+		return NULL;
+	}
+
 	kbd-&gt;usbdev = dev;
 
 	kbd-&gt;dev.evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);
@@ -215,7 +227,7 @@
 	kbd-&gt;dev.open = usb_kbd_open;
 	kbd-&gt;dev.close = usb_kbd_close;
 
-	FILL_INT_URB(&amp;kbd-&gt;irq, dev, pipe, kbd-&gt;new, maxp &gt; 8 ? 8 : maxp,
+	FILL_INT_URB(kbd-&gt;irq, dev, pipe, kbd-&gt;new, maxp &gt; 8 ? 8 : maxp,
 		usb_kbd_irq, kbd, endpoint-&gt;bInterval);
 
 	kbd-&gt;dr.bRequestType = USB_TYPE_CLASS | USB_RECIP_INTERFACE;
@@ -248,7 +260,7 @@
 
 	kfree(buf);
 
-	FILL_CONTROL_URB(&amp;kbd-&gt;led, dev, usb_sndctrlpipe(dev, 0),
+	FILL_CONTROL_URB(kbd-&gt;led, dev, usb_sndctrlpipe(dev, 0),
 		(void*) &amp;kbd-&gt;dr, &amp;kbd-&gt;leds, 1, usb_kbd_led, kbd);
 			
 	input_register_device(&amp;kbd-&gt;dev);
@@ -262,8 +274,10 @@
 static void usb_kbd_disconnect(struct usb_device *dev, void *ptr)
 {
 	struct usb_kbd *kbd = ptr;
-	usb_unlink_urb(&amp;kbd-&gt;irq);
+	usb_unlink_urb(kbd-&gt;irq);
 	input_unregister_device(&amp;kbd-&gt;dev);
+	usb_free_urb(kbd-&gt;irq);
+	usb_free_urb(kbd-&gt;led);
 	kfree(kbd);
 }
 

</pre></body></html>