<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">ChangeSet 1.1264, 2003/06/18 17:21:20-07:00, baldrick@wanadoo.fr

[PATCH] USB speedtouch: parametrize the module


 drivers/usb/speedtouch.c |  108 +++++++++++++++++++++++++++++++----------------
 1 files changed, 72 insertions(+), 36 deletions(-)


diff -Nru a/drivers/usb/speedtouch.c b/drivers/usb/speedtouch.c
--- a/drivers/usb/speedtouch.c	Wed Jun 18 17:34:39 2003
+++ b/drivers/usb/speedtouch.c	Wed Jun 18 17:34:39 2003
@@ -102,12 +102,43 @@
 #define SPEEDTOUCH_VENDORID		0x06b9
 #define SPEEDTOUCH_PRODUCTID		0x4061
 
-#define UDSL_NUM_RCV_URBS		1
-#define UDSL_NUM_SND_URBS		1
-#define UDSL_NUM_RCV_BUFS		(2*UDSL_NUM_RCV_URBS)
-#define UDSL_NUM_SND_BUFS		(2*UDSL_NUM_SND_URBS)
-#define UDSL_RCV_BUF_SIZE		32 /* ATM cells */
-#define UDSL_SND_BUF_SIZE		64 /* ATM cells */
+#define UDSL_MAX_RCV_URBS		4
+#define UDSL_MAX_SND_URBS		4
+#define UDSL_MAX_RCV_BUFS		8
+#define UDSL_MAX_SND_BUFS		8
+#define UDSL_MAX_RCV_BUF_SIZE		1024 /* ATM cells */
+#define UDSL_MAX_SND_BUF_SIZE		1024 /* ATM cells */
+#define UDSL_DEFAULT_RCV_URBS		1
+#define UDSL_DEFAULT_SND_URBS		1
+#define UDSL_DEFAULT_RCV_BUFS		2
+#define UDSL_DEFAULT_SND_BUFS		2
+#define UDSL_DEFAULT_RCV_BUF_SIZE	64 /* ATM cells */
+#define UDSL_DEFAULT_SND_BUF_SIZE	64 /* ATM cells */
+
+static unsigned int num_rcv_urbs = UDSL_DEFAULT_RCV_URBS;
+static unsigned int num_snd_urbs = UDSL_DEFAULT_SND_URBS;
+static unsigned int num_rcv_bufs = UDSL_DEFAULT_RCV_BUFS;
+static unsigned int num_snd_bufs = UDSL_DEFAULT_SND_BUFS;
+static unsigned int rcv_buf_size = UDSL_DEFAULT_RCV_BUF_SIZE;
+static unsigned int snd_buf_size = UDSL_DEFAULT_SND_BUF_SIZE;
+
+MODULE_PARM (num_rcv_urbs, "i");
+MODULE_PARM_DESC (num_rcv_urbs, "Number of urbs used for reception (range: 0-" __MODULE_STRING (UDSL_MAX_RCV_URBS) ", default: " __MODULE_STRING (UDSL_DEFAULT_RCV_URBS) ")");
+
+MODULE_PARM (num_snd_urbs, "i");
+MODULE_PARM_DESC (num_snd_urbs, "Number of urbs used for transmission (range: 0-" __MODULE_STRING (UDSL_MAX_SND_URBS) ", default: " __MODULE_STRING (UDSL_DEFAULT_SND_URBS) ")");
+
+MODULE_PARM (num_rcv_bufs, "i");
+MODULE_PARM_DESC (num_rcv_bufs, "Number of buffers used for reception (range: 0-" __MODULE_STRING (UDSL_MAX_RCV_BUFS) ", default: " __MODULE_STRING (UDSL_DEFAULT_RCV_BUFS) ")");
+
+MODULE_PARM (num_snd_bufs, "i");
+MODULE_PARM_DESC (num_snd_bufs, "Number of buffers used for transmission (range: 0-" __MODULE_STRING (UDSL_MAX_SND_BUFS) ", default: " __MODULE_STRING (UDSL_DEFAULT_SND_BUFS) ")");
+
+MODULE_PARM (rcv_buf_size, "i");
+MODULE_PARM_DESC (rcv_buf_size, "Size of the buffers used for reception (range: 0-" __MODULE_STRING (UDSL_MAX_RCV_BUF_SIZE) ", default: " __MODULE_STRING (UDSL_DEFAULT_RCV_BUF_SIZE) ")");
+
+MODULE_PARM (snd_buf_size, "i");
+MODULE_PARM_DESC (snd_buf_size, "Size of the buffers used for transmission (range: 0-" __MODULE_STRING (UDSL_MAX_SND_BUF_SIZE) ", default: " __MODULE_STRING (UDSL_DEFAULT_SND_BUF_SIZE) ")");
 
 #define UDSL_IOCTL_LINE_UP		1
 #define UDSL_IOCTL_LINE_DOWN		2
