mirror of
https://github.com/torvalds/linux.git
synced 2026-06-08 14:42:37 +02:00
更新usb ethernet:
解决ax88772待机唤醒无法连接上问题. 解决dm9620上网时间稍长后导致内存不足使机器卡死问题.
This commit is contained in:
parent
8540a6d3d9
commit
e8c05e1f0d
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -496,7 +496,7 @@ static void rx_complete (struct urb *urb)
|
|||
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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user