Lines Matching +full:usb +full:- +full:attach
1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause
18 * 4. Neither the name of the author nor the names of any co-contributors
37 * Kawasaki LSI KL5KUSB101B USB to ethernet adapter driver.
45 * The KLSI USB to ethernet adapter chip contains an USB serial interface,
50 * it's currently unused. This device is 10Mbps half-duplex only, hence
59 * leave the adapter attached to the USB controller, it may remain
91 #include <dev/usb/usb.h>
92 #include <dev/usb/usbdi.h>
93 #include <dev/usb/usbdi_util.h>
97 #include <dev/usb/usb_debug.h>
98 #include <dev/usb/usb_process.h>
100 #include <dev/usb/net/usb_ethernet.h>
101 #include <dev/usb/net/if_kuereg.h>
102 #include <dev/usb/net/if_kuefw.h>
141 KUE_DEV(SMC, 2102USB),
173 "USB kue");
217 MODULE_DEPEND(kue, usb, 1, 1, 1);
244 err = uether_do_request(&sc->sc_ue, req, data, 60000); in kue_do_request()
289 dd = usbd_get_device_descriptor(sc->sc_ue.ue_udev); in kue_load_fw()
290 hwrev = UGETW(dd->bcdDevice); in kue_load_fw()
313 device_printf(sc->sc_ue.ue_dev, "failed to load code segment: %s\n", in kue_load_fw()
322 device_printf(sc->sc_ue.ue_dev, "failed to load fixup segment: %s\n", in kue_load_fw()
331 device_printf(sc->sc_ue.ue_dev, "failed to load trigger segment: %s\n", in kue_load_fw()
348 sc->sc_rxfilt |= KUE_RXFILT_PROMISC; in kue_setpromisc()
350 sc->sc_rxfilt &= ~KUE_RXFILT_PROMISC; in kue_setpromisc()
352 kue_setword(sc, KUE_CMD_SET_PKT_FILTER, sc->sc_rxfilt); in kue_setpromisc()
378 sc->sc_rxfilt |= KUE_RXFILT_ALLMULTI; in kue_setmulti()
379 sc->sc_rxfilt &= ~KUE_RXFILT_MULTICAST; in kue_setmulti()
380 kue_setword(sc, KUE_CMD_SET_PKT_FILTER, sc->sc_rxfilt); in kue_setmulti()
384 sc->sc_rxfilt &= ~KUE_RXFILT_ALLMULTI; in kue_setmulti()
389 sc->sc_rxfilt |= KUE_RXFILT_ALLMULTI; in kue_setmulti()
391 sc->sc_rxfilt |= KUE_RXFILT_MULTICAST; in kue_setmulti()
393 i, sc->sc_mcfilters, i * ETHER_ADDR_LEN); in kue_setmulti()
396 kue_setword(sc, KUE_CMD_SET_PKT_FILTER, sc->sc_rxfilt); in kue_setmulti()
410 cd = usbd_get_config_descriptor(sc->sc_ue.ue_udev); in kue_reset()
412 err = usbd_req_set_config(sc->sc_ue.ue_udev, &sc->sc_mtx, in kue_reset()
413 cd->bConfigurationValue); in kue_reset()
418 uether_pause(&sc->sc_ue, hz / 100); in kue_reset()
430 device_printf(sc->sc_ue.ue_dev, "could not load firmware\n"); in kue_attach_post()
439 0, &sc->sc_desc, sizeof(sc->sc_desc)); in kue_attach_post()
442 memcpy(ue->ue_eaddr, sc->sc_desc.kue_macaddr, sizeof(ue->ue_eaddr)); in kue_attach_post()
453 if (uaa->usb_mode != USB_MODE_HOST) in kue_probe()
455 if (uaa->info.bConfigIndex != KUE_CONFIG_IDX) in kue_probe()
457 if (uaa->info.bIfaceIndex != KUE_IFACE_IDX) in kue_probe()
464 * Attach the interface. Allocate softc structures, do
465 * setup and ethernet/BPF attach.
472 struct usb_ether *ue = &sc->sc_ue; in kue_attach()
477 mtx_init(&sc->sc_mtx, device_get_nameunit(dev), NULL, MTX_DEF); in kue_attach()
480 error = usbd_transfer_setup(uaa->device, &iface_index, in kue_attach()
481 sc->sc_xfer, kue_config, KUE_N_TRANSFER, sc, &sc->sc_mtx); in kue_attach()
483 device_printf(dev, "allocating USB transfers failed\n"); in kue_attach()
487 sc->sc_mcfilters = malloc(KUE_MCFILTCNT(sc) * ETHER_ADDR_LEN, in kue_attach()
489 if (sc->sc_mcfilters == NULL) { in kue_attach()
490 device_printf(dev, "failed allocating USB memory\n"); in kue_attach()
494 ue->ue_sc = sc; in kue_attach()
495 ue->ue_dev = dev; in kue_attach()
496 ue->ue_udev = uaa->device; in kue_attach()
497 ue->ue_mtx = &sc->sc_mtx; in kue_attach()
498 ue->ue_methods = &kue_ue_methods; in kue_attach()
502 device_printf(dev, "could not attach interface\n"); in kue_attach()
516 struct usb_ether *ue = &sc->sc_ue; in kue_detach()
518 usbd_transfer_unsetup(sc->sc_xfer, KUE_N_TRANSFER); in kue_detach()
520 mtx_destroy(&sc->sc_mtx); in kue_detach()
521 free(sc->sc_mcfilters, M_USBDEV); in kue_detach()
534 struct usb_ether *ue = &sc->sc_ue; in kue_bulk_read_callback()
552 actlen -= 2; in kue_bulk_read_callback()
582 if_t ifp = uether_getifp(&sc->sc_ue); in kue_bulk_write_callback()
601 if (m->m_pkthdr.len > MCLBYTES) in kue_bulk_write_callback()
602 m->m_pkthdr.len = MCLBYTES; in kue_bulk_write_callback()
603 temp_len = (m->m_pkthdr.len + 2); in kue_bulk_write_callback()
604 total_len = (temp_len + (64 - (temp_len % 64))); in kue_bulk_write_callback()
608 buf[0] = (uint8_t)(m->m_pkthdr.len); in kue_bulk_write_callback()
609 buf[1] = (uint8_t)(m->m_pkthdr.len >> 8); in kue_bulk_write_callback()
613 usbd_m_copy_in(pc, 2, m, 0, m->m_pkthdr.len); in kue_bulk_write_callback()
615 usbd_frame_zero(pc, temp_len, total_len - temp_len); in kue_bulk_write_callback()
651 * start the USB transfers, if not already started: in kue_start()
653 usbd_transfer_start(sc->sc_xfer[KUE_BULK_DT_RD]); in kue_start()
654 usbd_transfer_start(sc->sc_xfer[KUE_BULK_DT_WR]); in kue_start()
682 usbd_xfer_set_stall(sc->sc_xfer[KUE_BULK_DT_WR]); in kue_init()
701 usbd_transfer_stop(sc->sc_xfer[KUE_BULK_DT_WR]); in kue_stop()
702 usbd_transfer_stop(sc->sc_xfer[KUE_BULK_DT_RD]); in kue_stop()