1f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell/* 2f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * USB Networking Link Interface 3f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * 4f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net> 5f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> 6f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * 7f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * This program is free software; you can redistribute it and/or modify 8f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * it under the terms of the GNU General Public License as published by 9f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * the Free Software Foundation; either version 2 of the License, or 10f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * (at your option) any later version. 11f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * 12f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * This program is distributed in the hope that it will be useful, 13f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * but WITHOUT ANY WARRANTY; without even the implied warranty of 14f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * GNU General Public License for more details. 16f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * 17f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * You should have received a copy of the GNU General Public License 18f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * along with this program; if not, write to the Free Software 19f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell */ 21f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 22dda43a0e03a33dd716fb34f812b1af614f74daffRobert P. J. Day#ifndef __LINUX_USB_USBNET_H 23dda43a0e03a33dd716fb34f812b1af614f74daffRobert P. J. Day#define __LINUX_USB_USBNET_H 24f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 2538bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell/* interface from usbnet core to each USB networking link we handle */ 26f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownellstruct usbnet { 27f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* housekeeping */ 28f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct usb_device *udev; 29a11a6544c0bf6c0871f2379ad0c5ad0210691e73Oliver Neukum struct usb_interface *intf; 30f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct driver_info *driver_info; 31296c02429271e1b9525b52fed76daa3b1cafefc4David Brownell const char *driver_name; 32476842b1962c7cf5ccea57dcfad26dc77d16e363Jussi Kivilinna void *driver_priv; 3314a0d635d18d0fb552dcc979d6d25106e6541f2eOliver Neukum wait_queue_head_t wait; 34a9fc6338bd51a3d5735839e756fe7b741c2e6fadArnd Bergmann struct mutex phy_mutex; 3536433127ae7a842482ba857f5ad3c431817a9542Oliver Neukum unsigned char suspend_count; 3670c37bf97f2a91accba76080db69144f3b69f736Bjørn Mork unsigned char pkt_cnt, pkt_err; 37a88c32ae15f25fcf0a3c9fadd92f840a1abf0e43Ming Lei unsigned short rx_qlen, tx_qlen; 38638c5115a794981441246fa8fa5d95c1875af5baMing Lei unsigned can_dma_sg:1; 39f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 40f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* i/o info: pipes etc */ 41f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell unsigned in, out; 42f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct usb_host_endpoint *status; 43f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell unsigned maxpacket; 44f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct timer_list delay; 4560e453a940ac678565b6641d65f8c18541bb9f28Ming Lei const char *padding_pkt; 46f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 47f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* protocol/interface state */ 48f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct net_device *net; 49f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int msg_enable; 500858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartman unsigned long data[5]; 51f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell u32 xid; 52f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell u32 hard_mtu; /* count any extra framing */ 5318ab458fb7bd5c64bef766090020648266cfa9b6David Brownell size_t rx_urb_size; /* size for rx urbs */ 54f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct mii_if_info mii; 55f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 56f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* various kinds of pending driver work */ 57f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct sk_buff_head rxq; 58f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct sk_buff_head txq; 59f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct sk_buff_head done; 607834ddbcc7a097443761b0722e8c9fb8511b95b1Jussi Kivilinna struct sk_buff_head rxq_pause; 61f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct urb *interrupt; 626eecdc5f95a393cb558503123eae9a9a6642e835Dan Williams unsigned interrupt_count; 636eecdc5f95a393cb558503123eae9a9a6642e835Dan Williams struct mutex interrupt_mutex; 6469ee472f2706371ca639de49b06df91615c07d8dOliver Neukum struct usb_anchor deferred; 65f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct tasklet_struct bh; 66f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 67f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct work_struct kevent; 68f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell unsigned long flags; 69f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell# define EVENT_TX_HALT 0 70f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell# define EVENT_RX_HALT 1 71f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell# define EVENT_RX_MEMORY 2 72f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell# define EVENT_STS_SPLIT 3 73f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell# define EVENT_LINK_RESET 4 747834ddbcc7a097443761b0722e8c9fb8511b95b1Jussi Kivilinna# define EVENT_RX_PAUSED 5 754a5a14d39e8164b5c77f1bf42851a58a69a6c7b2tom.leiming@gmail.com# define EVENT_DEV_ASLEEP 6 764a5a14d39e8164b5c77f1bf42851a58a69a6c7b2tom.leiming@gmail.com# define EVENT_DEV_OPEN 7 775d9d01a30204c99edf99189018953ee84c5f5017Oliver Neukum# define EVENT_DEVICE_REPORT_IDLE 8 78a1c088e01b71d90852b0df5a77cdae46bd0e0c05Oliver Neukum# define EVENT_NO_RUNTIME_PM 9 7970c37bf97f2a91accba76080db69144f3b69f736Bjørn Mork# define EVENT_RX_KILL 10 804b49f58fff00e6e9b24eaa31d4c6324393d76b0aMing Lei# define EVENT_LINK_CHANGE 11 811efed2d06c703489342ab6af2951683e07509c99Olivier Blin# define EVENT_SET_RX_MODE 12 82f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell}; 83f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 8438bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownellstatic inline struct usb_driver *driver_of(struct usb_interface *intf) 8538bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell{ 8638bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell return to_usb_driver(intf->dev.driver); 8738bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell} 88f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 89f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell/* interface from the device/framing level "minidriver" to core */ 90f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownellstruct driver_info { 91f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell char *description; 92f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 93f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int flags; 94f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell/* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */ 95f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell#define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */ 96f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell#define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */ 97f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell#define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */ 98f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell#define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */ 99f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 100f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell#define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */ 101f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell#define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */ 102f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 10318ab458fb7bd5c64bef766090020648266cfa9b6David Brownell#define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */ 1046e3bbcc5d75d187bb853a086e22cd813242f6b75Jussi Kivilinna#define FLAG_WLAN 0x0080 /* use "wlan%d" names */ 1051487cd5e76337555737cbc55d7d83f41460d198fJussi Kivilinna#define FLAG_AVOID_UNLINK_URBS 0x0100 /* don't unlink urbs at usbnet_stop() */ 106ec4756238239f1a331d9fb95bad8b281dad56855Steve Glendinning#define FLAG_SEND_ZLP 0x0200 /* hw requires ZLPs are sent */ 107e1e499eef2200c2a7120c9ebf297d48b195cf887Marcel Holtmann#define FLAG_WWAN 0x0400 /* use "wwan%d" names */ 1086e3bbcc5d75d187bb853a086e22cd813242f6b75Jussi Kivilinna 10937e8273cd30592d3a82bcb70cbb1bdc4eaeb6b71Ben Hutchings#define FLAG_LINK_INTR 0x0800 /* updates link (carrier) status */ 110f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 111c261344d3ce3edac781f9d3c7eabe2e96d8e8fe8Arnd Bergmann#define FLAG_POINTTOPOINT 0x1000 /* possibly use "usb%d" names */ 112c261344d3ce3edac781f9d3c7eabe2e96d8e8fe8Arnd Bergmann 113073285fd392f6dc901da7c698d46e1e2a7e26436Alexey Orishko/* 114073285fd392f6dc901da7c698d46e1e2a7e26436Alexey Orishko * Indicates to usbnet, that USB driver accumulates multiple IP packets. 115073285fd392f6dc901da7c698d46e1e2a7e26436Alexey Orishko * Affects statistic (counters) and short packet handling. 116073285fd392f6dc901da7c698d46e1e2a7e26436Alexey Orishko */ 11738a2f37258f9e2ae3f6e4241e01088be8dfaf4e9huajun li#define FLAG_MULTI_PACKET 0x2000 11838a2f37258f9e2ae3f6e4241e01088be8dfaf4e9huajun li#define FLAG_RX_ASSEMBLE 0x4000 /* rx packets may span >1 frames */ 1199c79330d930b5774aed8eb323daebecedce2e245Lucas Stach#define FLAG_NOARP 0x8000 /* device can't do ARP */ 120073285fd392f6dc901da7c698d46e1e2a7e26436Alexey Orishko 121f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* init device ... can sleep, or cause probe() failure */ 122f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int (*bind)(struct usbnet *, struct usb_interface *); 123f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 124f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* cleanup device ... can sleep, but can't fail */ 125f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell void (*unbind)(struct usbnet *, struct usb_interface *); 126f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 127f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* reset device ... can sleep */ 128f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int (*reset)(struct usbnet *); 129f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 130a33e9e7f35ef6dcab528e0327f29188475f60691Jussi Kivilinna /* stop device ... can sleep */ 131a33e9e7f35ef6dcab528e0327f29188475f60691Jussi Kivilinna int (*stop)(struct usbnet *); 132a33e9e7f35ef6dcab528e0327f29188475f60691Jussi Kivilinna 133f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* see if peer is connected ... can sleep */ 134f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int (*check_connect)(struct usbnet *); 135f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 13669ee472f2706371ca639de49b06df91615c07d8dOliver Neukum /* (dis)activate runtime power management */ 13769ee472f2706371ca639de49b06df91615c07d8dOliver Neukum int (*manage_power)(struct usbnet *, int); 13869ee472f2706371ca639de49b06df91615c07d8dOliver Neukum 139f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* for status polling */ 140f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell void (*status)(struct usbnet *, struct urb *); 141f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 142f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* link reset handling, called from defer_kevent */ 143f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int (*link_reset)(struct usbnet *); 144f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 145f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* fixup rx packet (strip framing) */ 146f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb); 147f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 148f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* fixup tx packet (add framing) */ 149f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct sk_buff *(*tx_fixup)(struct usbnet *dev, 15055016f10e31bb15b85d8c500f979dfdceb37d548Al Viro struct sk_buff *skb, gfp_t flags); 1517c39e038fc738012ba36ed222bb62545ee59c012Jussi Kivilinna 152dbcdd4d58c7230bea3157d56d6ef77c493b3865bOliver Neukum /* recover from timeout */ 153dbcdd4d58c7230bea3157d56d6ef77c493b3865bOliver Neukum void (*recover)(struct usbnet *dev); 154dbcdd4d58c7230bea3157d56d6ef77c493b3865bOliver Neukum 1557c39e038fc738012ba36ed222bb62545ee59c012Jussi Kivilinna /* early initialization code, can sleep. This is for minidrivers 1567c39e038fc738012ba36ed222bb62545ee59c012Jussi Kivilinna * having 'subminidrivers' that need to do extra initialization 1577c39e038fc738012ba36ed222bb62545ee59c012Jussi Kivilinna * right after minidriver have initialized hardware. */ 1587c39e038fc738012ba36ed222bb62545ee59c012Jussi Kivilinna int (*early_init)(struct usbnet *dev); 1595d6ecf6c5d4994198527496fa51ea119030400e0Jussi Kivilinna 1602a4901bcbe9c122bd56e1f6c337fcb4ad75fafb7Jussi Kivilinna /* called by minidriver when receiving indication */ 1612a4901bcbe9c122bd56e1f6c337fcb4ad75fafb7Jussi Kivilinna void (*indication)(struct usbnet *dev, void *ind, int indlen); 162f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 1631efed2d06c703489342ab6af2951683e07509c99Olivier Blin /* rx mode change (device changes address list filtering) */ 1641efed2d06c703489342ab6af2951683e07509c99Olivier Blin void (*set_rx_mode)(struct usbnet *dev); 1651efed2d06c703489342ab6af2951683e07509c99Olivier Blin 166f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell /* for new devices, use the descriptor-reading code instead */ 167f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int in; /* rx endpoint */ 168f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell int out; /* tx endpoint */ 169f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 170f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell unsigned long data; /* Misc driver specific data */ 171f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell}; 172f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 17338bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell/* Minidrivers are just drivers using the "usbnet" core as a powerful 17438bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell * network-specific subroutine library ... that happens to do pretty 17538bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell * much everything except custom framing and chip-specific stuff. 17638bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell */ 17738bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownellextern int usbnet_probe(struct usb_interface *, const struct usb_device_id *); 1780858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_suspend(struct usb_interface *, pm_message_t); 1790858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_resume(struct usb_interface *); 18038bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownellextern void usbnet_disconnect(struct usb_interface *); 1815d9d01a30204c99edf99189018953ee84c5f5017Oliver Neukumextern void usbnet_device_suggests_idle(struct usbnet *dev); 18238bde1d4699af45e6a4167a72e2e512e45c35ca8David Brownell 183877bd862f32b815d54ab5fc10a4fd903d7bf3012Ming Leiextern int usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, 184877bd862f32b815d54ab5fc10a4fd903d7bf3012Ming Lei u16 value, u16 index, void *data, u16 size); 185877bd862f32b815d54ab5fc10a4fd903d7bf3012Ming Leiextern int usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype, 186877bd862f32b815d54ab5fc10a4fd903d7bf3012Ming Lei u16 value, u16 index, const void *data, u16 size); 1870547fad2dd7ccaaf3c914ba49073fa37e4e241ebMing Leiextern int usbnet_read_cmd_nopm(struct usbnet *dev, u8 cmd, u8 reqtype, 1880547fad2dd7ccaaf3c914ba49073fa37e4e241ebMing Lei u16 value, u16 index, void *data, u16 size); 1890547fad2dd7ccaaf3c914ba49073fa37e4e241ebMing Leiextern int usbnet_write_cmd_nopm(struct usbnet *dev, u8 cmd, u8 reqtype, 1900547fad2dd7ccaaf3c914ba49073fa37e4e241ebMing Lei u16 value, u16 index, const void *data, u16 size); 191877bd862f32b815d54ab5fc10a4fd903d7bf3012Ming Leiextern int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype, 192877bd862f32b815d54ab5fc10a4fd903d7bf3012Ming Lei u16 value, u16 index, const void *data, u16 size); 193f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 1940aa599c5644fddd3052433c5335260108a8a39a2David Brownell/* Drivers that reuse some of the standard USB CDC infrastructure 19559c51591a0ac7568824f541f57de967e88adaa07Michael Opdenacker * (notably, using multiple interfaces according to the CDC 1960aa599c5644fddd3052433c5335260108a8a39a2David Brownell * union descriptor) get some helper code. 1970aa599c5644fddd3052433c5335260108a8a39a2David Brownell */ 1980aa599c5644fddd3052433c5335260108a8a39a2David Brownellstruct cdc_state { 1990aa599c5644fddd3052433c5335260108a8a39a2David Brownell struct usb_cdc_header_desc *header; 2000aa599c5644fddd3052433c5335260108a8a39a2David Brownell struct usb_cdc_union_desc *u; 2010aa599c5644fddd3052433c5335260108a8a39a2David Brownell struct usb_cdc_ether_desc *ether; 2020aa599c5644fddd3052433c5335260108a8a39a2David Brownell struct usb_interface *control; 2030aa599c5644fddd3052433c5335260108a8a39a2David Brownell struct usb_interface *data; 2040aa599c5644fddd3052433c5335260108a8a39a2David Brownell}; 2050aa599c5644fddd3052433c5335260108a8a39a2David Brownell 2060858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_generic_cdc_bind(struct usbnet *, struct usb_interface *); 2077a635ea989991d7f12d57a12f2ba7cb6d211e083Andrzej Zaborowskiextern int usbnet_cdc_bind(struct usbnet *, struct usb_interface *); 2080858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern void usbnet_cdc_unbind(struct usbnet *, struct usb_interface *); 2097a635ea989991d7f12d57a12f2ba7cb6d211e083Andrzej Zaborowskiextern void usbnet_cdc_status(struct usbnet *, struct urb *); 2100aa599c5644fddd3052433c5335260108a8a39a2David Brownell 2110aa599c5644fddd3052433c5335260108a8a39a2David Brownell/* CDC and RNDIS support the same host-chosen packet filters for IN transfers */ 2120aa599c5644fddd3052433c5335260108a8a39a2David Brownell#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ 21318ab458fb7bd5c64bef766090020648266cfa9b6David Brownell |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ 21418ab458fb7bd5c64bef766090020648266cfa9b6David Brownell |USB_CDC_PACKET_TYPE_PROMISCUOUS \ 21518ab458fb7bd5c64bef766090020648266cfa9b6David Brownell |USB_CDC_PACKET_TYPE_DIRECTED) 2160aa599c5644fddd3052433c5335260108a8a39a2David Brownell 2170aa599c5644fddd3052433c5335260108a8a39a2David Brownell 218f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell/* we record the state for each of our queued skbs */ 219f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownellenum skb_state { 220f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell illegal = 0, 221f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell tx_start, tx_done, 2225b6e9bcdeb65634b4ad604eb4536404bbfc62cfaMing Lei rx_start, rx_done, rx_cleanup, 2235b6e9bcdeb65634b4ad604eb4536404bbfc62cfaMing Lei unlink_start 224f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell}; 225f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 226f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownellstruct skb_data { /* skb->cb is one of these */ 227f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct urb *urb; 228f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell struct usbnet *dev; 229f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell enum skb_state state; 230f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell size_t length; 231f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell}; 232f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 2330858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_open(struct net_device *net); 2340858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_stop(struct net_device *net); 2350858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern netdev_tx_t usbnet_start_xmit(struct sk_buff *skb, 2360858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartman struct net_device *net); 2370858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern void usbnet_tx_timeout(struct net_device *net); 2380858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_change_mtu(struct net_device *net, int new_mtu); 239f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 2402e55cc7210fef90f88201e860d8767594974574eDavid Brownellextern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *); 24103ad032bb78b2732b607ed198e951240e1d21e59Peter Holikextern int usbnet_get_ethernet_addr(struct usbnet *, int); 2420858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern void usbnet_defer_kevent(struct usbnet *, int); 2430858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern void usbnet_skb_return(struct usbnet *, struct sk_buff *); 244a99c19492a801013fd25ce7bab1f0f65a328a4baJamie Painterextern void usbnet_unlink_rx_urbs(struct usbnet *); 2452e55cc7210fef90f88201e860d8767594974574eDavid Brownell 2467834ddbcc7a097443761b0722e8c9fb8511b95b1Jussi Kivilinnaextern void usbnet_pause_rx(struct usbnet *); 2477834ddbcc7a097443761b0722e8c9fb8511b95b1Jussi Kivilinnaextern void usbnet_resume_rx(struct usbnet *); 2487834ddbcc7a097443761b0722e8c9fb8511b95b1Jussi Kivilinnaextern void usbnet_purge_paused_rxq(struct usbnet *); 2497834ddbcc7a097443761b0722e8c9fb8511b95b1Jussi Kivilinna 2500858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_get_settings(struct net_device *net, 2510858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartman struct ethtool_cmd *cmd); 2520858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern int usbnet_set_settings(struct net_device *net, 2530858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartman struct ethtool_cmd *cmd); 2540858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern u32 usbnet_get_link(struct net_device *net); 2550858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern u32 usbnet_get_msglevel(struct net_device *); 2560858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern void usbnet_set_msglevel(struct net_device *, u32); 2570858a3a52f659dabf2860f350e5a6a61f069e851Greg Kroah-Hartmanextern void usbnet_get_drvinfo(struct net_device *, struct ethtool_drvinfo *); 258c41286fd42f3545513f8de9f61028120b6d38e89Arnd Bergmannextern int usbnet_nway_reset(struct net_device *net); 259f29fc259976e9f4dd1fe8ed59ccdd50e4ea61db0David Brownell 2602dd7c8cf29769f6b66f26b501db2364640c2c9d0Oliver Neukumextern int usbnet_manage_power(struct usbnet *, int); 261ac64995da872c8ae6f74a5556fdad565829985b0Ming Leiextern void usbnet_link_change(struct usbnet *, bool, bool); 2622dd7c8cf29769f6b66f26b501db2364640c2c9d0Oliver Neukum 2636eecdc5f95a393cb558503123eae9a9a6642e835Dan Williamsextern int usbnet_status_start(struct usbnet *dev, gfp_t mem_flags); 2646eecdc5f95a393cb558503123eae9a9a6642e835Dan Williamsextern void usbnet_status_stop(struct usbnet *dev); 2656eecdc5f95a393cb558503123eae9a9a6642e835Dan Williams 266a88c32ae15f25fcf0a3c9fadd92f840a1abf0e43Ming Leiextern void usbnet_update_max_qlen(struct usbnet *dev); 267a88c32ae15f25fcf0a3c9fadd92f840a1abf0e43Ming Lei 268dda43a0e03a33dd716fb34f812b1af614f74daffRobert P. J. Day#endif /* __LINUX_USB_USBNET_H */ 269