70#include <sys/stdint.h>
71#include <sys/stddef.h>
76#include <sys/socket.h>
77#include <sys/kernel.h>
79#include <sys/module.h>
82#include <sys/condvar.h>
83#include <sys/sysctl.h>
85#include <sys/unistd.h>
86#include <sys/callout.h>
87#include <sys/malloc.h>
91#include <net/if_var.h>
92#include <net/if_media.h>
94#include <dev/mii/mii.h>
95#include <dev/mii/miivar.h>
102#define USB_DEBUG_VAR rue_debug
109#include "miibus_if.h"
112static int rue_debug = 0;
114static SYSCTL_NODE(_hw_usb, OID_AUTO, rue, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
117 &rue_debug, 0,
"Debug level");
125 {
USB_VPI(USB_VENDOR_MELCO, USB_PRODUCT_MELCO_LUAKTX, 0)},
126 {
USB_VPI(USB_VENDOR_REALTEK, USB_PRODUCT_REALTEK_USBKR100, 0)},
127 {
USB_VPI(USB_VENDOR_OQO, USB_PRODUCT_OQO_ETHER01, 0)},
170 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
179 .bufsize = (MCLBYTES + 4),
189 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
239#define RUE_SETBIT(sc, reg, x) \
240 rue_csr_write_1(sc, reg, rue_csr_read_1(sc, reg) | (x))
242#define RUE_CLRBIT(sc, reg, x) \
243 rue_csr_write_1(sc, reg, rue_csr_read_1(sc, reg) & ~(x))
326 locked = mtx_owned(&sc->
sc_mtx);
355 device_printf(sc->
sc_ue.
ue_dev,
"bad phy register\n");
377 locked = mtx_owned(&sc->
sc_mtx);
405 device_printf(sc->
sc_ue.
ue_dev,
" bad phy register\n");
430 struct mii_data *mii =
GET_MII(sc);
434 locked = mtx_owned(&sc->
sc_mtx);
442 if (IFM_SUBTYPE(mii->mii_media_active) == IFM_100_TX)
445 bmcr &= ~RUE_BMCR_SPD_SET;
447 if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX)
450 bmcr &= ~RUE_BMCR_DUPLEX;
470 if (ifp->if_flags & IFF_PROMISC)
479 uint32_t *hashes = arg;
482 h = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN) >> 26;
484 hashes[0] |= (1 << h);
486 hashes[1] |= (1 << (h - 32));
500 uint32_t hashes[2] = { 0, 0 };
507 if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
509 rxcfg &= ~RUE_RCR_AM;
526 rxcfg &= ~RUE_RCR_AM;
549 device_printf(sc->
sc_ue.
ue_dev,
"reset never completed\n");
598 mtx_init(&sc->
sc_mtx, device_get_nameunit(
dev), NULL, MTX_DEF);
605 device_printf(
dev,
"allocating USB transfers failed\n");
617 device_printf(
dev,
"could not attach interface\n");
654 if (ifp && (ifp->if_drv_flags & IFF_DRV_RUNNING) &&
655 actlen >= (
int)
sizeof(pkt)) {
661 if_inc_counter(ifp, IFCOUNTER_COLLISIONS, pkt.
rue_col_cnt);
696 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
706 if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
719 DPRINTF(
"bulk read error, %s\n",
742 DPRINTFN(11,
"transfer complete\n");
743 if_inc_counter(ifp, IFCOUNTER_OPACKETS, 1);
754 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
758 if (m->m_pkthdr.len > MCLBYTES)
759 m->m_pkthdr.len = MCLBYTES;
760 temp_len = m->m_pkthdr.len;
790 DPRINTFN(11,
"transfer error, %s\n",
793 if_inc_counter(ifp, IFCOUNTER_OERRORS, 1);
808 struct mii_data *mii =
GET_MII(sc);
814 && mii->mii_media_status & IFM_ACTIVE &&
815 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
868 ifp->if_drv_flags |= IFF_DRV_RUNNING;
879 struct mii_data *mii =
GET_MII(sc);
880 struct mii_softc *miisc;
886 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
888 error = mii_mediachg(mii);
899 struct mii_data *mii =
GET_MII(sc);
903 ifmr->ifm_active = mii->mii_media_active;
904 ifmr->ifm_status = mii->mii_media_status;
916 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 int rue_ifmedia_upd(struct ifnet *)
static miibus_writereg_t rue_miibus_writereg
MODULE_DEPEND(rue, uether, 1, 1, 1)
static miibus_readreg_t rue_miibus_readreg
static const struct usb_config rue_config[RUE_N_TRANSFER]
static uint8_t rue_csr_read_1(struct rue_softc *, uint16_t)
static usb_callback_t rue_bulk_read_callback
static device_attach_t rue_attach
#define RUE_SETBIT(sc, reg, x)
static devclass_t rue_devclass
static const struct usb_ether_methods rue_ue_methods
DRIVER_MODULE_ORDERED(rue, uhub, rue_driver, rue_devclass, NULL, NULL, SI_ORDER_ANY)
static int rue_csr_write_2(struct rue_softc *, uint16_t, uint16_t)
static uether_fn_t rue_attach_post
static device_method_t rue_methods[]
static void rue_ifmedia_sts(struct ifnet *, struct ifmediareq *)
USB_PNP_HOST_INFO(rue_devs)
static u_int rue_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
static usb_callback_t rue_intr_callback
static uether_fn_t rue_init
static int rue_read_mem(struct rue_softc *, uint16_t, void *, int)
#define RUE_CLRBIT(sc, reg, x)
static void rue_reset(struct rue_softc *)
static uint16_t rue_csr_read_2(struct rue_softc *, uint16_t)
static uether_fn_t rue_setmulti
static driver_t rue_driver
static int rue_csr_write_4(struct rue_softc *, int, uint32_t)
static usb_callback_t rue_bulk_write_callback
static uether_fn_t rue_start
DRIVER_MODULE(miibus, rue, miibus_driver, miibus_devclass, NULL, NULL)
static int rue_csr_write_1(struct rue_softc *, uint16_t, uint8_t)
static miibus_statchg_t rue_miibus_statchg
static device_probe_t rue_probe
static int rue_write_mem(struct rue_softc *, uint16_t, void *, int)
static device_detach_t rue_detach
static uether_fn_t rue_stop
static uether_fn_t rue_tick
static uether_fn_t rue_setpromisc
static const STRUCT_USB_HOST_ID rue_devs[]
#define RUE_LOCK_ASSERT(_sc, t)
struct usb_xfer * sc_xfer[RUE_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_frame_zero(struct usb_page_cache *cache, usb_frlength_t offset, 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 USB_VPI(vend, prod, info)
#define STRUCT_USB_HOST_ID
#define USB_GET_STATE(xfer)