diff options
author | Anton Vorontsov <cbouatmailru@gmail.com> | 2008-07-29 18:05:23 -0400 |
---|---|---|
committer | Anton Vorontsov <cbouatmailru@gmail.com> | 2008-07-29 18:05:23 -0400 |
commit | 9fec6060d9e48ed7db0dac0e16d0f0f0e615b7f6 (patch) | |
tree | 74b41f31a08f6500ff3dfcf64ba21e2d9a8e87e5 /drivers/usb/gadget/u_ether.h | |
parent | fece418418f51e92dd7e67e17c5e3fe5a28d3279 (diff) | |
parent | 6e86841d05f371b5b9b86ce76c02aaee83352298 (diff) |
Merge branch 'master' of /home/cbou/linux-2.6
Conflicts:
drivers/power/Kconfig
drivers/power/Makefile
Diffstat (limited to 'drivers/usb/gadget/u_ether.h')
-rw-r--r-- | drivers/usb/gadget/u_ether.h | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/drivers/usb/gadget/u_ether.h b/drivers/usb/gadget/u_ether.h new file mode 100644 index 000000000000..0d1f7ae3b071 --- /dev/null +++ b/drivers/usb/gadget/u_ether.h | |||
@@ -0,0 +1,127 @@ | |||
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 | */ | ||
45 | struct 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 */ | ||
82 | int gether_setup(struct usb_gadget *g, u8 ethaddr[ETH_ALEN]); | ||
83 | void gether_cleanup(void); | ||
84 | |||
85 | /* connect/disconnect is handled by individual functions */ | ||
86 | struct net_device *gether_connect(struct gether *); | ||
87 | void gether_disconnect(struct gether *); | ||
88 | |||
89 | /* Some controllers can't support CDC Ethernet (ECM) ... */ | ||
90 | static 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 */ | ||
110 | int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); | ||
111 | int ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); | ||
112 | |||
113 | #ifdef CONFIG_USB_ETH_RNDIS | ||
114 | |||
115 | int rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]); | ||
116 | |||
117 | #else | ||
118 | |||
119 | static inline int | ||
120 | rndis_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN]) | ||
121 | { | ||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | #endif | ||
126 | |||
127 | #endif /* __U_ETHER_H */ | ||