hi,
this patch fixes the usb ipaq driver so that it submits urbs
outside spinlocks. btw the digi_accelport driver has several instances of
this bug.
thanks,
ganesh
# This is a BitKeeper generated patch for the following project:
# Project Name: greg k-h's linux 2.4 USB kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
# ChangeSet 1.635 -> 1.636
# drivers/usb/serial/ipaq.c 1.4 -> 1.5
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/03/20 [EMAIL PROTECTED] 1.636
# Don't submit urbs while holding spinlocks.
# --------------------------------------------
#
diff -Nru a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
--- a/drivers/usb/serial/ipaq.c Wed Mar 20 06:40:36 2002
+++ b/drivers/usb/serial/ipaq.c Wed Mar 20 06:40:36 2002
@@ -9,6 +9,10 @@
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
+ * (19/3/2002) ganesh
+ * Don't submit urbs while holding spinlocks. Thanks to Greg for pointing
+ * this out.
+ *
* (8/3/2002) ganesh
* The ipaq sometimes emits a '\0' before the CLIENT string. At this
* point of time, the ppp ldisc is not yet attached to the tty, so
@@ -65,7 +69,7 @@
int count);
static int ipaq_write_bulk(struct usb_serial_port *port, int from_user, const
unsigned char *buf,
int count);
-static int ipaq_write_flush(struct usb_serial_port *port);
+static void ipaq_write_gather(struct usb_serial_port *port);
static void ipaq_read_bulk_callback (struct urb *urb);
static void ipaq_write_bulk_callback(struct urb *urb);
static int ipaq_write_room(struct usb_serial_port *port);
@@ -382,17 +386,23 @@
priv->queue_len += count;
if (priv->active == 0) {
priv->active = 1;
- result = ipaq_write_flush(port);
+ ipaq_write_gather(port);
+ spin_unlock_irqrestore(&write_list_lock, flags);
+ result = usb_submit_urb(port->write_urb);
+ if (result) {
+ err(__FUNCTION__ " - failed submitting write urb, error %d",
+result);
+ }
+ } else {
+ spin_unlock_irqrestore(&write_list_lock, flags);
}
- spin_unlock_irqrestore(&write_list_lock, flags);
return result;
}
-static int ipaq_write_flush(struct usb_serial_port *port)
+static void ipaq_write_gather(struct usb_serial_port *port)
{
struct ipaq_private *priv = (struct ipaq_private *)port->private;
struct usb_serial *serial = port->serial;
- int count, room, result;
+ int count, room;
struct ipaq_packet *pkt;
struct urb *urb = port->write_urb;
struct list_head *tmp;
@@ -400,7 +410,7 @@
if (urb->status == -EINPROGRESS) {
/* Should never happen */
err(__FUNCTION__ " - flushing while urb is active !");
- return -EAGAIN;
+ return;
}
room = URBDATA_SIZE;
for (tmp = priv->queue.next; tmp != &priv->queue;) {
@@ -427,11 +437,7 @@
usb_sndbulkpipe(serial->dev, port->bulk_out_endpointAddress),
port->write_urb->transfer_buffer, count,
ipaq_write_bulk_callback,
port);
- result = usb_submit_urb(urb);
- if (result) {
- err(__FUNCTION__ " - failed submitting write urb, error %d", result);
- }
- return result;
+ return;
}
static void ipaq_write_bulk_callback(struct urb *urb)
@@ -439,6 +445,7 @@
struct usb_serial_port *port = (struct usb_serial_port *)urb->context;
struct ipaq_private *priv = (struct ipaq_private *)port->private;
unsigned long flags;
+ int result;
if (port_paranoia_check (port, __FUNCTION__)) {
return;
@@ -452,11 +459,16 @@
spin_lock_irqsave(&write_list_lock, flags);
if (!list_empty(&priv->queue)) {
- ipaq_write_flush(port);
+ ipaq_write_gather(port);
+ spin_unlock_irqrestore(&write_list_lock, flags);
+ result = usb_submit_urb(port->write_urb);
+ if (result) {
+ err(__FUNCTION__ " - failed submitting write urb, error %d",
+result);
+ }
} else {
priv->active = 0;
+ spin_unlock_irqrestore(&write_list_lock, flags);
}
- spin_unlock_irqrestore(&write_list_lock, flags);
queue_task(&port->tqueue, &tq_immediate);
mark_bh(IMMEDIATE_BH);
This BitKeeper patch contains the following changesets:
+
## Wrapped with gzip_uu ##
begin 664 bkpatch1362
M'XL(`)CAESP``]V586_;-A"&/XN_XM!BF]/&$BF*DN7!1;IX[8(.;9`UGP59
MHBW!LNB25-*A[G_?D4I3;$.V9D%18(:A`ZF[EW?/G:3'<&FDG@>;LI>F(8_A
M%V7L/+##>ZOVX=7[MJ_;,KR2NK6E"2NU0Y<+I=`E:M1.1F-<=*WT-AK,:AJ'
MR=0MVGY#T/6\M%4#&&[F`0OY[8[]?2_GP<7/+R]_?7Y!R&(!ITW9;^1OTL)B
M05;;DWJ07;C5JFQ"I3>'V]N'F%)&!64Q3U(:'VA&F3BD65UF":>Y$$G-)".]
MW"FCUO;$[*HJK''5AWWW9YF8<B98QO(D/]`XY2E9`@O1`HTCRJ.8`DWGG,U%
M_I2*.:<P5GMR-QUXRF!*R4_P\`I.205+U?]@P0RK76MAT"L#UTW;26A45R-A
M,/NV[U2U-2%Y!2B6D_//(,GTGC]":$G),]B[%OTU_5JWKHVNR1%.3%MV4;LO
MWX65+X?%<<IF@@MZ8'R6Q(=5QE>9S/),)'*U2OF_H_OG$[!7'AL3KE>S+/5#
M<V>(&Z*O40;9:+DY&>6^)&>G&.<B._`,V^/G2SQDNF(!4\:_S7QYZF]@JJ_]
M'^?E_.X&_(?A.V,,$@)/8,+RR/&A\=$-$[<;?'FR\!99;`U8!2^Q7[!6&O:J
M[:U[*SDIV[0&U&!#7)%E.@-&SOS5V-*V%5RIM@972'&-\&6Q*6TC]<18/51X
MMED58['%7FD+3]SUZ$>RY#/AE)R9D2#XN\"-8Q"X7(O!IUNT^IV6QBHM)]^/
MWEUK;.'N'<.Z*S?&AZ#/T.';<3S>4RB0@M></AL#<>U]VS5,1O\C^(#K0&H]
M*8H7EZ]/WYZ]>5T4\`BFL"X17WU#U+$!K^+8'@-&(+7OZD?'<*/DA#^2X"/(
MSD@O>^\JD%"&A)8\9QZ4-P]@[I1&Y-X$V&(LME)#;S%MI79X9$*Y\QB-PV@'
MW;M]?.($[O/$[7_:/DL2]EEIK-PY"W^,,^G_M;-87>81W;^MB<@Q\O;K7C42
4'\-AMR@3EF0LE>0/*WCK&F<(````
`
end
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel