[prev in list] [next in list] [prev in thread] [next in thread]
List: linux-usb-devel
Subject: [linux-usb-devel] [PATCH] allocate speedtouch send urbs in the USB probe routine
From: Duncan Sands <baldrick () wanadoo ! fr>
Date: 2003-01-31 14:52:56
[Download RAW message or body]
speedtouch: allocate send urbs in udsl_usb_probe rather than in udsl_usb_data_init.
Since this diminishes udsl_usb_data_init down to almost nothing, roll it into the one
place it was used. Get rid of the semaphore Oliver put it - it is no longer needed.
speedtouch.c | 86 ++++++++++++++++++++++++++---------------------------------
1 files changed, 38 insertions(+), 48 deletions(-)
diff -Nru a/drivers/usb/misc/speedtouch.c b/drivers/usb/misc/speedtouch.c
--- a/drivers/usb/misc/speedtouch.c Fri Jan 31 15:49:25 2003
+++ b/drivers/usb/misc/speedtouch.c Fri Jan 31 15:49:25 2003
@@ -165,8 +165,6 @@
static const char udsl_driver_name [] = "Alcatel SpeedTouch USB";
-static DECLARE_MUTEX(udsl_usb_ioctl_lock);
-
#ifdef DEBUG_PACKET
static int udsl_print_packet (const unsigned char *data, int len);
#endif
@@ -731,41 +729,6 @@
return err;
}
-static void udsl_usb_data_init (struct udsl_instance_data *instance)
-{
- int i, succes;
-
- if (instance->firmware_loaded)
- return;
-
- /* set alternate setting 1 on interface 1 */
- usb_set_interface (instance->usb_dev, 1, 2);
-
- PDEBUG ("max packet size on endpoint %d is %d\n", UDSL_ENDPOINT_DATA_OUT,
- usb_maxpacket (instance->usb_dev,
- usb_sndbulkpipe (instance->usb_dev, UDSL_ENDPOINT_DATA_OUT), 0));
-
- skb_queue_head_init (&instance->sndqueue);
-
- udsl_fire_receivers (instance);
-
- for (i = 0, succes = 0; i < UDSL_NUMBER_SND_URBS; i++) {
- instance->send_ctx[i].urb = usb_alloc_urb (0, GFP_KERNEL);
- PDEBUG ("udsl_usb_data_init: send urb allocted address %p\n",
- instance->send_ctx[i].urb);
- if (instance->send_ctx[i].urb)
- succes++;
- }
-
- PDEBUG ("udsl_usb_data_init %d urb%s queued for send\n", succes, (succes != 1) ? "s" : "");
-
- wmb ();
-
- instance->firmware_loaded = 1;
-
- return;
-}
-
/***************************************************************************
*
@@ -776,25 +739,31 @@
static int udsl_usb_ioctl (struct usb_interface *intf, unsigned int code, void *user_data)
{
struct udsl_instance_data *instance = usb_get_intfdata (intf);
- int retval;
- down(&udsl_usb_ioctl_lock);
+ PDEBUG ("udsl_usb_ioctl entered\n");
+
+ if (!instance) {
+ PDEBUG ("NULL instance!\n");
+ return -ENODEV;
+ }
+
switch (code) {
case UDSL_IOCTL_START:
instance->atm_dev->signal = ATM_PHY_SIG_FOUND;
- udsl_usb_data_init (instance);
- retval = 0;
- break;
+ down (&instance->serialize); /* vs self */
+ if (!instance->firmware_loaded) {
+ usb_set_interface (instance->usb_dev, 1, 2);
+ instance->firmware_loaded = 1;
+ }
+ up (&instance->serialize);
+ udsl_fire_receivers (instance);
+ return 0;
case UDSL_IOCTL_STOP:
instance->atm_dev->signal = ATM_PHY_SIG_LOST;
- retval = 0;
- break;
+ return 0;
default:
- retval = -ENOTTY;
- break;
+ return -ENOTTY;
}
- up(&udsl_usb_ioctl_lock);
- return retval;
}
static int udsl_usb_probe (struct usb_interface *intf, const struct usb_device_id *id)
@@ -837,6 +806,8 @@
tasklet_init (&instance->receive_tasklet, udsl_process_receive, (unsigned long) instance);
+ skb_queue_head_init (&instance->sndqueue);
+
/* receive urb init */
for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) {
struct udsl_receiver *rcv = &(instance->all_receivers[i]);
@@ -860,6 +831,18 @@
PDEBUG ("skb->truesize = %d (asked for %d)\n", rcv->skb->truesize, UDSL_RECEIVE_BUFFER_SIZE);
}
+ for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) {
+ struct udsl_usb_send_data_context *snd = &(instance->send_ctx[i]);
+
+ if (!(snd->urb = usb_alloc_urb (0, GFP_KERNEL))) {
+ PDEBUG ("No memory for send urb %d!\n", i);
+ err = -ENOMEM;
+ goto fail_urbs;
+ }
+
+ snd->instance = instance;
+ }
+
/* atm init */
if (!(instance->atm_dev = atm_dev_register (udsl_driver_name, &udsl_atm_devops, -1, 0))) {
PDEBUG ("failed to register ATM device!\n");
@@ -893,6 +876,13 @@
fail_atm:
fail_urbs:
+ for (i = 0; i < UDSL_NUMBER_SND_URBS; i++) {
+ struct udsl_usb_send_data_context *snd = &(instance->send_ctx[i]);
+
+ if (snd->urb)
+ usb_free_urb (snd->urb);
+ }
+
for (i = 0; i < UDSL_NUMBER_RCV_URBS; i++) {
struct udsl_receiver *rcv = &(instance->all_receivers[i]);
-------------------------------------------------------
This SF.NET email is sponsored by:
SourceForge Enterprise Edition + IBM + LinuxWorld = Something 2 See!
http://www.vasoftware.com
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic