usbnet.c revision 1.121 1 /* $NetBSD: usbnet.c,v 1.121 2024/11/10 11:53:04 mlelstv Exp $ */
2
3 /*
4 * Copyright (c) 2019 Matthew R. Green
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 /*
30 * Common code shared between USB network drivers.
31 */
32
33 #include <sys/cdefs.h>
34 __KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.121 2024/11/10 11:53:04 mlelstv Exp $");
35
36 #include <sys/param.h>
37 #include <sys/kernel.h>
38 #include <sys/kmem.h>
39 #include <sys/module.h>
40 #include <sys/atomic.h>
41
42 #include <dev/usb/usbnet.h>
43 #include <dev/usb/usbhist.h>
44
45 struct usbnet_cdata {
46 struct usbnet_chain *uncd_tx_chain;
47 struct usbnet_chain *uncd_rx_chain;
48
49 int uncd_tx_prod;
50 int uncd_tx_cnt;
51 };
52
53 struct usbnet_private {
54 /*
55 * - unp_miilock protects the MII / media data and tick scheduling.
56 * - unp_rxlock protects the rx path and its data
57 * - unp_txlock protects the tx path and its data
58 *
59 * the lock ordering is:
60 * ifnet lock -> unp_miilock
61 * -> unp_rxlock
62 * -> unp_txlock
63 * -> unp_mcastlock
64 */
65 kmutex_t unp_miilock;
66 kmutex_t unp_rxlock;
67 kmutex_t unp_txlock;
68
69 kmutex_t unp_mcastlock;
70 bool unp_mcastactive;
71
72 struct usbnet_cdata unp_cdata;
73
74 struct ethercom unp_ec;
75 struct mii_data unp_mii;
76 struct usb_task unp_ticktask;
77 struct callout unp_stat_ch;
78 struct usbd_pipe *unp_ep[USBNET_ENDPT_MAX];
79
80 volatile bool unp_dying;
81 bool unp_stopped;
82 bool unp_rxstopped;
83 bool unp_txstopped;
84 bool unp_attached;
85 bool unp_ifp_attached;
86 bool unp_link;
87
88 int unp_timer;
89 unsigned short unp_if_flags;
90 unsigned unp_number;
91
92 krndsource_t unp_rndsrc;
93
94 struct timeval unp_rx_notice;
95 struct timeval unp_tx_notice;
96 struct timeval unp_intr_notice;
97 };
98
99 #define un_cdata(un) (&(un)->un_pri->unp_cdata)
100
101 volatile unsigned usbnet_number;
102
103 static void usbnet_isowned_rx(struct usbnet *);
104 static void usbnet_isowned_tx(struct usbnet *);
105
106 static inline void
107 usbnet_isowned_mii(struct usbnet *un)
108 {
109 KASSERT(mutex_owned(&un->un_pri->unp_miilock));
110 }
111
112 static int usbnet_modcmd(modcmd_t, void *);
113
114 #ifdef USB_DEBUG
115 #ifndef USBNET_DEBUG
116 #define usbnetdebug 0
117 #else
118 static int usbnetdebug = 0;
119
120 SYSCTL_SETUP(sysctl_hw_usbnet_setup, "sysctl hw.usbnet setup")
121 {
122 int err;
123 const struct sysctlnode *rnode;
124 const struct sysctlnode *cnode;
125
126 err = sysctl_createv(clog, 0, NULL, &rnode,
127 CTLFLAG_PERMANENT, CTLTYPE_NODE, "usbnet",
128 SYSCTL_DESCR("usbnet global controls"),
129 NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
130
131 if (err)
132 goto fail;
133
134 /* control debugging printfs */
135 err = sysctl_createv(clog, 0, &rnode, &cnode,
136 CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_INT,
137 "debug", SYSCTL_DESCR("Enable debugging output"),
138 NULL, 0, &usbnetdebug, sizeof(usbnetdebug), CTL_CREATE, CTL_EOL);
139 if (err)
140 goto fail;
141
142 return;
143 fail:
144 aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err);
145 }
146
147 #endif /* USBNET_DEBUG */
148 #endif /* USB_DEBUG */
149
150 #define DPRINTF(FMT,A,B,C,D) USBHIST_LOGN(usbnetdebug,1,FMT,A,B,C,D)
151 #define DPRINTFN(N,FMT,A,B,C,D) USBHIST_LOGN(usbnetdebug,N,FMT,A,B,C,D)
152 #define USBNETHIST_FUNC() USBHIST_FUNC()
153 #define USBNETHIST_CALLED(name) USBHIST_CALLED(usbnetdebug)
154 #define USBNETHIST_CALLARGS(FMT,A,B,C,D) \
155 USBHIST_CALLARGS(usbnetdebug,FMT,A,B,C,D)
156 #define USBNETHIST_CALLARGSN(N,FMT,A,B,C,D) \
157 USBHIST_CALLARGSN(usbnetdebug,N,FMT,A,B,C,D)
158
159 /* Callback vectors. */
160
161 static void
162 uno_stop(struct usbnet *un, struct ifnet *ifp, int disable)
163 {
164 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
165 if (un->un_ops->uno_stop)
166 (*un->un_ops->uno_stop)(ifp, disable);
167 }
168
169 static int
170 uno_ioctl(struct usbnet *un, struct ifnet *ifp, u_long cmd, void *data)
171 {
172
173 KASSERTMSG(cmd != SIOCADDMULTI, "%s", ifp->if_xname);
174 KASSERTMSG(cmd != SIOCDELMULTI, "%s", ifp->if_xname);
175 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
176
177 if (un->un_ops->uno_ioctl)
178 return (*un->un_ops->uno_ioctl)(ifp, cmd, data);
179 return 0;
180 }
181
182 static int
183 uno_override_ioctl(struct usbnet *un, struct ifnet *ifp, u_long cmd, void *data)
184 {
185
186 switch (cmd) {
187 case SIOCADDMULTI:
188 case SIOCDELMULTI:
189 break;
190 default:
191 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
192 }
193
194 return (*un->un_ops->uno_override_ioctl)(ifp, cmd, data);
195 }
196
197 static int
198 uno_init(struct usbnet *un, struct ifnet *ifp)
199 {
200 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
201 return un->un_ops->uno_init ? (*un->un_ops->uno_init)(ifp) : 0;
202 }
203
204 static int
205 uno_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val)
206 {
207 usbnet_isowned_mii(un);
208 return (*un->un_ops->uno_read_reg)(un, phy, reg, val);
209 }
210
211 static int
212 uno_write_reg(struct usbnet *un, int phy, int reg, uint16_t val)
213 {
214 usbnet_isowned_mii(un);
215 return (*un->un_ops->uno_write_reg)(un, phy, reg, val);
216 }
217
218 static void
219 uno_mii_statchg(struct usbnet *un, struct ifnet *ifp)
220 {
221 usbnet_isowned_mii(un);
222 (*un->un_ops->uno_statchg)(ifp);
223 }
224
225 static unsigned
226 uno_tx_prepare(struct usbnet *un, struct mbuf *m, struct usbnet_chain *c)
227 {
228 usbnet_isowned_tx(un);
229 return (*un->un_ops->uno_tx_prepare)(un, m, c);
230 }
231
232 static void
233 uno_rx_loop(struct usbnet *un, struct usbnet_chain *c, uint32_t total_len)
234 {
235 usbnet_isowned_rx(un);
236 (*un->un_ops->uno_rx_loop)(un, c, total_len);
237 }
238
239 static void
240 uno_tick(struct usbnet *un)
241 {
242 if (un->un_ops->uno_tick)
243 (*un->un_ops->uno_tick)(un);
244 }
245
246 static void
247 uno_intr(struct usbnet *un, usbd_status status)
248 {
249 if (un->un_ops->uno_intr)
250 (*un->un_ops->uno_intr)(un, status);
251 }
252
253 /* Interrupt handling. */
254
255 static struct mbuf *
256 usbnet_newbuf(size_t buflen)
257 {
258 struct mbuf *m;
259
260 if (buflen > MCLBYTES - ETHER_ALIGN)
261 return NULL;
262
263 MGETHDR(m, M_DONTWAIT, MT_DATA);
264 if (m == NULL)
265 return NULL;
266
267 if (buflen > MHLEN - ETHER_ALIGN) {
268 MCLGET(m, M_DONTWAIT);
269 if (!(m->m_flags & M_EXT)) {
270 m_freem(m);
271 return NULL;
272 }
273 }
274
275 m->m_len = m->m_pkthdr.len = ETHER_ALIGN + buflen;
276 m_adj(m, ETHER_ALIGN);
277
278 return m;
279 }
280
281 /*
282 * usbnet_rxeof() is designed to be the done callback for rx completion.
283 * it provides generic setup and finalisation, calls a different usbnet
284 * rx_loop callback in the middle, which can use usbnet_enqueue() to
285 * enqueue a packet for higher levels (or usbnet_input() if previously
286 * using if_input() path.)
287 */
288 void
289 usbnet_enqueue(struct usbnet * const un, uint8_t *buf, size_t buflen,
290 int csum_flags, uint32_t csum_data, int mbuf_flags)
291 {
292 USBNETHIST_FUNC();
293 struct ifnet * const ifp = usbnet_ifp(un);
294 struct usbnet_private * const unp __unused = un->un_pri;
295 struct mbuf *m;
296
297 USBNETHIST_CALLARGSN(5, "%jd: enter: len=%ju csf %#jx mbf %#jx",
298 unp->unp_number, buflen, csum_flags, mbuf_flags);
299
300 usbnet_isowned_rx(un);
301
302 m = usbnet_newbuf(buflen);
303 if (m == NULL) {
304 DPRINTF("%jd: no memory", unp->unp_number, 0, 0, 0);
305 if_statinc(ifp, if_ierrors);
306 return;
307 }
308 MCLAIM(m, &unp->unp_ec.ec_rx_mowner);
309
310 m_set_rcvif(m, ifp);
311 m->m_pkthdr.csum_flags = csum_flags;
312 m->m_pkthdr.csum_data = csum_data;
313 m->m_flags |= mbuf_flags;
314 memcpy(mtod(m, uint8_t *), buf, buflen);
315
316 /* push the packet up */
317 if_percpuq_enqueue(ifp->if_percpuq, m);
318 }
319
320 void
321 usbnet_input(struct usbnet * const un, uint8_t *buf, size_t buflen)
322 {
323 USBNETHIST_FUNC();
324 struct ifnet * const ifp = usbnet_ifp(un);
325 struct usbnet_private * const unp __unused = un->un_pri;
326 struct mbuf *m;
327
328 USBNETHIST_CALLARGSN(5, "%jd: enter: buf %#jx len %ju",
329 unp->unp_number, (uintptr_t)buf, buflen, 0);
330
331 usbnet_isowned_rx(un);
332
333 m = usbnet_newbuf(buflen);
334 if (m == NULL) {
335 if_statinc(ifp, if_ierrors);
336 return;
337 }
338 MCLAIM(m, &unp->unp_ec.ec_rx_mowner);
339
340 m_set_rcvif(m, ifp);
341 memcpy(mtod(m, char *), buf, buflen);
342
343 /* push the packet up */
344 if_input(ifp, m);
345 }
346
347 /*
348 * A frame has been uploaded: pass the resulting mbuf chain up to
349 * the higher level protocols.
350 */
351 static void
352 usbnet_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
353 {
354 USBNETHIST_FUNC();
355 struct usbnet_chain * const c = priv;
356 struct usbnet * const un = c->unc_un;
357 struct usbnet_private * const unp = un->un_pri;
358 uint32_t total_len;
359
360 USBNETHIST_CALLARGSN(5, "%jd: enter: status %#jx xfer %#jx",
361 unp->unp_number, status, (uintptr_t)xfer, 0);
362
363 mutex_enter(&unp->unp_rxlock);
364
365 if (usbnet_isdying(un) || unp->unp_rxstopped ||
366 status == USBD_INVAL || status == USBD_NOT_STARTED ||
367 status == USBD_CANCELLED)
368 goto out;
369
370 if (status != USBD_NORMAL_COMPLETION) {
371 if (usbd_ratecheck(&unp->unp_rx_notice))
372 device_printf(un->un_dev, "usb errors on rx: %s\n",
373 usbd_errstr(status));
374 if (status == USBD_STALLED)
375 usbd_clear_endpoint_stall_async(unp->unp_ep[USBNET_ENDPT_RX]);
376 goto done;
377 }
378
379 usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL);
380
381 if (total_len > un->un_rx_bufsz) {
382 device_printf(un->un_dev,
383 "rxeof: too large transfer (%u > %u)\n",
384 total_len, un->un_rx_bufsz);
385 goto done;
386 }
387
388 uno_rx_loop(un, c, total_len);
389 usbnet_isowned_rx(un);
390
391 done:
392 if (usbnet_isdying(un) || unp->unp_rxstopped)
393 goto out;
394
395 mutex_exit(&unp->unp_rxlock);
396
397 /* Setup new transfer. */
398 usbd_setup_xfer(xfer, c, c->unc_buf, un->un_rx_bufsz,
399 un->un_rx_xfer_flags, USBD_NO_TIMEOUT, usbnet_rxeof);
400 usbd_transfer(xfer);
401 return;
402
403 out:
404 mutex_exit(&unp->unp_rxlock);
405 }
406
407 static void
408 usbnet_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
409 {
410 USBNETHIST_FUNC(); USBNETHIST_CALLED();
411 struct usbnet_chain * const c = priv;
412 struct usbnet * const un = c->unc_un;
413 struct usbnet_cdata * const cd = un_cdata(un);
414 struct usbnet_private * const unp = un->un_pri;
415 struct ifnet * const ifp = usbnet_ifp(un);
416
417 USBNETHIST_CALLARGSN(5, "%jd: enter: status %#jx xfer %#jx",
418 unp->unp_number, status, (uintptr_t)xfer, 0);
419
420 mutex_enter(&unp->unp_txlock);
421 if (unp->unp_txstopped || usbnet_isdying(un)) {
422 mutex_exit(&unp->unp_txlock);
423 return;
424 }
425
426 KASSERT(cd->uncd_tx_cnt > 0);
427 cd->uncd_tx_cnt--;
428
429 unp->unp_timer = 0;
430
431 switch (status) {
432 case USBD_NOT_STARTED:
433 case USBD_CANCELLED:
434 break;
435
436 case USBD_NORMAL_COMPLETION:
437 if_statinc(ifp, if_opackets);
438 break;
439
440 default:
441
442 if_statinc(ifp, if_oerrors);
443 if (usbd_ratecheck(&unp->unp_tx_notice))
444 device_printf(un->un_dev, "usb error on tx: %s\n",
445 usbd_errstr(status));
446 if (status == USBD_STALLED)
447 usbd_clear_endpoint_stall_async(unp->unp_ep[USBNET_ENDPT_TX]);
448 break;
449 }
450
451 mutex_exit(&unp->unp_txlock);
452
453 if (status == USBD_NORMAL_COMPLETION && !IFQ_IS_EMPTY(&ifp->if_snd))
454 (*ifp->if_start)(ifp);
455 }
456
457 static void
458 usbnet_pipe_intr(struct usbd_xfer *xfer, void *priv, usbd_status status)
459 {
460 USBNETHIST_FUNC();
461 struct usbnet * const un = priv;
462 struct usbnet_private * const unp = un->un_pri;
463 struct usbnet_intr * const uni __unused = un->un_intr;
464
465 if (usbnet_isdying(un) ||
466 status == USBD_INVAL || status == USBD_NOT_STARTED ||
467 status == USBD_CANCELLED) {
468 USBNETHIST_CALLARGS("%jd: uni %#jx dying %#jx status %#jx",
469 unp->unp_number, (uintptr_t)uni,
470 usbnet_isdying(un), status);
471 return;
472 }
473
474 if (status != USBD_NORMAL_COMPLETION) {
475 if (usbd_ratecheck(&unp->unp_intr_notice)) {
476 device_printf(un->un_dev, "usb error on intr: %s\n",
477 usbd_errstr(status));
478 }
479 if (status == USBD_STALLED)
480 usbd_clear_endpoint_stall_async(unp->unp_ep[USBNET_ENDPT_INTR]);
481 USBNETHIST_CALLARGS("%jd: not normal status %#jx",
482 unp->unp_number, status, 0, 0);
483 return;
484 }
485
486 uno_intr(un, status);
487 }
488
489 static void
490 usbnet_start_locked(struct ifnet *ifp)
491 {
492 USBNETHIST_FUNC();
493 struct usbnet * const un = ifp->if_softc;
494 struct usbnet_cdata * const cd = un_cdata(un);
495 struct usbnet_private * const unp = un->un_pri;
496 struct mbuf *m;
497 unsigned length;
498 bool done_transmit = false;
499 int idx, count;
500
501 USBNETHIST_CALLARGS("%jd: tx_cnt %jd list_cnt %jd link %jd",
502 unp->unp_number, cd->uncd_tx_cnt, un->un_tx_list_cnt,
503 unp->unp_link);
504
505 usbnet_isowned_tx(un);
506 KASSERT(cd->uncd_tx_cnt <= un->un_tx_list_cnt);
507 KASSERT(!unp->unp_txstopped);
508
509 if (!unp->unp_link) {
510 DPRINTF("start called no link (%jx)",
511 unp->unp_link, 0, 0, 0);
512 return;
513 }
514
515 if (cd->uncd_tx_cnt == un->un_tx_list_cnt) {
516 DPRINTF("start called, tx busy (%#jx == %#jx)",
517 cd->uncd_tx_cnt, un->un_tx_list_cnt, 0, 0);
518 return;
519 }
520
521 idx = cd->uncd_tx_prod;
522 count = 0;
523 while (cd->uncd_tx_cnt < un->un_tx_list_cnt) {
524 IFQ_POLL(&ifp->if_snd, m);
525 if (m == NULL) {
526 DPRINTF("start called, queue empty", 0, 0, 0, 0);
527 break;
528 }
529 KASSERT(m->m_pkthdr.len <= un->un_tx_bufsz);
530
531 struct usbnet_chain *c = &cd->uncd_tx_chain[idx];
532
533 length = uno_tx_prepare(un, m, c);
534 if (length == 0) {
535 DPRINTF("uno_tx_prepare gave zero length", 0, 0, 0, 0);
536 if_statinc(ifp, if_oerrors);
537 break;
538 }
539
540 if (__predict_false(c->unc_xfer == NULL)) {
541 DPRINTF("unc_xfer is NULL", 0, 0, 0, 0);
542 if_statinc(ifp, if_oerrors);
543 break;
544 }
545
546 usbd_setup_xfer(c->unc_xfer, c, c->unc_buf, length,
547 un->un_tx_xfer_flags, 10000, usbnet_txeof);
548
549 /* Transmit */
550 usbd_status err = usbd_transfer(c->unc_xfer);
551 if (err != USBD_IN_PROGRESS) {
552 DPRINTF("usbd_transfer on %#jx for %ju bytes: %jd",
553 (uintptr_t)c->unc_buf, length, err, 0);
554 if_statinc(ifp, if_oerrors);
555 break;
556 }
557 done_transmit = true;
558
559 IFQ_DEQUEUE(&ifp->if_snd, m);
560
561 /*
562 * If there's a BPF listener, bounce a copy of this frame
563 * to him.
564 */
565 bpf_mtap(ifp, m, BPF_D_OUT);
566 m_freem(m);
567
568 idx = (idx + 1) % un->un_tx_list_cnt;
569 cd->uncd_tx_cnt++;
570 count++;
571 }
572 cd->uncd_tx_prod = idx;
573
574 DPRINTF("finished with start; tx_cnt %jd list_cnt %jd link %jd",
575 cd->uncd_tx_cnt, un->un_tx_list_cnt, unp->unp_link, 0);
576
577 /*
578 * Set a timeout in case the chip goes out to lunch.
579 */
580 if (done_transmit)
581 unp->unp_timer = 5;
582
583 if (count != 0)
584 rnd_add_uint32(&unp->unp_rndsrc, count);
585 }
586
587 static void
588 usbnet_if_start(struct ifnet *ifp)
589 {
590 struct usbnet * const un = ifp->if_softc;
591 struct usbnet_private * const unp = un->un_pri;
592
593 USBNETHIST_FUNC();
594 USBNETHIST_CALLARGS("%jd: txstopped %jd",
595 unp->unp_number, unp->unp_txstopped, 0, 0);
596
597 mutex_enter(&unp->unp_txlock);
598 if (!unp->unp_txstopped)
599 usbnet_start_locked(ifp);
600 mutex_exit(&unp->unp_txlock);
601 }
602
603 /*
604 * Chain management.
605 *
606 * RX and TX are identical. Keep them that way.
607 */
608
609 /* Start of common RX functions */
610
611 static size_t
612 usbnet_rx_list_size(struct usbnet_cdata * const cd, struct usbnet * const un)
613 {
614 return sizeof(*cd->uncd_rx_chain) * un->un_rx_list_cnt;
615 }
616
617 static void
618 usbnet_rx_list_alloc(struct usbnet * const un)
619 {
620 struct usbnet_cdata * const cd = un_cdata(un);
621
622 cd->uncd_rx_chain = kmem_zalloc(usbnet_rx_list_size(cd, un), KM_SLEEP);
623 }
624
625 static void
626 usbnet_rx_list_free(struct usbnet * const un)
627 {
628 struct usbnet_cdata * const cd = un_cdata(un);
629
630 if (cd->uncd_rx_chain) {
631 kmem_free(cd->uncd_rx_chain, usbnet_rx_list_size(cd, un));
632 cd->uncd_rx_chain = NULL;
633 }
634 }
635
636 static int
637 usbnet_rx_list_init(struct usbnet * const un)
638 {
639 struct usbnet_cdata * const cd = un_cdata(un);
640 struct usbnet_private * const unp = un->un_pri;
641
642 for (size_t i = 0; i < un->un_rx_list_cnt; i++) {
643 struct usbnet_chain *c = &cd->uncd_rx_chain[i];
644
645 c->unc_un = un;
646 if (c->unc_xfer == NULL) {
647 int err = usbd_create_xfer(unp->unp_ep[USBNET_ENDPT_RX],
648 un->un_rx_bufsz, un->un_rx_xfer_flags, 0,
649 &c->unc_xfer);
650 if (err)
651 return err;
652 c->unc_buf = usbd_get_buffer(c->unc_xfer);
653 }
654 }
655
656 return 0;
657 }
658
659 static void
660 usbnet_rx_list_fini(struct usbnet * const un)
661 {
662 struct usbnet_cdata * const cd = un_cdata(un);
663
664 for (size_t i = 0; i < un->un_rx_list_cnt; i++) {
665 struct usbnet_chain *c = &cd->uncd_rx_chain[i];
666
667 if (c->unc_xfer != NULL) {
668 usbd_destroy_xfer(c->unc_xfer);
669 c->unc_xfer = NULL;
670 c->unc_buf = NULL;
671 }
672 }
673 }
674
675 /* End of common RX functions */
676
677 static void
678 usbnet_rx_start_pipes(struct usbnet * const un)
679 {
680 struct usbnet_cdata * const cd = un_cdata(un);
681 struct usbnet_private * const unp = un->un_pri;
682
683 mutex_enter(&unp->unp_rxlock);
684 KASSERT(unp->unp_rxstopped);
685 unp->unp_rxstopped = false;
686
687 for (size_t i = 0; i < un->un_rx_list_cnt; i++) {
688 struct usbnet_chain *c = &cd->uncd_rx_chain[i];
689
690 usbd_setup_xfer(c->unc_xfer, c, c->unc_buf, un->un_rx_bufsz,
691 un->un_rx_xfer_flags, USBD_NO_TIMEOUT, usbnet_rxeof);
692 usbd_transfer(c->unc_xfer);
693 }
694
695 mutex_exit(&unp->unp_rxlock);
696 }
697
698 /* Start of common TX functions */
699
700 static size_t
701 usbnet_tx_list_size(struct usbnet_cdata * const cd, struct usbnet * const un)
702 {
703 return sizeof(*cd->uncd_tx_chain) * un->un_tx_list_cnt;
704 }
705
706 static void
707 usbnet_tx_list_alloc(struct usbnet * const un)
708 {
709 struct usbnet_cdata * const cd = un_cdata(un);
710
711 cd->uncd_tx_chain = kmem_zalloc(usbnet_tx_list_size(cd, un), KM_SLEEP);
712 }
713
714 static void
715 usbnet_tx_list_free(struct usbnet * const un)
716 {
717 struct usbnet_cdata * const cd = un_cdata(un);
718
719 if (cd->uncd_tx_chain) {
720 kmem_free(cd->uncd_tx_chain, usbnet_tx_list_size(cd, un));
721 cd->uncd_tx_chain = NULL;
722 }
723 }
724
725 static int
726 usbnet_tx_list_init(struct usbnet * const un)
727 {
728 struct usbnet_cdata * const cd = un_cdata(un);
729 struct usbnet_private * const unp = un->un_pri;
730
731 for (size_t i = 0; i < un->un_tx_list_cnt; i++) {
732 struct usbnet_chain *c = &cd->uncd_tx_chain[i];
733
734 c->unc_un = un;
735 if (c->unc_xfer == NULL) {
736 int err = usbd_create_xfer(unp->unp_ep[USBNET_ENDPT_TX],
737 un->un_tx_bufsz, un->un_tx_xfer_flags, 0,
738 &c->unc_xfer);
739 if (err)
740 return err;
741 c->unc_buf = usbd_get_buffer(c->unc_xfer);
742 }
743 }
744
745 return 0;
746 }
747
748 static void
749 usbnet_tx_list_fini(struct usbnet * const un)
750 {
751 struct usbnet_cdata * const cd = un_cdata(un);
752
753 for (size_t i = 0; i < un->un_tx_list_cnt; i++) {
754 struct usbnet_chain *c = &cd->uncd_tx_chain[i];
755
756 if (c->unc_xfer != NULL) {
757 usbd_destroy_xfer(c->unc_xfer);
758 c->unc_xfer = NULL;
759 c->unc_buf = NULL;
760 }
761 }
762 cd->uncd_tx_prod = cd->uncd_tx_cnt = 0;
763 }
764
765 /* End of common TX functions */
766
767 /* Endpoint pipe management. */
768
769 static void
770 usbnet_ep_close_pipes(struct usbnet * const un)
771 {
772 struct usbnet_private * const unp = un->un_pri;
773
774 for (size_t i = 0; i < __arraycount(unp->unp_ep); i++) {
775 if (unp->unp_ep[i] == NULL)
776 continue;
777 usbd_close_pipe(unp->unp_ep[i]);
778 unp->unp_ep[i] = NULL;
779 }
780 }
781
782 static usbd_status
783 usbnet_ep_open_pipes(struct usbnet * const un)
784 {
785 struct usbnet_intr * const uni = un->un_intr;
786 struct usbnet_private * const unp = un->un_pri;
787
788 for (size_t i = 0; i < __arraycount(unp->unp_ep); i++) {
789 usbd_status err;
790
791 if (un->un_ed[i] == 0)
792 continue;
793
794 if (i == USBNET_ENDPT_INTR && uni) {
795 err = usbd_open_pipe_intr(un->un_iface, un->un_ed[i],
796 USBD_EXCLUSIVE_USE | USBD_MPSAFE, &unp->unp_ep[i], un,
797 uni->uni_buf, uni->uni_bufsz, usbnet_pipe_intr,
798 uni->uni_interval);
799 } else {
800 err = usbd_open_pipe(un->un_iface, un->un_ed[i],
801 USBD_EXCLUSIVE_USE | USBD_MPSAFE, &unp->unp_ep[i]);
802 }
803 if (err) {
804 usbnet_ep_close_pipes(un);
805 return err;
806 }
807 }
808
809 return USBD_NORMAL_COMPLETION;
810 }
811
812 static void
813 usbnet_ep_stop_pipes(struct usbnet * const un)
814 {
815 struct usbnet_private * const unp = un->un_pri;
816
817 for (size_t i = 0; i < __arraycount(unp->unp_ep); i++) {
818 if (unp->unp_ep[i] == NULL)
819 continue;
820 usbd_abort_pipe(unp->unp_ep[i]);
821 }
822 }
823
824 static int
825 usbnet_init_rx_tx(struct usbnet * const un)
826 {
827 USBNETHIST_FUNC(); USBNETHIST_CALLED();
828 struct usbnet_private * const unp = un->un_pri;
829 struct ifnet * const ifp = usbnet_ifp(un);
830 usbd_status err;
831 int error = 0;
832
833 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
834
835 if (usbnet_isdying(un)) {
836 return EIO;
837 }
838
839 /* Open RX and TX pipes. */
840 err = usbnet_ep_open_pipes(un);
841 if (err) {
842 aprint_error_dev(un->un_dev, "open rx/tx pipes failed: %s\n",
843 usbd_errstr(err));
844 error = EIO;
845 goto out;
846 }
847
848 /* Init RX ring. */
849 if (usbnet_rx_list_init(un)) {
850 aprint_error_dev(un->un_dev, "rx list init failed\n");
851 error = ENOBUFS;
852 goto out;
853 }
854
855 /* Init TX ring. */
856 if (usbnet_tx_list_init(un)) {
857 aprint_error_dev(un->un_dev, "tx list init failed\n");
858 error = ENOBUFS;
859 goto out;
860 }
861
862 /* Indicate we are up and running. */
863 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
864 ifp->if_flags |= IFF_RUNNING;
865
866 /*
867 * If the hardware has a multicast filter, program it and then
868 * allow updates to it while we're running.
869 */
870 if (un->un_ops->uno_mcast) {
871 mutex_enter(&unp->unp_mcastlock);
872 KASSERTMSG(!unp->unp_mcastactive, "%s", ifp->if_xname);
873 unp->unp_if_flags = ifp->if_flags;
874 (*un->un_ops->uno_mcast)(ifp);
875 unp->unp_mcastactive = true;
876 mutex_exit(&unp->unp_mcastlock);
877 }
878
879 /* Allow transmit. */
880 mutex_enter(&unp->unp_txlock);
881 KASSERT(unp->unp_txstopped);
882 unp->unp_txstopped = false;
883 mutex_exit(&unp->unp_txlock);
884
885 /* Start up the receive pipe(s). */
886 usbnet_rx_start_pipes(un);
887
888 /* Kick off the watchdog/stats/mii tick. */
889 mutex_enter(&unp->unp_miilock);
890 unp->unp_stopped = false;
891 callout_schedule(&unp->unp_stat_ch, hz);
892 mutex_exit(&unp->unp_miilock);
893
894 out:
895 if (error) {
896 usbnet_rx_list_fini(un);
897 usbnet_tx_list_fini(un);
898 usbnet_ep_close_pipes(un);
899 }
900
901 /*
902 * For devices without any media autodetection, treat success
903 * here as an active link.
904 */
905 if (un->un_ops->uno_statchg == NULL) {
906 mutex_enter(&unp->unp_miilock);
907 usbnet_set_link(un, error == 0);
908 mutex_exit(&unp->unp_miilock);
909 }
910
911 return error;
912 }
913
914 /* MII management. */
915
916 static int
917 usbnet_mii_readreg(device_t dev, int phy, int reg, uint16_t *val)
918 {
919 USBNETHIST_FUNC();
920 struct usbnet * const un = device_private(dev);
921 int err;
922
923 /* MII layer ensures miilock is held. */
924 usbnet_isowned_mii(un);
925
926 if (usbnet_isdying(un)) {
927 return EIO;
928 }
929
930 err = uno_read_reg(un, phy, reg, val);
931 if (err) {
932 USBNETHIST_CALLARGS("%jd: read PHY failed: %jd",
933 un->un_pri->unp_number, err, 0, 0);
934 return err;
935 }
936
937 return 0;
938 }
939
940 static int
941 usbnet_mii_writereg(device_t dev, int phy, int reg, uint16_t val)
942 {
943 USBNETHIST_FUNC();
944 struct usbnet * const un = device_private(dev);
945 int err;
946
947 /* MII layer ensures miilock is held. */
948 usbnet_isowned_mii(un);
949
950 if (usbnet_isdying(un)) {
951 return EIO;
952 }
953
954 err = uno_write_reg(un, phy, reg, val);
955 if (err) {
956 USBNETHIST_CALLARGS("%jd: write PHY failed: %jd",
957 un->un_pri->unp_number, err, 0, 0);
958 return err;
959 }
960
961 return 0;
962 }
963
964 static void
965 usbnet_mii_statchg(struct ifnet *ifp)
966 {
967 USBNETHIST_FUNC(); USBNETHIST_CALLED();
968 struct usbnet * const un = ifp->if_softc;
969
970 /* MII layer ensures miilock is held. */
971 usbnet_isowned_mii(un);
972
973 uno_mii_statchg(un, ifp);
974 }
975
976 static int
977 usbnet_media_upd(struct ifnet *ifp)
978 {
979 USBNETHIST_FUNC(); USBNETHIST_CALLED();
980 struct usbnet * const un = ifp->if_softc;
981 struct usbnet_private * const unp = un->un_pri;
982 struct mii_data * const mii = usbnet_mii(un);
983
984 /* ifmedia layer ensures miilock is held. */
985 usbnet_isowned_mii(un);
986
987 /* ifmedia changes only with IFNET_LOCK held. */
988 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
989
990 if (usbnet_isdying(un))
991 return EIO;
992
993 unp->unp_link = false;
994
995 if (mii->mii_instance) {
996 struct mii_softc *miisc;
997
998 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
999 mii_phy_reset(miisc);
1000 }
1001
1002 return ether_mediachange(ifp);
1003 }
1004
1005 /* ioctl */
1006
1007 /*
1008 * usbnet_ifflags_cb(ec)
1009 *
1010 * Called by if_ethersubr when interface flags change
1011 * (SIOCSIFFLAGS), or ethernet capabilities change
1012 * (SIOCSETHERCAP), on a running interface.
1013 */
1014 static int
1015 usbnet_ifflags_cb(struct ethercom *ec)
1016 {
1017 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1018 struct ifnet *ifp = &ec->ec_if;
1019 struct usbnet *un = ifp->if_softc;
1020 struct usbnet_private * const unp = un->un_pri;
1021
1022 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
1023
1024 const u_short changed = ifp->if_flags ^ unp->unp_if_flags;
1025
1026 /*
1027 * If any user-settable flags have changed other than
1028 * IFF_DEBUG, just reset the interface.
1029 */
1030 if ((changed & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0)
1031 return ENETRESET;
1032
1033 /*
1034 * Otherwise, cache the flags change so we can read the flags
1035 * under unp_mcastlock for multicast updates in SIOCADDMULTI or
1036 * SIOCDELMULTI without IFNET_LOCK.
1037 */
1038 mutex_enter(&unp->unp_mcastlock);
1039 unp->unp_if_flags = ifp->if_flags;
1040 mutex_exit(&unp->unp_mcastlock);
1041
1042 /*
1043 * If we're switching on or off promiscuous mode, reprogram the
1044 * hardware multicast filter now.
1045 *
1046 * XXX Actually, reset the interface, because some usbnet
1047 * drivers (e.g., aue(4)) initialize the hardware differently
1048 * in uno_init depending on IFF_PROMISC. But some (again,
1049 * aue(4)) _also_ need to know whether IFF_PROMISC is set in
1050 * uno_mcast and do something different with it there. Maybe
1051 * the logic can be unified, but it will require an audit and
1052 * testing of all the usbnet drivers.
1053 */
1054 if (changed & IFF_PROMISC)
1055 return ENETRESET;
1056
1057 return 0;
1058 }
1059
1060 bool
1061 usbnet_ispromisc(struct usbnet *un)
1062 {
1063 struct ifnet * const ifp = usbnet_ifp(un);
1064 struct usbnet_private * const unp = un->un_pri;
1065
1066 KASSERTMSG(mutex_owned(&unp->unp_mcastlock) || IFNET_LOCKED(ifp),
1067 "%s", ifp->if_xname);
1068
1069 return unp->unp_if_flags & IFF_PROMISC;
1070 }
1071
1072 static int
1073 usbnet_if_ioctl(struct ifnet *ifp, u_long cmd, void *data)
1074 {
1075 USBNETHIST_FUNC();
1076 struct usbnet * const un = ifp->if_softc;
1077 struct usbnet_private * const unp __unused = un->un_pri;
1078 int error;
1079
1080 USBNETHIST_CALLARGSN(11, "%jd: enter %#jx data %#jx",
1081 unp->unp_number, cmd, (uintptr_t)data, 0);
1082
1083 if (un->un_ops->uno_override_ioctl)
1084 return uno_override_ioctl(un, ifp, cmd, data);
1085
1086 error = ether_ioctl(ifp, cmd, data);
1087 if (error == ENETRESET) {
1088 switch (cmd) {
1089 case SIOCADDMULTI:
1090 case SIOCDELMULTI:
1091 /*
1092 * If there's a hardware multicast filter, and
1093 * it has been programmed by usbnet_init_rx_tx
1094 * and is active, update it now. Otherwise,
1095 * drop the update on the floor -- it will be
1096 * observed by usbnet_init_rx_tx next time we
1097 * bring the interface up.
1098 */
1099 if (un->un_ops->uno_mcast) {
1100 mutex_enter(&unp->unp_mcastlock);
1101 if (unp->unp_mcastactive)
1102 (*un->un_ops->uno_mcast)(ifp);
1103 mutex_exit(&unp->unp_mcastlock);
1104 }
1105 error = 0;
1106 break;
1107 default:
1108 error = uno_ioctl(un, ifp, cmd, data);
1109 }
1110 }
1111
1112 return error;
1113 }
1114
1115 /*
1116 * Generic stop network function:
1117 * - mark as stopping
1118 * - call DD routine to stop the device
1119 * - turn off running, timer, statchg callout, link
1120 * - stop transfers
1121 * - free RX and TX resources
1122 * - close pipes
1123 *
1124 * usbnet_if_stop() is for the if_stop handler.
1125 */
1126 static void
1127 usbnet_stop(struct usbnet *un, struct ifnet *ifp, int disable)
1128 {
1129 struct usbnet_private * const unp = un->un_pri;
1130 struct mii_data * const mii = usbnet_mii(un);
1131
1132 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1133
1134 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
1135 KASSERTMSG(ifp->if_flags & IFF_RUNNING, "%s", ifp->if_xname);
1136
1137 /*
1138 * For drivers with hardware multicast filter update callbacks:
1139 * Prevent concurrent access to the hardware registers by
1140 * multicast filter updates, which happens without IFNET_LOCK.
1141 */
1142 if (un->un_ops->uno_mcast) {
1143 mutex_enter(&unp->unp_mcastlock);
1144 KASSERTMSG(unp->unp_mcastactive, "%p", ifp->if_xname);
1145 unp->unp_mcastactive = false;
1146 unp->unp_if_flags = 0;
1147 mutex_exit(&unp->unp_mcastlock);
1148 }
1149
1150 /*
1151 * Prevent new activity (rescheduling ticks, xfers, &c.) and
1152 * clear the watchdog timer.
1153 */
1154 mutex_enter(&unp->unp_miilock);
1155 unp->unp_stopped = true;
1156 mutex_exit(&unp->unp_miilock);
1157
1158 mutex_enter(&unp->unp_rxlock);
1159 unp->unp_rxstopped = true;
1160 mutex_exit(&unp->unp_rxlock);
1161
1162 mutex_enter(&unp->unp_txlock);
1163 unp->unp_txstopped = true;
1164 unp->unp_timer = 0;
1165 mutex_exit(&unp->unp_txlock);
1166
1167 /*
1168 * Stop the timer first, then the task -- if the timer was
1169 * already firing, we stop the task or wait for it complete
1170 * only after it last fired. Setting unp_stopped prevents the
1171 * timer task from being scheduled again.
1172 */
1173 callout_halt(&unp->unp_stat_ch, NULL);
1174 usb_rem_task_wait(un->un_udev, &unp->unp_ticktask, USB_TASKQ_DRIVER,
1175 NULL);
1176
1177 /*
1178 * Now that we have stopped calling mii_tick, bring the MII
1179 * state machine down.
1180 */
1181 if (mii) {
1182 mutex_enter(&unp->unp_miilock);
1183 mii_down(mii);
1184 mutex_exit(&unp->unp_miilock);
1185 }
1186
1187 /* Stop transfers. */
1188 usbnet_ep_stop_pipes(un);
1189
1190 /*
1191 * Now that the software is quiescent, ask the driver to stop
1192 * the hardware. The driver's uno_stop routine now has
1193 * exclusive access to any registers that might previously have
1194 * been used by to ifmedia, mii, or ioctl callbacks.
1195 *
1196 * Don't bother if the device is being detached, though -- if
1197 * it's been unplugged then there's no point in trying to touch
1198 * the registers.
1199 */
1200 if (!usbnet_isdying(un))
1201 uno_stop(un, ifp, disable);
1202
1203 /* Free RX/TX resources. */
1204 usbnet_rx_list_fini(un);
1205 usbnet_tx_list_fini(un);
1206
1207 /* Close pipes. */
1208 usbnet_ep_close_pipes(un);
1209
1210 /* Everything is quesced now. */
1211 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
1212 ifp->if_flags &= ~IFF_RUNNING;
1213 }
1214
1215 static void
1216 usbnet_if_stop(struct ifnet *ifp, int disable)
1217 {
1218 struct usbnet * const un = ifp->if_softc;
1219
1220 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
1221
1222 /*
1223 * If we're already stopped, nothing to do.
1224 *
1225 * XXX This should be an assertion, but it may require some
1226 * analysis -- and possibly some tweaking -- of sys/net to
1227 * ensure.
1228 */
1229 if ((ifp->if_flags & IFF_RUNNING) == 0)
1230 return;
1231
1232 usbnet_stop(un, ifp, disable);
1233 }
1234
1235 /*
1236 * Generic tick task function.
1237 *
1238 * usbnet_tick() is triggered from a callout, and triggers a call to
1239 * usbnet_tick_task() from the usb_task subsystem.
1240 */
1241 static void
1242 usbnet_tick(void *arg)
1243 {
1244 USBNETHIST_FUNC();
1245 struct usbnet * const un = arg;
1246 struct usbnet_private * const unp = un->un_pri;
1247
1248 USBNETHIST_CALLARGSN(10, "%jd: enter", unp->unp_number, 0, 0, 0);
1249
1250 /* Perform periodic stuff in process context */
1251 usb_add_task(un->un_udev, &unp->unp_ticktask, USB_TASKQ_DRIVER);
1252 }
1253
1254 static void
1255 usbnet_watchdog(struct ifnet *ifp)
1256 {
1257 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1258 struct usbnet * const un = ifp->if_softc;
1259 struct usbnet_private * const unp = un->un_pri;
1260 struct usbnet_cdata * const cd = un_cdata(un);
1261
1262 if_statinc(ifp, if_oerrors);
1263 device_printf(un->un_dev, "watchdog timeout\n");
1264
1265 if (cd->uncd_tx_cnt > 0) {
1266 DPRINTF("uncd_tx_cnt=%ju non zero, aborting pipe", 0, 0, 0, 0);
1267 usbd_abort_pipe(unp->unp_ep[USBNET_ENDPT_TX]);
1268 if (cd->uncd_tx_cnt != 0)
1269 DPRINTF("uncd_tx_cnt now %ju", cd->uncd_tx_cnt, 0, 0, 0);
1270 }
1271
1272 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1273 (*ifp->if_start)(ifp);
1274 }
1275
1276 static void
1277 usbnet_tick_task(void *arg)
1278 {
1279 USBNETHIST_FUNC();
1280 struct usbnet * const un = arg;
1281 struct usbnet_private * const unp = un->un_pri;
1282 struct ifnet * const ifp = usbnet_ifp(un);
1283 struct mii_data * const mii = usbnet_mii(un);
1284
1285 USBNETHIST_CALLARGSN(8, "%jd: enter", unp->unp_number, 0, 0, 0);
1286
1287 mutex_enter(&unp->unp_txlock);
1288 const bool timeout = unp->unp_timer != 0 && --unp->unp_timer == 0;
1289 mutex_exit(&unp->unp_txlock);
1290 if (timeout)
1291 usbnet_watchdog(ifp);
1292
1293 /* Call driver if requested. */
1294 uno_tick(un);
1295
1296 mutex_enter(&unp->unp_miilock);
1297 DPRINTFN(8, "mii %#jx ifp %#jx", (uintptr_t)mii, (uintptr_t)ifp, 0, 0);
1298 if (mii) {
1299 mii_tick(mii);
1300 if (!unp->unp_link)
1301 (*mii->mii_statchg)(ifp);
1302 }
1303
1304 if (!unp->unp_stopped && !usbnet_isdying(un))
1305 callout_schedule(&unp->unp_stat_ch, hz);
1306 mutex_exit(&unp->unp_miilock);
1307 }
1308
1309 static int
1310 usbnet_if_init(struct ifnet *ifp)
1311 {
1312 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1313 struct usbnet * const un = ifp->if_softc;
1314 int error;
1315
1316 KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname);
1317
1318 /*
1319 * Prevent anyone from bringing the interface back up once
1320 * we're detaching.
1321 */
1322 if (usbnet_isdying(un))
1323 return EIO;
1324
1325 /*
1326 * If we're already running, stop the interface first -- we're
1327 * reinitializing it.
1328 *
1329 * XXX Grody for sys/net to call if_init to reinitialize. This
1330 * should be an assertion, not a branch, but it will require
1331 * some tweaking of sys/net to avoid. See also the comment in
1332 * usbnet_ifflags_cb about if_init vs uno_mcast on reinitialize.
1333 */
1334 if (ifp->if_flags & IFF_RUNNING)
1335 usbnet_stop(un, ifp, /*disable*/1/*XXX???*/);
1336 KASSERTMSG((ifp->if_flags & IFF_RUNNING) == 0, "%s", ifp->if_xname);
1337
1338 error = uno_init(un, ifp);
1339 if (error)
1340 return error;
1341 error = usbnet_init_rx_tx(un);
1342 if (error)
1343 return error;
1344
1345 return 0;
1346 }
1347
1348
1349 /* Various accessors. */
1350
1351 void
1352 usbnet_set_link(struct usbnet *un, bool link)
1353 {
1354 usbnet_isowned_mii(un);
1355 un->un_pri->unp_link = link;
1356 }
1357
1358 struct ifnet *
1359 usbnet_ifp(struct usbnet *un)
1360 {
1361 return &un->un_pri->unp_ec.ec_if;
1362 }
1363
1364 struct ethercom *
1365 usbnet_ec(struct usbnet *un)
1366 {
1367 return &un->un_pri->unp_ec;
1368 }
1369
1370 struct mii_data *
1371 usbnet_mii(struct usbnet *un)
1372 {
1373 return un->un_pri->unp_ec.ec_mii;
1374 }
1375
1376 krndsource_t *
1377 usbnet_rndsrc(struct usbnet *un)
1378 {
1379 return &un->un_pri->unp_rndsrc;
1380 }
1381
1382 void *
1383 usbnet_softc(struct usbnet *un)
1384 {
1385 return un->un_sc;
1386 }
1387
1388 bool
1389 usbnet_havelink(struct usbnet *un)
1390 {
1391 return un->un_pri->unp_link;
1392 }
1393
1394 bool
1395 usbnet_isdying(struct usbnet *un)
1396 {
1397 return atomic_load_relaxed(&un->un_pri->unp_dying);
1398 }
1399
1400
1401 /* Locking. */
1402
1403 static void
1404 usbnet_isowned_rx(struct usbnet *un)
1405 {
1406 KASSERT(mutex_owned(&un->un_pri->unp_rxlock));
1407 }
1408
1409 static void
1410 usbnet_isowned_tx(struct usbnet *un)
1411 {
1412 KASSERT(mutex_owned(&un->un_pri->unp_txlock));
1413 }
1414
1415 /* Autoconf management. */
1416
1417 static bool
1418 usbnet_empty_eaddr(struct usbnet * const un)
1419 {
1420 return (un->un_eaddr[0] == 0 && un->un_eaddr[1] == 0 &&
1421 un->un_eaddr[2] == 0 && un->un_eaddr[3] == 0 &&
1422 un->un_eaddr[4] == 0 && un->un_eaddr[5] == 0);
1423 }
1424
1425 /*
1426 * usbnet_attach() and usbnet_attach_ifp() perform setup of the relevant
1427 * 'usbnet'. The first is enough to enable device access (eg, endpoints
1428 * are connected and commands can be sent), and the second connects the
1429 * device to the system networking.
1430 *
1431 * Always call usbnet_detach(), even if usbnet_attach_ifp() is skipped.
1432 * Also usable as driver detach directly.
1433 *
1434 * To skip ethernet configuration (eg, point-to-point), make sure that
1435 * the un_eaddr[] is fully zero.
1436 */
1437
1438 void
1439 usbnet_attach(struct usbnet *un)
1440 {
1441 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1442
1443 /* Required inputs. */
1444 KASSERT(un->un_ops->uno_tx_prepare);
1445 KASSERT(un->un_ops->uno_rx_loop);
1446 KASSERT(un->un_rx_bufsz);
1447 KASSERT(un->un_tx_bufsz);
1448 KASSERT(un->un_rx_list_cnt);
1449 KASSERT(un->un_tx_list_cnt);
1450
1451 /* Unfortunate fact. */
1452 KASSERT(un == device_private(un->un_dev));
1453
1454 un->un_pri = kmem_zalloc(sizeof(*un->un_pri), KM_SLEEP);
1455 struct usbnet_private * const unp = un->un_pri;
1456
1457 usb_init_task(&unp->unp_ticktask, usbnet_tick_task, un,
1458 USB_TASKQ_MPSAFE);
1459 callout_init(&unp->unp_stat_ch, CALLOUT_MPSAFE);
1460 callout_setfunc(&unp->unp_stat_ch, usbnet_tick, un);
1461
1462 mutex_init(&unp->unp_txlock, MUTEX_DEFAULT, IPL_SOFTUSB);
1463 mutex_init(&unp->unp_rxlock, MUTEX_DEFAULT, IPL_SOFTUSB);
1464 mutex_init(&unp->unp_miilock, MUTEX_DEFAULT, IPL_NONE);
1465 mutex_init(&unp->unp_mcastlock, MUTEX_DEFAULT, IPL_SOFTCLOCK);
1466
1467 rnd_attach_source(&unp->unp_rndsrc, device_xname(un->un_dev),
1468 RND_TYPE_NET, RND_FLAG_DEFAULT);
1469
1470 usbnet_rx_list_alloc(un);
1471 usbnet_tx_list_alloc(un);
1472
1473 unp->unp_number = atomic_inc_uint_nv(&usbnet_number);
1474
1475 unp->unp_stopped = true;
1476 unp->unp_rxstopped = true;
1477 unp->unp_txstopped = true;
1478 unp->unp_attached = true;
1479 }
1480
1481 static void
1482 usbnet_attach_mii(struct usbnet *un, const struct usbnet_mii *unm)
1483 {
1484 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1485 struct usbnet_private * const unp = un->un_pri;
1486 struct mii_data * const mii = &unp->unp_mii;
1487 struct ifnet * const ifp = usbnet_ifp(un);
1488
1489 KASSERT(un->un_ops->uno_read_reg);
1490 KASSERT(un->un_ops->uno_write_reg);
1491 KASSERT(un->un_ops->uno_statchg);
1492
1493 mii->mii_ifp = ifp;
1494 mii->mii_readreg = usbnet_mii_readreg;
1495 mii->mii_writereg = usbnet_mii_writereg;
1496 mii->mii_statchg = usbnet_mii_statchg;
1497 mii->mii_flags = MIIF_AUTOTSLEEP;
1498
1499 usbnet_ec(un)->ec_mii = mii;
1500 ifmedia_init_with_lock(&mii->mii_media, 0,
1501 usbnet_media_upd, ether_mediastatus, &unp->unp_miilock);
1502 mii_attach(un->un_dev, mii, unm->un_mii_capmask, unm->un_mii_phyloc,
1503 unm->un_mii_offset, unm->un_mii_flags);
1504
1505 if (LIST_FIRST(&mii->mii_phys) == NULL) {
1506 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
1507 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
1508 } else
1509 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
1510 }
1511
1512 void
1513 usbnet_attach_ifp(struct usbnet *un,
1514 unsigned if_flags, /* additional if_flags */
1515 unsigned if_extflags, /* additional if_extflags */
1516 const struct usbnet_mii *unm) /* additional mii_attach flags */
1517 {
1518 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1519 struct usbnet_private * const unp = un->un_pri;
1520 struct ifnet * const ifp = usbnet_ifp(un);
1521
1522 KASSERT(unp->unp_attached);
1523 KASSERT(!unp->unp_ifp_attached);
1524
1525 ifp->if_softc = un;
1526 strlcpy(ifp->if_xname, device_xname(un->un_dev), IFNAMSIZ);
1527 ifp->if_flags = if_flags;
1528 ifp->if_extflags = IFEF_MPSAFE | if_extflags;
1529 ifp->if_ioctl = usbnet_if_ioctl;
1530 ifp->if_start = usbnet_if_start;
1531 ifp->if_init = usbnet_if_init;
1532 ifp->if_stop = usbnet_if_stop;
1533
1534 if (unm)
1535 usbnet_attach_mii(un, unm);
1536 else
1537 unp->unp_link = true;
1538
1539 /* Attach the interface. */
1540 if_initialize(ifp);
1541 if (ifp->_if_input == NULL)
1542 ifp->if_percpuq = if_percpuq_create(ifp);
1543 if_register(ifp);
1544 unp->unp_ifp_attached = true;
1545
1546 /*
1547 * If ethernet address is all zero, skip ether_ifattach() and
1548 * instead attach bpf here..
1549 */
1550 if (!usbnet_empty_eaddr(un)) {
1551 ether_set_ifflags_cb(&unp->unp_ec, usbnet_ifflags_cb);
1552 aprint_normal_dev(un->un_dev, "Ethernet address %s\n",
1553 ether_sprintf(un->un_eaddr));
1554 ether_ifattach(ifp, un->un_eaddr);
1555 } else {
1556 if_alloc_sadl(ifp);
1557 bpf_attach(ifp, DLT_RAW, 0);
1558 }
1559
1560 /* Now ready, and attached. */
1561 IFQ_SET_READY(&ifp->if_snd);
1562
1563 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, un->un_udev, un->un_dev);
1564
1565 if (!pmf_device_register(un->un_dev, NULL, NULL))
1566 aprint_error_dev(un->un_dev, "couldn't establish power handler\n");
1567 }
1568
1569 int
1570 usbnet_detach(device_t self, int flags)
1571 {
1572 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1573 struct usbnet * const un = device_private(self);
1574 struct usbnet_private * const unp = un->un_pri;
1575
1576 /* Detached before attached finished, so just bail out. */
1577 if (unp == NULL || !unp->unp_attached)
1578 return 0;
1579
1580 struct ifnet * const ifp = usbnet_ifp(un);
1581 struct mii_data * const mii = usbnet_mii(un);
1582
1583 /*
1584 * Prevent new activity. After we stop the interface, it
1585 * cannot be brought back up.
1586 */
1587 atomic_store_relaxed(&unp->unp_dying, true);
1588
1589 /*
1590 * If we're still running on the network, stop and wait for all
1591 * asynchronous activity to finish.
1592 *
1593 * If usbnet_attach_ifp never ran, IFNET_LOCK won't work, but
1594 * no activity is possible, so just skip this part.
1595 */
1596 if (unp->unp_ifp_attached) {
1597 IFNET_LOCK(ifp);
1598 if (ifp->if_flags & IFF_RUNNING) {
1599 usbnet_if_stop(ifp, 1);
1600 }
1601 IFNET_UNLOCK(ifp);
1602 }
1603
1604 /*
1605 * The callout and tick task can't be scheduled anew at this
1606 * point, and usbnet_if_stop has waited for them to complete.
1607 */
1608 KASSERT(!callout_pending(&unp->unp_stat_ch));
1609 KASSERT(!usb_task_pending(un->un_udev, &unp->unp_ticktask));
1610
1611 if (mii) {
1612 mii_detach(mii, MII_PHY_ANY, MII_OFFSET_ANY);
1613 ifmedia_fini(&mii->mii_media);
1614 }
1615 if (unp->unp_ifp_attached) {
1616 if (!usbnet_empty_eaddr(un))
1617 ether_ifdetach(ifp);
1618 else
1619 bpf_detach(ifp);
1620 if_detach(ifp);
1621 }
1622 usbnet_ec(un)->ec_mii = NULL;
1623
1624 usbnet_rx_list_free(un);
1625 usbnet_tx_list_free(un);
1626
1627 rnd_detach_source(&unp->unp_rndsrc);
1628
1629 mutex_destroy(&unp->unp_mcastlock);
1630 mutex_destroy(&unp->unp_miilock);
1631 mutex_destroy(&unp->unp_rxlock);
1632 mutex_destroy(&unp->unp_txlock);
1633
1634 callout_destroy(&unp->unp_stat_ch);
1635
1636 pmf_device_deregister(un->un_dev);
1637
1638 /*
1639 * Notify userland that we're going away, if we arrived in the
1640 * first place.
1641 */
1642 if (unp->unp_ifp_attached) {
1643 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, un->un_udev,
1644 un->un_dev);
1645 }
1646
1647 kmem_free(unp, sizeof(*unp));
1648 un->un_pri = NULL;
1649
1650 return 0;
1651 }
1652
1653 int
1654 usbnet_activate(device_t self, devact_t act)
1655 {
1656 USBNETHIST_FUNC(); USBNETHIST_CALLED();
1657 struct usbnet * const un = device_private(self);
1658 struct usbnet_private * const unp = un->un_pri;
1659 struct ifnet * const ifp = usbnet_ifp(un);
1660
1661 switch (act) {
1662 case DVACT_DEACTIVATE:
1663 if_deactivate(ifp);
1664
1665 atomic_store_relaxed(&unp->unp_dying, true);
1666
1667 mutex_enter(&unp->unp_miilock);
1668 unp->unp_stopped = true;
1669 mutex_exit(&unp->unp_miilock);
1670
1671 mutex_enter(&unp->unp_rxlock);
1672 unp->unp_rxstopped = true;
1673 mutex_exit(&unp->unp_rxlock);
1674
1675 mutex_enter(&unp->unp_txlock);
1676 unp->unp_txstopped = true;
1677 mutex_exit(&unp->unp_txlock);
1678
1679 return 0;
1680 default:
1681 return EOPNOTSUPP;
1682 }
1683 }
1684
1685 MODULE(MODULE_CLASS_MISC, usbnet, NULL);
1686
1687 static int
1688 usbnet_modcmd(modcmd_t cmd, void *arg)
1689 {
1690 switch (cmd) {
1691 case MODULE_CMD_INIT:
1692 return 0;
1693 case MODULE_CMD_FINI:
1694 return 0;
1695 case MODULE_CMD_STAT:
1696 case MODULE_CMD_AUTOUNLOAD:
1697 default:
1698 return ENOTTY;
1699 }
1700 }
1701