@@ -196,8 +227,8 @@
 	struct list_head vcc_list;
 
 	/* receive */
-	struct udsl_receiver receivers [UDSL_NUM_RCV_URBS];
-	struct udsl_receive_buffer receive_buffers [UDSL_NUM_RCV_BUFS];
+	struct udsl_receiver receivers [UDSL_MAX_RCV_URBS];
+	struct udsl_receive_buffer receive_buffers [UDSL_MAX_RCV_BUFS];
 
 	spinlock_t receive_lock;
 	struct list_head spare_receivers;
@@ -207,8 +238,8 @@
 	struct list_head spare_receive_buffers;
 
 	/* send */
-	struct udsl_sender senders [UDSL_NUM_SND_URBS];
-	struct udsl_send_buffer send_buffers [UDSL_NUM_SND_BUFS];
+	struct udsl_sender senders [UDSL_MAX_SND_URBS];
+	struct udsl_send_buffer send_buffers [UDSL_MAX_SND_BUFS];
 
 	struct sk_buff_head sndqueue;
 
@@ -503,7 +534,7 @@
 
 	vdbg ("udsl_complete_receive: urb 0x%p, status %d, actual_length %d, filled_cells %u, rcv 0x%p, buf 0x%p", urb, urb-&gt;status, urb-&gt;actual_length, buf-&gt;filled_cells, rcv, buf);
 
-	BUG_ON (buf-&gt;filled_cells &gt; UDSL_RCV_BUF_SIZE);
+	BUG_ON (buf-&gt;filled_cells &gt; rcv_buf_size);
 
 	/* may not be in_interrupt() */
 	spin_lock_irqsave (&amp;instance-&gt;receive_lock, flags);
@@ -541,7 +572,7 @@
 			       instance-&gt;usb_dev,
 			       usb_rcvbulkpipe (instance-&gt;usb_dev, UDSL_ENDPOINT_DATA_IN),
 			       buf-&gt;base,
-			       UDSL_RCV_BUF_SIZE * ATM_CELL_SIZE,
+			       rcv_buf_size * ATM_CELL_SIZE,
 			       udsl_complete_receive,
 			       rcv);
 		rcv-&gt;urb-&gt;transfer_flags |= USB_QUEUE_BULK;
@@ -627,12 +658,12 @@
 			       instance-&gt;usb_dev,
 			       usb_sndbulkpipe (instance-&gt;usb_dev, UDSL_ENDPOINT_DATA_OUT),
 			       buf-&gt;base,
-			       (UDSL_SND_BUF_SIZE - buf-&gt;free_cells) * ATM_CELL_SIZE,
+			       (snd_buf_size - buf-&gt;free_cells) * ATM_CELL_SIZE,
 			       udsl_complete_send,
 			       snd);
 		snd-&gt;urb-&gt;transfer_flags |= USB_QUEUE_BULK;
 
-		vdbg ("udsl_process_send: submitting urb 0x%p (%d cells), snd 0x%p, buf 0x%p", snd-&gt;urb, UDSL_SND_BUF_SIZE - buf-&gt;free_cells, snd, buf);
+		vdbg ("udsl_process_send: submitting urb 0x%p (%d cells), snd 0x%p, buf 0x%p", snd-&gt;urb, snd_buf_size - buf-&gt;free_cells, snd, buf);
 
 		if ((err = usb_submit_urb(snd-&gt;urb)) &lt; 0) {
 			dbg ("udsl_process_send: urb submission failed (%d)!", err);
@@ -664,7 +695,7 @@
 		spin_unlock_irq (&amp;instance-&gt;send_lock);
 
 		buf-&gt;free_start = buf-&gt;base;
-		buf-&gt;free_cells = UDSL_SND_BUF_SIZE;
+		buf-&gt;free_cells = snd_buf_size;
 
 		instance-&gt;current_buffer = buf;
 	}
