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 #define KUE_CONFIG_NO 1
46 #define KUE_IFACE_IDX 0
47
48 #define KUE_CMD_GET_ETHER_DESCRIPTOR 0x00
49 #define KUE_CMD_SET_MCAST_FILTERS 0x01
50 #define KUE_CMD_SET_PKT_FILTER 0x02
51 #define KUE_CMD_GET_ETHERSTATS 0x03
52 #define KUE_CMD_GET_GPIO 0x04
53 #define KUE_CMD_SET_GPIO 0x05
54 #define KUE_CMD_SET_MAC 0x06
55 #define KUE_CMD_GET_MAC 0x07
56 #define KUE_CMD_SET_URB_SIZE 0x08
57 #define KUE_CMD_SET_SOFS 0x09
58 #define KUE_CMD_SET_EVEN_PKTS 0x0A
59 #define KUE_CMD_SEND_SCAN 0xFF
60
61 struct kue_ether_desc {
62 u_int8_t kue_len;
63 u_int8_t kue_rsvd0;
64 u_int8_t kue_rsvd1;
65 u_int8_t kue_macaddr[ETHER_ADDR_LEN];
66 u_int8_t kue_etherstats[4];
67 u_int8_t kue_maxseg[2];
68 u_int8_t kue_mcastfilt[2];
69 u_int8_t kue_rsvd2;
70 } __packed;
71
72 #define KUE_ETHERSTATS(x) \
73 (((x)->kue_desc.kue_etherstats[3] << 24) | \
74 ((x)->kue_desc.kue_etherstats[2] << 16) | \
75 ((x)->kue_desc.kue_etherstats[1] << 8) | \
76 (x)->kue_desc.kue_etherstats[0])
77 #define KUE_MAXSEG(x) \
78 (((x)->kue_desc.kue_maxseg[1] << 8) | (x)->kue_desc.kue_maxseg[0])
79 #define KUE_MCFILTCNT(x) \
80 ((((x)->kue_desc.kue_mcastfilt[1] << 8) | \
81 (x)->kue_desc.kue_mcastfilt[0]) & 0x7FFF)
82 #define KUE_MCFILT(x, y) \
83 (char *)&(sc->kue_mcfilters[y * ETHER_ADDR_LEN])
84
85 #define KUE_STAT_TX_OK 0x00000001
86 #define KUE_STAT_RX_OK 0x00000002
87 #define KUE_STAT_TX_ERR 0x00000004
88 #define KUE_STAT_RX_ERR 0x00000008
89 #define KUE_STAT_RX_NOBUF 0x00000010
90 #define KUE_STAT_TX_UCAST_BYTES 0x00000020
91 #define KUE_STAT_TX_UCAST_FRAMES 0x00000040
92 #define KUE_STAT_TX_MCAST_BYTES 0x00000080
93 #define KUE_STAT_TX_MCAST_FRAMES 0x00000100
94 #define KUE_STAT_TX_BCAST_BYTES 0x00000200
95 #define KUE_STAT_TX_BCAST_FRAMES 0x00000400
96 #define KUE_STAT_RX_UCAST_BYTES 0x00000800
97 #define KUE_STAT_RX_UCAST_FRAMES 0x00001000
98 #define KUE_STAT_RX_MCAST_BYTES 0x00002000
99 #define KUE_STAT_RX_MCAST_FRAMES 0x00004000
100 #define KUE_STAT_RX_BCAST_BYTES 0x00008000
101 #define KUE_STAT_RX_BCAST_FRAMES 0x00010000
102 #define KUE_STAT_RX_CRCERR 0x00020000
103 #define KUE_STAT_TX_QUEUE_LENGTH 0x00040000
104 #define KUE_STAT_RX_ALIGNERR 0x00080000
105 #define KUE_STAT_TX_SINGLECOLL 0x00100000
106 #define KUE_STAT_TX_MULTICOLL 0x00200000
107 #define KUE_STAT_TX_DEFERRED 0x00400000
108 #define KUE_STAT_TX_MAXCOLLS 0x00800000
109 #define KUE_STAT_RX_OVERRUN 0x01000000
110 #define KUE_STAT_TX_UNDERRUN 0x02000000
111 #define KUE_STAT_TX_SQE_ERR 0x04000000
112 #define KUE_STAT_TX_CARRLOSS 0x08000000
113 #define KUE_STAT_RX_LATECOLL 0x10000000
114
115 #define KUE_RXFILT_PROMISC 0x0001
116 #define KUE_RXFILT_ALLMULTI 0x0002
117 #define KUE_RXFILT_UNICAST 0x0004
118 #define KUE_RXFILT_BROADCAST 0x0008
119 #define KUE_RXFILT_MULTICAST 0x0010
120
121 #define KUE_TIMEOUT 1000
122 #define KUE_BUFSZ 1536
123 #define KUE_MIN_FRAMELEN 60
124
125 #define KUE_RX_LIST_CNT 1
126 #define KUE_TX_LIST_CNT 1
127
128 #define KUE_CTL_READ 0x01
129 #define KUE_CTL_WRITE 0x02
130
131 #define KUE_WARM_REV 0x0202
132
133
134
135
136
137 #define KUE_ENDPT_RX 0x0
138 #define KUE_ENDPT_TX 0x1
139 #define KUE_ENDPT_INTR 0x2
140 #define KUE_ENDPT_MAX 0x3
141
142 struct kue_type {
143 u_int16_t kue_vid;
144 u_int16_t kue_did;
145 };
146
147 struct kue_softc;
148
149 struct kue_chain {
150 struct kue_softc *kue_sc;
151 usbd_xfer_handle kue_xfer;
152 char *kue_buf;
153 struct mbuf *kue_mbuf;
154 int kue_idx;
155 };
156
157 struct kue_cdata {
158 struct kue_chain kue_tx_chain[KUE_TX_LIST_CNT];
159 struct kue_chain kue_rx_chain[KUE_RX_LIST_CNT];
160 int kue_tx_prod;
161 int kue_tx_cons;
162 int kue_tx_cnt;
163 int kue_rx_prod;
164 };
165
166 struct kue_softc {
167 struct device kue_dev;
168
169 struct arpcom arpcom;
170 #define GET_IFP(sc) (&(sc)->arpcom.ac_if)
171
172 usbd_device_handle kue_udev;
173 usbd_interface_handle kue_iface;
174 u_int16_t kue_vendor;
175 u_int16_t kue_product;
176 struct kue_ether_desc kue_desc;
177 int kue_ed[KUE_ENDPT_MAX];
178 usbd_pipe_handle kue_ep[KUE_ENDPT_MAX];
179 int kue_if_flags;
180 u_int16_t kue_rxfilt;
181 u_int8_t *kue_mcfilters;
182 struct kue_cdata kue_cdata;
183
184 char kue_dying;
185 char kue_attached;
186 u_int kue_rx_errs;
187 struct timeval kue_rx_notice;
188 };