FreeBSD kernel usb device Code
if_udav.c File Reference
#include <sys/cdefs.h>
#include <sys/stdint.h>
#include <sys/stddef.h>
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/types.h>
#include <sys/systm.h>
#include <sys/socket.h>
#include <sys/kernel.h>
#include <sys/bus.h>
#include <sys/module.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/condvar.h>
#include <sys/sysctl.h>
#include <sys/sx.h>
#include <sys/unistd.h>
#include <sys/callout.h>
#include <sys/malloc.h>
#include <sys/priv.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_media.h>
#include <dev/mii/mii.h>
#include <dev/mii/miivar.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdi_util.h>
#include "usbdevs.h"
#include "miibus_if.h"
#include <dev/usb/usb_debug.h>
#include <dev/usb/usb_process.h>
#include <dev/usb/net/usb_ethernet.h>
#include <dev/usb/net/if_udavreg.h>
Include dependency graph for if_udav.c:

Go to the source code of this file.

Macros

#define USB_DEBUG_VAR   udav_debug
 
#define UDAV_SETBIT(sc, reg, x)    udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) | (x))
 
#define UDAV_CLRBIT(sc, reg, x)    udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) & ~(x))
 

Functions

 __FBSDID ("$FreeBSD$")
 
static int udav_csr_read (struct udav_softc *, uint16_t, void *, int)
 
static int udav_csr_write (struct udav_softc *, uint16_t, void *, int)
 
static uint8_t udav_csr_read1 (struct udav_softc *, uint16_t)
 
static int udav_csr_write1 (struct udav_softc *, uint16_t, uint8_t)
 
static void udav_reset (struct udav_softc *)
 
static int udav_ifmedia_upd (struct ifnet *)
 
static void udav_ifmedia_status (struct ifnet *, struct ifmediareq *)
 
 DRIVER_MODULE (udav, uhub, udav_driver, udav_devclass, NULL, 0)
 
 DRIVER_MODULE (miibus, udav, miibus_driver, miibus_devclass, 0, 0)
 
 MODULE_DEPEND (udav, uether, 1, 1, 1)
 
 MODULE_DEPEND (udav, usb, 1, 1, 1)
 
 MODULE_DEPEND (udav, ether, 1, 1, 1)
 
 MODULE_DEPEND (udav, miibus, 1, 1, 1)
 
 MODULE_VERSION (udav, 1)
 
 USB_PNP_HOST_INFO (udav_devs)
 
static void udav_attach_post (struct usb_ether *ue)
 
static int udav_probe (device_t dev)
 
static int udav_attach (device_t dev)
 
static int udav_detach (device_t dev)
 
static void udav_init (struct usb_ether *ue)
 
static u_int udav_hash_maddr (void *arg, struct sockaddr_dl *sdl, u_int cnt)
 
static void udav_setmulti (struct usb_ether *ue)
 
static void udav_setpromisc (struct usb_ether *ue)
 
static void udav_start (struct usb_ether *ue)
 
static void udav_bulk_write_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void udav_bulk_read_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void udav_intr_callback (struct usb_xfer *xfer, usb_error_t error)
 
static void udav_stop (struct usb_ether *ue)
 
static void udav_tick (struct usb_ether *ue)
 
static int udav_miibus_readreg (device_t dev, int phy, int reg)
 
static int udav_miibus_writereg (device_t dev, int phy, int reg, int data)
 
static void udav_miibus_statchg (device_t dev)
 

Variables

static device_probe_t udav_probe
 
static device_attach_t udav_attach
 
static device_detach_t udav_detach
 
static usb_callback_t udav_bulk_write_callback
 
static usb_callback_t udav_bulk_read_callback
 
static usb_callback_t udav_intr_callback
 
static uether_fn_t udav_attach_post
 
static uether_fn_t udav_init
 
static uether_fn_t udav_stop
 
static uether_fn_t udav_start
 
static uether_fn_t udav_tick
 
static uether_fn_t udav_setmulti
 
static uether_fn_t udav_setpromisc
 
static miibus_readreg_t udav_miibus_readreg
 
static miibus_writereg_t udav_miibus_writereg
 
static miibus_statchg_t udav_miibus_statchg
 
static const struct usb_config udav_config [UDAV_N_TRANSFER]
 
static device_method_t udav_methods []
 
static driver_t udav_driver
 
static devclass_t udav_devclass
 
static const STRUCT_USB_HOST_ID udav_devs []
 
static const struct usb_ether_methods udav_ue_methods
 
static const struct usb_ether_methods udav_ue_methods_nophy
 

Macro Definition Documentation

◆ UDAV_CLRBIT

#define UDAV_CLRBIT (   sc,
  reg,
 
)     udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) & ~(x))

Definition at line 232 of file if_udav.c.

◆ UDAV_SETBIT

#define UDAV_SETBIT (   sc,
  reg,
 
)     udav_csr_write1(sc, reg, udav_csr_read1(sc, reg) | (x))

Definition at line 229 of file if_udav.c.

◆ USB_DEBUG_VAR

#define USB_DEBUG_VAR   udav_debug

Definition at line 85 of file if_udav.c.

Function Documentation

◆ __FBSDID()

__FBSDID ( "$FreeBSD$"  )

◆ DRIVER_MODULE() [1/2]

DRIVER_MODULE ( miibus  ,
udav  ,
miibus_driver  ,
miibus_devclass  ,
,
 
)

◆ DRIVER_MODULE() [2/2]

DRIVER_MODULE ( udav  ,
uhub  ,
udav_driver  ,
udav_devclass  ,
NULL  ,
 
)

◆ MODULE_DEPEND() [1/4]

MODULE_DEPEND ( udav  ,
ether  ,
,
,
 
)

◆ MODULE_DEPEND() [2/4]

MODULE_DEPEND ( udav  ,
miibus  ,
,
,
 
)

◆ MODULE_DEPEND() [3/4]

MODULE_DEPEND ( udav  ,
uether  ,
,
,
 
)

◆ MODULE_DEPEND() [4/4]

MODULE_DEPEND ( udav  ,
usb  ,
,
,
 
)

◆ MODULE_VERSION()

MODULE_VERSION ( udav  ,
 
)

◆ udav_attach()

◆ udav_attach_post()

static void udav_attach_post ( struct usb_ether ue)
static

Definition at line 236 of file if_udav.c.

References udav_csr_read(), UDAV_PAR, udav_reset(), usb_ether::ue_eaddr, and uether_getsc().

Here is the call graph for this function:

◆ udav_bulk_read_callback()

◆ udav_bulk_write_callback()

◆ udav_csr_read()

static int udav_csr_read ( struct udav_softc sc,
uint16_t  offset,
void *  buf,
int  len 
)
static

Definition at line 378 of file if_udav.c.

References len, offset, req, udav_softc::sc_ue, UDAV_REQ_REG_READ, uether_do_request, USETW, and UT_READ_VENDOR_DEVICE.

Referenced by udav_attach_post(), udav_csr_read1(), and udav_miibus_readreg().

Here is the caller graph for this function:

◆ udav_csr_read1()

static uint8_t udav_csr_read1 ( struct udav_softc sc,
uint16_t  offset 
)
static

Definition at line 411 of file if_udav.c.

References offset, udav_csr_read(), and val.

Referenced by udav_reset(), and udav_setpromisc().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ udav_csr_write()

static int udav_csr_write ( struct udav_softc sc,
uint16_t  offset,
void *  buf,
int  len 
)
static

Definition at line 394 of file if_udav.c.

References len, offset, req, udav_softc::sc_ue, UDAV_REQ_REG_WRITE, uether_do_request, USETW, and UT_WRITE_VENDOR_DEVICE.

Referenced by udav_init(), udav_miibus_writereg(), and udav_setmulti().

Here is the caller graph for this function:

◆ udav_csr_write1()

static int udav_csr_write1 ( struct udav_softc sc,
uint16_t  offset,
uint8_t  ch 
)
static

Definition at line 420 of file if_udav.c.

References offset, req, udav_softc::sc_ue, UDAV_REQ_REG_WRITE1, uether_do_request, USETW, and UT_WRITE_VENDOR_DEVICE.

Referenced by udav_miibus_readreg(), udav_miibus_writereg(), and udav_setpromisc().

Here is the caller graph for this function:

◆ udav_detach()

static int udav_detach ( device_t  dev)
static

Definition at line 314 of file if_udav.c.

References dev, udav_softc::sc_mtx, udav_softc::sc_ue, udav_softc::sc_xfer, UDAV_N_TRANSFER, uether_ifdetach(), and usbd_transfer_unsetup().

Here is the call graph for this function:

◆ udav_hash_maddr()

static u_int udav_hash_maddr ( void *  arg,
struct sockaddr_dl *  sdl,
u_int  cnt 
)
static

Definition at line 508 of file if_udav.c.

Referenced by udav_setmulti().

Here is the caller graph for this function:

◆ udav_ifmedia_status()

static void udav_ifmedia_status ( struct ifnet *  ifp,
struct ifmediareq *  ifmr 
)
static

Definition at line 778 of file if_udav.c.

References GET_MII, UDAV_LOCK, and UDAV_UNLOCK.

◆ udav_ifmedia_upd()

static int udav_ifmedia_upd ( struct ifnet *  ifp)
static

Definition at line 761 of file if_udav.c.

References error, GET_MII, udav_softc::sc_flags, and UDAV_LOCK_ASSERT.

◆ udav_init()

◆ udav_intr_callback()

static void udav_intr_callback ( struct usb_xfer xfer,
usb_error_t  error 
)
static

◆ udav_miibus_readreg()

static int udav_miibus_readreg ( device_t  dev,
int  phy,
int  reg 
)
static

◆ udav_miibus_statchg()

static void udav_miibus_statchg ( device_t  dev)
static

Definition at line 886 of file if_udav.c.

◆ udav_miibus_writereg()

static int udav_miibus_writereg ( device_t  dev,
int  phy,
int  reg,
int  data 
)
static

◆ udav_probe()

static int udav_probe ( device_t  dev)
static

◆ udav_reset()

static void udav_reset ( struct udav_softc sc)
static

Definition at line 477 of file if_udav.c.

References udav_softc::sc_flags, udav_softc::sc_ue, UDAV_CLRBIT, udav_csr_read1(), UDAV_NCR, UDAV_NCR_EXT_PHY, UDAV_NCR_RST, UDAV_SETBIT, UDAV_TX_TIMEOUT, and uether_pause().

Referenced by udav_attach_post(), and udav_stop().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ udav_setmulti()

static void udav_setmulti ( struct usb_ether ue)
static

◆ udav_setpromisc()

static void udav_setpromisc ( struct usb_ether ue)
static

Definition at line 549 of file if_udav.c.

References udav_softc::sc_ue, udav_csr_read1(), udav_csr_write1(), UDAV_RCR, UDAV_RCR_ALL, UDAV_RCR_PRMSC, usb_ether::ue_sc, and uether_getifp().

Here is the call graph for this function:

◆ udav_start()

static void udav_start ( struct usb_ether ue)
static

Definition at line 568 of file if_udav.c.

References udav_softc::sc_xfer, UDAV_BULK_DT_RD, UDAV_BULK_DT_WR, UDAV_INTR_DT_RD, usb_ether::ue_sc, and usbd_transfer_start().

Here is the call graph for this function:

◆ udav_stop()

static void udav_stop ( struct usb_ether ue)
static

◆ udav_tick()

static void udav_tick ( struct usb_ether ue)
static

◆ USB_PNP_HOST_INFO()

USB_PNP_HOST_INFO ( udav_devs  )

Variable Documentation

◆ udav_attach

device_attach_t udav_attach
static

Definition at line 95 of file if_udav.c.

◆ udav_attach_post

uether_fn_t udav_attach_post
static

Definition at line 102 of file if_udav.c.

◆ udav_bulk_read_callback

usb_callback_t udav_bulk_read_callback
static

Definition at line 99 of file if_udav.c.

◆ udav_bulk_write_callback

usb_callback_t udav_bulk_write_callback
static

Definition at line 98 of file if_udav.c.

◆ udav_config

const struct usb_config udav_config[UDAV_N_TRANSFER]
static
Initial value:
= {
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_OUT,
.bufsize = (MCLBYTES + 2),
.flags = {.pipe_bof = 1,.force_short_xfer = 1,},
.timeout = 10000,
},
.type = UE_BULK,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.bufsize = (MCLBYTES + 3),
.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.timeout = 0,
},
.type = UE_INTERRUPT,
.endpoint = UE_ADDR_ANY,
.direction = UE_DIR_IN,
.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
.bufsize = 0,
.callback = udav_intr_callback,
},
}
static usb_callback_t udav_bulk_read_callback
Definition: if_udav.c:99
static usb_callback_t udav_bulk_write_callback
Definition: if_udav.c:98
static usb_callback_t udav_intr_callback
Definition: if_udav.c:100
@ UDAV_BULK_DT_WR
Definition: if_udavreg.h:150
@ UDAV_INTR_DT_RD
Definition: if_udavreg.h:152
@ UDAV_BULK_DT_RD
Definition: if_udavreg.h:151
#define UE_INTERRUPT
Definition: usb.h:544
#define UE_ADDR_ANY
Definition: usb.h:537
#define UE_BULK
Definition: usb.h:543
#define UE_DIR_IN
Definition: usb.h:531
#define UE_DIR_OUT
Definition: usb.h:532

Definition at line 122 of file if_udav.c.

Referenced by udav_attach().

◆ udav_detach

device_detach_t udav_detach
static

Definition at line 96 of file if_udav.c.

Referenced by udav_attach().

◆ udav_devclass

devclass_t udav_devclass
static

Definition at line 173 of file if_udav.c.

◆ udav_devs

