#ifndef _SMSC95XX_H #define _SMSC95XX_H /** @file * * SMSC LAN95xx USB Ethernet driver * */ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include "smscusb.h" /** Interrupt status register */ #define SMSC95XX_INT_STS 0x008 #define SMSC95XX_INT_STS_RXDF_INT 0x00000800UL /**< RX FIFO overflow */ #define SMSC95XX_INT_STS_PHY_INT 0x00008000UL /**< PHY interrupt */ /** Transmit configuration register */ #define SMSC95XX_TX_CFG 0x010 #define SMSC95XX_TX_CFG_ON 0x00000004UL /**< TX enable */ /** Hardware configuration register */ #define SMSC95XX_HW_CFG 0x014 #define SMSC95XX_HW_CFG_BIR 0x00001000UL /**< Bulk IN use NAK */ #define SMSC95XX_HW_CFG_LRST 0x00000008UL /**< Soft lite reset */ /** LED GPIO configuration register */ #define SMSC95XX_LED_GPIO_CFG 0x024 #define SMSC95XX_LED_GPIO_CFG_GPCTL2(x) ( (x) << 24 ) /**< GPIO 2 control */ #define SMSC95XX_LED_GPIO_CFG_GPCTL2_NSPD_LED \ SMSC95XX_LED_GPIO_CFG_GPCTL2 ( 1 ) /**< Link speed LED */ #define SMSC95XX_LED_GPIO_CFG_GPCTL1(x) ( (x) << 20 ) /**< GPIO 1 control */ #define SMSC95XX_LED_GPIO_CFG_GPCTL1_NLNKA_LED \ SMSC95XX_LED_GPIO_CFG_GPCTL1 ( 1 ) /**< Activity LED */ #define SMSC95XX_LED_GPIO_CFG_GPCTL0(x) ( (x) << 16 ) /**< GPIO 0 control */ #define SMSC95XX_LED_GPIO_CFG_GPCTL0_NFDX_LED \ SMSC95XX_LED_GPIO_CFG_GPCTL0 ( 1 ) /**< Full-duplex LED */ /** EEPROM register base */ #define SMSC95XX_E2P_BASE 0x030 /** Interrupt endpoint control register */ #define SMSC95XX_INT_EP_CTL 0x068 #define SMSC95XX_INT_EP_CTL_RXDF_EN 0x00000800UL /**< RX FIFO overflow */ #define SMSC95XX_INT_EP_CTL_PHY_EN 0x00008000UL /**< PHY interrupt */ /** Bulk IN delay register */ #define SMSC95XX_BULK_IN_DLY 0x06c #define SMSC95XX_BULK_IN_DLY_SET(ticks) ( (ticks) << 0 ) /**< Delay / 16.7ns */ /** MAC control register */ #define SMSC95XX_MAC_CR 0x100 #define SMSC95XX_MAC_CR_RXALL 0x80000000UL /**< Receive all */ #define SMSC95XX_MAC_CR_FDPX 0x00100000UL /**< Full duplex */ #define SMSC95XX_MAC_CR_MCPAS 0x00080000UL /**< All multicast */ #define SMSC95XX_MAC_CR_PRMS 0x00040000UL /**< Promiscuous */ #define SMSC95XX_MAC_CR_PASSBAD 0x00010000UL /**< Pass bad frames */ #define SMSC95XX_MAC_CR_TXEN 0x00000008UL /**< TX enabled */ #define SMSC95XX_MAC_CR_RXEN 0x00000004UL /**< RX enabled */ /** MAC address register base */ #define SMSC95XX_ADDR_BASE 0x104 /** MII register base */ #define SMSC95XX_MII_BASE 0x0114 /** Receive packet header */ struct smsc95xx_rx_header { /** Command word */ uint32_t command; } __attribute__ (( packed )); /** Runt frame */ #define SMSC95XX_RX_RUNT 0x00004000UL /** Late collision */ #define SMSC95XX_RX_LATE 0x00000040UL /** CRC error */ #define SMSC95XX_RX_CRC 0x00000002UL /** Transmit packet header */ struct smsc95xx_tx_header { /** Command word */ uint32_t command; /** Frame length */ uint32_t len; } __attribute__ (( packed )); /** First segment */ #define SMSC95XX_TX_FIRST 0x00002000UL /** Last segment */ #define SMSC95XX_TX_LAST 0x00001000UL /** Buffer size */ #define SMSC95XX_TX_LEN(len) ( (len) << 0 ) /** Receive statistics */ struct smsc95xx_rx_statistics { /** Good frames */ uint32_t good; /** CRC errors */ uint32_t crc; /** Runt frame errors */ uint32_t undersize; /** Alignment errors */ uint32_t alignment; /** Frame too long errors */ uint32_t oversize; /** Later collision errors */ uint32_t late; /** Bad frames */ uint32_t bad; /** Dropped frames */ uint32_t dropped; } __attribute__ (( packed )); /** Receive statistics */ #define SMSC95XX_RX_STATISTICS 0 /** Transmit statistics */ struct smsc95xx_tx_statistics { /** Good frames */ uint32_t good; /** Pause frames */ uint32_t pause; /** Single collisions */ uint32_t single; /** Multiple collisions */ uint32_t multiple; /** Excessive collisions */ uint32_t excessive; /** Late collisions */ uint32_t late; /** Buffer underruns */ uint32_t underrun; /** Excessive deferrals */ uint32_t deferred; /** Carrier errors */ uint32_t carrier; /** Bad frames */ uint32_t bad; } __attribute__ (( packed )); /** Transmit statistics */ #define SMSC95XX_TX_STATISTICS 1 /** Reset delay (in microseconds) */ #define SMSC95XX_RESET_DELAY_US 2 /** Bulk IN maximum fill level * * This is a policy decision. */ #define SMSC95XX_IN_MAX_FILL 8 /** Bulk IN buffer size */ #define SMSC95XX_IN_MTU \ ( sizeof ( struct smsc95xx_rx_header ) + \ ETH_FRAME_LEN + 4 /* possible VLAN header */ \ + 4 /* CRC */ ) /** Honeywell VM3 MAC address OEM string index */ #define SMSC95XX_VM3_OEM_STRING_MAC 2 #endif /* _SMSC95XX_H */