blob: 9d9aad52719408e0c33c0d88085d2bcf240ddaa1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#ifndef _ECM_H
#define _ECM_H
/** @file
*
* CDC-ECM USB Ethernet driver
*
*/
FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/usb.h>
#include <ipxe/cdc.h>
/** CDC-ECM subclass */
#define USB_SUBCLASS_CDC_ECM 0x06
/** CDC-ECM interfaces */
enum ecm_interfaces {
/** Communications interface */
ECM_INTERFACE_COMMS = 0,
/** Data interface */
ECM_INTERFACE_DATA,
ECM_INTERFACE_COUNT
};
/** Alternate setting for CDC-ECM data interface */
#define ECM_DATA_ALTERNATE 1
/** Set Ethernet packet filter */
#define ECM_SET_ETHERNET_PACKET_FILTER \
( USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE | \
USB_REQUEST_TYPE ( 0x43 ) )
/** Ethernet packet types */
enum ecm_ethernet_packet_filter {
/** Promiscuous mode */
ECM_PACKET_TYPE_PROMISCUOUS = 0x0001,
/** All multicast packets */
ECM_PACKET_TYPE_ALL_MULTICAST = 0x0002,
/** Unicast packets */
ECM_PACKET_TYPE_DIRECTED = 0x0004,
/** Broadcast packets */
ECM_PACKET_TYPE_BROADCAST = 0x0008,
/** Specified multicast packets */
ECM_PACKET_TYPE_MULTICAST = 0x0010,
};
/** An Ethernet Functional Descriptor */
struct ecm_ethernet_descriptor {
/** Descriptor header */
struct usb_descriptor_header header;
/** Descriptor subtype */
uint8_t subtype;
/** MAC address string */
uint8_t mac;
/** Ethernet statistics bitmap */
uint32_t statistics;
/** Maximum segment size */
uint16_t mtu;
/** Multicast filter configuration */
uint16_t mcast;
/** Number of wake-on-LAN filters */
uint8_t wol;
} __attribute__ (( packed ));
/** A CDC-ECM network device */
struct ecm_device {
/** USB device */
struct usb_device *usb;
/** USB bus */
struct usb_bus *bus;
/** Network device */
struct net_device *netdev;
/** Communications interface */
unsigned int comms;
/** Data interface */
unsigned int data;
/** Interrupt endpoint */
struct usb_endpoint intr;
/** Bulk IN endpoint */
struct usb_endpoint in;
/** Bulk OUT endpoint */
struct usb_endpoint out;
};
/** Interrupt maximum fill level
*
* This is a policy decision.
*/
#define ECM_INTR_MAX_FILL 2
/** Bulk IN maximum fill level
*
* This is a policy decision.
*/
#define ECM_IN_MAX_FILL 8
/** Bulk IN buffer size
*
* This is a policy decision.
*/
#define ECM_IN_MTU ( ETH_FRAME_LEN + 4 /* possible VLAN header */ )
extern struct ecm_ethernet_descriptor *
ecm_ethernet_descriptor ( struct usb_configuration_descriptor *config,
struct usb_interface_descriptor *interface );
extern int ecm_fetch_mac ( struct usb_device *usb,
struct ecm_ethernet_descriptor *desc,
uint8_t *hw_addr );
#endif /* _ECM_H */
|