Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.27 127 lines 3.9 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 * we currently don't support multiple frames per SKB. 65 */ 66 u32 header_len; 67 struct sk_buff *(*wrap)(struct sk_buff *skb); 68 int (*unwrap)(struct sk_buff *skb); 69 70 /* called on network open/close */ 71 void (*open)(struct gether *); 72 void (*close)(struct gether *); 73}; 74 75#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ 76 |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ 77 |USB_CDC_PACKET_TYPE_PROMISCUOUS \ 78 |USB_CDC_PACKET_TYPE_DIRECTED) 79 80 81/* netdev setup/teardown as directed by the gadget driver */ 82int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]); 83void gether_cleanup(void); 84 85/* connect/disconnect is handled by individual functions */ 86struct net_device *gether_connect(struct gether *); 87void gether_disconnect(struct gether *); 88 89/* Some controllers can't support CDC Ethernet (ECM) ... */ 90static inline bool can_support_ecm(struct usb_gadget *gadget) 91{ 92 if (!gadget_supports_altsettings(gadget)) 93 return false; 94 95 /* SA1100 can do ECM, *without* status endpoint ... but we'll 96 * only use it in non-ECM mode for backwards compatibility 97 * (and since we currently require a status endpoint) 98 */ 99 if (gadget_is_sa1100(gadget)) 100 return false; 101 102 /* Everything else is *presumably* fine ... but this is a bit 103 * chancy, so be **CERTAIN** there are no hardware issues with 104 * your controller. Add it above if it can't handle CDC. 105 */ 106 return true; 107} 108 109/* each configuration may bind one instance of an ethernet link */ 110int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 111int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 112 113#ifdef CONFIG_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 */