vserver 1.9.3
[linux-2.6.git] / drivers / usb / net / kaweth.c
index 09c6bbe..40e921a 100644 (file)
@@ -62,7 +62,7 @@
 #include <asm/semaphore.h>
 #include <asm/byteorder.h>
 
-#define DEBUG
+#undef DEBUG
 
 #ifdef DEBUG
 #define kaweth_dbg(format, arg...) printk(KERN_DEBUG __FILE__ ": " format "\n" ,##arg)
@@ -123,9 +123,10 @@ static int kaweth_probe(
                const struct usb_device_id *id  /* from id_table */
        );
 static void kaweth_disconnect(struct usb_interface *intf);
-int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
-                               struct usb_ctrlrequest *cmd, void *data,
-                               int len, int timeout);
+static int kaweth_internal_control_msg(struct usb_device *usb_dev,
+                                      unsigned int pipe,
+                                      struct usb_ctrlrequest *cmd, void *data,
+                                      int len, int timeout);
 
 /****************************************************************
  *     usb_device_id
@@ -202,7 +203,7 @@ struct kaweth_ethernet_configuration
        __u8 reserved2;
        eth_addr_t hw_addr;
        __u32 statistics_mask;
-       __u16 segment_size;
+       __le16 segment_size;
        __u16 max_multicast_filters;
        __u8 reserved3;
 } __attribute__ ((packed));
@@ -587,11 +588,11 @@ static void kaweth_usb_receive(struct urb *urb, struct pt_regs *regs)
        int count = urb->actual_length;
        int count2 = urb->transfer_buffer_length;
 
-       __u16 pkt_len = le16_to_cpup((u16 *)kaweth->rx_buf);
+       __u16 pkt_len = le16_to_cpup((__le16 *)kaweth->rx_buf);
 
        struct sk_buff *skb;
 
-       if(unlikely(urb->status == -ECONNRESET || urb->status == -ECONNABORTED))
+       if(unlikely(urb->status == -ECONNRESET || urb->status == -ECONNABORTED || urb->status == -ESHUTDOWN))
        /* we are killed - set a flag and wake the disconnect handler */
        {
                kaweth->end = 1;
@@ -667,7 +668,7 @@ static int kaweth_open(struct net_device *net)
                INTBUFFERSIZE,
                int_callback,
                kaweth,
-               HZ/4);
+               8);
        kaweth->irq_urb->transfer_dma = kaweth->intbufferhandle;
        kaweth->irq_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
@@ -736,7 +737,7 @@ static int kaweth_ioctl(struct net_device *net, struct ifreq *rq, int cmd)
 {
        switch (cmd) {
        case SIOCETHTOOL:
-               return netdev_ethtool_ioctl(net, (void __user *)rq->ifr_data);
+               return netdev_ethtool_ioctl(net, rq->ifr_data);
        }
        return -EOPNOTSUPP;
 }
@@ -762,7 +763,7 @@ static void kaweth_usb_transmit_complete(struct urb *urb, struct pt_regs *regs)
 static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
 {
        struct kaweth_device *kaweth = net->priv;
-       u16 *private_header;
+       __le16 *private_header;
 
        int res;
 
@@ -793,7 +794,7 @@ static int kaweth_start_xmit(struct sk_buff *skb, struct net_device *net)
                }
        }
 
-       private_header = (u16 *)__skb_push(skb, 2);
+       private_header = (__le16 *)__skb_push(skb, 2);
        *private_header = cpu_to_le16(skb->len-2);
        kaweth->tx_skb = skb;
 
@@ -1239,20 +1240,21 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
         init_waitqueue_head(&awd.wqh);
         awd.done = 0;
 
-        set_current_state(TASK_INTERRUPTIBLE);
         add_wait_queue(&awd.wqh, &wait);
         urb->context = &awd;
-        status = usb_submit_urb(urb, GFP_ATOMIC);
+        status = usb_submit_urb(urb, GFP_NOIO);
         if (status) {
                 // something went wrong
                 usb_free_urb(urb);
-                set_current_state(TASK_RUNNING);
                 remove_wait_queue(&awd.wqh, &wait);
                 return status;
         }
 
-       while (timeout && !awd.done)
+       set_current_state(TASK_UNINTERRUPTIBLE);
+       while (timeout && !awd.done) {
                timeout = schedule_timeout(timeout);
+               set_current_state(TASK_UNINTERRUPTIBLE);
+       }
 
         set_current_state(TASK_RUNNING);
         remove_wait_queue(&awd.wqh, &wait);
@@ -1277,9 +1279,10 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int* actual_length)
 
 /*-------------------------------------------------------------------*/
 // returns status (negative) or length (positive)
-int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
-                            struct usb_ctrlrequest *cmd, void *data, int len,
-                           int timeout)
+static int kaweth_internal_control_msg(struct usb_device *usb_dev,
+                                      unsigned int pipe,
+                                      struct usb_ctrlrequest *cmd, void *data,
+                                      int len, int timeout)
 {
         struct urb *urb;
         int retv;
@@ -1290,7 +1293,7 @@ int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
                 return -ENOMEM;
 
         usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char*)cmd, data,
-                        len, usb_api_blocking_completion,0);
+                        len, usb_api_blocking_completion, NULL);
 
         retv = usb_start_wait_urb(urb, timeout, &length);
         if (retv < 0) {
@@ -1305,7 +1308,7 @@ int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
 /****************************************************************
  *     kaweth_init
  ****************************************************************/
-int __init kaweth_init(void)
+static int __init kaweth_init(void)
 {
        kaweth_dbg("Driver loading");
        return usb_register(&kaweth_driver);
@@ -1314,7 +1317,7 @@ int __init kaweth_init(void)
 /****************************************************************
  *     kaweth_exit
  ****************************************************************/
-void __exit kaweth_exit(void)
+static void __exit kaweth_exit(void)
 {
        usb_deregister(&kaweth_driver);
 }