44 { .
name =
"smscusb.intr" };
66 DBGCIO ( smscusb,
"SMSCUSB %p [%03x] <= %08x\n",
70 DBGC ( smscusb,
"SMSCUSB %p could not write %03x: %s\n",
93 DBGC ( smscusb,
"SMSCUSB %p could not read %03x: %s\n",
97 DBGCIO ( smscusb,
"SMSCUSB %p [%03x] => %08x\n",
118 unsigned int e2p_base ) {
138 DBGC ( smscusb,
"SMSCUSB %p timed out waiting for EEPROM\n",
152 unsigned int e2p_base,
192 unsigned int e2p_base,
unsigned int address,
216 unsigned int e2p_base ) {
227 DBGC ( smscusb,
"SMSCUSB %p has no EEPROM MAC (%s)\n",
232 DBGC ( smscusb,
"SMSCUSB %p using EEPROM MAC %s\n",
252 unsigned int otp_base ) {
268 &otp_power ) ) != 0 )
277 DBGC ( smscusb,
"SMSCUSB %p timed out waiting for OTP power up\n",
290 unsigned int otp_base ) {
301 &otp_status ) ) != 0 )
310 DBGC ( smscusb,
"SMSCUSB %p timed out waiting for OTP\n",
324 unsigned int otp_base,
372 unsigned int otp_base,
unsigned int address,
401 unsigned int otp_base ) {
421 DBGC ( smscusb,
"SMSCUSB %p unknown OTP signature %#02x\n",
433 DBGC ( smscusb,
"SMSCUSB %p has no layout %#02x OTP MAC (%s)\n",
438 DBGC ( smscusb,
"SMSCUSB %p using layout %#02x OTP MAC %s\n",
471 DBGC ( smscusb,
"SMSCUSB %p using FDT MAC %s\n",
501 &mii_access ) ) != 0 )
510 DBGC ( smscusb,
"SMSCUSB %p timed out waiting for MII\n",
541 mii_access ) ) != 0 )
567 unsigned int data ) {
591 mii_access ) ) != 0 )
622 DBGC ( smscusb,
"SMSCUSB %p could not get PHY interrupt " 630 DBGC ( smscusb,
"SMSCUSB %p could not acknowledge PHY " 631 "interrupt: %s\n", smscusb,
strerror (
rc ) );
637 DBGC ( smscusb,
"SMSCUSB %p could not check link: %s\n",
642 DBGC ( smscusb,
"SMSCUSB %p link %s (intr %#04x)\n",
656 unsigned int phy_mask,
unsigned int intrs ) {
660 if ( (
rc =
mii_write ( &smscusb->
mii, phy_mask, intrs ) ) != 0 ) {
661 DBGC ( smscusb,
"SMSCUSB %p could not set PHY interrupt " 687 unsigned int addr_base ) {
699 mac.addr.h ) ) != 0 )
705 mac.addr.l ) ) != 0 )
719 unsigned int filt_base ) {
732 mac.addr.h ) ) != 0 )
738 mac.addr.l ) ) != 0 )
774 DBGC ( smscusb,
"SMSCUSB %p interrupt failed: %s\n",
783 DBGC ( smscusb,
"SMSCUSB %p malformed interrupt\n",
int smscusb_set_address(struct smscusb_device *smscusb, unsigned int addr_base)
Set receive address.
#define SMSCUSB_MII_ACCESS_MIIWNR
MII write.
#define SMSCUSB_E2P_CMD_EPC_ADDR(addr)
EPC address.
struct arbelprm_rc_send_wqe rc
static struct profiler smscusb_intr_profiler __profiler
Interrupt completion profiler.
static int smscusb_otp_read_byte(struct smscusb_device *smscusb, unsigned int otp_base, unsigned int address)
Read byte from OTP.
void(* complete)(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete transfer.
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
#define SMSCUSB_OTP_STATUS
OTP status register offset.
static void smscusb_out_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk OUT transfer.
static unsigned int unsigned int reg
#define le32_to_cpu(value)
int fdt_mac(unsigned int offset, struct net_device *netdev)
Get MAC address from property.
#define SMSCUSB_REGISTER_WRITE
Register write command.
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
uint64_t address
Base address.
int(* read)(struct mii_interface *mdio, unsigned int phy, unsigned int reg)
Read from MII register.
#define SMSCUSB_OTP_1_MAC
OTP layout 1 MAC address offset.
#define SMSCUSB_EEPROM_MAC
MAC address EEPROM address.
#define SMSCUSB_ADDR_FILTH_VALID
Address valid.
struct usb_device * usb
USB device.
static int smscusb_mii_read(struct mii_interface *mdio, unsigned int phy __unused, unsigned int reg)
Read from MII register.
#define SMSCUSB_OTP_2_MAC
OTP layout 2 MAC address offset.
static int smscusb_writel(struct smscusb_device *smscusb, unsigned int address, uint32_t value)
Write register.
#define SMSCUSB_OTP_DATA_GET(otp_data)
OTP data.
uint8_t mac[ETH_ALEN]
MAC address.
A data structure for storing profiling information.
static int smscusb_otp_power_up(struct smscusb_device *smscusb, unsigned int otp_base)
Power up OTP.
int open
Endpoint is open.
static void profile_stop(struct profiler *profiler)
Stop profiling.
struct usb_endpoint intr
Interrupt endpoint.
#define SMSCUSB_MII_DATA
MII data register offset.
int smscusb_mii_open(struct smscusb_device *smscusb, unsigned int phy_mask, unsigned int intrs)
Enable PHY interrupts and update link status.
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
#define ENOTSUP
Operation not supported.
#define SMSCUSB_MII_ACCESS_MIIRINDA(addr)
MII register.
#define SMSCUSB_MII_DATA_GET(mii_data)
Get data.
#define SMSCUSB_RX_ADDRH
MAC receive address high register offset.
struct usb_endpoint out
Bulk OUT endpoint.
int smscusb_set_filter(struct smscusb_device *smscusb, unsigned int filt_base)
Set receive filter.
#define SMSCUSB_OTP_2_SIG
OTP layout 2 signature.
uint32_t int_sts
Interrupt status.
#define SMSCUSB_MII_MAX_WAIT_MS
Maximum time to wait for MII (in milliseconds)
uint16_t phy_source
PHY interrupt source register.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
#define SMSCUSB_OTP_CMD
OTP command selection register offset.
#define SMSCUSB_OTP_MAX_WAIT_MS
Maximum time to wait for OTP (in milliseconds)
struct usbnet_device usbnet
USB network device.
#define container_of(ptr, type, field)
Get containing structure.
#define SMSCUSB_OTP_GO_GO
Initiate command.
#define SMSCUSB_MII_ACCESS_PHY_ADDRESS
PHY address.
uint8_t intr
Interrupts enabled.
#define SMSCUSB_OTP_CMD_READ
Read command.
pseudo_bit_t value[0x00020]
#define __unused
Declare a variable or data structure as unused.
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
static int smscusb_otp_wait(struct smscusb_device *smscusb, unsigned int otp_base)
Wait for OTP to become idle.
static struct net_device * netdev
int smscusb_raw_writel(struct smscusb_device *smscusb, unsigned int address, uint32_t value)
Write register (without byte-swapping)
static int smscusb_readl(struct smscusb_device *smscusb, unsigned int address, uint32_t *value)
Read register.
#define SMSCUSB_E2P_CMD_EPC_BSY
EPC busy.
#define SMSCUSB_ADDR_FILTL(n)
MAC address perfect filter N low register offset.
static void profile_start(struct profiler *profiler)
Start profiling.
#define SMSCUSB_MII_ACCESS_MIIBZY
MII busy.
#define SMSCUSB_MII_DATA_SET(data)
Set data.
#define SMSCUSB_E2P_DATA_GET(e2p_data)
EEPROM data.
static int smscusb_mii_write(struct mii_interface *mdio, unsigned int phy __unused, unsigned int reg, unsigned int data)
Write to MII register.
static int smscusb_mii_wait(struct smscusb_device *smscusb)
Wait for MII to become idle.
#define SMSCUSB_OTP_ADDRH
OTP address high byte register offset.
#define cpu_to_le32(value)
struct mii_interface mdio
MII interface.
int smscusb_eeprom_fetch_mac(struct smscusb_device *smscusb, unsigned int e2p_base)
Fetch MAC address from EEPROM.
char * strerror(int errno)
Retrieve string representation of error number.
static int smscusb_eeprom_wait(struct smscusb_device *smscusb, unsigned int e2p_base)
Wait for EEPROM to become idle.
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
#define ENODEV
No such device.
SMSC USB Ethernet drivers.
#define SMSCUSB_ADDR_FILTH(n)
MAC address perfect filter N high register offset.
int smscusb_raw_readl(struct smscusb_device *smscusb, unsigned int address, uint32_t *value)
Read register (without byte-swapping)
struct mii_device mii
MII device.
int mii_check_link(struct mii_device *mii, struct net_device *netdev)
Update link status via MII.
static int is_valid_ether_addr(const void *addr)
Check if Ethernet address is valid.
#define SMSCUSB_OTP_POWER_DOWN
OTP power down.
static int smscusb_eeprom_read(struct smscusb_device *smscusb, unsigned int e2p_base, unsigned int address, void *data, size_t len)
Read data from EEPROM.
#define SMSCUSB_OTP_DATA
OTP data register offset.
#define SMSCUSB_EEPROM_MAX_WAIT_MS
Maximum time to wait for EEPROM (in milliseconds)
MII interface operations.
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
#define SMSCUSB_E2P_CMD
EEPROM command register offset.
int smscusb_otp_fetch_mac(struct smscusb_device *smscusb, unsigned int otp_base)
Fetch MAC address from OTP.
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
struct usb_endpoint_driver_operations smscusb_intr_operations
Interrupt endpoint operations.
#define SMSCUSB_MII_ACCESS
MII access register offset.
#define SMSCUSB_OTP_GO
OTP command initiation register offset.
Universal Serial Bus (USB)
struct usb_endpoint_driver_operations smscusb_out_operations
Bulk OUT endpoint operations.
#define SMSCUSB_OTP_ADDRL
OTP address low byte register offset.
void * data
Start of data.
int smscusb_mii_check_link(struct smscusb_device *smscusb)
Check link status.
uint16_t mii_base
MII register base.
uint8_t data[48]
Additional event data.
#define SMSCUSB_E2P_CMD_EPC_CMD_READ
READ command.
#define SMSCUSB_REGISTER_READ
Register read command.
static int mii_read(int phy_id, int location)
uint16_t offset
Offset to command line.
#define SMSCUSB_RX_ADDRL
MAC receive address low register offset.
#define SMSCUSB_OTP_STATUS_BUSY
OTP busy.
struct net_device * netdev
Network device.
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
USB endpoint driver operations.
static int smscusb_otp_read(struct smscusb_device *smscusb, unsigned int otp_base, unsigned int address, void *data, size_t len)
Read data from OTP.
static int smscusb_eeprom_read_byte(struct smscusb_device *smscusb, unsigned int e2p_base, unsigned int address)
Read byte from EEPROM.
#define SMSCUSB_OTP_POWER
OTP power register offset.
#define SMSCUSB_OTP_1_SIG
OTP layout 1 signature.
u8 signature
CPU signature.
static int mii_write(struct mii_device *mii, unsigned int reg, unsigned int data)
Write to MII register.
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
static void smscusb_intr_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete interrupt transfer.
int smscusb_fdt_fetch_mac(struct smscusb_device *smscusb)
Fetch MAC address from device tree.
#define SMSCUSB_E2P_DATA
EEPROM data register offset.
#define NULL
NULL pointer (VOID *)
#define ETIMEDOUT
Connection timed out.
struct bofm_section_header done
struct mii_operations smscusb_mii_operations
MII operations.
void * memset(void *dest, int character, size_t len) __nonnull
int fdt_alias(const char *name, unsigned int *offset)
Find node by alias.