15b2fc499SJeff Garzik /* 25b2fc499SJeff Garzik * USB Network driver infrastructure 35b2fc499SJeff Garzik * Copyright (C) 2000-2005 by David Brownell 45b2fc499SJeff Garzik * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 55b2fc499SJeff Garzik * 65b2fc499SJeff Garzik * This program is free software; you can redistribute it and/or modify 75b2fc499SJeff Garzik * it under the terms of the GNU General Public License as published by 85b2fc499SJeff Garzik * the Free Software Foundation; either version 2 of the License, or 95b2fc499SJeff Garzik * (at your option) any later version. 105b2fc499SJeff Garzik * 115b2fc499SJeff Garzik * This program is distributed in the hope that it will be useful, 125b2fc499SJeff Garzik * but WITHOUT ANY WARRANTY; without even the implied warranty of 135b2fc499SJeff Garzik * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 145b2fc499SJeff Garzik * GNU General Public License for more details. 155b2fc499SJeff Garzik * 165b2fc499SJeff Garzik * You should have received a copy of the GNU General Public License 175b2fc499SJeff Garzik * along with this program; if not, write to the Free Software 185b2fc499SJeff Garzik * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 195b2fc499SJeff Garzik */ 205b2fc499SJeff Garzik 215b2fc499SJeff Garzik /* 225b2fc499SJeff Garzik * This is a generic "USB networking" framework that works with several 235b2fc499SJeff Garzik * kinds of full and high speed networking devices: host-to-host cables, 245b2fc499SJeff Garzik * smart usb peripherals, and actual Ethernet adapters. 255b2fc499SJeff Garzik * 265b2fc499SJeff Garzik * These devices usually differ in terms of control protocols (if they 275b2fc499SJeff Garzik * even have one!) and sometimes they define new framing to wrap or batch 285b2fc499SJeff Garzik * Ethernet packets. Otherwise, they talk to USB pretty much the same, 295b2fc499SJeff Garzik * so interface (un)binding, endpoint I/O queues, fault handling, and other 305b2fc499SJeff Garzik * issues can usefully be addressed by this framework. 315b2fc499SJeff Garzik */ 325b2fc499SJeff Garzik 335b2fc499SJeff Garzik // #define DEBUG // error path messages, extra info 345b2fc499SJeff Garzik // #define VERBOSE // more; success messages 355b2fc499SJeff Garzik 365b2fc499SJeff Garzik #include <linux/module.h> 375b2fc499SJeff Garzik #include <linux/init.h> 385b2fc499SJeff Garzik #include <linux/netdevice.h> 395b2fc499SJeff Garzik #include <linux/etherdevice.h> 4003ad032bSPeter Holik #include <linux/ctype.h> 415b2fc499SJeff Garzik #include <linux/ethtool.h> 425b2fc499SJeff Garzik #include <linux/workqueue.h> 435b2fc499SJeff Garzik #include <linux/mii.h> 445b2fc499SJeff Garzik #include <linux/usb.h> 453692e94fSJussi Kivilinna #include <linux/usb/usbnet.h> 465a0e3ad6STejun Heo #include <linux/slab.h> 47fd1f170dSAndy Shevchenko #include <linux/kernel.h> 48b0786b43SMing Lei #include <linux/pm_runtime.h> 495b2fc499SJeff Garzik 505b2fc499SJeff Garzik #define DRIVER_VERSION "22-Aug-2005" 515b2fc499SJeff Garzik 525b2fc499SJeff Garzik 535b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 545b2fc499SJeff Garzik 555b2fc499SJeff Garzik /* 565b2fc499SJeff Garzik * Nineteen USB 1.1 max size bulk transactions per frame (ms), max. 575b2fc499SJeff Garzik * Several dozen bytes of IPv4 data can fit in two such transactions. 585b2fc499SJeff Garzik * One maximum size Ethernet packet takes twenty four of them. 595b2fc499SJeff Garzik * For high speed, each frame comfortably fits almost 36 max size 605b2fc499SJeff Garzik * Ethernet packets (so queues should be bigger). 615b2fc499SJeff Garzik * 625b2fc499SJeff Garzik * REVISIT qlens should be members of 'struct usbnet'; the goal is to 635b2fc499SJeff Garzik * let the USB host controller be busy for 5msec or more before an irq 645b2fc499SJeff Garzik * is required, under load. Jumbograms change the equation. 655b2fc499SJeff Garzik */ 665b2fc499SJeff Garzik #define RX_MAX_QUEUE_MEMORY (60 * 1518) 675b2fc499SJeff Garzik #define RX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? \ 685b2fc499SJeff Garzik (RX_MAX_QUEUE_MEMORY/(dev)->rx_urb_size) : 4) 695b2fc499SJeff Garzik #define TX_QLEN(dev) (((dev)->udev->speed == USB_SPEED_HIGH) ? \ 705b2fc499SJeff Garzik (RX_MAX_QUEUE_MEMORY/(dev)->hard_mtu) : 4) 715b2fc499SJeff Garzik 725b2fc499SJeff Garzik // reawaken network queue this soon after stopping; else watchdog barks 735b2fc499SJeff Garzik #define TX_TIMEOUT_JIFFIES (5*HZ) 745b2fc499SJeff Garzik 755b2fc499SJeff Garzik // throttle rx/tx briefly after some faults, so khubd might disconnect() 765b2fc499SJeff Garzik // us (it polls at HZ/4 usually) before we report too many false errors. 775b2fc499SJeff Garzik #define THROTTLE_JIFFIES (HZ/8) 785b2fc499SJeff Garzik 795b2fc499SJeff Garzik // between wakeups 805b2fc499SJeff Garzik #define UNLINK_TIMEOUT_MS 3 815b2fc499SJeff Garzik 825b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 835b2fc499SJeff Garzik 845b2fc499SJeff Garzik // randomly generated ethernet address 855b2fc499SJeff Garzik static u8 node_id [ETH_ALEN]; 865b2fc499SJeff Garzik 875b2fc499SJeff Garzik static const char driver_name [] = "usbnet"; 885b2fc499SJeff Garzik 895b2fc499SJeff Garzik /* use ethtool to change the level for any given device */ 905b2fc499SJeff Garzik static int msg_level = -1; 915b2fc499SJeff Garzik module_param (msg_level, int, 0); 925b2fc499SJeff Garzik MODULE_PARM_DESC (msg_level, "Override default message level"); 935b2fc499SJeff Garzik 945b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 955b2fc499SJeff Garzik 965b2fc499SJeff Garzik /* handles CDC Ethernet and many other network "bulk data" interfaces */ 975b2fc499SJeff Garzik int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) 985b2fc499SJeff Garzik { 995b2fc499SJeff Garzik int tmp; 1005b2fc499SJeff Garzik struct usb_host_interface *alt = NULL; 1015b2fc499SJeff Garzik struct usb_host_endpoint *in = NULL, *out = NULL; 1025b2fc499SJeff Garzik struct usb_host_endpoint *status = NULL; 1035b2fc499SJeff Garzik 1045b2fc499SJeff Garzik for (tmp = 0; tmp < intf->num_altsetting; tmp++) { 1055b2fc499SJeff Garzik unsigned ep; 1065b2fc499SJeff Garzik 1075b2fc499SJeff Garzik in = out = status = NULL; 1085b2fc499SJeff Garzik alt = intf->altsetting + tmp; 1095b2fc499SJeff Garzik 1105b2fc499SJeff Garzik /* take the first altsetting with in-bulk + out-bulk; 1115b2fc499SJeff Garzik * remember any status endpoint, just in case; 11270f23fd6SJustin P. Mattock * ignore other endpoints and altsettings. 1135b2fc499SJeff Garzik */ 1145b2fc499SJeff Garzik for (ep = 0; ep < alt->desc.bNumEndpoints; ep++) { 1155b2fc499SJeff Garzik struct usb_host_endpoint *e; 1165b2fc499SJeff Garzik int intr = 0; 1175b2fc499SJeff Garzik 1185b2fc499SJeff Garzik e = alt->endpoint + ep; 1195b2fc499SJeff Garzik switch (e->desc.bmAttributes) { 1205b2fc499SJeff Garzik case USB_ENDPOINT_XFER_INT: 1215b2fc499SJeff Garzik if (!usb_endpoint_dir_in(&e->desc)) 1225b2fc499SJeff Garzik continue; 1235b2fc499SJeff Garzik intr = 1; 1245b2fc499SJeff Garzik /* FALLTHROUGH */ 1255b2fc499SJeff Garzik case USB_ENDPOINT_XFER_BULK: 1265b2fc499SJeff Garzik break; 1275b2fc499SJeff Garzik default: 1285b2fc499SJeff Garzik continue; 1295b2fc499SJeff Garzik } 1305b2fc499SJeff Garzik if (usb_endpoint_dir_in(&e->desc)) { 1315b2fc499SJeff Garzik if (!intr && !in) 1325b2fc499SJeff Garzik in = e; 1335b2fc499SJeff Garzik else if (intr && !status) 1345b2fc499SJeff Garzik status = e; 1355b2fc499SJeff Garzik } else { 1365b2fc499SJeff Garzik if (!out) 1375b2fc499SJeff Garzik out = e; 1385b2fc499SJeff Garzik } 1395b2fc499SJeff Garzik } 1405b2fc499SJeff Garzik if (in && out) 1415b2fc499SJeff Garzik break; 1425b2fc499SJeff Garzik } 1435b2fc499SJeff Garzik if (!alt || !in || !out) 1445b2fc499SJeff Garzik return -EINVAL; 1455b2fc499SJeff Garzik 1468e95a202SJoe Perches if (alt->desc.bAlternateSetting != 0 || 1478e95a202SJoe Perches !(dev->driver_info->flags & FLAG_NO_SETINT)) { 1485b2fc499SJeff Garzik tmp = usb_set_interface (dev->udev, alt->desc.bInterfaceNumber, 1495b2fc499SJeff Garzik alt->desc.bAlternateSetting); 1505b2fc499SJeff Garzik if (tmp < 0) 1515b2fc499SJeff Garzik return tmp; 1525b2fc499SJeff Garzik } 1535b2fc499SJeff Garzik 1545b2fc499SJeff Garzik dev->in = usb_rcvbulkpipe (dev->udev, 1555b2fc499SJeff Garzik in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); 1565b2fc499SJeff Garzik dev->out = usb_sndbulkpipe (dev->udev, 1575b2fc499SJeff Garzik out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); 1585b2fc499SJeff Garzik dev->status = status; 1595b2fc499SJeff Garzik return 0; 1605b2fc499SJeff Garzik } 1615b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_get_endpoints); 1625b2fc499SJeff Garzik 16303ad032bSPeter Holik int usbnet_get_ethernet_addr(struct usbnet *dev, int iMACAddress) 16403ad032bSPeter Holik { 16503ad032bSPeter Holik int tmp, i; 16603ad032bSPeter Holik unsigned char buf [13]; 16703ad032bSPeter Holik 16803ad032bSPeter Holik tmp = usb_string(dev->udev, iMACAddress, buf, sizeof buf); 16903ad032bSPeter Holik if (tmp != 12) { 17003ad032bSPeter Holik dev_dbg(&dev->udev->dev, 17103ad032bSPeter Holik "bad MAC string %d fetch, %d\n", iMACAddress, tmp); 17203ad032bSPeter Holik if (tmp >= 0) 17303ad032bSPeter Holik tmp = -EINVAL; 17403ad032bSPeter Holik return tmp; 17503ad032bSPeter Holik } 17603ad032bSPeter Holik for (i = tmp = 0; i < 6; i++, tmp += 2) 17703ad032bSPeter Holik dev->net->dev_addr [i] = 178fd1f170dSAndy Shevchenko (hex_to_bin(buf[tmp]) << 4) + hex_to_bin(buf[tmp + 1]); 17903ad032bSPeter Holik return 0; 18003ad032bSPeter Holik } 18103ad032bSPeter Holik EXPORT_SYMBOL_GPL(usbnet_get_ethernet_addr); 18203ad032bSPeter Holik 18324ead299Stom.leiming@gmail.com static void intr_complete (struct urb *urb) 18424ead299Stom.leiming@gmail.com { 18524ead299Stom.leiming@gmail.com struct usbnet *dev = urb->context; 18624ead299Stom.leiming@gmail.com int status = urb->status; 18724ead299Stom.leiming@gmail.com 18824ead299Stom.leiming@gmail.com switch (status) { 18924ead299Stom.leiming@gmail.com /* success */ 19024ead299Stom.leiming@gmail.com case 0: 19124ead299Stom.leiming@gmail.com dev->driver_info->status(dev, urb); 19224ead299Stom.leiming@gmail.com break; 19324ead299Stom.leiming@gmail.com 19424ead299Stom.leiming@gmail.com /* software-driven interface shutdown */ 19524ead299Stom.leiming@gmail.com case -ENOENT: /* urb killed */ 19624ead299Stom.leiming@gmail.com case -ESHUTDOWN: /* hardware gone */ 19724ead299Stom.leiming@gmail.com netif_dbg(dev, ifdown, dev->net, 19824ead299Stom.leiming@gmail.com "intr shutdown, code %d\n", status); 19924ead299Stom.leiming@gmail.com return; 20024ead299Stom.leiming@gmail.com 20124ead299Stom.leiming@gmail.com /* NOTE: not throttling like RX/TX, since this endpoint 20224ead299Stom.leiming@gmail.com * already polls infrequently 20324ead299Stom.leiming@gmail.com */ 20424ead299Stom.leiming@gmail.com default: 20524ead299Stom.leiming@gmail.com netdev_dbg(dev->net, "intr status %d\n", status); 20624ead299Stom.leiming@gmail.com break; 20724ead299Stom.leiming@gmail.com } 20824ead299Stom.leiming@gmail.com 20924ead299Stom.leiming@gmail.com if (!netif_running (dev->net)) 21024ead299Stom.leiming@gmail.com return; 21124ead299Stom.leiming@gmail.com 21224ead299Stom.leiming@gmail.com status = usb_submit_urb (urb, GFP_ATOMIC); 21324ead299Stom.leiming@gmail.com if (status != 0) 21424ead299Stom.leiming@gmail.com netif_err(dev, timer, dev->net, 21524ead299Stom.leiming@gmail.com "intr resubmit --> %d\n", status); 21624ead299Stom.leiming@gmail.com } 2175b2fc499SJeff Garzik 2185b2fc499SJeff Garzik static int init_status (struct usbnet *dev, struct usb_interface *intf) 2195b2fc499SJeff Garzik { 2205b2fc499SJeff Garzik char *buf = NULL; 2215b2fc499SJeff Garzik unsigned pipe = 0; 2225b2fc499SJeff Garzik unsigned maxp; 2235b2fc499SJeff Garzik unsigned period; 2245b2fc499SJeff Garzik 2255b2fc499SJeff Garzik if (!dev->driver_info->status) 2265b2fc499SJeff Garzik return 0; 2275b2fc499SJeff Garzik 2285b2fc499SJeff Garzik pipe = usb_rcvintpipe (dev->udev, 2295b2fc499SJeff Garzik dev->status->desc.bEndpointAddress 2305b2fc499SJeff Garzik & USB_ENDPOINT_NUMBER_MASK); 2315b2fc499SJeff Garzik maxp = usb_maxpacket (dev->udev, pipe, 0); 2325b2fc499SJeff Garzik 2335b2fc499SJeff Garzik /* avoid 1 msec chatter: min 8 msec poll rate */ 2345b2fc499SJeff Garzik period = max ((int) dev->status->desc.bInterval, 2355b2fc499SJeff Garzik (dev->udev->speed == USB_SPEED_HIGH) ? 7 : 3); 2365b2fc499SJeff Garzik 2375b2fc499SJeff Garzik buf = kmalloc (maxp, GFP_KERNEL); 2385b2fc499SJeff Garzik if (buf) { 2395b2fc499SJeff Garzik dev->interrupt = usb_alloc_urb (0, GFP_KERNEL); 2405b2fc499SJeff Garzik if (!dev->interrupt) { 2415b2fc499SJeff Garzik kfree (buf); 2425b2fc499SJeff Garzik return -ENOMEM; 2435b2fc499SJeff Garzik } else { 2445b2fc499SJeff Garzik usb_fill_int_urb(dev->interrupt, dev->udev, pipe, 2455b2fc499SJeff Garzik buf, maxp, intr_complete, dev, period); 246720f3d7cStom.leiming@gmail.com dev->interrupt->transfer_flags |= URB_FREE_BUFFER; 2475b2fc499SJeff Garzik dev_dbg(&intf->dev, 2485b2fc499SJeff Garzik "status ep%din, %d bytes period %d\n", 2495b2fc499SJeff Garzik usb_pipeendpoint(pipe), maxp, period); 2505b2fc499SJeff Garzik } 2515b2fc499SJeff Garzik } 2525b2fc499SJeff Garzik return 0; 2535b2fc499SJeff Garzik } 2545b2fc499SJeff Garzik 2556eecdc5fSDan Williams /* Submit the interrupt URB if not previously submitted, increasing refcount */ 2566eecdc5fSDan Williams int usbnet_status_start(struct usbnet *dev, gfp_t mem_flags) 2576eecdc5fSDan Williams { 2586eecdc5fSDan Williams int ret = 0; 2596eecdc5fSDan Williams 2606eecdc5fSDan Williams WARN_ON_ONCE(dev->interrupt == NULL); 2616eecdc5fSDan Williams if (dev->interrupt) { 2626eecdc5fSDan Williams mutex_lock(&dev->interrupt_mutex); 2636eecdc5fSDan Williams 2646eecdc5fSDan Williams if (++dev->interrupt_count == 1) 2656eecdc5fSDan Williams ret = usb_submit_urb(dev->interrupt, mem_flags); 2666eecdc5fSDan Williams 2676eecdc5fSDan Williams dev_dbg(&dev->udev->dev, "incremented interrupt URB count to %d\n", 2686eecdc5fSDan Williams dev->interrupt_count); 2696eecdc5fSDan Williams mutex_unlock(&dev->interrupt_mutex); 2706eecdc5fSDan Williams } 2716eecdc5fSDan Williams return ret; 2726eecdc5fSDan Williams } 2736eecdc5fSDan Williams EXPORT_SYMBOL_GPL(usbnet_status_start); 2746eecdc5fSDan Williams 2756eecdc5fSDan Williams /* For resume; submit interrupt URB if previously submitted */ 2766eecdc5fSDan Williams static int __usbnet_status_start_force(struct usbnet *dev, gfp_t mem_flags) 2776eecdc5fSDan Williams { 2786eecdc5fSDan Williams int ret = 0; 2796eecdc5fSDan Williams 2806eecdc5fSDan Williams mutex_lock(&dev->interrupt_mutex); 2816eecdc5fSDan Williams if (dev->interrupt_count) { 2826eecdc5fSDan Williams ret = usb_submit_urb(dev->interrupt, mem_flags); 2836eecdc5fSDan Williams dev_dbg(&dev->udev->dev, 2846eecdc5fSDan Williams "submitted interrupt URB for resume\n"); 2856eecdc5fSDan Williams } 2866eecdc5fSDan Williams mutex_unlock(&dev->interrupt_mutex); 2876eecdc5fSDan Williams return ret; 2886eecdc5fSDan Williams } 2896eecdc5fSDan Williams 2906eecdc5fSDan Williams /* Kill the interrupt URB if all submitters want it killed */ 2916eecdc5fSDan Williams void usbnet_status_stop(struct usbnet *dev) 2926eecdc5fSDan Williams { 2936eecdc5fSDan Williams if (dev->interrupt) { 2946eecdc5fSDan Williams mutex_lock(&dev->interrupt_mutex); 2956eecdc5fSDan Williams WARN_ON(dev->interrupt_count == 0); 2966eecdc5fSDan Williams 2976eecdc5fSDan Williams if (dev->interrupt_count && --dev->interrupt_count == 0) 2986eecdc5fSDan Williams usb_kill_urb(dev->interrupt); 2996eecdc5fSDan Williams 3006eecdc5fSDan Williams dev_dbg(&dev->udev->dev, 3016eecdc5fSDan Williams "decremented interrupt URB count to %d\n", 3026eecdc5fSDan Williams dev->interrupt_count); 3036eecdc5fSDan Williams mutex_unlock(&dev->interrupt_mutex); 3046eecdc5fSDan Williams } 3056eecdc5fSDan Williams } 3066eecdc5fSDan Williams EXPORT_SYMBOL_GPL(usbnet_status_stop); 3076eecdc5fSDan Williams 3086eecdc5fSDan Williams /* For suspend; always kill interrupt URB */ 3096eecdc5fSDan Williams static void __usbnet_status_stop_force(struct usbnet *dev) 3106eecdc5fSDan Williams { 3116eecdc5fSDan Williams if (dev->interrupt) { 3126eecdc5fSDan Williams mutex_lock(&dev->interrupt_mutex); 3136eecdc5fSDan Williams usb_kill_urb(dev->interrupt); 3146eecdc5fSDan Williams dev_dbg(&dev->udev->dev, "killed interrupt URB for suspend\n"); 3156eecdc5fSDan Williams mutex_unlock(&dev->interrupt_mutex); 3166eecdc5fSDan Williams } 3176eecdc5fSDan Williams } 3186eecdc5fSDan Williams 3195b2fc499SJeff Garzik /* Passes this packet up the stack, updating its accounting. 3205b2fc499SJeff Garzik * Some link protocols batch packets, so their rx_fixup paths 3215b2fc499SJeff Garzik * can return clones as well as just modify the original skb. 3225b2fc499SJeff Garzik */ 3235b2fc499SJeff Garzik void usbnet_skb_return (struct usbnet *dev, struct sk_buff *skb) 3245b2fc499SJeff Garzik { 3255b2fc499SJeff Garzik int status; 3265b2fc499SJeff Garzik 3277834ddbcSJussi Kivilinna if (test_bit(EVENT_RX_PAUSED, &dev->flags)) { 3287834ddbcSJussi Kivilinna skb_queue_tail(&dev->rxq_pause, skb); 3297834ddbcSJussi Kivilinna return; 3307834ddbcSJussi Kivilinna } 3317834ddbcSJussi Kivilinna 3325b2fc499SJeff Garzik skb->protocol = eth_type_trans (skb, dev->net); 3337963837fSHerbert Xu dev->net->stats.rx_packets++; 3347963837fSHerbert Xu dev->net->stats.rx_bytes += skb->len; 3355b2fc499SJeff Garzik 336a475f603SJoe Perches netif_dbg(dev, rx_status, dev->net, "< rx, len %zu, type 0x%x\n", 3375b2fc499SJeff Garzik skb->len + sizeof (struct ethhdr), skb->protocol); 3385b2fc499SJeff Garzik memset (skb->cb, 0, sizeof (struct skb_data)); 339f9b491ecSMichael Riesch 340f9b491ecSMichael Riesch if (skb_defer_rx_timestamp(skb)) 341f9b491ecSMichael Riesch return; 342f9b491ecSMichael Riesch 3435b2fc499SJeff Garzik status = netif_rx (skb); 344a475f603SJoe Perches if (status != NET_RX_SUCCESS) 345a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, 346a475f603SJoe Perches "netif_rx status %d\n", status); 3475b2fc499SJeff Garzik } 3485b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_skb_return); 3495b2fc499SJeff Garzik 3505b2fc499SJeff Garzik 3515b2fc499SJeff Garzik /*------------------------------------------------------------------------- 3525b2fc499SJeff Garzik * 3535b2fc499SJeff Garzik * Network Device Driver (peer link to "Host Device", from USB host) 3545b2fc499SJeff Garzik * 3555b2fc499SJeff Garzik *-------------------------------------------------------------------------*/ 3565b2fc499SJeff Garzik 357777baa47SStephen Hemminger int usbnet_change_mtu (struct net_device *net, int new_mtu) 3585b2fc499SJeff Garzik { 3595b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 3605b2fc499SJeff Garzik int ll_mtu = new_mtu + net->hard_header_len; 3615b2fc499SJeff Garzik int old_hard_mtu = dev->hard_mtu; 3625b2fc499SJeff Garzik int old_rx_urb_size = dev->rx_urb_size; 3635b2fc499SJeff Garzik 3645b2fc499SJeff Garzik if (new_mtu <= 0) 3655b2fc499SJeff Garzik return -EINVAL; 3665b2fc499SJeff Garzik // no second zero-length packet read wanted after mtu-sized packets 3675b2fc499SJeff Garzik if ((ll_mtu % dev->maxpacket) == 0) 3685b2fc499SJeff Garzik return -EDOM; 3695b2fc499SJeff Garzik net->mtu = new_mtu; 3705b2fc499SJeff Garzik 3715b2fc499SJeff Garzik dev->hard_mtu = net->mtu + net->hard_header_len; 3725b2fc499SJeff Garzik if (dev->rx_urb_size == old_hard_mtu) { 3735b2fc499SJeff Garzik dev->rx_urb_size = dev->hard_mtu; 3745b2fc499SJeff Garzik if (dev->rx_urb_size > old_rx_urb_size) 3755b2fc499SJeff Garzik usbnet_unlink_rx_urbs(dev); 3765b2fc499SJeff Garzik } 3775b2fc499SJeff Garzik 3785b2fc499SJeff Garzik return 0; 3795b2fc499SJeff Garzik } 380777baa47SStephen Hemminger EXPORT_SYMBOL_GPL(usbnet_change_mtu); 3815b2fc499SJeff Garzik 3825b6e9bcdSMing Lei /* The caller must hold list->lock */ 3835b6e9bcdSMing Lei static void __usbnet_queue_skb(struct sk_buff_head *list, 3845b6e9bcdSMing Lei struct sk_buff *newsk, enum skb_state state) 3855b6e9bcdSMing Lei { 3865b6e9bcdSMing Lei struct skb_data *entry = (struct skb_data *) newsk->cb; 3875b6e9bcdSMing Lei 3885b6e9bcdSMing Lei __skb_queue_tail(list, newsk); 3895b6e9bcdSMing Lei entry->state = state; 3905b6e9bcdSMing Lei } 3915b6e9bcdSMing Lei 3925b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 3935b2fc499SJeff Garzik 3945b2fc499SJeff Garzik /* some LK 2.4 HCDs oopsed if we freed or resubmitted urbs from 3955b2fc499SJeff Garzik * completion callbacks. 2.5 should have fixed those bugs... 3965b2fc499SJeff Garzik */ 3975b2fc499SJeff Garzik 3985b6e9bcdSMing Lei static enum skb_state defer_bh(struct usbnet *dev, struct sk_buff *skb, 3995b6e9bcdSMing Lei struct sk_buff_head *list, enum skb_state state) 4005b2fc499SJeff Garzik { 4015b2fc499SJeff Garzik unsigned long flags; 4025b6e9bcdSMing Lei enum skb_state old_state; 4035b6e9bcdSMing Lei struct skb_data *entry = (struct skb_data *) skb->cb; 4045b2fc499SJeff Garzik 4055b2fc499SJeff Garzik spin_lock_irqsave(&list->lock, flags); 4065b6e9bcdSMing Lei old_state = entry->state; 4075b6e9bcdSMing Lei entry->state = state; 4085b2fc499SJeff Garzik __skb_unlink(skb, list); 4095b2fc499SJeff Garzik spin_unlock(&list->lock); 4105b2fc499SJeff Garzik spin_lock(&dev->done.lock); 4115b2fc499SJeff Garzik __skb_queue_tail(&dev->done, skb); 4125b2fc499SJeff Garzik if (dev->done.qlen == 1) 4135b2fc499SJeff Garzik tasklet_schedule(&dev->bh); 4145b2fc499SJeff Garzik spin_unlock_irqrestore(&dev->done.lock, flags); 4155b6e9bcdSMing Lei return old_state; 4165b2fc499SJeff Garzik } 4175b2fc499SJeff Garzik 4185b2fc499SJeff Garzik /* some work can't be done in tasklets, so we use keventd 4195b2fc499SJeff Garzik * 4205b2fc499SJeff Garzik * NOTE: annoying asymmetry: if it's active, schedule_work() fails, 4215b2fc499SJeff Garzik * but tasklet_schedule() doesn't. hope the failure is rare. 4225b2fc499SJeff Garzik */ 4235b2fc499SJeff Garzik void usbnet_defer_kevent (struct usbnet *dev, int work) 4245b2fc499SJeff Garzik { 4255b2fc499SJeff Garzik set_bit (work, &dev->flags); 4269532021dSSteve Glendinning if (!schedule_work (&dev->kevent)) { 4279532021dSSteve Glendinning if (net_ratelimit()) 42860b86755SJoe Perches netdev_err(dev->net, "kevent %d may have been dropped\n", work); 4299532021dSSteve Glendinning } else { 43060b86755SJoe Perches netdev_dbg(dev->net, "kevent %d scheduled\n", work); 4315b2fc499SJeff Garzik } 4329532021dSSteve Glendinning } 4335b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_defer_kevent); 4345b2fc499SJeff Garzik 4355b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 4365b2fc499SJeff Garzik 4375b2fc499SJeff Garzik static void rx_complete (struct urb *urb); 4385b2fc499SJeff Garzik 439dacb3975SDavid S. Miller static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags) 4405b2fc499SJeff Garzik { 4415b2fc499SJeff Garzik struct sk_buff *skb; 4425b2fc499SJeff Garzik struct skb_data *entry; 4435b2fc499SJeff Garzik int retval = 0; 4445b2fc499SJeff Garzik unsigned long lockflags; 4455b2fc499SJeff Garzik size_t size = dev->rx_urb_size; 4465b2fc499SJeff Garzik 44770c37bf9SBjørn Mork /* prevent rx skb allocation when error ratio is high */ 44870c37bf9SBjørn Mork if (test_bit(EVENT_RX_KILL, &dev->flags)) { 44970c37bf9SBjørn Mork usb_free_urb(urb); 45070c37bf9SBjørn Mork return -ENOLINK; 45170c37bf9SBjørn Mork } 45270c37bf9SBjørn Mork 4537bdd4027SEric Dumazet skb = __netdev_alloc_skb_ip_align(dev->net, size, flags); 4547bdd4027SEric Dumazet if (!skb) { 455a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, "no rx skb\n"); 4565b2fc499SJeff Garzik usbnet_defer_kevent (dev, EVENT_RX_MEMORY); 4575b2fc499SJeff Garzik usb_free_urb (urb); 458dacb3975SDavid S. Miller return -ENOMEM; 4595b2fc499SJeff Garzik } 4605b2fc499SJeff Garzik 4615b2fc499SJeff Garzik entry = (struct skb_data *) skb->cb; 4625b2fc499SJeff Garzik entry->urb = urb; 4635b2fc499SJeff Garzik entry->dev = dev; 4645b2fc499SJeff Garzik entry->length = 0; 4655b2fc499SJeff Garzik 4665b2fc499SJeff Garzik usb_fill_bulk_urb (urb, dev->udev, dev->in, 4675b2fc499SJeff Garzik skb->data, size, rx_complete, skb); 4685b2fc499SJeff Garzik 4695b2fc499SJeff Garzik spin_lock_irqsave (&dev->rxq.lock, lockflags); 4705b2fc499SJeff Garzik 4718e95a202SJoe Perches if (netif_running (dev->net) && 4728e95a202SJoe Perches netif_device_present (dev->net) && 47369ee472fSOliver Neukum !test_bit (EVENT_RX_HALT, &dev->flags) && 47469ee472fSOliver Neukum !test_bit (EVENT_DEV_ASLEEP, &dev->flags)) { 4755b2fc499SJeff Garzik switch (retval = usb_submit_urb (urb, GFP_ATOMIC)) { 4765b2fc499SJeff Garzik case -EPIPE: 4775b2fc499SJeff Garzik usbnet_defer_kevent (dev, EVENT_RX_HALT); 4785b2fc499SJeff Garzik break; 4795b2fc499SJeff Garzik case -ENOMEM: 4805b2fc499SJeff Garzik usbnet_defer_kevent (dev, EVENT_RX_MEMORY); 4815b2fc499SJeff Garzik break; 4825b2fc499SJeff Garzik case -ENODEV: 483a475f603SJoe Perches netif_dbg(dev, ifdown, dev->net, "device gone\n"); 4845b2fc499SJeff Garzik netif_device_detach (dev->net); 4855b2fc499SJeff Garzik break; 486dacb3975SDavid S. Miller case -EHOSTUNREACH: 487dacb3975SDavid S. Miller retval = -ENOLINK; 488dacb3975SDavid S. Miller break; 4895b2fc499SJeff Garzik default: 490a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, 491a475f603SJoe Perches "rx submit, %d\n", retval); 4925b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 4935b2fc499SJeff Garzik break; 4945b2fc499SJeff Garzik case 0: 4955b6e9bcdSMing Lei __usbnet_queue_skb(&dev->rxq, skb, rx_start); 4965b2fc499SJeff Garzik } 4975b2fc499SJeff Garzik } else { 498a475f603SJoe Perches netif_dbg(dev, ifdown, dev->net, "rx: stopped\n"); 4995b2fc499SJeff Garzik retval = -ENOLINK; 5005b2fc499SJeff Garzik } 5015b2fc499SJeff Garzik spin_unlock_irqrestore (&dev->rxq.lock, lockflags); 5025b2fc499SJeff Garzik if (retval) { 5035b2fc499SJeff Garzik dev_kfree_skb_any (skb); 5045b2fc499SJeff Garzik usb_free_urb (urb); 5055b2fc499SJeff Garzik } 506dacb3975SDavid S. Miller return retval; 5075b2fc499SJeff Garzik } 5085b2fc499SJeff Garzik 5095b2fc499SJeff Garzik 5105b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 5115b2fc499SJeff Garzik 5125b2fc499SJeff Garzik static inline void rx_process (struct usbnet *dev, struct sk_buff *skb) 5135b2fc499SJeff Garzik { 5148e95a202SJoe Perches if (dev->driver_info->rx_fixup && 5157a635ea9SAndrzej Zaborowski !dev->driver_info->rx_fixup (dev, skb)) { 5167a635ea9SAndrzej Zaborowski /* With RX_ASSEMBLE, rx_fixup() must update counters */ 5177a635ea9SAndrzej Zaborowski if (!(dev->driver_info->flags & FLAG_RX_ASSEMBLE)) 5187a635ea9SAndrzej Zaborowski dev->net->stats.rx_errors++; 5197a635ea9SAndrzej Zaborowski goto done; 5207a635ea9SAndrzej Zaborowski } 5215b2fc499SJeff Garzik // else network stack removes extra byte if we forced a short packet 5225b2fc499SJeff Garzik 523073285fdSAlexey Orishko if (skb->len) { 524073285fdSAlexey Orishko /* all data was already cloned from skb inside the driver */ 525073285fdSAlexey Orishko if (dev->driver_info->flags & FLAG_MULTI_PACKET) 526073285fdSAlexey Orishko dev_kfree_skb_any(skb); 527073285fdSAlexey Orishko else 5285b2fc499SJeff Garzik usbnet_skb_return(dev, skb); 529073285fdSAlexey Orishko return; 530073285fdSAlexey Orishko } 531073285fdSAlexey Orishko 532a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, "drop\n"); 5337963837fSHerbert Xu dev->net->stats.rx_errors++; 5347a635ea9SAndrzej Zaborowski done: 5355b2fc499SJeff Garzik skb_queue_tail(&dev->done, skb); 5365b2fc499SJeff Garzik } 5375b2fc499SJeff Garzik 5385b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 5395b2fc499SJeff Garzik 5405b2fc499SJeff Garzik static void rx_complete (struct urb *urb) 5415b2fc499SJeff Garzik { 5425b2fc499SJeff Garzik struct sk_buff *skb = (struct sk_buff *) urb->context; 5435b2fc499SJeff Garzik struct skb_data *entry = (struct skb_data *) skb->cb; 5445b2fc499SJeff Garzik struct usbnet *dev = entry->dev; 5455b2fc499SJeff Garzik int urb_status = urb->status; 5465b6e9bcdSMing Lei enum skb_state state; 5475b2fc499SJeff Garzik 5485b2fc499SJeff Garzik skb_put (skb, urb->actual_length); 5495b6e9bcdSMing Lei state = rx_done; 5505b2fc499SJeff Garzik entry->urb = NULL; 5515b2fc499SJeff Garzik 5525b2fc499SJeff Garzik switch (urb_status) { 55318ab458fSDavid Brownell /* success */ 5545b2fc499SJeff Garzik case 0: 5555b2fc499SJeff Garzik if (skb->len < dev->net->hard_header_len) { 5565b6e9bcdSMing Lei state = rx_cleanup; 5577963837fSHerbert Xu dev->net->stats.rx_errors++; 5587963837fSHerbert Xu dev->net->stats.rx_length_errors++; 559a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, 560a475f603SJoe Perches "rx length %d\n", skb->len); 5615b2fc499SJeff Garzik } 5625b2fc499SJeff Garzik break; 5635b2fc499SJeff Garzik 56418ab458fSDavid Brownell /* stalls need manual reset. this is rare ... except that 56518ab458fSDavid Brownell * when going through USB 2.0 TTs, unplug appears this way. 5663ac49a1cSJean Delvare * we avoid the highspeed version of the ETIMEDOUT/EILSEQ 56718ab458fSDavid Brownell * storm, recovering as needed. 56818ab458fSDavid Brownell */ 5695b2fc499SJeff Garzik case -EPIPE: 5707963837fSHerbert Xu dev->net->stats.rx_errors++; 5715b2fc499SJeff Garzik usbnet_defer_kevent (dev, EVENT_RX_HALT); 5725b2fc499SJeff Garzik // FALLTHROUGH 5735b2fc499SJeff Garzik 57418ab458fSDavid Brownell /* software-driven interface shutdown */ 57518ab458fSDavid Brownell case -ECONNRESET: /* async unlink */ 57618ab458fSDavid Brownell case -ESHUTDOWN: /* hardware gone */ 577a475f603SJoe Perches netif_dbg(dev, ifdown, dev->net, 578a475f603SJoe Perches "rx shutdown, code %d\n", urb_status); 5795b2fc499SJeff Garzik goto block; 5805b2fc499SJeff Garzik 58118ab458fSDavid Brownell /* we get controller i/o faults during khubd disconnect() delays. 58218ab458fSDavid Brownell * throttle down resubmits, to avoid log floods; just temporarily, 58318ab458fSDavid Brownell * so we still recover when the fault isn't a khubd delay. 58418ab458fSDavid Brownell */ 5855b2fc499SJeff Garzik case -EPROTO: 5865b2fc499SJeff Garzik case -ETIME: 5875b2fc499SJeff Garzik case -EILSEQ: 5887963837fSHerbert Xu dev->net->stats.rx_errors++; 5895b2fc499SJeff Garzik if (!timer_pending (&dev->delay)) { 5905b2fc499SJeff Garzik mod_timer (&dev->delay, jiffies + THROTTLE_JIFFIES); 591a475f603SJoe Perches netif_dbg(dev, link, dev->net, 592a475f603SJoe Perches "rx throttle %d\n", urb_status); 5935b2fc499SJeff Garzik } 5945b2fc499SJeff Garzik block: 5955b6e9bcdSMing Lei state = rx_cleanup; 5965b2fc499SJeff Garzik entry->urb = urb; 5975b2fc499SJeff Garzik urb = NULL; 5985b2fc499SJeff Garzik break; 5995b2fc499SJeff Garzik 60018ab458fSDavid Brownell /* data overrun ... flush fifo? */ 6015b2fc499SJeff Garzik case -EOVERFLOW: 6027963837fSHerbert Xu dev->net->stats.rx_over_errors++; 6035b2fc499SJeff Garzik // FALLTHROUGH 6045b2fc499SJeff Garzik 6055b2fc499SJeff Garzik default: 6065b6e9bcdSMing Lei state = rx_cleanup; 6077963837fSHerbert Xu dev->net->stats.rx_errors++; 608a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, "rx status %d\n", urb_status); 6095b2fc499SJeff Garzik break; 6105b2fc499SJeff Garzik } 6115b2fc499SJeff Garzik 61270c37bf9SBjørn Mork /* stop rx if packet error rate is high */ 61370c37bf9SBjørn Mork if (++dev->pkt_cnt > 30) { 61470c37bf9SBjørn Mork dev->pkt_cnt = 0; 61570c37bf9SBjørn Mork dev->pkt_err = 0; 61670c37bf9SBjørn Mork } else { 61770c37bf9SBjørn Mork if (state == rx_cleanup) 61870c37bf9SBjørn Mork dev->pkt_err++; 61970c37bf9SBjørn Mork if (dev->pkt_err > 20) 62070c37bf9SBjørn Mork set_bit(EVENT_RX_KILL, &dev->flags); 62170c37bf9SBjørn Mork } 62270c37bf9SBjørn Mork 6235b6e9bcdSMing Lei state = defer_bh(dev, skb, &dev->rxq, state); 6245b2fc499SJeff Garzik 6255b2fc499SJeff Garzik if (urb) { 6268e95a202SJoe Perches if (netif_running (dev->net) && 6275b6e9bcdSMing Lei !test_bit (EVENT_RX_HALT, &dev->flags) && 6285b6e9bcdSMing Lei state != unlink_start) { 6295b2fc499SJeff Garzik rx_submit (dev, urb, GFP_ATOMIC); 6308a783354SOliver Neukum usb_mark_last_busy(dev->udev); 6315b2fc499SJeff Garzik return; 6325b2fc499SJeff Garzik } 6335b2fc499SJeff Garzik usb_free_urb (urb); 6345b2fc499SJeff Garzik } 635a475f603SJoe Perches netif_dbg(dev, rx_err, dev->net, "no read resubmitted\n"); 6365b2fc499SJeff Garzik } 6375b2fc499SJeff Garzik 6385b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 6397834ddbcSJussi Kivilinna void usbnet_pause_rx(struct usbnet *dev) 6407834ddbcSJussi Kivilinna { 6417834ddbcSJussi Kivilinna set_bit(EVENT_RX_PAUSED, &dev->flags); 6427834ddbcSJussi Kivilinna 643a475f603SJoe Perches netif_dbg(dev, rx_status, dev->net, "paused rx queue enabled\n"); 6447834ddbcSJussi Kivilinna } 6457834ddbcSJussi Kivilinna EXPORT_SYMBOL_GPL(usbnet_pause_rx); 6467834ddbcSJussi Kivilinna 6477834ddbcSJussi Kivilinna void usbnet_resume_rx(struct usbnet *dev) 6487834ddbcSJussi Kivilinna { 6497834ddbcSJussi Kivilinna struct sk_buff *skb; 6507834ddbcSJussi Kivilinna int num = 0; 6517834ddbcSJussi Kivilinna 6527834ddbcSJussi Kivilinna clear_bit(EVENT_RX_PAUSED, &dev->flags); 6537834ddbcSJussi Kivilinna 6547834ddbcSJussi Kivilinna while ((skb = skb_dequeue(&dev->rxq_pause)) != NULL) { 6557834ddbcSJussi Kivilinna usbnet_skb_return(dev, skb); 6567834ddbcSJussi Kivilinna num++; 6577834ddbcSJussi Kivilinna } 6587834ddbcSJussi Kivilinna 6597834ddbcSJussi Kivilinna tasklet_schedule(&dev->bh); 6607834ddbcSJussi Kivilinna 661a475f603SJoe Perches netif_dbg(dev, rx_status, dev->net, 662a475f603SJoe Perches "paused rx queue disabled, %d skbs requeued\n", num); 6637834ddbcSJussi Kivilinna } 6647834ddbcSJussi Kivilinna EXPORT_SYMBOL_GPL(usbnet_resume_rx); 6657834ddbcSJussi Kivilinna 6667834ddbcSJussi Kivilinna void usbnet_purge_paused_rxq(struct usbnet *dev) 6677834ddbcSJussi Kivilinna { 6687834ddbcSJussi Kivilinna skb_queue_purge(&dev->rxq_pause); 6697834ddbcSJussi Kivilinna } 6707834ddbcSJussi Kivilinna EXPORT_SYMBOL_GPL(usbnet_purge_paused_rxq); 6717834ddbcSJussi Kivilinna 6727834ddbcSJussi Kivilinna /*-------------------------------------------------------------------------*/ 6735b2fc499SJeff Garzik 6745b2fc499SJeff Garzik // unlink pending rx/tx; completion handlers do all other cleanup 6755b2fc499SJeff Garzik 6765b2fc499SJeff Garzik static int unlink_urbs (struct usbnet *dev, struct sk_buff_head *q) 6775b2fc499SJeff Garzik { 6785b2fc499SJeff Garzik unsigned long flags; 6795b6e9bcdSMing Lei struct sk_buff *skb; 6805b2fc499SJeff Garzik int count = 0; 6815b2fc499SJeff Garzik 6825b2fc499SJeff Garzik spin_lock_irqsave (&q->lock, flags); 6835b6e9bcdSMing Lei while (!skb_queue_empty(q)) { 6845b2fc499SJeff Garzik struct skb_data *entry; 6855b2fc499SJeff Garzik struct urb *urb; 6865b2fc499SJeff Garzik int retval; 6875b2fc499SJeff Garzik 6885b6e9bcdSMing Lei skb_queue_walk(q, skb) { 6895b2fc499SJeff Garzik entry = (struct skb_data *) skb->cb; 6905b6e9bcdSMing Lei if (entry->state != unlink_start) 6915b6e9bcdSMing Lei goto found; 6925b6e9bcdSMing Lei } 6935b6e9bcdSMing Lei break; 6945b6e9bcdSMing Lei found: 6955b6e9bcdSMing Lei entry->state = unlink_start; 6965b2fc499SJeff Garzik urb = entry->urb; 6975b2fc499SJeff Garzik 6980956a8c2Stom.leiming@gmail.com /* 6990956a8c2Stom.leiming@gmail.com * Get reference count of the URB to avoid it to be 7000956a8c2Stom.leiming@gmail.com * freed during usb_unlink_urb, which may trigger 7010956a8c2Stom.leiming@gmail.com * use-after-free problem inside usb_unlink_urb since 7020956a8c2Stom.leiming@gmail.com * usb_unlink_urb is always racing with .complete 7030956a8c2Stom.leiming@gmail.com * handler(include defer_bh). 7040956a8c2Stom.leiming@gmail.com */ 7050956a8c2Stom.leiming@gmail.com usb_get_urb(urb); 7064231d47eSSebastian Siewior spin_unlock_irqrestore(&q->lock, flags); 7075b2fc499SJeff Garzik // during some PM-driven resume scenarios, 7085b2fc499SJeff Garzik // these (async) unlinks complete immediately 7095b2fc499SJeff Garzik retval = usb_unlink_urb (urb); 7105b2fc499SJeff Garzik if (retval != -EINPROGRESS && retval != 0) 71160b86755SJoe Perches netdev_dbg(dev->net, "unlink urb err, %d\n", retval); 7125b2fc499SJeff Garzik else 7135b2fc499SJeff Garzik count++; 7140956a8c2Stom.leiming@gmail.com usb_put_urb(urb); 7154231d47eSSebastian Siewior spin_lock_irqsave(&q->lock, flags); 7165b2fc499SJeff Garzik } 7175b2fc499SJeff Garzik spin_unlock_irqrestore (&q->lock, flags); 7185b2fc499SJeff Garzik return count; 7195b2fc499SJeff Garzik } 7205b2fc499SJeff Garzik 7215b2fc499SJeff Garzik // Flush all pending rx urbs 7225b2fc499SJeff Garzik // minidrivers may need to do this when the MTU changes 7235b2fc499SJeff Garzik 7245b2fc499SJeff Garzik void usbnet_unlink_rx_urbs(struct usbnet *dev) 7255b2fc499SJeff Garzik { 7265b2fc499SJeff Garzik if (netif_running(dev->net)) { 7275b2fc499SJeff Garzik (void) unlink_urbs (dev, &dev->rxq); 7285b2fc499SJeff Garzik tasklet_schedule(&dev->bh); 7295b2fc499SJeff Garzik } 7305b2fc499SJeff Garzik } 7315b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs); 7325b2fc499SJeff Garzik 7335b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 7345b2fc499SJeff Garzik 7355b2fc499SJeff Garzik // precondition: never called in_interrupt 73669ee472fSOliver Neukum static void usbnet_terminate_urbs(struct usbnet *dev) 73769ee472fSOliver Neukum { 73869ee472fSOliver Neukum DECLARE_WAIT_QUEUE_HEAD_ONSTACK(unlink_wakeup); 73969ee472fSOliver Neukum DECLARE_WAITQUEUE(wait, current); 74069ee472fSOliver Neukum int temp; 74169ee472fSOliver Neukum 74269ee472fSOliver Neukum /* ensure there are no more active urbs */ 74369ee472fSOliver Neukum add_wait_queue(&unlink_wakeup, &wait); 74469ee472fSOliver Neukum set_current_state(TASK_UNINTERRUPTIBLE); 74569ee472fSOliver Neukum dev->wait = &unlink_wakeup; 74669ee472fSOliver Neukum temp = unlink_urbs(dev, &dev->txq) + 74769ee472fSOliver Neukum unlink_urbs(dev, &dev->rxq); 74869ee472fSOliver Neukum 74969ee472fSOliver Neukum /* maybe wait for deletions to finish. */ 75069ee472fSOliver Neukum while (!skb_queue_empty(&dev->rxq) 75169ee472fSOliver Neukum && !skb_queue_empty(&dev->txq) 75269ee472fSOliver Neukum && !skb_queue_empty(&dev->done)) { 75366cc42a4SKulikov Vasiliy schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); 75469ee472fSOliver Neukum set_current_state(TASK_UNINTERRUPTIBLE); 755a475f603SJoe Perches netif_dbg(dev, ifdown, dev->net, 756a475f603SJoe Perches "waited for %d urb completions\n", temp); 75769ee472fSOliver Neukum } 75869ee472fSOliver Neukum set_current_state(TASK_RUNNING); 75969ee472fSOliver Neukum dev->wait = NULL; 76069ee472fSOliver Neukum remove_wait_queue(&unlink_wakeup, &wait); 76169ee472fSOliver Neukum } 7625b2fc499SJeff Garzik 763777baa47SStephen Hemminger int usbnet_stop (struct net_device *net) 7645b2fc499SJeff Garzik { 7655b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 766a33e9e7fSJussi Kivilinna struct driver_info *info = dev->driver_info; 767a33e9e7fSJussi Kivilinna int retval; 7685b2fc499SJeff Garzik 76975bd0cbdSMing Lei clear_bit(EVENT_DEV_OPEN, &dev->flags); 7705b2fc499SJeff Garzik netif_stop_queue (net); 7715b2fc499SJeff Garzik 772a475f603SJoe Perches netif_info(dev, ifdown, dev->net, 7738ccef431SBen Hutchings "stop stats: rx/tx %lu/%lu, errs %lu/%lu\n", 7747963837fSHerbert Xu net->stats.rx_packets, net->stats.tx_packets, 77560b86755SJoe Perches net->stats.rx_errors, net->stats.tx_errors); 7765b2fc499SJeff Garzik 777a33e9e7fSJussi Kivilinna /* allow minidriver to stop correctly (wireless devices to turn off 778a33e9e7fSJussi Kivilinna * radio etc) */ 779a33e9e7fSJussi Kivilinna if (info->stop) { 780a33e9e7fSJussi Kivilinna retval = info->stop(dev); 781a475f603SJoe Perches if (retval < 0) 782a475f603SJoe Perches netif_info(dev, ifdown, dev->net, 78360b86755SJoe Perches "stop fail (%d) usbnet usb-%s-%s, %s\n", 784a33e9e7fSJussi Kivilinna retval, 785a33e9e7fSJussi Kivilinna dev->udev->bus->bus_name, dev->udev->devpath, 786a33e9e7fSJussi Kivilinna info->description); 787a33e9e7fSJussi Kivilinna } 788a33e9e7fSJussi Kivilinna 78969ee472fSOliver Neukum if (!(info->flags & FLAG_AVOID_UNLINK_URBS)) 79069ee472fSOliver Neukum usbnet_terminate_urbs(dev); 7915b2fc499SJeff Garzik 7926eecdc5fSDan Williams usbnet_status_stop(dev); 7935b2fc499SJeff Garzik 7947834ddbcSJussi Kivilinna usbnet_purge_paused_rxq(dev); 7957834ddbcSJussi Kivilinna 7965b2fc499SJeff Garzik /* deferred work (task, timer, softirq) must also stop. 7975b2fc499SJeff Garzik * can't flush_scheduled_work() until we drop rtnl (later), 7985b2fc499SJeff Garzik * else workers could deadlock; so make workers a NOP. 7995b2fc499SJeff Garzik */ 8005b2fc499SJeff Garzik dev->flags = 0; 8015b2fc499SJeff Garzik del_timer_sync (&dev->delay); 8025b2fc499SJeff Garzik tasklet_kill (&dev->bh); 803a1c088e0SOliver Neukum if (info->manage_power && 804a1c088e0SOliver Neukum !test_and_clear_bit(EVENT_NO_RUNTIME_PM, &dev->flags)) 80569ee472fSOliver Neukum info->manage_power(dev, 0); 80669ee472fSOliver Neukum else 807a11a6544SOliver Neukum usb_autopm_put_interface(dev->intf); 8085b2fc499SJeff Garzik 8095b2fc499SJeff Garzik return 0; 8105b2fc499SJeff Garzik } 811777baa47SStephen Hemminger EXPORT_SYMBOL_GPL(usbnet_stop); 8125b2fc499SJeff Garzik 8135b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 8145b2fc499SJeff Garzik 8155b2fc499SJeff Garzik // posts reads, and enables write queuing 8165b2fc499SJeff Garzik 8175b2fc499SJeff Garzik // precondition: never called in_interrupt 8185b2fc499SJeff Garzik 819777baa47SStephen Hemminger int usbnet_open (struct net_device *net) 8205b2fc499SJeff Garzik { 8215b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 822a11a6544SOliver Neukum int retval; 8235b2fc499SJeff Garzik struct driver_info *info = dev->driver_info; 8245b2fc499SJeff Garzik 825a11a6544SOliver Neukum if ((retval = usb_autopm_get_interface(dev->intf)) < 0) { 826a475f603SJoe Perches netif_info(dev, ifup, dev->net, 82760b86755SJoe Perches "resumption fail (%d) usbnet usb-%s-%s, %s\n", 828a11a6544SOliver Neukum retval, 82960b86755SJoe Perches dev->udev->bus->bus_name, 83060b86755SJoe Perches dev->udev->devpath, 831a11a6544SOliver Neukum info->description); 832a11a6544SOliver Neukum goto done_nopm; 833a11a6544SOliver Neukum } 834a11a6544SOliver Neukum 8355b2fc499SJeff Garzik // put into "known safe" state 8365b2fc499SJeff Garzik if (info->reset && (retval = info->reset (dev)) < 0) { 837a475f603SJoe Perches netif_info(dev, ifup, dev->net, 83860b86755SJoe Perches "open reset fail (%d) usbnet usb-%s-%s, %s\n", 8395b2fc499SJeff Garzik retval, 84060b86755SJoe Perches dev->udev->bus->bus_name, 84160b86755SJoe Perches dev->udev->devpath, 8425b2fc499SJeff Garzik info->description); 8435b2fc499SJeff Garzik goto done; 8445b2fc499SJeff Garzik } 8455b2fc499SJeff Garzik 8465b2fc499SJeff Garzik // insist peer be connected 8475b2fc499SJeff Garzik if (info->check_connect && (retval = info->check_connect (dev)) < 0) { 848a475f603SJoe Perches netif_dbg(dev, ifup, dev->net, "can't open; %d\n", retval); 8495b2fc499SJeff Garzik goto done; 8505b2fc499SJeff Garzik } 8515b2fc499SJeff Garzik 8525b2fc499SJeff Garzik /* start any status interrupt transfer */ 8535b2fc499SJeff Garzik if (dev->interrupt) { 8546eecdc5fSDan Williams retval = usbnet_status_start(dev, GFP_KERNEL); 8555b2fc499SJeff Garzik if (retval < 0) { 856a475f603SJoe Perches netif_err(dev, ifup, dev->net, 857a475f603SJoe Perches "intr submit %d\n", retval); 8585b2fc499SJeff Garzik goto done; 8595b2fc499SJeff Garzik } 8605b2fc499SJeff Garzik } 8615b2fc499SJeff Garzik 86268972efaSPaul Stewart set_bit(EVENT_DEV_OPEN, &dev->flags); 8635b2fc499SJeff Garzik netif_start_queue (net); 864a475f603SJoe Perches netif_info(dev, ifup, dev->net, 865a475f603SJoe Perches "open: enable queueing (rx %d, tx %d) mtu %d %s framing\n", 86660b86755SJoe Perches (int)RX_QLEN(dev), (int)TX_QLEN(dev), 867a475f603SJoe Perches dev->net->mtu, 868a475f603SJoe Perches (dev->driver_info->flags & FLAG_FRAMING_NC) ? "NetChip" : 869a475f603SJoe Perches (dev->driver_info->flags & FLAG_FRAMING_GL) ? "GeneSys" : 870a475f603SJoe Perches (dev->driver_info->flags & FLAG_FRAMING_Z) ? "Zaurus" : 871a475f603SJoe Perches (dev->driver_info->flags & FLAG_FRAMING_RN) ? "RNDIS" : 872a475f603SJoe Perches (dev->driver_info->flags & FLAG_FRAMING_AX) ? "ASIX" : 873a475f603SJoe Perches "simple"); 8745b2fc499SJeff Garzik 87570c37bf9SBjørn Mork /* reset rx error state */ 87670c37bf9SBjørn Mork dev->pkt_cnt = 0; 87770c37bf9SBjørn Mork dev->pkt_err = 0; 87870c37bf9SBjørn Mork clear_bit(EVENT_RX_KILL, &dev->flags); 87970c37bf9SBjørn Mork 8805b2fc499SJeff Garzik // delay posting reads until we're fully open 8815b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 88269ee472fSOliver Neukum if (info->manage_power) { 88369ee472fSOliver Neukum retval = info->manage_power(dev, 1); 884a1c088e0SOliver Neukum if (retval < 0) { 885a1c088e0SOliver Neukum retval = 0; 886a1c088e0SOliver Neukum set_bit(EVENT_NO_RUNTIME_PM, &dev->flags); 887a1c088e0SOliver Neukum } else { 88869ee472fSOliver Neukum usb_autopm_put_interface(dev->intf); 88969ee472fSOliver Neukum } 890a1c088e0SOliver Neukum } 891a11a6544SOliver Neukum return retval; 8925b2fc499SJeff Garzik done: 893a11a6544SOliver Neukum usb_autopm_put_interface(dev->intf); 894a11a6544SOliver Neukum done_nopm: 8955b2fc499SJeff Garzik return retval; 8965b2fc499SJeff Garzik } 897777baa47SStephen Hemminger EXPORT_SYMBOL_GPL(usbnet_open); 8985b2fc499SJeff Garzik 8995b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 9005b2fc499SJeff Garzik 9015b2fc499SJeff Garzik /* ethtool methods; minidrivers may need to add some more, but 9025b2fc499SJeff Garzik * they'll probably want to use this base set. 9035b2fc499SJeff Garzik */ 9045b2fc499SJeff Garzik 9055b2fc499SJeff Garzik int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd) 9065b2fc499SJeff Garzik { 9075b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9085b2fc499SJeff Garzik 9095b2fc499SJeff Garzik if (!dev->mii.mdio_read) 9105b2fc499SJeff Garzik return -EOPNOTSUPP; 9115b2fc499SJeff Garzik 9125b2fc499SJeff Garzik return mii_ethtool_gset(&dev->mii, cmd); 9135b2fc499SJeff Garzik } 9145b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_get_settings); 9155b2fc499SJeff Garzik 9165b2fc499SJeff Garzik int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd) 9175b2fc499SJeff Garzik { 9185b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9195b2fc499SJeff Garzik int retval; 9205b2fc499SJeff Garzik 9215b2fc499SJeff Garzik if (!dev->mii.mdio_write) 9225b2fc499SJeff Garzik return -EOPNOTSUPP; 9235b2fc499SJeff Garzik 9245b2fc499SJeff Garzik retval = mii_ethtool_sset(&dev->mii, cmd); 9255b2fc499SJeff Garzik 9265b2fc499SJeff Garzik /* link speed/duplex might have changed */ 9275b2fc499SJeff Garzik if (dev->driver_info->link_reset) 9285b2fc499SJeff Garzik dev->driver_info->link_reset(dev); 9295b2fc499SJeff Garzik 9305b2fc499SJeff Garzik return retval; 9315b2fc499SJeff Garzik 9325b2fc499SJeff Garzik } 9335b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_set_settings); 9345b2fc499SJeff Garzik 9355b2fc499SJeff Garzik u32 usbnet_get_link (struct net_device *net) 9365b2fc499SJeff Garzik { 9375b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9385b2fc499SJeff Garzik 9395b2fc499SJeff Garzik /* If a check_connect is defined, return its result */ 9405b2fc499SJeff Garzik if (dev->driver_info->check_connect) 9415b2fc499SJeff Garzik return dev->driver_info->check_connect (dev) == 0; 9425b2fc499SJeff Garzik 9435b2fc499SJeff Garzik /* if the device has mii operations, use those */ 9445b2fc499SJeff Garzik if (dev->mii.mdio_read) 9455b2fc499SJeff Garzik return mii_link_ok(&dev->mii); 9465b2fc499SJeff Garzik 94705ffb3e2SBjørn Mork /* Otherwise, dtrt for drivers calling netif_carrier_{on,off} */ 94805ffb3e2SBjørn Mork return ethtool_op_get_link(net); 9495b2fc499SJeff Garzik } 9505b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_get_link); 9515b2fc499SJeff Garzik 9525b2fc499SJeff Garzik int usbnet_nway_reset(struct net_device *net) 9535b2fc499SJeff Garzik { 9545b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9555b2fc499SJeff Garzik 9565b2fc499SJeff Garzik if (!dev->mii.mdio_write) 9575b2fc499SJeff Garzik return -EOPNOTSUPP; 9585b2fc499SJeff Garzik 9595b2fc499SJeff Garzik return mii_nway_restart(&dev->mii); 9605b2fc499SJeff Garzik } 9615b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_nway_reset); 9625b2fc499SJeff Garzik 9635b2fc499SJeff Garzik void usbnet_get_drvinfo (struct net_device *net, struct ethtool_drvinfo *info) 9645b2fc499SJeff Garzik { 9655b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9665b2fc499SJeff Garzik 96786a2f415SPhil Sutter strlcpy (info->driver, dev->driver_name, sizeof info->driver); 96886a2f415SPhil Sutter strlcpy (info->version, DRIVER_VERSION, sizeof info->version); 96986a2f415SPhil Sutter strlcpy (info->fw_version, dev->driver_info->description, 9705b2fc499SJeff Garzik sizeof info->fw_version); 9715b2fc499SJeff Garzik usb_make_path (dev->udev, info->bus_info, sizeof info->bus_info); 9725b2fc499SJeff Garzik } 9735b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_get_drvinfo); 9745b2fc499SJeff Garzik 9755b2fc499SJeff Garzik u32 usbnet_get_msglevel (struct net_device *net) 9765b2fc499SJeff Garzik { 9775b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9785b2fc499SJeff Garzik 9795b2fc499SJeff Garzik return dev->msg_enable; 9805b2fc499SJeff Garzik } 9815b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_get_msglevel); 9825b2fc499SJeff Garzik 9835b2fc499SJeff Garzik void usbnet_set_msglevel (struct net_device *net, u32 level) 9845b2fc499SJeff Garzik { 9855b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 9865b2fc499SJeff Garzik 9875b2fc499SJeff Garzik dev->msg_enable = level; 9885b2fc499SJeff Garzik } 9895b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_set_msglevel); 9905b2fc499SJeff Garzik 9915b2fc499SJeff Garzik /* drivers may override default ethtool_ops in their bind() routine */ 9920fc0b732SStephen Hemminger static const struct ethtool_ops usbnet_ethtool_ops = { 9935b2fc499SJeff Garzik .get_settings = usbnet_get_settings, 9945b2fc499SJeff Garzik .set_settings = usbnet_set_settings, 9955b2fc499SJeff Garzik .get_link = usbnet_get_link, 9965b2fc499SJeff Garzik .nway_reset = usbnet_nway_reset, 9975b2fc499SJeff Garzik .get_drvinfo = usbnet_get_drvinfo, 9985b2fc499SJeff Garzik .get_msglevel = usbnet_get_msglevel, 9995b2fc499SJeff Garzik .set_msglevel = usbnet_set_msglevel, 1000123edb18SRichard Cochran .get_ts_info = ethtool_op_get_ts_info, 10015b2fc499SJeff Garzik }; 10025b2fc499SJeff Garzik 10035b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 10045b2fc499SJeff Garzik 10054b49f58fSMing Lei static void __handle_link_change(struct usbnet *dev) 10064b49f58fSMing Lei { 10074b49f58fSMing Lei if (!test_bit(EVENT_DEV_OPEN, &dev->flags)) 10084b49f58fSMing Lei return; 10094b49f58fSMing Lei 10104b49f58fSMing Lei if (!netif_carrier_ok(dev->net)) { 10114b49f58fSMing Lei /* kill URBs for reading packets to save bus bandwidth */ 10124b49f58fSMing Lei unlink_urbs(dev, &dev->rxq); 10134b49f58fSMing Lei 10144b49f58fSMing Lei /* 10154b49f58fSMing Lei * tx_timeout will unlink URBs for sending packets and 10164b49f58fSMing Lei * tx queue is stopped by netcore after link becomes off 10174b49f58fSMing Lei */ 10184b49f58fSMing Lei } else { 10194b49f58fSMing Lei /* submitting URBs for reading packets */ 10204b49f58fSMing Lei tasklet_schedule(&dev->bh); 10214b49f58fSMing Lei } 10224b49f58fSMing Lei 10234b49f58fSMing Lei clear_bit(EVENT_LINK_CHANGE, &dev->flags); 10244b49f58fSMing Lei } 10254b49f58fSMing Lei 10265b2fc499SJeff Garzik /* work that cannot be done in interrupt context uses keventd. 10275b2fc499SJeff Garzik * 10285b2fc499SJeff Garzik * NOTE: with 2.5 we could do more of this using completion callbacks, 10295b2fc499SJeff Garzik * especially now that control transfers can be queued. 10305b2fc499SJeff Garzik */ 10315b2fc499SJeff Garzik static void 10325b2fc499SJeff Garzik kevent (struct work_struct *work) 10335b2fc499SJeff Garzik { 10345b2fc499SJeff Garzik struct usbnet *dev = 10355b2fc499SJeff Garzik container_of(work, struct usbnet, kevent); 10365b2fc499SJeff Garzik int status; 10375b2fc499SJeff Garzik 10385b2fc499SJeff Garzik /* usb_clear_halt() needs a thread context */ 10395b2fc499SJeff Garzik if (test_bit (EVENT_TX_HALT, &dev->flags)) { 10405b2fc499SJeff Garzik unlink_urbs (dev, &dev->txq); 104169ee472fSOliver Neukum status = usb_autopm_get_interface(dev->intf); 104269ee472fSOliver Neukum if (status < 0) 104369ee472fSOliver Neukum goto fail_pipe; 10445b2fc499SJeff Garzik status = usb_clear_halt (dev->udev, dev->out); 104569ee472fSOliver Neukum usb_autopm_put_interface(dev->intf); 10468e95a202SJoe Perches if (status < 0 && 10478e95a202SJoe Perches status != -EPIPE && 10488e95a202SJoe Perches status != -ESHUTDOWN) { 10495b2fc499SJeff Garzik if (netif_msg_tx_err (dev)) 105069ee472fSOliver Neukum fail_pipe: 105160b86755SJoe Perches netdev_err(dev->net, "can't clear tx halt, status %d\n", 10525b2fc499SJeff Garzik status); 10535b2fc499SJeff Garzik } else { 10545b2fc499SJeff Garzik clear_bit (EVENT_TX_HALT, &dev->flags); 10555b2fc499SJeff Garzik if (status != -ESHUTDOWN) 10565b2fc499SJeff Garzik netif_wake_queue (dev->net); 10575b2fc499SJeff Garzik } 10585b2fc499SJeff Garzik } 10595b2fc499SJeff Garzik if (test_bit (EVENT_RX_HALT, &dev->flags)) { 10605b2fc499SJeff Garzik unlink_urbs (dev, &dev->rxq); 106169ee472fSOliver Neukum status = usb_autopm_get_interface(dev->intf); 106269ee472fSOliver Neukum if (status < 0) 106369ee472fSOliver Neukum goto fail_halt; 10645b2fc499SJeff Garzik status = usb_clear_halt (dev->udev, dev->in); 106569ee472fSOliver Neukum usb_autopm_put_interface(dev->intf); 10668e95a202SJoe Perches if (status < 0 && 10678e95a202SJoe Perches status != -EPIPE && 10688e95a202SJoe Perches status != -ESHUTDOWN) { 10695b2fc499SJeff Garzik if (netif_msg_rx_err (dev)) 107069ee472fSOliver Neukum fail_halt: 107160b86755SJoe Perches netdev_err(dev->net, "can't clear rx halt, status %d\n", 10725b2fc499SJeff Garzik status); 10735b2fc499SJeff Garzik } else { 10745b2fc499SJeff Garzik clear_bit (EVENT_RX_HALT, &dev->flags); 10755b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 10765b2fc499SJeff Garzik } 10775b2fc499SJeff Garzik } 10785b2fc499SJeff Garzik 10795b2fc499SJeff Garzik /* tasklet could resubmit itself forever if memory is tight */ 10805b2fc499SJeff Garzik if (test_bit (EVENT_RX_MEMORY, &dev->flags)) { 10815b2fc499SJeff Garzik struct urb *urb = NULL; 1082dacb3975SDavid S. Miller int resched = 1; 10835b2fc499SJeff Garzik 10845b2fc499SJeff Garzik if (netif_running (dev->net)) 10855b2fc499SJeff Garzik urb = usb_alloc_urb (0, GFP_KERNEL); 10865b2fc499SJeff Garzik else 10875b2fc499SJeff Garzik clear_bit (EVENT_RX_MEMORY, &dev->flags); 10885b2fc499SJeff Garzik if (urb != NULL) { 10895b2fc499SJeff Garzik clear_bit (EVENT_RX_MEMORY, &dev->flags); 109069ee472fSOliver Neukum status = usb_autopm_get_interface(dev->intf); 1091ab60707fSJesper Juhl if (status < 0) { 1092ab60707fSJesper Juhl usb_free_urb(urb); 109369ee472fSOliver Neukum goto fail_lowmem; 1094ab60707fSJesper Juhl } 1095dacb3975SDavid S. Miller if (rx_submit (dev, urb, GFP_KERNEL) == -ENOLINK) 1096dacb3975SDavid S. Miller resched = 0; 109769ee472fSOliver Neukum usb_autopm_put_interface(dev->intf); 109869ee472fSOliver Neukum fail_lowmem: 1099dacb3975SDavid S. Miller if (resched) 11005b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 11015b2fc499SJeff Garzik } 11025b2fc499SJeff Garzik } 11035b2fc499SJeff Garzik 11045b2fc499SJeff Garzik if (test_bit (EVENT_LINK_RESET, &dev->flags)) { 11055b2fc499SJeff Garzik struct driver_info *info = dev->driver_info; 11065b2fc499SJeff Garzik int retval = 0; 11075b2fc499SJeff Garzik 11085b2fc499SJeff Garzik clear_bit (EVENT_LINK_RESET, &dev->flags); 110969ee472fSOliver Neukum status = usb_autopm_get_interface(dev->intf); 111069ee472fSOliver Neukum if (status < 0) 111169ee472fSOliver Neukum goto skip_reset; 11125b2fc499SJeff Garzik if(info->link_reset && (retval = info->link_reset(dev)) < 0) { 111369ee472fSOliver Neukum usb_autopm_put_interface(dev->intf); 111469ee472fSOliver Neukum skip_reset: 111560b86755SJoe Perches netdev_info(dev->net, "link reset failed (%d) usbnet usb-%s-%s, %s\n", 11165b2fc499SJeff Garzik retval, 111760b86755SJoe Perches dev->udev->bus->bus_name, 111860b86755SJoe Perches dev->udev->devpath, 11195b2fc499SJeff Garzik info->description); 112069ee472fSOliver Neukum } else { 112169ee472fSOliver Neukum usb_autopm_put_interface(dev->intf); 11225b2fc499SJeff Garzik } 11234b49f58fSMing Lei 11244b49f58fSMing Lei /* handle link change from link resetting */ 11254b49f58fSMing Lei __handle_link_change(dev); 11265b2fc499SJeff Garzik } 11275b2fc499SJeff Garzik 11284b49f58fSMing Lei if (test_bit (EVENT_LINK_CHANGE, &dev->flags)) 11294b49f58fSMing Lei __handle_link_change(dev); 11304b49f58fSMing Lei 11315b2fc499SJeff Garzik if (dev->flags) 113260b86755SJoe Perches netdev_dbg(dev->net, "kevent done, flags = 0x%lx\n", dev->flags); 11335b2fc499SJeff Garzik } 11345b2fc499SJeff Garzik 11355b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 11365b2fc499SJeff Garzik 11375b2fc499SJeff Garzik static void tx_complete (struct urb *urb) 11385b2fc499SJeff Garzik { 11395b2fc499SJeff Garzik struct sk_buff *skb = (struct sk_buff *) urb->context; 11405b2fc499SJeff Garzik struct skb_data *entry = (struct skb_data *) skb->cb; 11415b2fc499SJeff Garzik struct usbnet *dev = entry->dev; 11425b2fc499SJeff Garzik 11435b2fc499SJeff Garzik if (urb->status == 0) { 1144073285fdSAlexey Orishko if (!(dev->driver_info->flags & FLAG_MULTI_PACKET)) 11457963837fSHerbert Xu dev->net->stats.tx_packets++; 11467963837fSHerbert Xu dev->net->stats.tx_bytes += entry->length; 11475b2fc499SJeff Garzik } else { 11487963837fSHerbert Xu dev->net->stats.tx_errors++; 11495b2fc499SJeff Garzik 11505b2fc499SJeff Garzik switch (urb->status) { 11515b2fc499SJeff Garzik case -EPIPE: 11525b2fc499SJeff Garzik usbnet_defer_kevent (dev, EVENT_TX_HALT); 11535b2fc499SJeff Garzik break; 11545b2fc499SJeff Garzik 11555b2fc499SJeff Garzik /* software-driven interface shutdown */ 11565b2fc499SJeff Garzik case -ECONNRESET: // async unlink 11575b2fc499SJeff Garzik case -ESHUTDOWN: // hardware gone 11585b2fc499SJeff Garzik break; 11595b2fc499SJeff Garzik 11605b2fc499SJeff Garzik // like rx, tx gets controller i/o faults during khubd delays 11615b2fc499SJeff Garzik // and so it uses the same throttling mechanism. 11625b2fc499SJeff Garzik case -EPROTO: 11635b2fc499SJeff Garzik case -ETIME: 11645b2fc499SJeff Garzik case -EILSEQ: 116569ee472fSOliver Neukum usb_mark_last_busy(dev->udev); 11665b2fc499SJeff Garzik if (!timer_pending (&dev->delay)) { 11675b2fc499SJeff Garzik mod_timer (&dev->delay, 11685b2fc499SJeff Garzik jiffies + THROTTLE_JIFFIES); 1169a475f603SJoe Perches netif_dbg(dev, link, dev->net, 1170a475f603SJoe Perches "tx throttle %d\n", urb->status); 11715b2fc499SJeff Garzik } 11725b2fc499SJeff Garzik netif_stop_queue (dev->net); 11735b2fc499SJeff Garzik break; 11745b2fc499SJeff Garzik default: 1175a475f603SJoe Perches netif_dbg(dev, tx_err, dev->net, 1176a475f603SJoe Perches "tx err %d\n", entry->urb->status); 11775b2fc499SJeff Garzik break; 11785b2fc499SJeff Garzik } 11795b2fc499SJeff Garzik } 11805b2fc499SJeff Garzik 118169ee472fSOliver Neukum usb_autopm_put_interface_async(dev->intf); 11825b6e9bcdSMing Lei (void) defer_bh(dev, skb, &dev->txq, tx_done); 11835b2fc499SJeff Garzik } 11845b2fc499SJeff Garzik 11855b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 11865b2fc499SJeff Garzik 1187777baa47SStephen Hemminger void usbnet_tx_timeout (struct net_device *net) 11885b2fc499SJeff Garzik { 11895b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 11905b2fc499SJeff Garzik 11915b2fc499SJeff Garzik unlink_urbs (dev, &dev->txq); 11925b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 11935b2fc499SJeff Garzik 11945b2fc499SJeff Garzik // FIXME: device recovery -- reset? 11955b2fc499SJeff Garzik } 1196777baa47SStephen Hemminger EXPORT_SYMBOL_GPL(usbnet_tx_timeout); 11975b2fc499SJeff Garzik 11985b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 11995b2fc499SJeff Garzik 120025a79c41SStephen Hemminger netdev_tx_t usbnet_start_xmit (struct sk_buff *skb, 120125a79c41SStephen Hemminger struct net_device *net) 12025b2fc499SJeff Garzik { 12035b2fc499SJeff Garzik struct usbnet *dev = netdev_priv(net); 12045b2fc499SJeff Garzik int length; 12055b2fc499SJeff Garzik struct urb *urb = NULL; 12065b2fc499SJeff Garzik struct skb_data *entry; 12075b2fc499SJeff Garzik struct driver_info *info = dev->driver_info; 12085b2fc499SJeff Garzik unsigned long flags; 120925a79c41SStephen Hemminger int retval; 12105b2fc499SJeff Garzik 121123ba0799SKonstantin Khlebnikov if (skb) 1212f9b491ecSMichael Riesch skb_tx_timestamp(skb); 1213f9b491ecSMichael Riesch 12145b2fc499SJeff Garzik // some devices want funky USB-level framing, for 12155b2fc499SJeff Garzik // win32 driver (usually) and/or hardware quirks 12165b2fc499SJeff Garzik if (info->tx_fixup) { 12175b2fc499SJeff Garzik skb = info->tx_fixup (dev, skb, GFP_ATOMIC); 12185b2fc499SJeff Garzik if (!skb) { 1219bf414b36SBjørn Mork /* packet collected; minidriver waiting for more */ 1220bf414b36SBjørn Mork if (info->flags & FLAG_MULTI_PACKET) 1221bf414b36SBjørn Mork goto not_drop; 1222a475f603SJoe Perches netif_dbg(dev, tx_err, dev->net, "can't tx_fixup skb\n"); 12235b2fc499SJeff Garzik goto drop; 12245b2fc499SJeff Garzik } 12255b2fc499SJeff Garzik } 12265b2fc499SJeff Garzik length = skb->len; 12275b2fc499SJeff Garzik 12285b2fc499SJeff Garzik if (!(urb = usb_alloc_urb (0, GFP_ATOMIC))) { 1229a475f603SJoe Perches netif_dbg(dev, tx_err, dev->net, "no urb\n"); 12305b2fc499SJeff Garzik goto drop; 12315b2fc499SJeff Garzik } 12325b2fc499SJeff Garzik 12335b2fc499SJeff Garzik entry = (struct skb_data *) skb->cb; 12345b2fc499SJeff Garzik entry->urb = urb; 12355b2fc499SJeff Garzik entry->dev = dev; 12365b2fc499SJeff Garzik entry->length = length; 12375b2fc499SJeff Garzik 12385b2fc499SJeff Garzik usb_fill_bulk_urb (urb, dev->udev, dev->out, 12395b2fc499SJeff Garzik skb->data, skb->len, tx_complete, skb); 12405b2fc499SJeff Garzik 12415b2fc499SJeff Garzik /* don't assume the hardware handles USB_ZERO_PACKET 12425b2fc499SJeff Garzik * NOTE: strictly conforming cdc-ether devices should expect 12435b2fc499SJeff Garzik * the ZLP here, but ignore the one-byte packet. 1244073285fdSAlexey Orishko * NOTE2: CDC NCM specification is different from CDC ECM when 1245073285fdSAlexey Orishko * handling ZLP/short packets, so cdc_ncm driver will make short 1246073285fdSAlexey Orishko * packet itself if needed. 12475b2fc499SJeff Garzik */ 1248b4d562e3SElina Pasheva if (length % dev->maxpacket == 0) { 1249b4d562e3SElina Pasheva if (!(info->flags & FLAG_SEND_ZLP)) { 1250073285fdSAlexey Orishko if (!(info->flags & FLAG_MULTI_PACKET)) { 12515b2fc499SJeff Garzik urb->transfer_buffer_length++; 12523e323f3eSPeter Korsgaard if (skb_tailroom(skb)) { 12533e323f3eSPeter Korsgaard skb->data[skb->len] = 0; 12543e323f3eSPeter Korsgaard __skb_put(skb, 1); 12553e323f3eSPeter Korsgaard } 1256073285fdSAlexey Orishko } 1257b4d562e3SElina Pasheva } else 1258b4d562e3SElina Pasheva urb->transfer_flags |= URB_ZERO_PACKET; 12593e323f3eSPeter Korsgaard } 12605b2fc499SJeff Garzik 12615b2fc499SJeff Garzik spin_lock_irqsave(&dev->txq.lock, flags); 126269ee472fSOliver Neukum retval = usb_autopm_get_interface_async(dev->intf); 126369ee472fSOliver Neukum if (retval < 0) { 126469ee472fSOliver Neukum spin_unlock_irqrestore(&dev->txq.lock, flags); 126569ee472fSOliver Neukum goto drop; 126669ee472fSOliver Neukum } 126769ee472fSOliver Neukum 126869ee472fSOliver Neukum #ifdef CONFIG_PM 126969ee472fSOliver Neukum /* if this triggers the device is still a sleep */ 127069ee472fSOliver Neukum if (test_bit(EVENT_DEV_ASLEEP, &dev->flags)) { 127169ee472fSOliver Neukum /* transmission will be done in resume */ 127269ee472fSOliver Neukum usb_anchor_urb(urb, &dev->deferred); 127369ee472fSOliver Neukum /* no use to process more packets */ 127469ee472fSOliver Neukum netif_stop_queue(net); 127539707c2aSHemant Kumar usb_put_urb(urb); 127669ee472fSOliver Neukum spin_unlock_irqrestore(&dev->txq.lock, flags); 127760b86755SJoe Perches netdev_dbg(dev->net, "Delaying transmission for resumption\n"); 127869ee472fSOliver Neukum goto deferred; 127969ee472fSOliver Neukum } 128069ee472fSOliver Neukum #endif 12815b2fc499SJeff Garzik 12825b2fc499SJeff Garzik switch ((retval = usb_submit_urb (urb, GFP_ATOMIC))) { 12835b2fc499SJeff Garzik case -EPIPE: 12845b2fc499SJeff Garzik netif_stop_queue (net); 12855b2fc499SJeff Garzik usbnet_defer_kevent (dev, EVENT_TX_HALT); 128669ee472fSOliver Neukum usb_autopm_put_interface_async(dev->intf); 12875b2fc499SJeff Garzik break; 12885b2fc499SJeff Garzik default: 128969ee472fSOliver Neukum usb_autopm_put_interface_async(dev->intf); 1290a475f603SJoe Perches netif_dbg(dev, tx_err, dev->net, 1291a475f603SJoe Perches "tx: submit urb err %d\n", retval); 12925b2fc499SJeff Garzik break; 12935b2fc499SJeff Garzik case 0: 12945b2fc499SJeff Garzik net->trans_start = jiffies; 12955b6e9bcdSMing Lei __usbnet_queue_skb(&dev->txq, skb, tx_start); 12965b2fc499SJeff Garzik if (dev->txq.qlen >= TX_QLEN (dev)) 12975b2fc499SJeff Garzik netif_stop_queue (net); 12985b2fc499SJeff Garzik } 12995b2fc499SJeff Garzik spin_unlock_irqrestore (&dev->txq.lock, flags); 13005b2fc499SJeff Garzik 13015b2fc499SJeff Garzik if (retval) { 1302a475f603SJoe Perches netif_dbg(dev, tx_err, dev->net, "drop, code %d\n", retval); 13035b2fc499SJeff Garzik drop: 13047963837fSHerbert Xu dev->net->stats.tx_dropped++; 1305073285fdSAlexey Orishko not_drop: 13065b2fc499SJeff Garzik if (skb) 13075b2fc499SJeff Garzik dev_kfree_skb_any (skb); 13085b2fc499SJeff Garzik usb_free_urb (urb); 1309a475f603SJoe Perches } else 1310a475f603SJoe Perches netif_dbg(dev, tx_queued, dev->net, 1311a475f603SJoe Perches "> tx, len %d, type 0x%x\n", length, skb->protocol); 131269ee472fSOliver Neukum #ifdef CONFIG_PM 131369ee472fSOliver Neukum deferred: 131469ee472fSOliver Neukum #endif 131525a79c41SStephen Hemminger return NETDEV_TX_OK; 13165b2fc499SJeff Garzik } 1317777baa47SStephen Hemminger EXPORT_SYMBOL_GPL(usbnet_start_xmit); 13185b2fc499SJeff Garzik 131985e87870SBjørn Mork static int rx_alloc_submit(struct usbnet *dev, gfp_t flags) 132065841fd5SMing Lei { 132165841fd5SMing Lei struct urb *urb; 132265841fd5SMing Lei int i; 132385e87870SBjørn Mork int ret = 0; 132465841fd5SMing Lei 132565841fd5SMing Lei /* don't refill the queue all at once */ 132665841fd5SMing Lei for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { 132765841fd5SMing Lei urb = usb_alloc_urb(0, flags); 132865841fd5SMing Lei if (urb != NULL) { 132985e87870SBjørn Mork ret = rx_submit(dev, urb, flags); 133085e87870SBjørn Mork if (ret) 133185e87870SBjørn Mork goto err; 133285e87870SBjørn Mork } else { 133385e87870SBjørn Mork ret = -ENOMEM; 133485e87870SBjørn Mork goto err; 133565841fd5SMing Lei } 133665841fd5SMing Lei } 133785e87870SBjørn Mork err: 133885e87870SBjørn Mork return ret; 133965841fd5SMing Lei } 134065841fd5SMing Lei 13415b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 13425b2fc499SJeff Garzik 13435b2fc499SJeff Garzik // tasklet (work deferred from completions, in_irq) or timer 13445b2fc499SJeff Garzik 13455b2fc499SJeff Garzik static void usbnet_bh (unsigned long param) 13465b2fc499SJeff Garzik { 13475b2fc499SJeff Garzik struct usbnet *dev = (struct usbnet *) param; 13485b2fc499SJeff Garzik struct sk_buff *skb; 13495b2fc499SJeff Garzik struct skb_data *entry; 13505b2fc499SJeff Garzik 13515b2fc499SJeff Garzik while ((skb = skb_dequeue (&dev->done))) { 13525b2fc499SJeff Garzik entry = (struct skb_data *) skb->cb; 13535b2fc499SJeff Garzik switch (entry->state) { 13545b2fc499SJeff Garzik case rx_done: 13555b2fc499SJeff Garzik entry->state = rx_cleanup; 13565b2fc499SJeff Garzik rx_process (dev, skb); 13575b2fc499SJeff Garzik continue; 13585b2fc499SJeff Garzik case tx_done: 13595b2fc499SJeff Garzik case rx_cleanup: 13605b2fc499SJeff Garzik usb_free_urb (entry->urb); 13615b2fc499SJeff Garzik dev_kfree_skb (skb); 13625b2fc499SJeff Garzik continue; 13635b2fc499SJeff Garzik default: 136460b86755SJoe Perches netdev_dbg(dev->net, "bogus skb state %d\n", entry->state); 13655b2fc499SJeff Garzik } 13665b2fc499SJeff Garzik } 13675b2fc499SJeff Garzik 136870c37bf9SBjørn Mork /* restart RX again after disabling due to high error rate */ 136970c37bf9SBjørn Mork clear_bit(EVENT_RX_KILL, &dev->flags); 137070c37bf9SBjørn Mork 13715b2fc499SJeff Garzik // waiting for all pending urbs to complete? 13725b2fc499SJeff Garzik if (dev->wait) { 13735b2fc499SJeff Garzik if ((dev->txq.qlen + dev->rxq.qlen + dev->done.qlen) == 0) { 13745b2fc499SJeff Garzik wake_up (dev->wait); 13755b2fc499SJeff Garzik } 13765b2fc499SJeff Garzik 13775b2fc499SJeff Garzik // or are we maybe short a few urbs? 13788e95a202SJoe Perches } else if (netif_running (dev->net) && 13798e95a202SJoe Perches netif_device_present (dev->net) && 13804b49f58fSMing Lei netif_carrier_ok(dev->net) && 13818e95a202SJoe Perches !timer_pending (&dev->delay) && 13828e95a202SJoe Perches !test_bit (EVENT_RX_HALT, &dev->flags)) { 13835b2fc499SJeff Garzik int temp = dev->rxq.qlen; 13845b2fc499SJeff Garzik 138565841fd5SMing Lei if (temp < RX_QLEN(dev)) { 138685e87870SBjørn Mork if (rx_alloc_submit(dev, GFP_ATOMIC) == -ENOLINK) 138785e87870SBjørn Mork return; 1388a475f603SJoe Perches if (temp != dev->rxq.qlen) 1389a475f603SJoe Perches netif_dbg(dev, link, dev->net, 1390a475f603SJoe Perches "rxqlen %d --> %d\n", 13915b2fc499SJeff Garzik temp, dev->rxq.qlen); 139265841fd5SMing Lei if (dev->rxq.qlen < RX_QLEN(dev)) 13935b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 13945b2fc499SJeff Garzik } 13955b2fc499SJeff Garzik if (dev->txq.qlen < TX_QLEN (dev)) 13965b2fc499SJeff Garzik netif_wake_queue (dev->net); 13975b2fc499SJeff Garzik } 13985b2fc499SJeff Garzik } 13995b2fc499SJeff Garzik 14005b2fc499SJeff Garzik 14015b2fc499SJeff Garzik /*------------------------------------------------------------------------- 14025b2fc499SJeff Garzik * 14035b2fc499SJeff Garzik * USB Device Driver support 14045b2fc499SJeff Garzik * 14055b2fc499SJeff Garzik *-------------------------------------------------------------------------*/ 14065b2fc499SJeff Garzik 14075b2fc499SJeff Garzik // precondition: never called in_interrupt 14085b2fc499SJeff Garzik 14095b2fc499SJeff Garzik void usbnet_disconnect (struct usb_interface *intf) 14105b2fc499SJeff Garzik { 14115b2fc499SJeff Garzik struct usbnet *dev; 14125b2fc499SJeff Garzik struct usb_device *xdev; 14135b2fc499SJeff Garzik struct net_device *net; 14145b2fc499SJeff Garzik 14155b2fc499SJeff Garzik dev = usb_get_intfdata(intf); 14165b2fc499SJeff Garzik usb_set_intfdata(intf, NULL); 14175b2fc499SJeff Garzik if (!dev) 14185b2fc499SJeff Garzik return; 14195b2fc499SJeff Garzik 14205b2fc499SJeff Garzik xdev = interface_to_usbdev (intf); 14215b2fc499SJeff Garzik 1422a475f603SJoe Perches netif_info(dev, probe, dev->net, "unregister '%s' usb-%s-%s, %s\n", 14235b2fc499SJeff Garzik intf->dev.driver->name, 14245b2fc499SJeff Garzik xdev->bus->bus_name, xdev->devpath, 14255b2fc499SJeff Garzik dev->driver_info->description); 14265b2fc499SJeff Garzik 14275b2fc499SJeff Garzik net = dev->net; 14285b2fc499SJeff Garzik unregister_netdev (net); 14295b2fc499SJeff Garzik 143023f333a2STejun Heo cancel_work_sync(&dev->kevent); 14315b2fc499SJeff Garzik 143239707c2aSHemant Kumar usb_scuttle_anchored_urbs(&dev->deferred); 143339707c2aSHemant Kumar 14345b2fc499SJeff Garzik if (dev->driver_info->unbind) 14355b2fc499SJeff Garzik dev->driver_info->unbind (dev, intf); 14365b2fc499SJeff Garzik 143768972efaSPaul Stewart usb_kill_urb(dev->interrupt); 143868972efaSPaul Stewart usb_free_urb(dev->interrupt); 143968972efaSPaul Stewart 14405b2fc499SJeff Garzik free_netdev(net); 14415b2fc499SJeff Garzik } 14425b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_disconnect); 14435b2fc499SJeff Garzik 1444777baa47SStephen Hemminger static const struct net_device_ops usbnet_netdev_ops = { 1445777baa47SStephen Hemminger .ndo_open = usbnet_open, 1446777baa47SStephen Hemminger .ndo_stop = usbnet_stop, 1447777baa47SStephen Hemminger .ndo_start_xmit = usbnet_start_xmit, 1448777baa47SStephen Hemminger .ndo_tx_timeout = usbnet_tx_timeout, 1449777baa47SStephen Hemminger .ndo_change_mtu = usbnet_change_mtu, 1450777baa47SStephen Hemminger .ndo_set_mac_address = eth_mac_addr, 1451777baa47SStephen Hemminger .ndo_validate_addr = eth_validate_addr, 1452777baa47SStephen Hemminger }; 14535b2fc499SJeff Garzik 14545b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 14555b2fc499SJeff Garzik 14565b2fc499SJeff Garzik // precondition: never called in_interrupt 14575b2fc499SJeff Garzik 1458225794f8SMarcel Holtmann static struct device_type wlan_type = { 1459225794f8SMarcel Holtmann .name = "wlan", 1460225794f8SMarcel Holtmann }; 1461225794f8SMarcel Holtmann 1462225794f8SMarcel Holtmann static struct device_type wwan_type = { 1463225794f8SMarcel Holtmann .name = "wwan", 1464225794f8SMarcel Holtmann }; 1465225794f8SMarcel Holtmann 14665b2fc499SJeff Garzik int 14675b2fc499SJeff Garzik usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) 14685b2fc499SJeff Garzik { 14695b2fc499SJeff Garzik struct usbnet *dev; 14705b2fc499SJeff Garzik struct net_device *net; 14715b2fc499SJeff Garzik struct usb_host_interface *interface; 14725b2fc499SJeff Garzik struct driver_info *info; 14735b2fc499SJeff Garzik struct usb_device *xdev; 14745b2fc499SJeff Garzik int status; 14755b2fc499SJeff Garzik const char *name; 1476b0786b43SMing Lei struct usb_driver *driver = to_usb_driver(udev->dev.driver); 1477b0786b43SMing Lei 1478b0786b43SMing Lei /* usbnet already took usb runtime pm, so have to enable the feature 1479b0786b43SMing Lei * for usb interface, otherwise usb_autopm_get_interface may return 1480*98f541c6SAlan Stern * failure if RUNTIME_PM is enabled. 1481b0786b43SMing Lei */ 1482b0786b43SMing Lei if (!driver->supports_autosuspend) { 1483b0786b43SMing Lei driver->supports_autosuspend = 1; 1484b0786b43SMing Lei pm_runtime_enable(&udev->dev); 1485b0786b43SMing Lei } 14865b2fc499SJeff Garzik 14875b2fc499SJeff Garzik name = udev->dev.driver->name; 14885b2fc499SJeff Garzik info = (struct driver_info *) prod->driver_info; 14895b2fc499SJeff Garzik if (!info) { 14905b2fc499SJeff Garzik dev_dbg (&udev->dev, "blacklisted by %s\n", name); 14915b2fc499SJeff Garzik return -ENODEV; 14925b2fc499SJeff Garzik } 14935b2fc499SJeff Garzik xdev = interface_to_usbdev (udev); 14945b2fc499SJeff Garzik interface = udev->cur_altsetting; 14955b2fc499SJeff Garzik 14965b2fc499SJeff Garzik status = -ENOMEM; 14975b2fc499SJeff Garzik 14985b2fc499SJeff Garzik // set up our own records 14995b2fc499SJeff Garzik net = alloc_etherdev(sizeof(*dev)); 150041de8d4cSJoe Perches if (!net) 15015b2fc499SJeff Garzik goto out; 15025b2fc499SJeff Garzik 15030dacca73SBen Hutchings /* netdev_printk() needs this so do it as early as possible */ 15040dacca73SBen Hutchings SET_NETDEV_DEV(net, &udev->dev); 15050dacca73SBen Hutchings 15065b2fc499SJeff Garzik dev = netdev_priv(net); 15075b2fc499SJeff Garzik dev->udev = xdev; 1508a11a6544SOliver Neukum dev->intf = udev; 15095b2fc499SJeff Garzik dev->driver_info = info; 15105b2fc499SJeff Garzik dev->driver_name = name; 15115b2fc499SJeff Garzik dev->msg_enable = netif_msg_init (msg_level, NETIF_MSG_DRV 15125b2fc499SJeff Garzik | NETIF_MSG_PROBE | NETIF_MSG_LINK); 15135b2fc499SJeff Garzik skb_queue_head_init (&dev->rxq); 15145b2fc499SJeff Garzik skb_queue_head_init (&dev->txq); 15155b2fc499SJeff Garzik skb_queue_head_init (&dev->done); 15167834ddbcSJussi Kivilinna skb_queue_head_init(&dev->rxq_pause); 15175b2fc499SJeff Garzik dev->bh.func = usbnet_bh; 15185b2fc499SJeff Garzik dev->bh.data = (unsigned long) dev; 15195b2fc499SJeff Garzik INIT_WORK (&dev->kevent, kevent); 152069ee472fSOliver Neukum init_usb_anchor(&dev->deferred); 15215b2fc499SJeff Garzik dev->delay.function = usbnet_bh; 15225b2fc499SJeff Garzik dev->delay.data = (unsigned long) dev; 15235b2fc499SJeff Garzik init_timer (&dev->delay); 15245b2fc499SJeff Garzik mutex_init (&dev->phy_mutex); 15256eecdc5fSDan Williams mutex_init(&dev->interrupt_mutex); 15266eecdc5fSDan Williams dev->interrupt_count = 0; 15275b2fc499SJeff Garzik 15285b2fc499SJeff Garzik dev->net = net; 15295b2fc499SJeff Garzik strcpy (net->name, "usb%d"); 15305b2fc499SJeff Garzik memcpy (net->dev_addr, node_id, sizeof node_id); 15315b2fc499SJeff Garzik 15325b2fc499SJeff Garzik /* rx and tx sides can use different message sizes; 15335b2fc499SJeff Garzik * bind() should set rx_urb_size in that case. 15345b2fc499SJeff Garzik */ 15355b2fc499SJeff Garzik dev->hard_mtu = net->mtu + net->hard_header_len; 15365b2fc499SJeff Garzik #if 0 15375b2fc499SJeff Garzik // dma_supported() is deeply broken on almost all architectures 15385b2fc499SJeff Garzik // possible with some EHCI controllers 15396a35528aSYang Hongyang if (dma_supported (&udev->dev, DMA_BIT_MASK(64))) 15405b2fc499SJeff Garzik net->features |= NETIF_F_HIGHDMA; 15415b2fc499SJeff Garzik #endif 15425b2fc499SJeff Garzik 1543777baa47SStephen Hemminger net->netdev_ops = &usbnet_netdev_ops; 1544777baa47SStephen Hemminger net->watchdog_timeo = TX_TIMEOUT_JIFFIES; 15455b2fc499SJeff Garzik net->ethtool_ops = &usbnet_ethtool_ops; 15465b2fc499SJeff Garzik 15475b2fc499SJeff Garzik // allow device-specific bind/init procedures 15485b2fc499SJeff Garzik // NOTE net->name still not usable ... 15495b2fc499SJeff Garzik if (info->bind) { 15505b2fc499SJeff Garzik status = info->bind (dev, udev); 15515b2fc499SJeff Garzik if (status < 0) 15525b2fc499SJeff Garzik goto out1; 15535b2fc499SJeff Garzik 15545b2fc499SJeff Garzik // heuristic: "usb%d" for links we know are two-host, 15555b2fc499SJeff Garzik // else "eth%d" when there's reasonable doubt. userspace 15565b2fc499SJeff Garzik // can rename the link if it knows better. 15578e95a202SJoe Perches if ((dev->driver_info->flags & FLAG_ETHER) != 0 && 1558c261344dSArnd Bergmann ((dev->driver_info->flags & FLAG_POINTTOPOINT) == 0 || 1559c261344dSArnd Bergmann (net->dev_addr [0] & 0x02) == 0)) 15605b2fc499SJeff Garzik strcpy (net->name, "eth%d"); 15616e3bbcc5SJussi Kivilinna /* WLAN devices should always be named "wlan%d" */ 15626e3bbcc5SJussi Kivilinna if ((dev->driver_info->flags & FLAG_WLAN) != 0) 15636e3bbcc5SJussi Kivilinna strcpy(net->name, "wlan%d"); 1564e1e499eeSMarcel Holtmann /* WWAN devices should always be named "wwan%d" */ 1565e1e499eeSMarcel Holtmann if ((dev->driver_info->flags & FLAG_WWAN) != 0) 1566e1e499eeSMarcel Holtmann strcpy(net->name, "wwan%d"); 15675b2fc499SJeff Garzik 15686509141fSWei Shuai /* devices that cannot do ARP */ 15696509141fSWei Shuai if ((dev->driver_info->flags & FLAG_NOARP) != 0) 15706509141fSWei Shuai net->flags |= IFF_NOARP; 15716509141fSWei Shuai 15725b2fc499SJeff Garzik /* maybe the remote can't receive an Ethernet MTU */ 15735b2fc499SJeff Garzik if (net->mtu > (dev->hard_mtu - net->hard_header_len)) 15745b2fc499SJeff Garzik net->mtu = dev->hard_mtu - net->hard_header_len; 15755b2fc499SJeff Garzik } else if (!info->in || !info->out) 15765b2fc499SJeff Garzik status = usbnet_get_endpoints (dev, udev); 15775b2fc499SJeff Garzik else { 15785b2fc499SJeff Garzik dev->in = usb_rcvbulkpipe (xdev, info->in); 15795b2fc499SJeff Garzik dev->out = usb_sndbulkpipe (xdev, info->out); 15805b2fc499SJeff Garzik if (!(info->flags & FLAG_NO_SETINT)) 15815b2fc499SJeff Garzik status = usb_set_interface (xdev, 15825b2fc499SJeff Garzik interface->desc.bInterfaceNumber, 15835b2fc499SJeff Garzik interface->desc.bAlternateSetting); 15845b2fc499SJeff Garzik else 15855b2fc499SJeff Garzik status = 0; 15865b2fc499SJeff Garzik 15875b2fc499SJeff Garzik } 15889514bfe5SPeter Korsgaard if (status >= 0 && dev->status) 15895b2fc499SJeff Garzik status = init_status (dev, udev); 15905b2fc499SJeff Garzik if (status < 0) 15915b2fc499SJeff Garzik goto out3; 15925b2fc499SJeff Garzik 15935b2fc499SJeff Garzik if (!dev->rx_urb_size) 15945b2fc499SJeff Garzik dev->rx_urb_size = dev->hard_mtu; 15955b2fc499SJeff Garzik dev->maxpacket = usb_maxpacket (dev->udev, dev->out, 1); 15965b2fc499SJeff Garzik 1597225794f8SMarcel Holtmann if ((dev->driver_info->flags & FLAG_WLAN) != 0) 1598225794f8SMarcel Holtmann SET_NETDEV_DEVTYPE(net, &wlan_type); 1599225794f8SMarcel Holtmann if ((dev->driver_info->flags & FLAG_WWAN) != 0) 1600225794f8SMarcel Holtmann SET_NETDEV_DEVTYPE(net, &wwan_type); 1601225794f8SMarcel Holtmann 16025b2fc499SJeff Garzik status = register_netdev (net); 16035b2fc499SJeff Garzik if (status) 1604a4723848Stom.leiming@gmail.com goto out4; 1605a475f603SJoe Perches netif_info(dev, probe, dev->net, 1606a475f603SJoe Perches "register '%s' at usb-%s-%s, %s, %pM\n", 16075b2fc499SJeff Garzik udev->dev.driver->name, 16085b2fc499SJeff Garzik xdev->bus->bus_name, xdev->devpath, 16095b2fc499SJeff Garzik dev->driver_info->description, 1610e174961cSJohannes Berg net->dev_addr); 16115b2fc499SJeff Garzik 16125b2fc499SJeff Garzik // ok, it's ready to go. 16135b2fc499SJeff Garzik usb_set_intfdata (udev, dev); 16145b2fc499SJeff Garzik 16155b2fc499SJeff Garzik netif_device_attach (net); 16165b2fc499SJeff Garzik 161737e8273cSBen Hutchings if (dev->driver_info->flags & FLAG_LINK_INTR) 16180162c554SMing Lei usbnet_link_change(dev, 0, 0); 161937e8273cSBen Hutchings 16205b2fc499SJeff Garzik return 0; 16215b2fc499SJeff Garzik 1622a4723848Stom.leiming@gmail.com out4: 1623a4723848Stom.leiming@gmail.com usb_free_urb(dev->interrupt); 16245b2fc499SJeff Garzik out3: 16255b2fc499SJeff Garzik if (info->unbind) 16265b2fc499SJeff Garzik info->unbind (dev, udev); 16275b2fc499SJeff Garzik out1: 16285b2fc499SJeff Garzik free_netdev(net); 16295b2fc499SJeff Garzik out: 16305b2fc499SJeff Garzik return status; 16315b2fc499SJeff Garzik } 16325b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_probe); 16335b2fc499SJeff Garzik 16345b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 16355b2fc499SJeff Garzik 163636433127SOliver Neukum /* 163736433127SOliver Neukum * suspend the whole driver as soon as the first interface is suspended 163836433127SOliver Neukum * resume only when the last interface is resumed 16395b2fc499SJeff Garzik */ 16405b2fc499SJeff Garzik 16415b2fc499SJeff Garzik int usbnet_suspend (struct usb_interface *intf, pm_message_t message) 16425b2fc499SJeff Garzik { 16435b2fc499SJeff Garzik struct usbnet *dev = usb_get_intfdata(intf); 16445b2fc499SJeff Garzik 164536433127SOliver Neukum if (!dev->suspend_count++) { 164669ee472fSOliver Neukum spin_lock_irq(&dev->txq.lock); 164769ee472fSOliver Neukum /* don't autosuspend while transmitting */ 16485b1b0b81SAlan Stern if (dev->txq.qlen && PMSG_IS_AUTO(message)) { 16495eeb3132SMing Lei dev->suspend_count--; 165069ee472fSOliver Neukum spin_unlock_irq(&dev->txq.lock); 165169ee472fSOliver Neukum return -EBUSY; 165269ee472fSOliver Neukum } else { 165369ee472fSOliver Neukum set_bit(EVENT_DEV_ASLEEP, &dev->flags); 165469ee472fSOliver Neukum spin_unlock_irq(&dev->txq.lock); 165569ee472fSOliver Neukum } 1656a11a6544SOliver Neukum /* 1657a11a6544SOliver Neukum * accelerate emptying of the rx and queues, to avoid 16585b2fc499SJeff Garzik * having everything error out. 16595b2fc499SJeff Garzik */ 16605b2fc499SJeff Garzik netif_device_detach (dev->net); 166169ee472fSOliver Neukum usbnet_terminate_urbs(dev); 16626eecdc5fSDan Williams __usbnet_status_stop_force(dev); 166369ee472fSOliver Neukum 1664a11a6544SOliver Neukum /* 1665a11a6544SOliver Neukum * reattach so runtime management can use and 1666a11a6544SOliver Neukum * wake the device 1667a11a6544SOliver Neukum */ 1668a11a6544SOliver Neukum netif_device_attach (dev->net); 166936433127SOliver Neukum } 16705b2fc499SJeff Garzik return 0; 16715b2fc499SJeff Garzik } 16725b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_suspend); 16735b2fc499SJeff Garzik 16745b2fc499SJeff Garzik int usbnet_resume (struct usb_interface *intf) 16755b2fc499SJeff Garzik { 16765b2fc499SJeff Garzik struct usbnet *dev = usb_get_intfdata(intf); 167769ee472fSOliver Neukum struct sk_buff *skb; 167869ee472fSOliver Neukum struct urb *res; 167969ee472fSOliver Neukum int retval; 16805b2fc499SJeff Garzik 168169ee472fSOliver Neukum if (!--dev->suspend_count) { 16826eecdc5fSDan Williams /* resume interrupt URB if it was previously submitted */ 16836eecdc5fSDan Williams __usbnet_status_start_force(dev, GFP_NOIO); 168468972efaSPaul Stewart 168569ee472fSOliver Neukum spin_lock_irq(&dev->txq.lock); 168669ee472fSOliver Neukum while ((res = usb_get_from_anchor(&dev->deferred))) { 168769ee472fSOliver Neukum 168869ee472fSOliver Neukum skb = (struct sk_buff *)res->context; 168969ee472fSOliver Neukum retval = usb_submit_urb(res, GFP_ATOMIC); 169069ee472fSOliver Neukum if (retval < 0) { 169169ee472fSOliver Neukum dev_kfree_skb_any(skb); 169269ee472fSOliver Neukum usb_free_urb(res); 169369ee472fSOliver Neukum usb_autopm_put_interface_async(dev->intf); 169469ee472fSOliver Neukum } else { 169569ee472fSOliver Neukum dev->net->trans_start = jiffies; 169669ee472fSOliver Neukum __skb_queue_tail(&dev->txq, skb); 169769ee472fSOliver Neukum } 169869ee472fSOliver Neukum } 169969ee472fSOliver Neukum 170069ee472fSOliver Neukum smp_mb(); 170169ee472fSOliver Neukum clear_bit(EVENT_DEV_ASLEEP, &dev->flags); 170269ee472fSOliver Neukum spin_unlock_irq(&dev->txq.lock); 170375bd0cbdSMing Lei 170475bd0cbdSMing Lei if (test_bit(EVENT_DEV_OPEN, &dev->flags)) { 170565841fd5SMing Lei /* handle remote wakeup ASAP */ 170665841fd5SMing Lei if (!dev->wait && 170765841fd5SMing Lei netif_device_present(dev->net) && 170865841fd5SMing Lei !timer_pending(&dev->delay) && 170965841fd5SMing Lei !test_bit(EVENT_RX_HALT, &dev->flags)) 1710ab6f148dSOliver Neukum rx_alloc_submit(dev, GFP_NOIO); 171165841fd5SMing Lei 171269ee472fSOliver Neukum if (!(dev->txq.qlen >= TX_QLEN(dev))) 17131aa9bc5bSAlexey Orishko netif_tx_wake_all_queues(dev->net); 17145b2fc499SJeff Garzik tasklet_schedule (&dev->bh); 171569ee472fSOliver Neukum } 171675bd0cbdSMing Lei } 17175d9d01a3SOliver Neukum 17185d9d01a3SOliver Neukum if (test_and_clear_bit(EVENT_DEVICE_REPORT_IDLE, &dev->flags)) 17195d9d01a3SOliver Neukum usb_autopm_get_interface_no_resume(intf); 17205d9d01a3SOliver Neukum 17215b2fc499SJeff Garzik return 0; 17225b2fc499SJeff Garzik } 17235b2fc499SJeff Garzik EXPORT_SYMBOL_GPL(usbnet_resume); 17245b2fc499SJeff Garzik 17255d9d01a3SOliver Neukum /* 17265d9d01a3SOliver Neukum * Either a subdriver implements manage_power, then it is assumed to always 17275d9d01a3SOliver Neukum * be ready to be suspended or it reports the readiness to be suspended 17285d9d01a3SOliver Neukum * explicitly 17295d9d01a3SOliver Neukum */ 17305d9d01a3SOliver Neukum void usbnet_device_suggests_idle(struct usbnet *dev) 17315d9d01a3SOliver Neukum { 17325d9d01a3SOliver Neukum if (!test_and_set_bit(EVENT_DEVICE_REPORT_IDLE, &dev->flags)) { 17335d9d01a3SOliver Neukum dev->intf->needs_remote_wakeup = 1; 17345d9d01a3SOliver Neukum usb_autopm_put_interface_async(dev->intf); 17355d9d01a3SOliver Neukum } 17365d9d01a3SOliver Neukum } 17375d9d01a3SOliver Neukum EXPORT_SYMBOL(usbnet_device_suggests_idle); 17385b2fc499SJeff Garzik 17392dd7c8cfSOliver Neukum /* 17402dd7c8cfSOliver Neukum * For devices that can do without special commands 17412dd7c8cfSOliver Neukum */ 17422dd7c8cfSOliver Neukum int usbnet_manage_power(struct usbnet *dev, int on) 17432dd7c8cfSOliver Neukum { 17442dd7c8cfSOliver Neukum dev->intf->needs_remote_wakeup = on; 17452dd7c8cfSOliver Neukum return 0; 17462dd7c8cfSOliver Neukum } 17472dd7c8cfSOliver Neukum EXPORT_SYMBOL(usbnet_manage_power); 17482dd7c8cfSOliver Neukum 1749ac64995dSMing Lei void usbnet_link_change(struct usbnet *dev, bool link, bool need_reset) 1750ac64995dSMing Lei { 1751ac64995dSMing Lei /* update link after link is reseted */ 1752ac64995dSMing Lei if (link && !need_reset) 1753ac64995dSMing Lei netif_carrier_on(dev->net); 1754ac64995dSMing Lei else 1755ac64995dSMing Lei netif_carrier_off(dev->net); 1756ac64995dSMing Lei 1757ac64995dSMing Lei if (need_reset && link) 1758ac64995dSMing Lei usbnet_defer_kevent(dev, EVENT_LINK_RESET); 17594b49f58fSMing Lei else 17604b49f58fSMing Lei usbnet_defer_kevent(dev, EVENT_LINK_CHANGE); 1761ac64995dSMing Lei } 1762ac64995dSMing Lei EXPORT_SYMBOL(usbnet_link_change); 1763ac64995dSMing Lei 17645b2fc499SJeff Garzik /*-------------------------------------------------------------------------*/ 17650547fad2SMing Lei static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, 1766877bd862SMing Lei u16 value, u16 index, void *data, u16 size) 1767877bd862SMing Lei { 1768877bd862SMing Lei void *buf = NULL; 1769877bd862SMing Lei int err = -ENOMEM; 1770877bd862SMing Lei 1771877bd862SMing Lei netdev_dbg(dev->net, "usbnet_read_cmd cmd=0x%02x reqtype=%02x" 1772877bd862SMing Lei " value=0x%04x index=0x%04x size=%d\n", 1773877bd862SMing Lei cmd, reqtype, value, index, size); 1774877bd862SMing Lei 1775877bd862SMing Lei if (data) { 1776877bd862SMing Lei buf = kmalloc(size, GFP_KERNEL); 1777877bd862SMing Lei if (!buf) 1778877bd862SMing Lei goto out; 1779877bd862SMing Lei } 1780877bd862SMing Lei 1781877bd862SMing Lei err = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), 1782877bd862SMing Lei cmd, reqtype, value, index, buf, size, 1783877bd862SMing Lei USB_CTRL_GET_TIMEOUT); 1784877bd862SMing Lei if (err > 0 && err <= size) 1785877bd862SMing Lei memcpy(data, buf, err); 1786877bd862SMing Lei kfree(buf); 1787877bd862SMing Lei out: 1788877bd862SMing Lei return err; 1789877bd862SMing Lei } 1790877bd862SMing Lei 17910547fad2SMing Lei static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, 17920547fad2SMing Lei u16 value, u16 index, const void *data, 17930547fad2SMing Lei u16 size) 1794877bd862SMing Lei { 1795877bd862SMing Lei void *buf = NULL; 1796877bd862SMing Lei int err = -ENOMEM; 1797877bd862SMing Lei 1798877bd862SMing Lei netdev_dbg(dev->net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x" 1799877bd862SMing Lei " value=0x%04x index=0x%04x size=%d\n", 1800877bd862SMing Lei cmd, reqtype, value, index, size); 1801877bd862SMing Lei 1802877bd862SMing Lei if (data) { 1803877bd862SMing Lei buf = kmemdup(data, size, GFP_KERNEL); 1804877bd862SMing Lei if (!buf) 1805877bd862SMing Lei goto out; 1806877bd862SMing Lei } 1807877bd862SMing Lei 1808877bd862SMing Lei err = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), 1809877bd862SMing Lei cmd, reqtype, value, index, buf, size, 1810877bd862SMing Lei USB_CTRL_SET_TIMEOUT); 1811877bd862SMing Lei kfree(buf); 1812877bd862SMing Lei 1813877bd862SMing Lei out: 1814877bd862SMing Lei return err; 1815877bd862SMing Lei } 18160547fad2SMing Lei 18170547fad2SMing Lei /* 18180547fad2SMing Lei * The function can't be called inside suspend/resume callback, 18190547fad2SMing Lei * otherwise deadlock will be caused. 18200547fad2SMing Lei */ 18210547fad2SMing Lei int usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, 18220547fad2SMing Lei u16 value, u16 index, void *data, u16 size) 18230547fad2SMing Lei { 18246f0a0986SMing Lei int ret; 18256f0a0986SMing Lei 18266f0a0986SMing Lei if (usb_autopm_get_interface(dev->intf) < 0) 18276f0a0986SMing Lei return -ENODEV; 18286f0a0986SMing Lei ret = __usbnet_read_cmd(dev, cmd, reqtype, value, index, 18290547fad2SMing Lei data, size); 18306f0a0986SMing Lei usb_autopm_put_interface(dev->intf); 18316f0a0986SMing Lei return ret; 18320547fad2SMing Lei } 18330547fad2SMing Lei EXPORT_SYMBOL_GPL(usbnet_read_cmd); 18340547fad2SMing Lei 18350547fad2SMing Lei /* 18360547fad2SMing Lei * The function can't be called inside suspend/resume callback, 18370547fad2SMing Lei * otherwise deadlock will be caused. 18380547fad2SMing Lei */ 18390547fad2SMing Lei int usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, 18400547fad2SMing Lei u16 value, u16 index, const void *data, u16 size) 18410547fad2SMing Lei { 18426f0a0986SMing Lei int ret; 18436f0a0986SMing Lei 18446f0a0986SMing Lei if (usb_autopm_get_interface(dev->intf) < 0) 18456f0a0986SMing Lei return -ENODEV; 18466f0a0986SMing Lei ret = __usbnet_write_cmd(dev, cmd, reqtype, value, index, 18470547fad2SMing Lei data, size); 18486f0a0986SMing Lei usb_autopm_put_interface(dev->intf); 18496f0a0986SMing Lei return ret; 18500547fad2SMing Lei } 1851877bd862SMing Lei EXPORT_SYMBOL_GPL(usbnet_write_cmd); 1852877bd862SMing Lei 18530547fad2SMing Lei /* 18540547fad2SMing Lei * The function can be called inside suspend/resume callback safely 18550547fad2SMing Lei * and should only be called by suspend/resume callback generally. 18560547fad2SMing Lei */ 18570547fad2SMing Lei int usbnet_read_cmd_nopm(struct usbnet *dev, u8 cmd, u8 reqtype, 18580547fad2SMing Lei u16 value, u16 index, void *data, u16 size) 18590547fad2SMing Lei { 18600547fad2SMing Lei return __usbnet_read_cmd(dev, cmd, reqtype, value, index, 18610547fad2SMing Lei data, size); 18620547fad2SMing Lei } 18630547fad2SMing Lei EXPORT_SYMBOL_GPL(usbnet_read_cmd_nopm); 18640547fad2SMing Lei 18650547fad2SMing Lei /* 18660547fad2SMing Lei * The function can be called inside suspend/resume callback safely 18670547fad2SMing Lei * and should only be called by suspend/resume callback generally. 18680547fad2SMing Lei */ 18690547fad2SMing Lei int usbnet_write_cmd_nopm(struct usbnet *dev, u8 cmd, u8 reqtype, 18700547fad2SMing Lei u16 value, u16 index, const void *data, 18710547fad2SMing Lei u16 size) 18720547fad2SMing Lei { 18730547fad2SMing Lei return __usbnet_write_cmd(dev, cmd, reqtype, value, index, 18740547fad2SMing Lei data, size); 18750547fad2SMing Lei } 18760547fad2SMing Lei EXPORT_SYMBOL_GPL(usbnet_write_cmd_nopm); 18770547fad2SMing Lei 1878877bd862SMing Lei static void usbnet_async_cmd_cb(struct urb *urb) 1879877bd862SMing Lei { 1880877bd862SMing Lei struct usb_ctrlrequest *req = (struct usb_ctrlrequest *)urb->context; 1881877bd862SMing Lei int status = urb->status; 1882877bd862SMing Lei 1883877bd862SMing Lei if (status < 0) 1884877bd862SMing Lei dev_dbg(&urb->dev->dev, "%s failed with %d", 1885877bd862SMing Lei __func__, status); 1886877bd862SMing Lei 1887877bd862SMing Lei kfree(req); 1888877bd862SMing Lei usb_free_urb(urb); 1889877bd862SMing Lei } 1890877bd862SMing Lei 18910547fad2SMing Lei /* 18920547fad2SMing Lei * The caller must make sure that device can't be put into suspend 18930547fad2SMing Lei * state until the control URB completes. 18940547fad2SMing Lei */ 1895877bd862SMing Lei int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype, 1896877bd862SMing Lei u16 value, u16 index, const void *data, u16 size) 1897877bd862SMing Lei { 1898877bd862SMing Lei struct usb_ctrlrequest *req = NULL; 1899877bd862SMing Lei struct urb *urb; 1900877bd862SMing Lei int err = -ENOMEM; 1901877bd862SMing Lei void *buf = NULL; 1902877bd862SMing Lei 1903877bd862SMing Lei netdev_dbg(dev->net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x" 1904877bd862SMing Lei " value=0x%04x index=0x%04x size=%d\n", 1905877bd862SMing Lei cmd, reqtype, value, index, size); 1906877bd862SMing Lei 1907877bd862SMing Lei urb = usb_alloc_urb(0, GFP_ATOMIC); 1908877bd862SMing Lei if (!urb) { 1909877bd862SMing Lei netdev_err(dev->net, "Error allocating URB in" 1910877bd862SMing Lei " %s!\n", __func__); 1911877bd862SMing Lei goto fail; 1912877bd862SMing Lei } 1913877bd862SMing Lei 1914877bd862SMing Lei if (data) { 1915877bd862SMing Lei buf = kmemdup(data, size, GFP_ATOMIC); 1916877bd862SMing Lei if (!buf) { 1917877bd862SMing Lei netdev_err(dev->net, "Error allocating buffer" 1918877bd862SMing Lei " in %s!\n", __func__); 1919877bd862SMing Lei goto fail_free; 1920877bd862SMing Lei } 1921877bd862SMing Lei } 1922877bd862SMing Lei 1923877bd862SMing Lei req = kmalloc(sizeof(struct usb_ctrlrequest), GFP_ATOMIC); 192438673c82SJoe Perches if (!req) 1925877bd862SMing Lei goto fail_free_buf; 1926877bd862SMing Lei 1927877bd862SMing Lei req->bRequestType = reqtype; 1928877bd862SMing Lei req->bRequest = cmd; 1929877bd862SMing Lei req->wValue = cpu_to_le16(value); 1930877bd862SMing Lei req->wIndex = cpu_to_le16(index); 1931877bd862SMing Lei req->wLength = cpu_to_le16(size); 1932877bd862SMing Lei 1933877bd862SMing Lei usb_fill_control_urb(urb, dev->udev, 1934877bd862SMing Lei usb_sndctrlpipe(dev->udev, 0), 1935877bd862SMing Lei (void *)req, buf, size, 1936877bd862SMing Lei usbnet_async_cmd_cb, req); 1937877bd862SMing Lei urb->transfer_flags |= URB_FREE_BUFFER; 1938877bd862SMing Lei 1939877bd862SMing Lei err = usb_submit_urb(urb, GFP_ATOMIC); 1940877bd862SMing Lei if (err < 0) { 1941877bd862SMing Lei netdev_err(dev->net, "Error submitting the control" 1942877bd862SMing Lei " message: status=%d\n", err); 1943877bd862SMing Lei goto fail_free; 1944877bd862SMing Lei } 1945877bd862SMing Lei return 0; 1946877bd862SMing Lei 1947877bd862SMing Lei fail_free_buf: 1948877bd862SMing Lei kfree(buf); 1949877bd862SMing Lei fail_free: 1950877bd862SMing Lei kfree(req); 1951877bd862SMing Lei usb_free_urb(urb); 1952877bd862SMing Lei fail: 1953877bd862SMing Lei return err; 1954877bd862SMing Lei 1955877bd862SMing Lei } 1956877bd862SMing Lei EXPORT_SYMBOL_GPL(usbnet_write_cmd_async); 1957877bd862SMing Lei /*-------------------------------------------------------------------------*/ 19585b2fc499SJeff Garzik 19595b2fc499SJeff Garzik static int __init usbnet_init(void) 19605b2fc499SJeff Garzik { 1961c582a950SThiago Farina /* Compiler should optimize this out. */ 1962c582a950SThiago Farina BUILD_BUG_ON( 1963c582a950SThiago Farina FIELD_SIZEOF(struct sk_buff, cb) < sizeof(struct skb_data)); 19645b2fc499SJeff Garzik 1965c7e12eadSJoe Perches eth_random_addr(node_id); 19665b2fc499SJeff Garzik return 0; 19675b2fc499SJeff Garzik } 19685b2fc499SJeff Garzik module_init(usbnet_init); 19695b2fc499SJeff Garzik 19705b2fc499SJeff Garzik static void __exit usbnet_exit(void) 19715b2fc499SJeff Garzik { 19725b2fc499SJeff Garzik } 19735b2fc499SJeff Garzik module_exit(usbnet_exit); 19745b2fc499SJeff Garzik 19755b2fc499SJeff Garzik MODULE_AUTHOR("David Brownell"); 19765b2fc499SJeff Garzik MODULE_DESCRIPTION("USB network driver framework"); 19775b2fc499SJeff Garzik MODULE_LICENSE("GPL"); 1978