[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-usb-devel
Subject:    [linux-usb-devel] [bk patch][2.4 series] bugfix for serial/ipaq.c
From:       ganesh () vxindia ! veritas ! com (V Ganesh)
Date:       2002-07-27 18:48:12
[Download RAW message or body]


hi,
	this is a bk export -tpatch followed by a bk send -wgzip_uu -r+ -
for ipaq.c for the 2.4 kernel.

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.739   -> 1.740  
#	drivers/usb/serial/ipaq.c	1.11    -> 1.12   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/07/27	ganesh@veritas.com	1.740
# Buggy error handling fixed. Retry the "kickstart" packet much harder -
# this greatly reduces instances of connection failures.
# --------------------------------------------
#
diff -Nru a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
--- a/drivers/usb/serial/ipaq.c	Sat Jul 27 04:07:05 2002
+++ b/drivers/usb/serial/ipaq.c	Sat Jul 27 04:07:05 2002
@@ -9,6 +9,10 @@
  *	the Free Software Foundation; either version 2 of the License, or
  *	(at your option) any later version.
  *
+ * (26/7/2002) ganesh
+ * 	Fixed up broken error handling in ipaq_open. Retry the "kickstart"
+ * 	packet much harder - this drastically reduces connection failures.
+ *
  * (30/4/2002) ganesh
  * 	Added support for the Casio EM500. Completely untested. Thanks
  * 	to info from Nathan <wfilardo@fuse.net>
@@ -57,6 +61,8 @@
 #include "usb-serial.h"
 #include "ipaq.h"
 
+#define KP_RETRIES	100
+
 /*
  * Version Information
  */
@@ -123,6 +129,7 @@
 	struct ipaq_private	*priv;
 	struct ipaq_packet	*pkt;
 	int			i, result = 0;
+	int			retries = KP_RETRIES;
 
 	if (port_paranoia_check(port, __FUNCTION__)) {
 		return -ENODEV;
@@ -142,7 +149,8 @@
 		priv = (struct ipaq_private *)kmalloc(sizeof(struct ipaq_private), GFP_KERNEL);
 		if (priv == NULL) {
 			err("%s - Out of memory", __FUNCTION__);
-			return -ENOMEM;
+			result = -ENOMEM;
+			goto error;
 		}
 		port->private = (void *)priv;
 		priv->active = 0;
@@ -204,34 +212,47 @@
 		result = usb_submit_urb(port->read_urb);
 		if (result) {
 			err("%s - failed submitting read urb, error %d", __FUNCTION__, result);
+			goto cleanup;
 		}
 
 		/*
-		 * Send out two control messages observed in win98 sniffs. Not sure what
-		 * they do.
-		 */
-
-		result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
-				0x1, 0, NULL, 0, 5 * HZ);
-		if (result < 0) {
-			err("%s - failed doing control urb, error %d", __FUNCTION__, result);
+		 * Send out control message observed in win98 sniffs. Not sure what
+		 * it does, but from empirical observations, it seems that the device
+	 	 * will start the chat sequence once one of these messages gets
+	 	 * through. Since this has a reasonably high failure rate, we retry
+	 	 * several times.
+	 	 */
+
+		while (retries--) {
+			result = usb_control_msg(serial->dev,
+					usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
+					0x1, 0, NULL, 0, HZ / 10 + 1);
+			if (result == 0) {
+				break;
+			}
 		}
-		result = usb_control_msg(serial->dev, usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
-				0x1, 0, NULL, 0, 5 * HZ);
 		if (result < 0) {
 			err("%s - failed doing control urb, error %d", __FUNCTION__, result);
+			goto cleanup;
 		}
 	}
-	
+
 	up(&port->sem);
+	return 0;
 	
-	return result;
-
 enomem:
+	err("%s - Out of memory", __FUNCTION__);
+	result = -ENOMEM;
+cleanup:
 	ipaq_destroy_lists(port);
 	kfree(priv);
-	err("%s - Out of memory", __FUNCTION__);
-	return -ENOMEM;
+error:
+	port->private = NULL;
+	port->open_count = 0;
+	port->active = 0;
+	up(&port->sem);
+	MOD_DEC_USE_COUNT;
+	return result;
 }
 
 
