at v3.1 123 lines 3.8 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 bool is_zlp_ok; 56 57 u16 cdc_filter; 58 59 /* hooks for added framing, as needed for RNDIS and EEM. */ 60 u32 header_len; 61 /* NCM requires fixed size bundles */ 62 bool is_fixed; 63 u32 fixed_out_len; 64 u32 fixed_in_len; 65 struct sk_buff *(*wrap)(struct gether *port, 66 struct sk_buff *skb); 67 int (*unwrap)(struct gether *port, 68 struct sk_buff *skb, 69 struct sk_buff_head *list); 70 71 /* called on network open/close */ 72 void (*open)(struct gether *); 73 void (*close)(struct gether *); 74}; 75 76#define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ 77 |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ 78 |USB_CDC_PACKET_TYPE_PROMISCUOUS \ 79 |USB_CDC_PACKET_TYPE_DIRECTED) 80 81 82/* netdev setup/teardown as directed by the gadget driver */ 83int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]); 84void gether_cleanup(void); 85 86/* connect/disconnect is handled by individual functions */ 87struct net_device *gether_connect(struct gether *); 88void gether_disconnect(struct gether *); 89 90/* Some controllers can't support CDC Ethernet (ECM) ... */ 91static inline bool can_support_ecm(struct usb_gadget *gadget) 92{ 93 if (!gadget_supports_altsettings(gadget)) 94 return false; 95 96 /* Everything else is *presumably* fine ... but this is a bit 97 * chancy, so be **CERTAIN** there are no hardware issues with 98 * your controller. Add it above if it can't handle CDC. 99 */ 100 return true; 101} 102 103/* each configuration may bind one instance of an ethernet link */ 104int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 105int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 106int ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 107int eem_bind_config(struct usb_configuration *c); 108 109#ifdef USB_ETH_RNDIS 110 111int rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); 112 113#else 114 115static inline int 116rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) 117{ 118 return 0; 119} 120 121#endif 122 123#endif /* __U_ETHER_H */