Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.0 127 lines 4.0 kB view raw
1/* 2 * u_ether.h -- interface to USB gadget "ethernet link" utilities 3 * 4 * Copyright (C) 2003-2005,2008 David Brownell 5 * Copyright (C) 2003-2004 Robert Schwebel, Benedikt Spranger 6 * Copyright (C) 2008 Nokia Corporation 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 */ 22 23#ifndef __U_ETHER_H 24#define __U_ETHER_H 25 26#include <linux/err.h> 27#include <linux/if_ether.h> 28#include <linux/usb/composite.h> 29#include <linux/usb/cdc.h> 30 31#include "gadget_chips.h" 32 33 34/* 35 * This represents the USB side of an "ethernet" link, managed by a USB 36 * function which provides control and (maybe) framing. Two functions 37 * in different configurations could share the same ethernet link/netdev, 38 * using different host interaction models. 39 * 40 * There is a current limitation that only one instance of this link may 41 * be present in any given configuration. When that's a problem, network 42 * layer facilities can be used to package multiple logical links on this 43 * single "physical" one. 44 */ 45struct gether { 46 struct usb_function func; 47 48 /* updated by gether_{connect,disconnect} */ 49 struct eth_dev *ioport; 50 51 /* endpoints handle full and/or high speeds */ 52 struct usb_ep *in_ep; 53 struct usb_ep *out_ep; 54 55 /* descriptors match device speed at gether_connect() time */ 56 struct usb_endpoint_descriptor *in; 57 struct usb_endpoint_descriptor *out; 58 59 bool is_zlp_ok; 60 61 u16 cdc_filter; 62 63 /* hooks for added framing, as needed for RNDIS and EEM. */ 64 u32 header_len; 65 /* NCM requires fixed size bundles */ 66 bool is_fixed; 67 u32 fixed_out_len; 68 u32 fixed_in_len; 69 struct sk_buff *(*wrap)(struct gether *port, 70 struct sk_buff *skb); 71 int (*unwrap)(struct gether *port, 72 struct sk_buff *skb, 73 struct sk_buff_head *list); 74 75 /* called on network open/close */ 76 void (*open)(struct gether *); 77 void (*close)(struct gether *); 78}; 79 80#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ 81 |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ 82 |USB_CDC_PACKET_TYPE_PROMISCUOUS \ 83 |USB_CDC_PACKET_TYPE_DIRECTED) 84 85 86/* netdev setup/teardown as directed by the gadget driver */ 87int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]); 88void gether_cleanup(void); 89 90/* connect/disconnect is handled by individual functions */ 91struct net_device *gether_connect(struct gether *); 92void gether_disconnect(struct gether *); 93 94/* Some controllers can't support CDC Ethernet (ECM) ... */ 95static inline bool can_support_ecm(struct usb_gadget *gadget) 96{ 97 if (!gadget_supports_altsettings(gadget)) 98 return false; 99 100 /* Everything else is *presumably* fine ... but this is a bit 101 * chancy, so be **CERTAIN** there are no hardware issues with 102 * your controller. Add it above if it can't handle CDC. 103 */ 104 return true; 105} 106 107/* each configuration may bind one instance of an ethernet link */ 108int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 109int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 110int ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 111int eem_bind_config(struct usb_configuration *c); 112 113#ifdef USB_ETH_RNDIS 114 115int rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 116 117#else 118 119static inline int 120rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) 121{ 122 return 0; 123} 124 125#endif 126 127#endif /* __U_ETHER_H */