This BitKeeper patch contains the following changesets:
+
## Wrapped with gzip_uu ##


begin 664 bkpatch3040
M'XL(`#W/03T``[56VV[;.!!]%K]BD&`721O;)'5+'+CH-G%;HVD2),W+HH!!
M2[1%6!)=DHH3K/??=RBYZ37%7KJ&+-'#X=',.8>$=^'&2C,,%J*6MB"[\%I;
M-PQNI5%.V'ZF*XQ=:8VQ0:$K.>@2!VMMEH/&SGJ\'_7\#U4O"*9>"I<5@,OM
M,&#]\"'B[E=R&%R-7]V<_79%R&@$)X6H%_):.AB-R&SY/&]DV5\:+8J^-HO-
MP_2&4\IH3!D/HX3R#4TIBS=)FHLT"NE1'$<YDXRLI%N*^GDEK%-+T2_KN[6O
M_DL<3E,>TCA.:+IA/#F*R"FP?AI1H'Q`TP%/@49#O.+P*8V'(86NW>>?\0%/
M&?0H>0'_O>83DL&+9K&X!VF,-H#+\Q*)A+FZDWD?KJ0S]^`*"3M+E2VM$\;M
MP$ID2V2M:I#60IA<&N@AD"N4A861PI7W8&3>9-*"JG%1[4=Z#IFN:YDYI6N8
M"U4V1MH^>0.,'26<7'X2A/3^X8<0*BAYAI6AU%^3DAOE[>#-,D"K*5$.U$I\
MZ&<M28SSA!W&84PW+#R,^&:6AK-4ID=I',G9+`F_H\"/(;W&"4?B8[Y):!A'
MK=L>7>+=]W_433XTJG:R%&C).C=B*:V>N[]7?H@O2&*VX2QBM+4HX]\XE/_`
MH6$*/9;\-(^^]':$9@4SHY>R_MJMJ@9?_U2O9/V(:1'D>[;M3(OLX*;-1/F9
M<1_Q:B?H!?3,NKW0>Y>/:_LOC#QA#"("3V"/)P.D&P79WU+LH\%/H,+#_`0R
MX`F9Q$?`R6XNYZJ6\.9R>C5^=S497P>,4O(>>^$Q,!*@#X,@,%B,0K#19XG'
MY)1%/F?B'YRT:;8I\4R&WOC\XNWX[;$/+K337:O'9,)IXE&WT:R4HFY6B,09
MA4.<9BFP".>QSVM9YZ`;YSMP1I=026O%0H*>H5"WR"02ME;UT2'86LWGM@_G
MVH'%#F%="->A*`>YEO8`9H@T-VAP6:V4\21M@83G!A,PTTI96:12N);X7-ZJ
M3)(`/-!:E26T*K1SF4^R\D,C\80$W=VD/REQULJ/Q>*I*IW=0KC"Z&91].%:
M^?Q6LD)8$"B6L+H6,]2M4(OBHU)@A),'L,:!=\,6QDIT+);O5.6U;(,#E"P(
MUH4J)>QMU>KU]N&/+V1!DT^W;$XKN]CK#-][AHT>^,0@\!FVSC-GRI5:R2\R
M@.[C]X[S]LZV*^@=P]\'<'YS=M8.7O\.`T`YGP+;;PV@YKZDKH01@G1%!3-L
M>MDF_.GU]VZ<<,Z_;X_6C)/N\=X/6AMAHXVI@;89ART`'FHA"=!N>SN_6-P7
M%R@[BE+)2IO[G0.83E_>G)^\FUR<3Z>^O&\MNWWK$#'#L,.,("6M@X<D6&GC
M>L]6>&R@-KC.]WW\,>RW+C+<U!Z1/H0%[K];N0TUJ[U?N["5E2_A[<7I]'1\
J,KVY'D]/+F[.WQT_=-95=_SISU%62#P+FFK$DYS.1"S(7^;7?0>%"0``
`
end


-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
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