const STRUCT_USB_HOST_ID udav_devs[]
static
Initial value:
= {
{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_DM9601, 0)},
{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_ST268, 0)},
{USB_VPI(USB_VENDOR_COREGA, USB_PRODUCT_COREGA_FETHER_USB_TXC, 0)},
{USB_VPI(USB_VENDOR_SHANTOU, USB_PRODUCT_SHANTOU_ADM8515, 0)},
{USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_DM9601, 0)},
{USB_VPI(USB_VENDOR_KONTRON, USB_PRODUCT_KONTRON_JP1082,
}
#define UDAV_FLAG_NO_PHY
Definition: if_udavreg.h:164
#define USB_VPI(vend, prod, info)
Definition: usbdi.h:367

Definition at line 175 of file if_udav.c.

Referenced by udav_probe().

◆ udav_driver

driver_t udav_driver
static
Initial value:
= {
.name = "udav",
.methods = udav_methods,
.size = sizeof(struct udav_softc),
}
static device_method_t udav_methods[]
Definition: if_udav.c:153

Definition at line 167 of file if_udav.c.

◆ udav_init

uether_fn_t udav_init
static

Definition at line 103 of file if_udav.c.

◆ udav_intr_callback

usb_callback_t udav_intr_callback
static

Definition at line 100 of file if_udav.c.

◆ udav_methods

device_method_t udav_methods[]
static
Initial value:
= {
DEVMETHOD(device_probe, udav_probe),
DEVMETHOD(device_attach, udav_attach),
DEVMETHOD(device_detach, udav_detach),
DEVMETHOD(miibus_readreg, udav_miibus_readreg),
DEVMETHOD(miibus_writereg, udav_miibus_writereg),
DEVMETHOD(miibus_statchg, udav_miibus_statchg),
DEVMETHOD_END
}
static device_detach_t udav_detach
Definition: if_udav.c:96
static device_attach_t udav_attach
Definition: if_udav.c:95
static device_probe_t udav_probe
Definition: if_udav.c:94
static miibus_statchg_t udav_miibus_statchg
Definition: if_udav.c:120
static miibus_writereg_t udav_miibus_writereg
Definition: if_udav.c:119
static miibus_readreg_t udav_miibus_readreg
Definition: if_udav.c:118

Definition at line 153 of file if_udav.c.

◆ udav_miibus_readreg

miibus_readreg_t udav_miibus_readreg
static

Definition at line 118 of file if_udav.c.

◆ udav_miibus_statchg

miibus_statchg_t udav_miibus_statchg
static

Definition at line 120 of file if_udav.c.

◆ udav_miibus_writereg

miibus_writereg_t udav_miibus_writereg
static

Definition at line 119 of file if_udav.c.

◆ udav_probe

device_probe_t udav_probe
static

Definition at line 94 of file if_udav.c.

◆ udav_setmulti

uether_fn_t udav_setmulti
static

Definition at line 107 of file if_udav.c.

◆ udav_setpromisc

uether_fn_t udav_setpromisc
static

Definition at line 108 of file if_udav.c.

Referenced by udav_init().

◆ udav_start

uether_fn_t udav_start
static

Definition at line 105 of file if_udav.c.

Referenced by udav_init(), and udav_tick().

◆ udav_stop

uether_fn_t udav_stop
static

Definition at line 104 of file if_udav.c.

Referenced by udav_init().

◆ udav_tick

uether_fn_t udav_tick
static

Definition at line 106 of file if_udav.c.

◆ udav_ue_methods

const struct usb_ether_methods udav_ue_methods
static
Initial value:
= {
.ue_attach_post = udav_attach_post,
.ue_start = udav_start,
.ue_init = udav_init,
.ue_stop = udav_stop,
.ue_tick = udav_tick,
.ue_setmulti = udav_setmulti,
.ue_setpromisc = udav_setpromisc,
.ue_mii_upd = udav_ifmedia_upd,
.ue_mii_sts = udav_ifmedia_status,
}
static void udav_ifmedia_status(struct ifnet *, struct ifmediareq *)
Definition: if_udav.c:778
static uether_fn_t udav_start
Definition: if_udav.c:105
static uether_fn_t udav_tick
Definition: if_udav.c:106
static uether_fn_t udav_setmulti
Definition: if_udav.c:107
static uether_fn_t udav_stop
Definition: if_udav.c:104
static uether_fn_t udav_setpromisc
Definition: if_udav.c:108
static uether_fn_t udav_init
Definition: if_udav.c:103
static uether_fn_t udav_attach_post
Definition: if_udav.c:102
static int udav_ifmedia_upd(struct ifnet *)
Definition: if_udav.c:761

Definition at line 199 of file if_udav.c.

Referenced by udav_attach().

◆ udav_ue_methods_nophy

const struct usb_ether_methods udav_ue_methods_nophy
static
Initial value:
= {
.ue_attach_post = udav_attach_post,
.ue_start = udav_start,
.ue_init = udav_init,
.ue_stop = udav_stop,
.ue_setmulti = udav_setmulti,
.ue_setpromisc = udav_setpromisc,
}

Definition at line 211 of file if_udav.c.

Referenced by udav_attach().