kaweth: Clean up code
authorLarry Finger <Larry.Finger@lwfinger.net>
Thu, 9 Apr 2009 07:11:55 +0000 (07:11 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 13 Apr 2009 22:44:35 +0000 (15:44 -0700)
The driver kaweth yields a -EBUSY error when starting, and a -ETIME
error when shutting down. These errors are avoided, and the RX status
is further checked for other potential errors.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/kaweth.c

index 3d0d0b0..e013147 100644 (file)
@@ -31,7 +31,6 @@
  ****************************************************************/
 
 /* TODO:
- * Fix in_interrupt() problem
  * Develop test procedures for USB net interfaces
  * Run test procedures
  * Fix bugs from previous two steps
@@ -606,14 +605,30 @@ static void kaweth_usb_receive(struct urb *urb)
 
        struct sk_buff *skb;
 
-       if(unlikely(status == -ECONNRESET || status == -ESHUTDOWN))
-       /* we are killed - set a flag and wake the disconnect handler */
-       {
+       if (unlikely(status == -EPIPE)) {
+               kaweth->stats.rx_errors++;
                kaweth->end = 1;
                wake_up(&kaweth->term_wait);
+               dbg("Status was -EPIPE.");
                return;
        }
-
+       if (unlikely(status == -ECONNRESET || status == -ESHUTDOWN)) {
+               /* we are killed - set a flag and wake the disconnect handler */
+               kaweth->end = 1;
+               wake_up(&kaweth->term_wait);
+               dbg("Status was -ECONNRESET or -ESHUTDOWN.");
+               return;
+       }
+       if (unlikely(status == -EPROTO || status == -ETIME ||
+                    status == -EILSEQ)) {
+               kaweth->stats.rx_errors++;
+               dbg("Status was -EPROTO, -ETIME, or -EILSEQ.");
+               return;
+       }
+       if (unlikely(status == -EOVERFLOW)) {
+               kaweth->stats.rx_errors++;
+               dbg("Status was -EOVERFLOW.");
+       }
        spin_lock(&kaweth->device_lock);
        if (IS_BLOCKED(kaweth->status)) {
                spin_unlock(&kaweth->device_lock);
@@ -883,13 +898,16 @@ static void kaweth_set_rx_mode(struct net_device *net)
  ****************************************************************/
 static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth)
 {
+       int result;
        __u16 packet_filter_bitmap = kaweth->packet_filter_bitmap;
+
        kaweth->packet_filter_bitmap = 0;
        if (packet_filter_bitmap == 0)
                return;
 
-       {
-       int result;
+       if (in_interrupt())
+               return;
+
        result = kaweth_control(kaweth,
                                usb_sndctrlpipe(kaweth->dev, 0),
                                KAWETH_COMMAND_SET_PACKET_FILTER,
@@ -906,7 +924,6 @@ static void kaweth_async_set_rx_mode(struct kaweth_device *kaweth)
        else {
                dbg("Set Rx mode to %d", packet_filter_bitmap);
        }
-       }
 }
 
 /****************************************************************