home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / usb / usbnet.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.9 KB  |  213 lines

  1. /*
  2.  * USB Networking Link Interface
  3.  *
  4.  * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net>
  5.  * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com>
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License as published by
  9.  * the Free Software Foundation; either version 2 of the License, or
  10.  * (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  20.  */
  21.  
  22. #ifndef    __LINUX_USB_USBNET_H
  23. #define    __LINUX_USB_USBNET_H
  24.  
  25. /* interface from usbnet core to each USB networking link we handle */
  26. struct usbnet {
  27.     /* housekeeping */
  28.     struct usb_device    *udev;
  29.     struct usb_interface    *intf;
  30.     struct driver_info    *driver_info;
  31.     const char        *driver_name;
  32.     void            *driver_priv;
  33.     wait_queue_head_t    *wait;
  34.     struct mutex        phy_mutex;
  35.     unsigned char        suspend_count;
  36.  
  37.     /* i/o info: pipes etc */
  38.     unsigned        in, out;
  39.     struct usb_host_endpoint *status;
  40.     unsigned        maxpacket;
  41.     struct timer_list    delay;
  42.  
  43.     /* protocol/interface state */
  44.     struct net_device    *net;
  45.     struct net_device_stats    stats;
  46.     int            msg_enable;
  47.     unsigned long        data [5];
  48.     u32            xid;
  49.     u32            hard_mtu;    /* count any extra framing */
  50.     size_t            rx_urb_size;    /* size for rx urbs */
  51.     struct mii_if_info    mii;
  52.  
  53.     /* various kinds of pending driver work */
  54.     struct sk_buff_head    rxq;
  55.     struct sk_buff_head    txq;
  56.     struct sk_buff_head    done;
  57.     struct urb        *interrupt;
  58.     struct tasklet_struct    bh;
  59.  
  60.     struct work_struct    kevent;
  61.     unsigned long        flags;
  62. #        define EVENT_TX_HALT    0
  63. #        define EVENT_RX_HALT    1
  64. #        define EVENT_RX_MEMORY    2
  65. #        define EVENT_STS_SPLIT    3
  66. #        define EVENT_LINK_RESET    4
  67. };
  68.  
  69. static inline struct usb_driver *driver_of(struct usb_interface *intf)
  70. {
  71.     return to_usb_driver(intf->dev.driver);
  72. }
  73.  
  74. /* interface from the device/framing level "minidriver" to core */
  75. struct driver_info {
  76.     char        *description;
  77.  
  78.     int        flags;
  79. /* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */
  80. #define FLAG_FRAMING_NC    0x0001        /* guard against device dropouts */
  81. #define FLAG_FRAMING_GL    0x0002        /* genelink batches packets */
  82. #define FLAG_FRAMING_Z    0x0004        /* zaurus adds a trailer */
  83. #define FLAG_FRAMING_RN    0x0008        /* RNDIS batches, plus huge header */
  84.  
  85. #define FLAG_NO_SETINT    0x0010        /* device can't set_interface() */
  86. #define FLAG_ETHER    0x0020        /* maybe use "eth%d" names */
  87.  
  88. #define FLAG_FRAMING_AX 0x0040        /* AX88772/178 packets */
  89. #define FLAG_WLAN    0x0080        /* use "wlan%d" names */
  90.  
  91.  
  92.     /* init device ... can sleep, or cause probe() failure */
  93.     int    (*bind)(struct usbnet *, struct usb_interface *);
  94.  
  95.     /* cleanup device ... can sleep, but can't fail */
  96.     void    (*unbind)(struct usbnet *, struct usb_interface *);
  97.  
  98.     /* reset device ... can sleep */
  99.     int    (*reset)(struct usbnet *);
  100.  
  101.     /* see if peer is connected ... can sleep */
  102.     int    (*check_connect)(struct usbnet *);
  103.  
  104.     /* for status polling */
  105.     void    (*status)(struct usbnet *, struct urb *);
  106.  
  107.     /* link reset handling, called from defer_kevent */
  108.     int    (*link_reset)(struct usbnet *);
  109.  
  110.     /* fixup rx packet (strip framing) */
  111.     int    (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb);
  112.  
  113.     /* fixup tx packet (add framing) */
  114.     struct sk_buff    *(*tx_fixup)(struct usbnet *dev,
  115.                 struct sk_buff *skb, gfp_t flags);
  116.  
  117.     /* early initialization code, can sleep. This is for minidrivers
  118.      * having 'subminidrivers' that need to do extra initialization
  119.      * right after minidriver have initialized hardware. */
  120.     int    (*early_init)(struct usbnet *dev);
  121.  
  122.     /* called by minidriver when link state changes, state: 0=disconnect,
  123.      * 1=connect */
  124.     void    (*link_change)(struct usbnet *dev, int state);
  125.  
  126.     /* for new devices, use the descriptor-reading code instead */
  127.     int        in;        /* rx endpoint */
  128.     int        out;        /* tx endpoint */
  129.  
  130.     unsigned long    data;        /* Misc driver specific data */
  131. };
  132.  
  133. /* Minidrivers are just drivers using the "usbnet" core as a powerful
  134.  * network-specific subroutine library ... that happens to do pretty
  135.  * much everything except custom framing and chip-specific stuff.
  136.  */
  137. extern int usbnet_probe(struct usb_interface *, const struct usb_device_id *);
  138. extern int usbnet_suspend (struct usb_interface *, pm_message_t );
  139. extern int usbnet_resume (struct usb_interface *);
  140. extern void usbnet_disconnect(struct usb_interface *);
  141.  
  142.  
  143. /* Drivers that reuse some of the standard USB CDC infrastructure
  144.  * (notably, using multiple interfaces according to the CDC
  145.  * union descriptor) get some helper code.
  146.  */
  147. struct cdc_state {
  148.     struct usb_cdc_header_desc    *header;
  149.     struct usb_cdc_union_desc    *u;
  150.     struct usb_cdc_ether_desc    *ether;
  151.     struct usb_interface        *control;
  152.     struct usb_interface        *data;
  153. };
  154.  
  155. extern int usbnet_generic_cdc_bind (struct usbnet *, struct usb_interface *);
  156. extern void usbnet_cdc_unbind (struct usbnet *, struct usb_interface *);
  157.  
  158. /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */
  159. #define    DEFAULT_FILTER    (USB_CDC_PACKET_TYPE_BROADCAST \
  160.             |USB_CDC_PACKET_TYPE_ALL_MULTICAST \
  161.             |USB_CDC_PACKET_TYPE_PROMISCUOUS \
  162.             |USB_CDC_PACKET_TYPE_DIRECTED)
  163.  
  164.  
  165. /* we record the state for each of our queued skbs */
  166. enum skb_state {
  167.     illegal = 0,
  168.     tx_start, tx_done,
  169.     rx_start, rx_done, rx_cleanup
  170. };
  171.  
  172. struct skb_data {    /* skb->cb is one of these */
  173.     struct urb        *urb;
  174.     struct usbnet        *dev;
  175.     enum skb_state        state;
  176.     size_t            length;
  177. };
  178.  
  179.  
  180. extern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *);
  181. extern void usbnet_defer_kevent (struct usbnet *, int);
  182. extern void usbnet_skb_return (struct usbnet *, struct sk_buff *);
  183. extern void usbnet_unlink_rx_urbs(struct usbnet *);
  184.  
  185. extern int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd);
  186. extern int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd);
  187. extern u32 usbnet_get_link (struct net_device *net);
  188. extern u32 usbnet_get_msglevel (struct net_device *);
  189. extern void usbnet_set_msglevel (struct net_device *, u32);
  190. extern void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *);
  191. extern int usbnet_nway_reset(struct net_device *net);
  192.  
  193. /* messaging support includes the interface name, so it must not be
  194.  * used before it has one ... notably, in minidriver bind() calls.
  195.  */
  196. #ifdef DEBUG
  197. #define devdbg(usbnet, fmt, arg...) \
  198.     printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
  199. #else
  200. #define devdbg(usbnet, fmt, arg...) do {} while(0)
  201. #endif
  202.  
  203. #define deverr(usbnet, fmt, arg...) \
  204.     printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
  205. #define devwarn(usbnet, fmt, arg...) \
  206.     printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg)
  207.  
  208. #define devinfo(usbnet, fmt, arg...) \
  209.     printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \
  210.  
  211.  
  212. #endif /* __LINUX_USB_USBNET_H */
  213.