usbnet.c (f6cec0ae58c17522a7bc4e2f39dae19f199ab534) | usbnet.c (dacb397511289154a68dea1f4bd674c660161c23) |
---|---|
1/* 2 * USB Network driver infrastructure 3 * Copyright (C) 2000-2005 by David Brownell 4 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or --- 301 unchanged lines hidden (view full) --- 310 netdev_dbg(dev->net, "kevent %d scheduled\n", work); 311} 312EXPORT_SYMBOL_GPL(usbnet_defer_kevent); 313 314/*-------------------------------------------------------------------------*/ 315 316static void rx_complete (struct urb *urb); 317 | 1/* 2 * USB Network driver infrastructure 3 * Copyright (C) 2000-2005 by David Brownell 4 * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or --- 301 unchanged lines hidden (view full) --- 310 netdev_dbg(dev->net, "kevent %d scheduled\n", work); 311} 312EXPORT_SYMBOL_GPL(usbnet_defer_kevent); 313 314/*-------------------------------------------------------------------------*/ 315 316static void rx_complete (struct urb *urb); 317 |
318static void rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) | 318static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) |
319{ 320 struct sk_buff *skb; 321 struct skb_data *entry; 322 int retval = 0; 323 unsigned long lockflags; 324 size_t size = dev->rx_urb_size; 325 326 if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { 327 netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); 328 usbnet_defer_kevent (dev, EVENT_RX_MEMORY); 329 usb_free_urb (urb); | 319{ 320 struct sk_buff *skb; 321 struct skb_data *entry; 322 int retval = 0; 323 unsigned long lockflags; 324 size_t size = dev->rx_urb_size; 325 326 if ((skb = alloc_skb (size + NET_IP_ALIGN, flags)) == NULL) { 327 netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); 328 usbnet_defer_kevent (dev, EVENT_RX_MEMORY); 329 usb_free_urb (urb); |
330 return; | 330 return -ENOMEM; |
331 } 332 skb_reserve (skb, NET_IP_ALIGN); 333 334 entry = (struct skb_data *) skb->cb; 335 entry->urb = urb; 336 entry->dev = dev; 337 entry->state = rx_start; 338 entry->length = 0; --- 13 unchanged lines hidden (view full) --- 352 break; 353 case -ENOMEM: 354 usbnet_defer_kevent (dev, EVENT_RX_MEMORY); 355 break; 356 case -ENODEV: 357 netif_dbg(dev, ifdown, dev->net, "device gone\n"); 358 netif_device_detach (dev->net); 359 break; | 331 } 332 skb_reserve (skb, NET_IP_ALIGN); 333 334 entry = (struct skb_data *) skb->cb; 335 entry->urb = urb; 336 entry->dev = dev; 337 entry->state = rx_start; 338 entry->length = 0; --- 13 unchanged lines hidden (view full) --- 352 break; 353 case -ENOMEM: 354 usbnet_defer_kevent (dev, EVENT_RX_MEMORY); 355 break; 356 case -ENODEV: 357 netif_dbg(dev, ifdown, dev->net, "device gone\n"); 358 netif_device_detach (dev->net); 359 break; |
360 case -EHOSTUNREACH: 361 retval = -ENOLINK; 362 break; |
|
360 default: 361 netif_dbg(dev, rx_err, dev->net, 362 "rx submit, %d\n", retval); 363 tasklet_schedule (&dev->bh); 364 break; 365 case 0: 366 __skb_queue_tail (&dev->rxq, skb); 367 } 368 } else { 369 netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); 370 retval = -ENOLINK; 371 } 372 spin_unlock_irqrestore (&dev->rxq.lock, lockflags); 373 if (retval) { 374 dev_kfree_skb_any (skb); 375 usb_free_urb (urb); 376 } | 363 default: 364 netif_dbg(dev, rx_err, dev->net, 365 "rx submit, %d\n", retval); 366 tasklet_schedule (&dev->bh); 367 break; 368 case 0: 369 __skb_queue_tail (&dev->rxq, skb); 370 } 371 } else { 372 netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); 373 retval = -ENOLINK; 374 } 375 spin_unlock_irqrestore (&dev->rxq.lock, lockflags); 376 if (retval) { 377 dev_kfree_skb_any (skb); 378 usb_free_urb (urb); 379 } |
380 return retval; |
|
377} 378 379 380/*-------------------------------------------------------------------------*/ 381 382static inline void rx_process (struct usbnet *dev, struct sk_buff *skb) 383{ 384 if (dev->driver_info->rx_fixup && --- 522 unchanged lines hidden (view full) --- 907 clear_bit (EVENT_RX_HALT, &dev->flags); 908 tasklet_schedule (&dev->bh); 909 } 910 } 911 912 /* tasklet could resubmit itself forever if memory is tight */ 913 if (test_bit (EVENT_RX_MEMORY, &dev->flags)) { 914 struct urb *urb = NULL; | 381} 382 383 384/*-------------------------------------------------------------------------*/ 385 386static inline void rx_process (struct usbnet *dev, struct sk_buff *skb) 387{ 388 if (dev->driver_info->rx_fixup && --- 522 unchanged lines hidden (view full) --- 911 clear_bit (EVENT_RX_HALT, &dev->flags); 912 tasklet_schedule (&dev->bh); 913 } 914 } 915 916 /* tasklet could resubmit itself forever if memory is tight */ 917 if (test_bit (EVENT_RX_MEMORY, &dev->flags)) { 918 struct urb *urb = NULL; |
919 int resched = 1; |
|
915 916 if (netif_running (dev->net)) 917 urb = usb_alloc_urb (0, GFP_KERNEL); 918 else 919 clear_bit (EVENT_RX_MEMORY, &dev->flags); 920 if (urb != NULL) { 921 clear_bit (EVENT_RX_MEMORY, &dev->flags); 922 status = usb_autopm_get_interface(dev->intf); 923 if (status < 0) 924 goto fail_lowmem; | 920 921 if (netif_running (dev->net)) 922 urb = usb_alloc_urb (0, GFP_KERNEL); 923 else 924 clear_bit (EVENT_RX_MEMORY, &dev->flags); 925 if (urb != NULL) { 926 clear_bit (EVENT_RX_MEMORY, &dev->flags); 927 status = usb_autopm_get_interface(dev->intf); 928 if (status < 0) 929 goto fail_lowmem; |
925 rx_submit (dev, urb, GFP_KERNEL); | 930 if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK) 931 resched = 0; |
926 usb_autopm_put_interface(dev->intf); 927fail_lowmem: | 932 usb_autopm_put_interface(dev->intf); 933fail_lowmem: |
928 tasklet_schedule (&dev->bh); | 934 if (resched) 935 tasklet_schedule (&dev->bh); |
929 } 930 } 931 932 if (test_bit (EVENT_LINK_RESET, &dev->flags)) { 933 struct driver_info *info = dev->driver_info; 934 int retval = 0; 935 936 clear_bit (EVENT_LINK_RESET, &dev->flags); --- 233 unchanged lines hidden (view full) --- 1170 1171 if (temp < qlen) { 1172 struct urb *urb; 1173 int i; 1174 1175 // don't refill the queue all at once 1176 for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) { 1177 urb = usb_alloc_urb (0, GFP_ATOMIC); | 936 } 937 } 938 939 if (test_bit (EVENT_LINK_RESET, &dev->flags)) { 940 struct driver_info *info = dev->driver_info; 941 int retval = 0; 942 943 clear_bit (EVENT_LINK_RESET, &dev->flags); --- 233 unchanged lines hidden (view full) --- 1177 1178 if (temp < qlen) { 1179 struct urb *urb; 1180 int i; 1181 1182 // don't refill the queue all at once 1183 for (i = 0; i < 10 && dev->rxq.qlen < qlen; i++) { 1184 urb = usb_alloc_urb (0, GFP_ATOMIC); |
1178 if (urb != NULL) 1179 rx_submit (dev, urb, GFP_ATOMIC); | 1185 if (urb != NULL) { 1186 if (rx_submit (dev, urb, GFP_ATOMIC) == 1187 -ENOLINK) 1188 return; 1189 } |
1180 } 1181 if (temp != dev->rxq.qlen) 1182 netif_dbg(dev, link, dev->net, 1183 "rxqlen %d --> %d\n", 1184 temp, dev->rxq.qlen); 1185 if (dev->rxq.qlen < qlen) 1186 tasklet_schedule (&dev->bh); 1187 } --- 317 unchanged lines hidden --- | 1190 } 1191 if (temp != dev->rxq.qlen) 1192 netif_dbg(dev, link, dev->net, 1193 "rxqlen %d --> %d\n", 1194 temp, dev->rxq.qlen); 1195 if (dev->rxq.qlen < qlen) 1196 tasklet_schedule (&dev->bh); 1197 } --- 317 unchanged lines hidden --- |