@@ -678,7 +709,7 @@
 		instance-&gt;current_buffer = NULL;
 	}
 
-	vdbg ("udsl_process_send: buffer contains %d cells, %d left", UDSL_SND_BUF_SIZE - buf-&gt;free_cells, buf-&gt;free_cells);
+	vdbg ("udsl_process_send: buffer contains %d cells, %d left", snd_buf_size - buf-&gt;free_cells, buf-&gt;free_cells);
 
 	if (!UDSL_SKB (skb)-&gt;num_cells) {
 		struct atm_vcc *vcc = UDSL_SKB (skb)-&gt;atm_data.vcc;
@@ -1040,7 +1071,7 @@
 	INIT_LIST_HEAD (&amp;instance-&gt;filled_send_buffers);
 
 	/* receive init */
-	for (i = 0; i &lt; UDSL_NUM_RCV_URBS; i++) {
+	for (i = 0; i &lt; num_rcv_urbs; i++) {
 		struct udsl_receiver *rcv = &amp;(instance-&gt;receivers [i]);
 
 		if (!(rcv-&gt;urb = usb_alloc_urb (0))) {
@@ -1053,10 +1084,10 @@
 		list_add (&amp;rcv-&gt;list, &amp;instance-&gt;spare_receivers);
 	}
 
-	for (i = 0; i &lt; UDSL_NUM_RCV_BUFS; i++) {
+	for (i = 0; i &lt; num_rcv_bufs; i++) {
 		struct udsl_receive_buffer *buf = &amp;(instance-&gt;receive_buffers [i]);
 
-		if (!(buf-&gt;base = kmalloc (UDSL_RCV_BUF_SIZE * ATM_CELL_SIZE, GFP_KERNEL))) {
+		if (!(buf-&gt;base = kmalloc (rcv_buf_size * ATM_CELL_SIZE, GFP_KERNEL))) {
 			dbg ("udsl_usb_probe: no memory for receive buffer %d!", i);
 			goto fail;
 		}
@@ -1065,7 +1096,7 @@
 	}
 
 	/* send init */
-	for (i = 0; i &lt; UDSL_NUM_SND_URBS; i++) {
+	for (i = 0; i &lt; num_snd_urbs; i++) {
 		struct udsl_sender *snd = &amp;(instance-&gt;senders [i]);
 
 		if (!(snd-&gt;urb = usb_alloc_urb (0))) {
@@ -1078,10 +1109,10 @@
 		list_add (&amp;snd-&gt;list, &amp;instance-&gt;spare_senders);
 	}
 
-	for (i = 0; i &lt; UDSL_NUM_SND_BUFS; i++) {
+	for (i = 0; i &lt; num_snd_bufs; i++) {
 		struct udsl_send_buffer *buf = &amp;(instance-&gt;send_buffers [i]);
 
-		if (!(buf-&gt;base = kmalloc (UDSL_SND_BUF_SIZE * ATM_CELL_SIZE, GFP_KERNEL))) {
+		if (!(buf-&gt;base = kmalloc (snd_buf_size * ATM_CELL_SIZE, GFP_KERNEL))) {
 			dbg ("udsl_usb_probe: no memory for send buffer %d!", i);
 			goto fail;
 		}
@@ -1138,16 +1169,16 @@
 	return instance;
 
 fail:
-	for (i = 0; i &lt; UDSL_NUM_SND_BUFS; i++)
+	for (i = 0; i &lt; num_snd_bufs; i++)
 		kfree (instance-&gt;send_buffers [i].base);
 
-	for (i = 0; i &lt; UDSL_NUM_SND_URBS; i++)
+	for (i = 0; i &lt; num_snd_urbs; i++)
 		usb_free_urb (instance-&gt;senders [i].urb);
 
-	for (i = 0; i &lt; UDSL_NUM_RCV_BUFS; i++)
+	for (i = 0; i &lt; num_rcv_bufs; i++)
 		kfree (instance-&gt;receive_buffers [i].base);
 
-	for (i = 0; i &lt; UDSL_NUM_RCV_URBS; i++)
+	for (i = 0; i &lt; num_rcv_urbs; i++)
 		usb_free_urb (instance-&gt;receivers [i].urb);
 
 	kfree (instance);
@@ -1172,7 +1203,7 @@
 	/* receive finalize */
 	tasklet_disable (&amp;instance-&gt;receive_tasklet);
 
-	for (i = 0; i &lt; UDSL_NUM_RCV_URBS; i++)
+	for (i = 0; i &lt; num_rcv_urbs; i++)
 		if ((result = usb_unlink_urb (instance-&gt;receivers [i].urb)) &lt; 0)
 			dbg ("udsl_usb_disconnect: usb_unlink_urb on receive urb %d returned %d", i, result);
 
@@ -1181,13 +1212,13 @@
 		count = 0;
 		spin_lock_irq (&amp;instance-&gt;receive_lock);
 		list_for_each (pos, &amp;instance-&gt;spare_receivers)
-			if (++count &gt; UDSL_NUM_RCV_URBS)
+			if (++count &gt; num_rcv_urbs)
 				panic (__FILE__ ": memory corruption detected at line %d!\n", __LINE__);
 		spin_unlock_irq (&amp;instance-&gt;receive_lock);
 
 		dbg ("udsl_usb_disconnect: found %u spare receivers", count);
 
-		if (count == UDSL_NUM_RCV_URBS)
+		if (count == num_rcv_urbs)
 			break;
 
 		set_current_state (TASK_RUNNING);
@@ -1200,16 +1231,16 @@
 
 	tasklet_enable (&amp;instance-&gt;receive_tasklet);
 
-	for (i = 0; i &lt; UDSL_NUM_RCV_URBS; i++)
+	for (i = 0; i &lt; num_rcv_urbs; i++)
 		usb_free_urb (instance-&gt;receivers [i].urb);
 
-	for (i = 0; i &lt; UDSL_NUM_RCV_BUFS; i++)
+	for (i = 0; i &lt; num_rcv_bufs; i++)
 		kfree (instance-&gt;receive_buffers [i].base);
 
 	/* send finalize */
 	tasklet_disable (&amp;instance-&gt;send_tasklet);
 
-	for (i = 0; i &lt; UDSL_NUM_SND_URBS; i++)
+	for (i = 0; i &lt; num_snd_urbs; i++)
 		if ((result = usb_unlink_urb (instance-&gt;senders [i].urb)) &lt; 0)
 			dbg ("udsl_usb_disconnect: usb_unlink_urb on send urb %d returned %d", i, result);
 
@@ -1218,13 +1249,13 @@
 		count = 0;
 		spin_lock_irq (&amp;instance-&gt;send_lock);
 		list_for_each (pos, &amp;instance-&gt;spare_senders)
-			if (++count &gt; UDSL_NUM_SND_URBS)
+			if (++count &gt; num_snd_urbs)
 				panic (__FILE__ ": memory corruption detected at line %d!\n", __LINE__);
 		spin_unlock_irq (&amp;instance-&gt;send_lock);
 
 		dbg ("udsl_usb_disconnect: found %u spare senders", count);
 
-		if (count == UDSL_NUM_SND_URBS)
+		if (count == num_snd_urbs)
 			break;
 
 		set_current_state (TASK_RUNNING);
@@ -1238,10 +1269,10 @@
 
 	tasklet_enable (&amp;instance-&gt;send_tasklet);
 
-	for (i = 0; i &lt; UDSL_NUM_SND_URBS; i++)
+	for (i = 0; i &lt; num_snd_urbs; i++)
 		usb_free_urb (instance-&gt;senders [i].urb);
 
-	for (i = 0; i &lt; UDSL_NUM_SND_BUFS; i++)
+	for (i = 0; i &lt; num_snd_bufs; i++)
 		kfree (instance-&gt;send_buffers [i].base);
 
 	wmb ();
@@ -1266,6 +1297,11 @@
 		printk (KERN_ERR __FILE__ ": unusable with this kernel!\n");
 		return -EIO;
 	}
+
+	if ((num_rcv_urbs &gt; UDSL_MAX_RCV_URBS) || (num_snd_urbs &gt; UDSL_MAX_SND_URBS) ||
+	    (num_rcv_bufs &gt; UDSL_MAX_RCV_BUFS) || (num_snd_bufs &gt; UDSL_MAX_SND_BUFS) ||
+	    (rcv_buf_size &gt; UDSL_MAX_RCV_BUF_SIZE) || (snd_buf_size &gt; UDSL_MAX_SND_BUF_SIZE))
+		return -EINVAL;
 
 	return usb_register (&amp;udsl_usb_driver);
 }
</pre></body></html>