更新usb ethernet:
author胡卫国 <hwg@rk29.(none)>
Wed, 10 Aug 2011 03:01:23 +0000 (11:01 +0800)
committer胡卫国 <hwg@rk29.(none)>
Wed, 10 Aug 2011 03:01:23 +0000 (11:01 +0800)
解决ax88772待机唤醒无法连接上问题.
解决dm9620上网时间稍长后导致内存不足使机器卡死问题.

drivers/net/usb/asix.c
drivers/net/usb/axusbnet.c
drivers/net/usb/axusbnet.h
drivers/net/usb/dm9620.c

index f8ebbc07d9e5394ada2dbe9aae583ace494d1529..55d770773f28f05934b24a00aaf3e2e672f52671 100644 (file)
@@ -592,11 +592,8 @@ static int ax88772_suspend (struct usb_interface *intf,
 {
        struct usbnet *dev = usb_get_intfdata(intf);
        u16 *medium;
-       printk("----> %s %d\n",__FUNCTION__,__LINE__);
-       
-       dev->asix_suspend = 1;
-       wait_event_interruptible_timeout(dev->intr_wait, dev->intr_complete == 1, HZ); // wait for intr_complete, then got to otg suspend
 
+#if 0
        medium = kmalloc (2, GFP_ATOMIC);
        if (!medium)
                return axusbnet_suspend (intf, message);
@@ -606,6 +603,8 @@ static int ax88772_suspend (struct usb_interface *intf,
                        (*medium & ~AX88772_MEDIUM_RX_ENABLE), 0, 0, NULL);
 
        kfree (medium);
+#endif
+
        return axusbnet_suspend (intf, message);
 }
 
@@ -621,6 +620,7 @@ static int ax88772b_suspend (struct usb_interface *intf,
        u16 *tmp16;
        u8 *opt;
 
+#if 0
        tmp16 = kmalloc (2, GFP_ATOMIC);
        if (!tmp16)
                return axusbnet_suspend (intf, message);
@@ -655,6 +655,8 @@ static int ax88772b_suspend (struct usb_interface *intf,
        }
 
        kfree (tmp16);
+#endif
+
        return axusbnet_suspend (intf, message);
 }
 
@@ -662,7 +664,7 @@ static int ax88772_resume (struct usb_interface *intf)
 {
        struct usbnet *dev = usb_get_intfdata(intf);
 
-       netif_carrier_off (dev->net);
+       //netif_carrier_off (dev->net);
 
        return axusbnet_resume (intf);
 }
@@ -674,6 +676,7 @@ static int ax88772b_resume (struct usb_interface *intf)
        int ret;
        void *buf;
 
+#if 0
        buf = kmalloc (6, GFP_KERNEL);
 
        /* Initialize MII structure */
@@ -745,6 +748,8 @@ static int ax88772b_resume (struct usb_interface *intf)
 */
        kfree (buf);
        netif_carrier_off (dev->net);
+#endif
+       
        return axusbnet_resume (intf);
 
 err_out:
index bc930c0834df052c03ded9fc4fc9a78f4e2ccce6..2b559c1fe40c384f3fbef739270f11162b2b3214 100755 (executable)
@@ -496,7 +496,7 @@ block:
        if (netif_msg_rx_err (dev))
                devdbg (dev, "no read resubmitted");
 }
-extern void dwc_otg_clear_halt(struct urb *_urb);
+
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
 static void intr_complete (struct urb *urb, struct pt_regs *regs)
 #else
@@ -505,10 +505,6 @@ static void intr_complete (struct urb *urb)
 {
        struct usbnet   *dev = urb->context;
        int             status = urb->status;
-       //devdbg(dev, "status %d running? %d\n", status,netif_running (dev->net));
-
-       dev->intr_complete = 1;
-       wake_up_interruptible(&dev->intr_wait);
 
        switch (status) {
        /* success */
@@ -521,28 +517,19 @@ static void intr_complete (struct urb *urb)
        case -ESHUTDOWN:        /* hardware gone */
                if (netif_msg_ifdown (dev))
                        devdbg (dev, "intr shutdown, code %d", status);
-               dwc_otg_clear_halt(urb);
-               break;
-               
-       //      return;
+               return;
 
        /* NOTE:  not throttling like RX/TX, since this endpoint
         * already polls infrequently
         */
        default:
                devdbg (dev, "intr status %d", status);
-               if(status < 0)
-                       dwc_otg_clear_halt(urb);
                break;
        }
 
-       if (!netif_running (dev->net) || dev->asix_suspend) {
-               dev->asix_suspend = 0;
-               devdbg (dev, "netif_running is false");
+       if (!netif_running (dev->net))
                return;
-       }
 
-       dev->intr_complete = 0;
        memset(urb->transfer_buffer, 0, urb->transfer_buffer_length);
        status = usb_submit_urb (urb, GFP_ATOMIC);
        if (status != 0 && netif_msg_timer (dev))
@@ -873,8 +860,6 @@ printk ("EVENT_TX_HALT\n");
                        if (status != -ESHUTDOWN)
                                netif_wake_queue (dev->net);
                }
-               
-               //dwc_otg_clear_halt(urb);
        }
        if (test_bit (EVENT_RX_HALT, &dev->flags)) {
 printk ("EVENT_RX_HALT\n");
@@ -1258,10 +1243,6 @@ axusbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
         */
        dev->hard_mtu = net->mtu + net->hard_header_len;
 
-       dev->asix_suspend = 0;
-       dev->intr_complete = 1;
-       init_waitqueue_head(&dev->intr_wait);
-
 #if 0
 // dma_supported() is deeply broken on almost all architectures
        // possible with some EHCI controllers
index a644763b1589257875716da41330dc3877b4d2a7..ae4f4fa27457e5d048fdaf1b5e68274468b3312d 100755 (executable)
@@ -73,9 +73,9 @@ struct usbnet {
 
        void                    *priv;  /* point to minidriver private data */
        unsigned char           rx_size;
-       int                     asix_suspend;
-       int                             intr_complete;
-       wait_queue_head_t intr_wait;
+       //int                   asix_suspend;
+       //int                           intr_complete;
+       //wait_queue_head_t intr_wait;
 };
 
 static inline struct usb_driver *driver_of(struct usb_interface *intf)
index 1c735e76b8c2f05bcdfb7714b52c7142aafa52b0..34019e8927c7428c13e7780313b3a86c1e18fa19 100755 (executable)
@@ -624,7 +624,7 @@ static int dm9620_bind(struct usbnet *dev, struct usb_interface *intf)
 #ifdef RK2818   //harris 2010.12.27
        dev->rx_urb_size = 8912; // ftp fail fixed
 #else
-       dev->rx_urb_size = dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD+1; // ftp fail fixed
+       dev->rx_urb_size = 2048;//dev->net->mtu + ETH_HLEN + DM_RX_OVERHEAD+1; // ftp fail fixed
 #endif
 
        dev->mii.dev = dev->net;