if_kue.c revision 1.112 1 1.112 riastrad /* $NetBSD: if_kue.c,v 1.112 2022/03/03 05:53:04 riastradh Exp $ */
2 1.77 mrg
3 1.1 augustss /*
4 1.1 augustss * Copyright (c) 1997, 1998, 1999, 2000
5 1.1 augustss * Bill Paul <wpaul (at) ee.columbia.edu>. All rights reserved.
6 1.1 augustss *
7 1.1 augustss * Redistribution and use in source and binary forms, with or without
8 1.1 augustss * modification, are permitted provided that the following conditions
9 1.1 augustss * are met:
10 1.1 augustss * 1. Redistributions of source code must retain the above copyright
11 1.1 augustss * notice, this list of conditions and the following disclaimer.
12 1.1 augustss * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 augustss * notice, this list of conditions and the following disclaimer in the
14 1.1 augustss * documentation and/or other materials provided with the distribution.
15 1.1 augustss * 3. All advertising materials mentioning features or use of this software
16 1.1 augustss * must display the following acknowledgement:
17 1.1 augustss * This product includes software developed by Bill Paul.
18 1.1 augustss * 4. Neither the name of the author nor the names of any co-contributors
19 1.1 augustss * may be used to endorse or promote products derived from this software
20 1.1 augustss * without specific prior written permission.
21 1.1 augustss *
22 1.1 augustss * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
23 1.1 augustss * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 augustss * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 augustss * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
26 1.1 augustss * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 1.1 augustss * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 1.1 augustss * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 1.1 augustss * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 1.1 augustss * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 1.1 augustss * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32 1.1 augustss * THE POSSIBILITY OF SUCH DAMAGE.
33 1.1 augustss *
34 1.1 augustss * $FreeBSD: src/sys/dev/usb/if_kue.c,v 1.14 2000/01/14 01:36:15 wpaul Exp $
35 1.1 augustss */
36 1.1 augustss
37 1.1 augustss /*
38 1.1 augustss * Kawasaki LSI KL5KUSB101B USB to ethernet adapter driver.
39 1.1 augustss *
40 1.1 augustss * Written by Bill Paul <wpaul (at) ee.columbia.edu>
41 1.1 augustss * Electrical Engineering Department
42 1.1 augustss * Columbia University, New York City
43 1.1 augustss */
44 1.1 augustss
45 1.1 augustss /*
46 1.1 augustss * The KLSI USB to ethernet adapter chip contains an USB serial interface,
47 1.1 augustss * ethernet MAC and embedded microcontroller (called the QT Engine).
48 1.1 augustss * The chip must have firmware loaded into it before it will operate.
49 1.1 augustss * Packets are passed between the chip and host via bulk transfers.
50 1.1 augustss * There is an interrupt endpoint mentioned in the software spec, however
51 1.1 augustss * it's currently unused. This device is 10Mbps half-duplex only, hence
52 1.1 augustss * there is no media selection logic. The MAC supports a 128 entry
53 1.1 augustss * multicast filter, though the exact size of the filter can depend
54 1.1 augustss * on the firmware. Curiously, while the software spec describes various
55 1.1 augustss * ethernet statistics counters, my sample adapter and firmware combination
56 1.1 augustss * claims not to support any statistics counters at all.
57 1.1 augustss *
58 1.1 augustss * Note that once we load the firmware in the device, we have to be
59 1.1 augustss * careful not to load it again: if you restart your computer but
60 1.1 augustss * leave the adapter attached to the USB controller, it may remain
61 1.1 augustss * powered on and retain its firmware. In this case, we don't need
62 1.1 augustss * to load the firmware a second time.
63 1.1 augustss *
64 1.1 augustss * Special thanks to Rob Furr for providing an ADS Technologies
65 1.1 augustss * adapter for development and testing. No monkeys were harmed during
66 1.1 augustss * the development of this driver.
67 1.1 augustss */
68 1.1 augustss
69 1.1 augustss /*
70 1.1 augustss * Ported to NetBSD and somewhat rewritten by Lennart Augustsson.
71 1.1 augustss */
72 1.44 lukem
73 1.44 lukem #include <sys/cdefs.h>
74 1.112 riastrad __KERNEL_RCSID(0, "$NetBSD: if_kue.c,v 1.112 2022/03/03 05:53:04 riastradh Exp $");
75 1.1 augustss
76 1.79 christos #ifdef _KERNEL_OPT
77 1.1 augustss #include "opt_inet.h"
78 1.87 skrll #include "opt_usb.h"
79 1.79 christos #endif
80 1.1 augustss
81 1.1 augustss #include <sys/param.h>
82 1.84 skrll #include <sys/kmem.h>
83 1.98 mrg
84 1.98 mrg #include <dev/usb/usbnet.h>
85 1.1 augustss
86 1.1 augustss #ifdef INET
87 1.49 augustss #include <netinet/in.h>
88 1.1 augustss #include <netinet/if_inarp.h>
89 1.1 augustss #endif
90 1.1 augustss
91 1.1 augustss #include <dev/usb/if_kuereg.h>
92 1.1 augustss #include <dev/usb/kue_fw.h>
93 1.1 augustss
94 1.1 augustss #ifdef KUE_DEBUG
95 1.74 dyoung #define DPRINTF(x) if (kuedebug) printf x
96 1.94 msaitoh #define DPRINTFN(n, x) if (kuedebug >= (n)) printf x
97 1.1 augustss int kuedebug = 0;
98 1.1 augustss #else
99 1.1 augustss #define DPRINTF(x)
100 1.94 msaitoh #define DPRINTFN(n, x)
101 1.1 augustss #endif
102 1.1 augustss
103 1.98 mrg struct kue_type {
104 1.98 mrg uint16_t kue_vid;
105 1.98 mrg uint16_t kue_did;
106 1.98 mrg };
107 1.98 mrg
108 1.98 mrg struct kue_softc {
109 1.98 mrg struct usbnet kue_un;
110 1.98 mrg
111 1.98 mrg struct kue_ether_desc kue_desc;
112 1.98 mrg uint16_t kue_rxfilt;
113 1.98 mrg uint8_t *kue_mcfilters;
114 1.98 mrg };
115 1.98 mrg
116 1.98 mrg #define KUE_MCFILT(x, y) \
117 1.98 mrg (uint8_t *)&(sc->kue_mcfilters[y * ETHER_ADDR_LEN])
118 1.98 mrg
119 1.98 mrg #define KUE_BUFSZ 1536
120 1.98 mrg #define KUE_MIN_FRAMELEN 60
121 1.98 mrg
122 1.98 mrg #define KUE_RX_LIST_CNT 1
123 1.98 mrg #define KUE_TX_LIST_CNT 1
124 1.98 mrg
125 1.1 augustss /*
126 1.1 augustss * Various supported device vendors/products.
127 1.1 augustss */
128 1.72 tsutsui static const struct usb_devno kue_devs[] = {
129 1.42 augustss { USB_VENDOR_3COM, USB_PRODUCT_3COM_3C19250 },
130 1.42 augustss { USB_VENDOR_3COM, USB_PRODUCT_3COM_3C460 },
131 1.42 augustss { USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_URE450 },
132 1.42 augustss { USB_VENDOR_ADS, USB_PRODUCT_ADS_UBS10BT },
133 1.43 augustss { USB_VENDOR_ADS, USB_PRODUCT_ADS_UBS10BTX },
134 1.105 mlelstv { USB_VENDOR_ACTIONTEC, USB_PRODUCT_ACTIONTEC_AR9287 },
135 1.99 mrg { USB_VENDOR_ALLIEDTELESYN, USB_PRODUCT_ALLIEDTELESYN_AT_USB10 },
136 1.1 augustss { USB_VENDOR_AOX, USB_PRODUCT_AOX_USB101 },
137 1.43 augustss { USB_VENDOR_ASANTE, USB_PRODUCT_ASANTE_EA },
138 1.1 augustss { USB_VENDOR_ATEN, USB_PRODUCT_ATEN_UC10T },
139 1.43 augustss { USB_VENDOR_ATEN, USB_PRODUCT_ATEN_DSB650C },
140 1.42 augustss { USB_VENDOR_COREGA, USB_PRODUCT_COREGA_ETHER_USB_T },
141 1.42 augustss { USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DSB650C },
142 1.42 augustss { USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_E45 },
143 1.43 augustss { USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_XX1 },
144 1.43 augustss { USB_VENDOR_ENTREGA, USB_PRODUCT_ENTREGA_XX2 },
145 1.42 augustss { USB_VENDOR_IODATA, USB_PRODUCT_IODATA_USBETT },
146 1.43 augustss { USB_VENDOR_JATON, USB_PRODUCT_JATON_EDA },
147 1.43 augustss { USB_VENDOR_KINGSTON, USB_PRODUCT_KINGSTON_XX1 },
148 1.42 augustss { USB_VENDOR_KLSI, USB_PRODUCT_KLSI_DUH3E10BT },
149 1.43 augustss { USB_VENDOR_KLSI, USB_PRODUCT_KLSI_DUH3E10BTN },
150 1.42 augustss { USB_VENDOR_LINKSYS, USB_PRODUCT_LINKSYS_USB10T },
151 1.43 augustss { USB_VENDOR_MOBILITY, USB_PRODUCT_MOBILITY_EA },
152 1.1 augustss { USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_EA101 },
153 1.43 augustss { USB_VENDOR_NETGEAR, USB_PRODUCT_NETGEAR_EA101X },
154 1.1 augustss { USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET },
155 1.1 augustss { USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET2 },
156 1.40 augustss { USB_VENDOR_PERACOM, USB_PRODUCT_PERACOM_ENET3 },
157 1.43 augustss { USB_VENDOR_PORTGEAR, USB_PRODUCT_PORTGEAR_EA8 },
158 1.43 augustss { USB_VENDOR_PORTGEAR, USB_PRODUCT_PORTGEAR_EA9 },
159 1.43 augustss { USB_VENDOR_PORTSMITH, USB_PRODUCT_PORTSMITH_EEA },
160 1.43 augustss { USB_VENDOR_SHARK, USB_PRODUCT_SHARK_PA },
161 1.52 augustss { USB_VENDOR_SILICOM, USB_PRODUCT_SILICOM_U2E },
162 1.99 mrg { USB_VENDOR_SILICOM, USB_PRODUCT_SILICOM_GPE },
163 1.1 augustss { USB_VENDOR_SMC, USB_PRODUCT_SMC_2102USB },
164 1.1 augustss };
165 1.46 augustss #define kue_lookup(v, p) (usb_lookup(kue_devs, v, p))
166 1.1 augustss
167 1.101 maxv static int kue_match(device_t, cfdata_t, void *);
168 1.101 maxv static void kue_attach(device_t, device_t, void *);
169 1.101 maxv static int kue_detach(device_t, int);
170 1.93 mrg
171 1.74 dyoung CFATTACH_DECL_NEW(kue, sizeof(struct kue_softc), kue_match, kue_attach,
172 1.98 mrg kue_detach, usbnet_activate);
173 1.1 augustss
174 1.103 thorpej static void kue_uno_rx_loop(struct usbnet *, struct usbnet_chain *, uint32_t);
175 1.103 thorpej static unsigned kue_uno_tx_prepare(struct usbnet *, struct mbuf *,
176 1.103 thorpej struct usbnet_chain *);
177 1.107 riastrad static void kue_uno_mcast(struct ifnet *);
178 1.103 thorpej static int kue_uno_init(struct ifnet *);
179 1.98 mrg
180 1.101 maxv static const struct usbnet_ops kue_ops = {
181 1.107 riastrad .uno_mcast = kue_uno_mcast,
182 1.103 thorpej .uno_tx_prepare = kue_uno_tx_prepare,
183 1.103 thorpej .uno_rx_loop = kue_uno_rx_loop,
184 1.103 thorpej .uno_init = kue_uno_init,
185 1.98 mrg };
186 1.29 augustss
187 1.98 mrg static void kue_reset(struct usbnet *);
188 1.29 augustss
189 1.98 mrg static usbd_status kue_ctl(struct usbnet *, int, uint8_t,
190 1.71 tsutsui uint16_t, void *, uint32_t);
191 1.98 mrg static int kue_load_fw(struct usbnet *);
192 1.1 augustss
193 1.72 tsutsui static usbd_status
194 1.98 mrg kue_setword(struct usbnet *un, uint8_t breq, uint16_t word)
195 1.1 augustss {
196 1.1 augustss usb_device_request_t req;
197 1.1 augustss
198 1.98 mrg DPRINTFN(10,("%s: %s: enter\n", device_xname(un->un_dev),__func__));
199 1.1 augustss
200 1.1 augustss req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
201 1.1 augustss req.bRequest = breq;
202 1.1 augustss USETW(req.wValue, word);
203 1.1 augustss USETW(req.wIndex, 0);
204 1.1 augustss USETW(req.wLength, 0);
205 1.1 augustss
206 1.98 mrg return usbd_do_request(un->un_udev, &req, NULL);
207 1.1 augustss }
208 1.1 augustss
209 1.72 tsutsui static usbd_status
210 1.98 mrg kue_ctl(struct usbnet *un, int rw, uint8_t breq, uint16_t val,
211 1.71 tsutsui void *data, uint32_t len)
212 1.1 augustss {
213 1.1 augustss usb_device_request_t req;
214 1.1 augustss
215 1.98 mrg DPRINTFN(10,("%s: %s: enter, len=%d\n", device_xname(un->un_dev),
216 1.48 augustss __func__, len));
217 1.1 augustss
218 1.1 augustss if (rw == KUE_CTL_WRITE)
219 1.1 augustss req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
220 1.1 augustss else
221 1.1 augustss req.bmRequestType = UT_READ_VENDOR_DEVICE;
222 1.1 augustss
223 1.1 augustss req.bRequest = breq;
224 1.1 augustss USETW(req.wValue, val);
225 1.1 augustss USETW(req.wIndex, 0);
226 1.1 augustss USETW(req.wLength, len);
227 1.1 augustss
228 1.98 mrg return usbd_do_request(un->un_udev, &req, data);
229 1.1 augustss }
230 1.1 augustss
231 1.72 tsutsui static int
232 1.98 mrg kue_load_fw(struct usbnet *un)
233 1.1 augustss {
234 1.36 augustss usb_device_descriptor_t dd;
235 1.1 augustss usbd_status err;
236 1.1 augustss
237 1.98 mrg DPRINTFN(1,("%s: %s: enter\n", device_xname(un->un_dev), __func__));
238 1.1 augustss
239 1.1 augustss /*
240 1.1 augustss * First, check if we even need to load the firmware.
241 1.1 augustss * If the device was still attached when the system was
242 1.1 augustss * rebooted, it may already have firmware loaded in it.
243 1.1 augustss * If this is the case, we don't need to do it again.
244 1.1 augustss * And in fact, if we try to load it again, we'll hang,
245 1.1 augustss * so we have to avoid this condition if we don't want
246 1.1 augustss * to look stupid.
247 1.1 augustss *
248 1.65 dyoung * We can test this quickly by checking the bcdRevision
249 1.65 dyoung * code. The NIC will return a different revision code if
250 1.65 dyoung * it's probed while the firmware is still loaded and
251 1.65 dyoung * running.
252 1.65 dyoung */
253 1.98 mrg if (usbd_get_device_desc(un->un_udev, &dd))
254 1.84 skrll return EIO;
255 1.65 dyoung if (UGETW(dd.bcdDevice) == KUE_WARM_REV) {
256 1.1 augustss printf("%s: warm boot, no firmware download\n",
257 1.98 mrg device_xname(un->un_dev));
258 1.84 skrll return 0;
259 1.1 augustss }
260 1.1 augustss
261 1.1 augustss printf("%s: cold boot, downloading firmware\n",
262 1.98 mrg device_xname(un->un_dev));
263 1.1 augustss
264 1.1 augustss /* Load code segment */
265 1.49 augustss DPRINTFN(1,("%s: kue_load_fw: download code_seg\n",
266 1.98 mrg device_xname(un->un_dev)));
267 1.54 christos /*XXXUNCONST*/
268 1.98 mrg err = kue_ctl(un, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN,
269 1.54 christos 0, __UNCONST(kue_code_seg), sizeof(kue_code_seg));
270 1.1 augustss if (err) {
271 1.1 augustss printf("%s: failed to load code segment: %s\n",
272 1.98 mrg device_xname(un->un_dev), usbd_errstr(err));
273 1.84 skrll return EIO;
274 1.1 augustss }
275 1.1 augustss
276 1.1 augustss /* Load fixup segment */
277 1.49 augustss DPRINTFN(1,("%s: kue_load_fw: download fix_seg\n",
278 1.98 mrg device_xname(un->un_dev)));
279 1.54 christos /*XXXUNCONST*/
280 1.98 mrg err = kue_ctl(un, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN,
281 1.54 christos 0, __UNCONST(kue_fix_seg), sizeof(kue_fix_seg));
282 1.1 augustss if (err) {
283 1.1 augustss printf("%s: failed to load fixup segment: %s\n",
284 1.98 mrg device_xname(un->un_dev), usbd_errstr(err));
285 1.84 skrll return EIO;
286 1.1 augustss }
287 1.1 augustss
288 1.1 augustss /* Send trigger command. */
289 1.49 augustss DPRINTFN(1,("%s: kue_load_fw: download trig_seg\n",
290 1.98 mrg device_xname(un->un_dev)));
291 1.54 christos /*XXXUNCONST*/
292 1.98 mrg err = kue_ctl(un, KUE_CTL_WRITE, KUE_CMD_SEND_SCAN,
293 1.54 christos 0, __UNCONST(kue_trig_seg), sizeof(kue_trig_seg));
294 1.1 augustss if (err) {
295 1.1 augustss printf("%s: failed to load trigger segment: %s\n",
296 1.98 mrg device_xname(un->un_dev), usbd_errstr(err));
297 1.84 skrll return EIO;
298 1.1 augustss }
299 1.1 augustss
300 1.98 mrg usbd_delay_ms(un->un_udev, 10);
301 1.1 augustss
302 1.1 augustss /*
303 1.1 augustss * Reload device descriptor.
304 1.1 augustss * Why? The chip without the firmware loaded returns
305 1.1 augustss * one revision code. The chip with the firmware
306 1.1 augustss * loaded and running returns a *different* revision
307 1.1 augustss * code. This confuses the quirk mechanism, which is
308 1.1 augustss * dependent on the revision data.
309 1.1 augustss */
310 1.98 mrg (void)usbd_reload_device_desc(un->un_udev);
311 1.1 augustss
312 1.98 mrg DPRINTFN(1,("%s: %s: done\n", device_xname(un->un_dev), __func__));
313 1.1 augustss
314 1.1 augustss /* Reset the adapter. */
315 1.98 mrg kue_reset(un);
316 1.1 augustss
317 1.84 skrll return 0;
318 1.1 augustss }
319 1.1 augustss
320 1.72 tsutsui static void
321 1.112 riastrad kue_uno_mcast(struct ifnet *ifp)
322 1.1 augustss {
323 1.112 riastrad struct usbnet * un = ifp->if_softc;
324 1.98 mrg struct ethercom * ec = usbnet_ec(un);
325 1.98 mrg struct kue_softc * sc = usbnet_softc(un);
326 1.1 augustss struct ether_multi *enm;
327 1.1 augustss struct ether_multistep step;
328 1.1 augustss int i;
329 1.1 augustss
330 1.98 mrg DPRINTFN(5,("%s: %s: enter\n", device_xname(un->un_dev), __func__));
331 1.98 mrg
332 1.98 mrg /* If we want promiscuous mode, set the allframes bit. */
333 1.98 mrg if (ifp->if_flags & IFF_PROMISC)
334 1.98 mrg sc->kue_rxfilt |= KUE_RXFILT_PROMISC;
335 1.98 mrg else
336 1.98 mrg sc->kue_rxfilt &= ~KUE_RXFILT_PROMISC;
337 1.1 augustss
338 1.38 enami if (ifp->if_flags & IFF_PROMISC) {
339 1.38 enami allmulti:
340 1.38 enami ifp->if_flags |= IFF_ALLMULTI;
341 1.98 mrg sc->kue_rxfilt |= KUE_RXFILT_ALLMULTI|KUE_RXFILT_PROMISC;
342 1.1 augustss sc->kue_rxfilt &= ~KUE_RXFILT_MULTICAST;
343 1.98 mrg kue_setword(un, KUE_CMD_SET_PKT_FILTER, sc->kue_rxfilt);
344 1.1 augustss return;
345 1.1 augustss }
346 1.1 augustss
347 1.98 mrg sc->kue_rxfilt &= ~(KUE_RXFILT_ALLMULTI|KUE_RXFILT_PROMISC);
348 1.1 augustss
349 1.1 augustss i = 0;
350 1.96 msaitoh ETHER_LOCK(ec);
351 1.96 msaitoh ETHER_FIRST_MULTI(step, ec, enm);
352 1.1 augustss while (enm != NULL) {
353 1.38 enami if (i == KUE_MCFILTCNT(sc) ||
354 1.38 enami memcmp(enm->enm_addrlo, enm->enm_addrhi,
355 1.96 msaitoh ETHER_ADDR_LEN) != 0) {
356 1.96 msaitoh ETHER_UNLOCK(ec);
357 1.38 enami goto allmulti;
358 1.96 msaitoh }
359 1.38 enami
360 1.1 augustss memcpy(KUE_MCFILT(sc, i), enm->enm_addrlo, ETHER_ADDR_LEN);
361 1.1 augustss ETHER_NEXT_MULTI(step, enm);
362 1.1 augustss i++;
363 1.1 augustss }
364 1.96 msaitoh ETHER_UNLOCK(ec);
365 1.1 augustss
366 1.38 enami ifp->if_flags &= ~IFF_ALLMULTI;
367 1.38 enami
368 1.38 enami sc->kue_rxfilt |= KUE_RXFILT_MULTICAST;
369 1.98 mrg kue_ctl(un, KUE_CTL_WRITE, KUE_CMD_SET_MCAST_FILTERS,
370 1.38 enami i, sc->kue_mcfilters, i * ETHER_ADDR_LEN);
371 1.1 augustss
372 1.98 mrg kue_setword(un, KUE_CMD_SET_PKT_FILTER, sc->kue_rxfilt);
373 1.1 augustss }
374 1.1 augustss
375 1.1 augustss /*
376 1.1 augustss * Issue a SET_CONFIGURATION command to reset the MAC. This should be
377 1.1 augustss * done after the firmware is loaded into the adapter in order to
378 1.1 augustss * bring it into proper operation.
379 1.1 augustss */
380 1.72 tsutsui static void
381 1.98 mrg kue_reset(struct usbnet *un)
382 1.1 augustss {
383 1.98 mrg DPRINTFN(5,("%s: %s: enter\n", device_xname(un->un_dev), __func__));
384 1.1 augustss
385 1.98 mrg if (usbd_set_config_no(un->un_udev, KUE_CONFIG_NO, 1) ||
386 1.98 mrg usbd_device2interface_handle(un->un_udev, KUE_IFACE_IDX,
387 1.98 mrg &un->un_iface))
388 1.98 mrg printf("%s: reset failed\n", device_xname(un->un_dev));
389 1.1 augustss
390 1.1 augustss /* Wait a little while for the chip to get its brains in order. */
391 1.98 mrg usbd_delay_ms(un->un_udev, 10);
392 1.1 augustss }
393 1.1 augustss
394 1.1 augustss /*
395 1.1 augustss * Probe for a KLSI chip.
396 1.1 augustss */
397 1.101 maxv static int
398 1.74 dyoung kue_match(device_t parent, cfdata_t match, void *aux)
399 1.1 augustss {
400 1.74 dyoung struct usb_attach_arg *uaa = aux;
401 1.1 augustss
402 1.1 augustss DPRINTFN(25,("kue_match: enter\n"));
403 1.1 augustss
404 1.84 skrll return kue_lookup(uaa->uaa_vendor, uaa->uaa_product) != NULL ?
405 1.84 skrll UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
406 1.1 augustss }
407 1.1 augustss
408 1.1 augustss /*
409 1.1 augustss * Attach the interface. Allocate softc structures, do
410 1.1 augustss * setup and ethernet/BPF attach.
411 1.1 augustss */
412 1.101 maxv static void
413 1.74 dyoung kue_attach(device_t parent, device_t self, void *aux)
414 1.1 augustss {
415 1.74 dyoung struct kue_softc *sc = device_private(self);
416 1.98 mrg struct usbnet * const un = &sc->kue_un;
417 1.74 dyoung struct usb_attach_arg *uaa = aux;
418 1.53 augustss char *devinfop;
419 1.84 skrll struct usbd_device * dev = uaa->uaa_device;
420 1.1 augustss usbd_status err;
421 1.1 augustss usb_interface_descriptor_t *id;
422 1.1 augustss usb_endpoint_descriptor_t *ed;
423 1.1 augustss int i;
424 1.1 augustss
425 1.98 mrg KASSERT((void *)sc == un);
426 1.98 mrg
427 1.1 augustss DPRINTFN(5,(" : kue_attach: sc=%p, dev=%p", sc, dev));
428 1.1 augustss
429 1.66 plunky aprint_naive("\n");
430 1.66 plunky aprint_normal("\n");
431 1.53 augustss devinfop = usbd_devinfo_alloc(dev, 0);
432 1.63 cube aprint_normal_dev(self, "%s\n", devinfop);
433 1.53 augustss usbd_devinfo_free(devinfop);
434 1.1 augustss
435 1.98 mrg un->un_dev = self;
436 1.98 mrg un->un_udev = dev;
437 1.98 mrg un->un_sc = sc;
438 1.98 mrg un->un_ops = &kue_ops;
439 1.98 mrg un->un_rx_xfer_flags = USBD_SHORT_XFER_OK;
440 1.98 mrg un->un_tx_xfer_flags = 0;
441 1.98 mrg un->un_rx_list_cnt = KUE_RX_LIST_CNT;
442 1.98 mrg un->un_tx_list_cnt = KUE_TX_LIST_CNT;
443 1.98 mrg un->un_rx_bufsz = KUE_BUFSZ;
444 1.98 mrg un->un_tx_bufsz = KUE_BUFSZ;
445 1.98 mrg
446 1.31 augustss err = usbd_set_config_no(dev, KUE_CONFIG_NO, 1);
447 1.1 augustss if (err) {
448 1.78 skrll aprint_error_dev(self, "failed to set configuration"
449 1.78 skrll ", err=%s\n", usbd_errstr(err));
450 1.74 dyoung return;
451 1.1 augustss }
452 1.1 augustss
453 1.1 augustss /* Load the firmware into the NIC. */
454 1.98 mrg if (kue_load_fw(un)) {
455 1.63 cube aprint_error_dev(self, "loading firmware failed\n");
456 1.74 dyoung return;
457 1.1 augustss }
458 1.1 augustss
459 1.98 mrg err = usbd_device2interface_handle(dev, KUE_IFACE_IDX, &un->un_iface);
460 1.1 augustss if (err) {
461 1.63 cube aprint_error_dev(self, "getting interface handle failed\n");
462 1.74 dyoung return;
463 1.1 augustss }
464 1.1 augustss
465 1.98 mrg id = usbd_get_interface_descriptor(un->un_iface);
466 1.1 augustss
467 1.1 augustss /* Find endpoints. */
468 1.1 augustss for (i = 0; i < id->bNumEndpoints; i++) {
469 1.98 mrg ed = usbd_interface2endpoint_descriptor(un->un_iface, i);
470 1.1 augustss if (ed == NULL) {
471 1.63 cube aprint_error_dev(self, "couldn't get ep %d\n", i);
472 1.74 dyoung return;
473 1.1 augustss }
474 1.1 augustss if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
475 1.12 augustss UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
476 1.98 mrg un->un_ed[USBNET_ENDPT_RX] = ed->bEndpointAddress;
477 1.1 augustss } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
478 1.12 augustss UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
479 1.98 mrg un->un_ed[USBNET_ENDPT_TX] = ed->bEndpointAddress;
480 1.1 augustss } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
481 1.12 augustss UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT) {
482 1.98 mrg /*
483 1.98 mrg * The interrupt endpoint is currently unused by the
484 1.98 mrg * KLSI part.
485 1.98 mrg */
486 1.98 mrg un->un_ed[USBNET_ENDPT_INTR] = ed->bEndpointAddress;
487 1.1 augustss }
488 1.1 augustss }
489 1.1 augustss
490 1.98 mrg if (un->un_ed[USBNET_ENDPT_RX] == 0 ||
491 1.98 mrg un->un_ed[USBNET_ENDPT_TX] == 0) {
492 1.63 cube aprint_error_dev(self, "missing endpoint\n");
493 1.74 dyoung return;
494 1.1 augustss }
495 1.1 augustss
496 1.98 mrg /* First level attach, so kue_ctl() works. */
497 1.98 mrg usbnet_attach(un, "kuedet");
498 1.98 mrg
499 1.1 augustss /* Read ethernet descriptor */
500 1.98 mrg err = kue_ctl(un, KUE_CTL_READ, KUE_CMD_GET_ETHER_DESCRIPTOR,
501 1.18 augustss 0, &sc->kue_desc, sizeof(sc->kue_desc));
502 1.1 augustss if (err) {
503 1.63 cube aprint_error_dev(self, "could not read Ethernet descriptor\n");
504 1.74 dyoung return;
505 1.1 augustss }
506 1.104 skrll memcpy(un->un_eaddr, sc->kue_desc.kue_macaddr, sizeof(un->un_eaddr));
507 1.1 augustss
508 1.84 skrll sc->kue_mcfilters = kmem_alloc(KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN,
509 1.84 skrll KM_SLEEP);
510 1.1 augustss
511 1.100 mrg usbnet_attach_ifp(un, IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST,
512 1.100 mrg 0, NULL);
513 1.1 augustss }
514 1.1 augustss
515 1.101 maxv static int
516 1.74 dyoung kue_detach(device_t self, int flags)
517 1.1 augustss {
518 1.74 dyoung struct kue_softc *sc = device_private(self);
519 1.1 augustss
520 1.8 augustss if (sc->kue_mcfilters != NULL) {
521 1.84 skrll kmem_free(sc->kue_mcfilters,
522 1.84 skrll KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN);
523 1.8 augustss sc->kue_mcfilters = NULL;
524 1.8 augustss }
525 1.8 augustss
526 1.98 mrg return usbnet_detach(self, flags);
527 1.1 augustss }
528 1.1 augustss
529 1.1 augustss /*
530 1.1 augustss * A frame has been uploaded: pass the resulting mbuf chain up to
531 1.1 augustss * the higher level protocols.
532 1.1 augustss */
533 1.72 tsutsui static void
534 1.103 thorpej kue_uno_rx_loop(struct usbnet *un, struct usbnet_chain *c, uint32_t total_len)
535 1.1 augustss {
536 1.98 mrg struct ifnet *ifp = usbnet_ifp(un);
537 1.98 mrg uint8_t *buf = c->unc_buf;
538 1.98 mrg unsigned pktlen;
539 1.1 augustss
540 1.98 mrg if (total_len <= 1)
541 1.1 augustss return;
542 1.1 augustss
543 1.98 mrg DPRINTFN(10,("%s: %s: total_len=%d len=%d\n",
544 1.98 mrg device_xname(un->un_dev), __func__,
545 1.98 mrg total_len, le16dec(buf)));
546 1.98 mrg
547 1.98 mrg pktlen = le16dec(buf);
548 1.98 mrg if (pktlen > total_len - ETHER_ALIGN)
549 1.98 mrg pktlen = total_len - ETHER_ALIGN;
550 1.73 tsutsui
551 1.73 tsutsui if (pktlen < ETHER_MIN_LEN - ETHER_CRC_LEN ||
552 1.73 tsutsui pktlen > MCLBYTES - ETHER_ALIGN) {
553 1.102 thorpej if_statinc(ifp, if_ierrors);
554 1.98 mrg return;
555 1.73 tsutsui }
556 1.73 tsutsui
557 1.98 mrg DPRINTFN(10,("%s: %s: deliver %d\n", device_xname(un->un_dev),
558 1.98 mrg __func__, pktlen));
559 1.98 mrg usbnet_enqueue(un, buf + 2, pktlen, 0, 0, 0);
560 1.1 augustss }
561 1.1 augustss
562 1.98 mrg static unsigned
563 1.103 thorpej kue_uno_tx_prepare(struct usbnet *un, struct mbuf *m, struct usbnet_chain *c)
564 1.1 augustss {
565 1.98 mrg unsigned total_len, pkt_len;
566 1.1 augustss
567 1.98 mrg pkt_len = m->m_pkthdr.len + 2;
568 1.98 mrg total_len = roundup2(pkt_len, 64);
569 1.6 augustss
570 1.98 mrg if ((unsigned)total_len > un->un_tx_bufsz) {
571 1.98 mrg DPRINTFN(10,("%s: %s: too big pktlen %u total %u\n",
572 1.98 mrg device_xname(un->un_dev), __func__, pkt_len, total_len));
573 1.98 mrg return 0;
574 1.1 augustss }
575 1.1 augustss
576 1.73 tsutsui /* Frame length is specified in the first 2 bytes of the buffer. */
577 1.98 mrg le16enc(c->unc_buf, (uint16_t)m->m_pkthdr.len);
578 1.73 tsutsui
579 1.1 augustss /*
580 1.98 mrg * Copy the mbuf data into a contiguous buffer after the frame length,
581 1.98 mrg * possibly zeroing the rest of the buffer.
582 1.1 augustss */
583 1.98 mrg m_copydata(m, 0, m->m_pkthdr.len, c->unc_buf + 2);
584 1.98 mrg if (total_len - pkt_len > 0)
585 1.98 mrg memset(c->unc_buf + pkt_len, 0, total_len - pkt_len);
586 1.1 augustss
587 1.98 mrg DPRINTFN(10,("%s: %s: enter pktlen %u total %u\n",
588 1.98 mrg device_xname(un->un_dev), __func__, pkt_len, total_len));
589 1.1 augustss
590 1.98 mrg return total_len;
591 1.1 augustss }
592 1.1 augustss
593 1.98 mrg static int
594 1.110 riastrad kue_uno_init(struct ifnet *ifp)
595 1.1 augustss {
596 1.98 mrg struct usbnet * const un = ifp->if_softc;
597 1.98 mrg struct kue_softc *sc = usbnet_softc(un);
598 1.71 tsutsui uint8_t eaddr[ETHER_ADDR_LEN];
599 1.1 augustss
600 1.98 mrg DPRINTFN(5,("%s: %s: enter\n", device_xname(un->un_dev),__func__));
601 1.1 augustss
602 1.98 mrg if (usbnet_isdying(un))
603 1.98 mrg return EIO;
604 1.1 augustss
605 1.98 mrg /* Cancel pending I/O */
606 1.98 mrg usbnet_stop(un, ifp, 1);
607 1.1 augustss
608 1.61 dyoung memcpy(eaddr, CLLADDR(ifp->if_sadl), sizeof(eaddr));
609 1.1 augustss /* Set MAC address */
610 1.98 mrg kue_ctl(un, KUE_CTL_WRITE, KUE_CMD_SET_MAC, 0, eaddr, ETHER_ADDR_LEN);
611 1.1 augustss
612 1.1 augustss sc->kue_rxfilt = KUE_RXFILT_UNICAST | KUE_RXFILT_BROADCAST;
613 1.1 augustss
614 1.1 augustss /* I'm not sure how to tune these. */
615 1.1 augustss #if 0
616 1.1 augustss /*
617 1.1 augustss * Leave this one alone for now; setting it
618 1.1 augustss * wrong causes lockups on some machines/controllers.
619 1.1 augustss */
620 1.98 mrg kue_setword(un, KUE_CMD_SET_SOFS, 1);
621 1.1 augustss #endif
622 1.98 mrg kue_setword(un, KUE_CMD_SET_URB_SIZE, 64);
623 1.1 augustss
624 1.84 skrll /* Load the multicast filter. */
625 1.112 riastrad kue_uno_mcast(ifp);
626 1.84 skrll
627 1.98 mrg return usbnet_init_rx_tx(un);
628 1.1 augustss }
629 1.1 augustss
630 1.98 mrg #ifdef _MODULE
631 1.98 mrg #include "ioconf.c"
632 1.98 mrg #endif
633 1.1 augustss
634 1.98 mrg USBNET_MODULE(kue)
635