56#include <sys/stdint.h>
57#include <sys/stddef.h>
62#include <sys/socket.h>
63#include <sys/kernel.h>
65#include <sys/module.h>
68#include <sys/condvar.h>
69#include <sys/sysctl.h>
71#include <sys/unistd.h>
72#include <sys/callout.h>
73#include <sys/malloc.h>
77#include <net/if_var.h>
84#define USB_DEBUG_VAR cue_debug
98#define CUE_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
101 CUE_DEV(SMARTBRIDGES, SMARTLINK),
131static int cue_debug = 0;
133static SYSCTL_NODE(_hw_usb, OID_AUTO, cue, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
144 .bufsize = (MCLBYTES + 2),
154 .bufsize = (MCLBYTES + 2),
194#define CUE_SETBIT(sc, reg, x) \
195 cue_csr_write_1(sc, reg, cue_csr_read_1(sc, reg) | (x))
197#define CUE_CLRBIT(sc, reg, x) \
198 cue_csr_write_1(sc, reg, cue_csr_read_1(sc, reg) & ~(x))
231 return (le16toh(
val));
287 crc = ether_crc32_le(
addr, ETHER_ADDR_LEN);
289 return (crc & ((1 <<
CUE_BITS) - 1));
301 if (ifp->if_flags & IFF_PROMISC)
313 uint8_t *hashtbl = arg;
317 hashtbl[h >> 3] |= 1 << (h & 0x7);
328 uint8_t hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
332 if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
333 for (i = 0; i < 8; i++)
347 if (ifp->if_flags & IFF_BROADCAST) {
349 hashtbl[h >> 3] |= 1 << (h & 0x7);
413 mtx_init(&sc->
sc_mtx, device_get_nameunit(
dev), NULL, MTX_DEF);
419 device_printf(
dev,
"allocating USB transfers failed\n");
431 device_printf(
dev,
"could not attach interface\n");
470 if (actlen <= (
int)(2 +
sizeof(
struct ether_header))) {
471 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
477 len = buf[0] | (buf[1] << 8);
490 DPRINTF(
"bulk read error, %s\n",
513 DPRINTFN(11,
"transfer complete\n");
514 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
519 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
523 if (m->m_pkthdr.len > MCLBYTES)
524 m->m_pkthdr.len = MCLBYTES;
529 buf[0] = (uint8_t)(m->m_pkthdr.len);
530 buf[1] = (uint8_t)(m->m_pkthdr.len >> 8);
549 DPRINTFN(11,
"transfer error, %s\n",
552 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
576 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
608 for (i = 0; i < ETHER_ADDR_LEN; i++)
633 ifp->if_drv_flags |= IFF_DRV_RUNNING;
649 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
static SYSCTL_NODE(_hw_usb, OID_AUTO, dwc_otg, CTLFLAG_RW|CTLFLAG_MPSAFE, 0, "USB DWC OTG")
SYSCTL_INT(_hw_usb_dwc_otg, OID_AUTO, phy_type, CTLFLAG_RDTUN, &dwc_otg_phy_type, 0, "DWC OTG PHY TYPE - 0/1/2/3 - ULPI/HSIC/INTERNAL/UTMI+")
static const STRUCT_USB_HOST_ID cue_devs[]
DRIVER_MODULE(cue, uhub, cue_driver, cue_devclass, NULL, 0)
static device_attach_t cue_attach
MODULE_DEPEND(cue, uether, 1, 1, 1)
static device_detach_t cue_detach
static uether_fn_t cue_setpromisc
static driver_t cue_driver
static uint8_t cue_csr_read_1(struct cue_softc *, uint16_t)
static void cue_reset(struct cue_softc *)
static uether_fn_t cue_init
static int cue_mem(struct cue_softc *, uint8_t, uint16_t, void *, int)
static device_probe_t cue_probe
static const struct usb_ether_methods cue_ue_methods
static device_method_t cue_methods[]
static int cue_csr_write_1(struct cue_softc *, uint16_t, uint16_t)
static u_int cue_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
static uether_fn_t cue_start
static uether_fn_t cue_stop
#define CUE_SETBIT(sc, reg, x)
static uether_fn_t cue_attach_post
static uether_fn_t cue_tick
static uint16_t cue_csr_read_2(struct cue_softc *, uint8_t)
static usb_callback_t cue_bulk_write_callback
USB_PNP_HOST_INFO(cue_devs)
static uint32_t cue_mchash(const uint8_t *)
static devclass_t cue_devclass
static const struct usb_config cue_config[CUE_N_TRANSFER]
static int cue_getmac(struct cue_softc *, void *)
static uether_fn_t cue_setmulti
static usb_callback_t cue_bulk_read_callback
#define CUE_CLRBIT(sc, reg, x)
#define CUE_TX_EXCESSCOLL
#define CUE_LOCK_ASSERT(_sc, t)
#define CUE_CMD_GET_MACADDR
#define CUE_ETHCTL_MCAST_ON
#define CUE_TX_SINGLECOLL
#define CUE_LEDCTL_FOLLOW_LINK
#define CUE_AOP_EMBED_RXLEN
#define CUE_ETHCTL_PROMISC
#define CUE_CMD_WRITESRAM
#define CUE_ADVANCED_OPMODES
#define CUE_MCAST_TABLE_ADDR
struct usb_xfer * sc_xfer[CUE_N_TRANSFER]
enum usb_hc_mode usb_mode
struct usbd_lookup_info info
struct usb_device * device
struct usb_xfer_flags flags
uether_fn_t * ue_attach_post
const struct usb_ether_methods * ue_methods
struct usb_device * ue_udev
uint8_t ue_eaddr[ETHER_ADDR_LEN]
#define UT_WRITE_VENDOR_DEVICE
#define UT_READ_VENDOR_DEVICE
void usbd_copy_in(struct usb_page_cache *cache, usb_frlength_t offset, const void *ptr, usb_frlength_t len)
void usbd_copy_out(struct usb_page_cache *cache, usb_frlength_t offset, void *ptr, usb_frlength_t len)
const char * usbd_errstr(usb_error_t err)
void uether_rxflush(struct usb_ether *ue)
void uether_ifdetach(struct usb_ether *ue)
void * uether_getsc(struct usb_ether *ue)
int uether_rxbuf(struct usb_ether *ue, struct usb_page_cache *pc, unsigned int offset, unsigned int len)
struct ifnet * uether_getifp(struct usb_ether *ue)
uint8_t uether_pause(struct usb_ether *ue, unsigned int _ticks)
int uether_ifattach(struct usb_ether *ue)
#define uether_do_request(ue, req, data, timo)
void() uether_fn_t(struct usb_ether *)
int usbd_lookup_id_by_uaa(const struct usb_device_id *id, usb_size_t sizeof_id, struct usb_attach_arg *uaa)
void usbd_transfer_submit(struct usb_xfer *xfer)
void usbd_transfer_unsetup(struct usb_xfer **pxfer, uint16_t n_setup)
void usbd_xfer_set_frame_len(struct usb_xfer *xfer, usb_frcount_t frindex, usb_frlength_t len)
struct usb_page_cache * usbd_xfer_get_frame(struct usb_xfer *xfer, usb_frcount_t frindex)
usb_error_t usbd_transfer_setup(struct usb_device *udev, const uint8_t *ifaces, struct usb_xfer **ppxfer, const struct usb_config *setup_start, uint16_t n_setup, void *priv_sc, struct mtx *xfer_mtx)
void usbd_transfer_start(struct usb_xfer *xfer)
void * usbd_xfer_softc(struct usb_xfer *xfer)
void usbd_xfer_set_stall(struct usb_xfer *xfer)
void usbd_transfer_stop(struct usb_xfer *xfer)
void usbd_xfer_status(struct usb_xfer *xfer, int *actlen, int *sumlen, int *aframes, int *nframes)
usb_frlength_t usbd_xfer_max_len(struct usb_xfer *xfer)
void device_set_usb_desc(device_t dev)
#define USB_ST_TRANSFERRED
void usbd_m_copy_in(struct usb_page_cache *cache, usb_frlength_t dst_offset, struct mbuf *m, usb_size_t src_offset, usb_frlength_t src_len)
void() usb_callback_t(struct usb_xfer *, usb_error_t)
#define STRUCT_USB_HOST_ID
#define USB_GET_STATE(xfer)