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 ---