119a38d8eSLiu Junliang /* CoreChip-sz SR9800 one chip USB 2.0 Ethernet Devices 219a38d8eSLiu Junliang * 319a38d8eSLiu Junliang * Author : Liu Junliang <liujunliang_ljl@163.com> 419a38d8eSLiu Junliang * 519a38d8eSLiu Junliang * This file is licensed under the terms of the GNU General Public License 619a38d8eSLiu Junliang * version 2. This program is licensed "as is" without any warranty of any 719a38d8eSLiu Junliang * kind, whether express or implied. 819a38d8eSLiu Junliang */ 919a38d8eSLiu Junliang 1019a38d8eSLiu Junliang #ifndef _SR9800_H 1119a38d8eSLiu Junliang #define _SR9800_H 1219a38d8eSLiu Junliang 1319a38d8eSLiu Junliang /* SR9800 spec. command table on Linux Platform */ 1419a38d8eSLiu Junliang 1519a38d8eSLiu Junliang /* command : Software Station Management Control Reg */ 1619a38d8eSLiu Junliang #define SR_CMD_SET_SW_MII 0x06 1719a38d8eSLiu Junliang /* command : PHY Read Reg */ 1819a38d8eSLiu Junliang #define SR_CMD_READ_MII_REG 0x07 1919a38d8eSLiu Junliang /* command : PHY Write Reg */ 2019a38d8eSLiu Junliang #define SR_CMD_WRITE_MII_REG 0x08 2119a38d8eSLiu Junliang /* command : Hardware Station Management Control Reg */ 2219a38d8eSLiu Junliang #define SR_CMD_SET_HW_MII 0x0a 2319a38d8eSLiu Junliang /* command : SROM Read Reg */ 2419a38d8eSLiu Junliang #define SR_CMD_READ_EEPROM 0x0b 2519a38d8eSLiu Junliang /* command : SROM Write Reg */ 2619a38d8eSLiu Junliang #define SR_CMD_WRITE_EEPROM 0x0c 2719a38d8eSLiu Junliang /* command : SROM Write Enable Reg */ 2819a38d8eSLiu Junliang #define SR_CMD_WRITE_ENABLE 0x0d 2919a38d8eSLiu Junliang /* command : SROM Write Disable Reg */ 3019a38d8eSLiu Junliang #define SR_CMD_WRITE_DISABLE 0x0e 3119a38d8eSLiu Junliang /* command : RX Control Read Reg */ 3219a38d8eSLiu Junliang #define SR_CMD_READ_RX_CTL 0x0f 3319a38d8eSLiu Junliang #define SR_RX_CTL_PRO (1 << 0) 3419a38d8eSLiu Junliang #define SR_RX_CTL_AMALL (1 << 1) 3519a38d8eSLiu Junliang #define SR_RX_CTL_SEP (1 << 2) 3619a38d8eSLiu Junliang #define SR_RX_CTL_AB (1 << 3) 3719a38d8eSLiu Junliang #define SR_RX_CTL_AM (1 << 4) 3819a38d8eSLiu Junliang #define SR_RX_CTL_AP (1 << 5) 3919a38d8eSLiu Junliang #define SR_RX_CTL_ARP (1 << 6) 4019a38d8eSLiu Junliang #define SR_RX_CTL_SO (1 << 7) 4119a38d8eSLiu Junliang #define SR_RX_CTL_RH1M (1 << 8) 4219a38d8eSLiu Junliang #define SR_RX_CTL_RH2M (1 << 9) 4319a38d8eSLiu Junliang #define SR_RX_CTL_RH3M (1 << 10) 4419a38d8eSLiu Junliang /* command : RX Control Write Reg */ 4519a38d8eSLiu Junliang #define SR_CMD_WRITE_RX_CTL 0x10 4619a38d8eSLiu Junliang /* command : IPG0/IPG1/IPG2 Control Read Reg */ 4719a38d8eSLiu Junliang #define SR_CMD_READ_IPG012 0x11 4819a38d8eSLiu Junliang /* command : IPG0/IPG1/IPG2 Control Write Reg */ 4919a38d8eSLiu Junliang #define SR_CMD_WRITE_IPG012 0x12 5019a38d8eSLiu Junliang /* command : Node ID Read Reg */ 5119a38d8eSLiu Junliang #define SR_CMD_READ_NODE_ID 0x13 5219a38d8eSLiu Junliang /* command : Node ID Write Reg */ 5319a38d8eSLiu Junliang #define SR_CMD_WRITE_NODE_ID 0x14 5419a38d8eSLiu Junliang /* command : Multicast Filter Array Read Reg */ 5519a38d8eSLiu Junliang #define SR_CMD_READ_MULTI_FILTER 0x15 5619a38d8eSLiu Junliang /* command : Multicast Filter Array Write Reg */ 5719a38d8eSLiu Junliang #define SR_CMD_WRITE_MULTI_FILTER 0x16 5819a38d8eSLiu Junliang /* command : Eth/HomePNA PHY Address Reg */ 5919a38d8eSLiu Junliang #define SR_CMD_READ_PHY_ID 0x19 6019a38d8eSLiu Junliang /* command : Medium Status Read Reg */ 6119a38d8eSLiu Junliang #define SR_CMD_READ_MEDIUM_STATUS 0x1a 6219a38d8eSLiu Junliang #define SR_MONITOR_LINK (1 << 1) 6319a38d8eSLiu Junliang #define SR_MONITOR_MAGIC (1 << 2) 6419a38d8eSLiu Junliang #define SR_MONITOR_HSFS (1 << 4) 6519a38d8eSLiu Junliang /* command : Medium Status Write Reg */ 6619a38d8eSLiu Junliang #define SR_CMD_WRITE_MEDIUM_MODE 0x1b 6719a38d8eSLiu Junliang #define SR_MEDIUM_GM (1 << 0) 6819a38d8eSLiu Junliang #define SR_MEDIUM_FD (1 << 1) 6919a38d8eSLiu Junliang #define SR_MEDIUM_AC (1 << 2) 7019a38d8eSLiu Junliang #define SR_MEDIUM_ENCK (1 << 3) 7119a38d8eSLiu Junliang #define SR_MEDIUM_RFC (1 << 4) 7219a38d8eSLiu Junliang #define SR_MEDIUM_TFC (1 << 5) 7319a38d8eSLiu Junliang #define SR_MEDIUM_JFE (1 << 6) 7419a38d8eSLiu Junliang #define SR_MEDIUM_PF (1 << 7) 7519a38d8eSLiu Junliang #define SR_MEDIUM_RE (1 << 8) 7619a38d8eSLiu Junliang #define SR_MEDIUM_PS (1 << 9) 7719a38d8eSLiu Junliang #define SR_MEDIUM_RSV (1 << 10) 7819a38d8eSLiu Junliang #define SR_MEDIUM_SBP (1 << 11) 7919a38d8eSLiu Junliang #define SR_MEDIUM_SM (1 << 12) 8019a38d8eSLiu Junliang /* command : Monitor Mode Status Read Reg */ 8119a38d8eSLiu Junliang #define SR_CMD_READ_MONITOR_MODE 0x1c 8219a38d8eSLiu Junliang /* command : Monitor Mode Status Write Reg */ 8319a38d8eSLiu Junliang #define SR_CMD_WRITE_MONITOR_MODE 0x1d 8419a38d8eSLiu Junliang /* command : GPIO Status Read Reg */ 8519a38d8eSLiu Junliang #define SR_CMD_READ_GPIOS 0x1e 8619a38d8eSLiu Junliang #define SR_GPIO_GPO0EN (1 << 0) /* GPIO0 Output enable */ 8719a38d8eSLiu Junliang #define SR_GPIO_GPO_0 (1 << 1) /* GPIO0 Output value */ 8819a38d8eSLiu Junliang #define SR_GPIO_GPO1EN (1 << 2) /* GPIO1 Output enable */ 8919a38d8eSLiu Junliang #define SR_GPIO_GPO_1 (1 << 3) /* GPIO1 Output value */ 9019a38d8eSLiu Junliang #define SR_GPIO_GPO2EN (1 << 4) /* GPIO2 Output enable */ 9119a38d8eSLiu Junliang #define SR_GPIO_GPO_2 (1 << 5) /* GPIO2 Output value */ 9219a38d8eSLiu Junliang #define SR_GPIO_RESERVED (1 << 6) /* Reserved */ 9319a38d8eSLiu Junliang #define SR_GPIO_RSE (1 << 7) /* Reload serial EEPROM */ 9419a38d8eSLiu Junliang /* command : GPIO Status Write Reg */ 9519a38d8eSLiu Junliang #define SR_CMD_WRITE_GPIOS 0x1f 9619a38d8eSLiu Junliang /* command : Eth PHY Power and Reset Control Reg */ 9719a38d8eSLiu Junliang #define SR_CMD_SW_RESET 0x20 9819a38d8eSLiu Junliang #define SR_SWRESET_CLEAR 0x00 9919a38d8eSLiu Junliang #define SR_SWRESET_RR (1 << 0) 10019a38d8eSLiu Junliang #define SR_SWRESET_RT (1 << 1) 10119a38d8eSLiu Junliang #define SR_SWRESET_PRTE (1 << 2) 10219a38d8eSLiu Junliang #define SR_SWRESET_PRL (1 << 3) 10319a38d8eSLiu Junliang #define SR_SWRESET_BZ (1 << 4) 10419a38d8eSLiu Junliang #define SR_SWRESET_IPRL (1 << 5) 10519a38d8eSLiu Junliang #define SR_SWRESET_IPPD (1 << 6) 10619a38d8eSLiu Junliang /* command : Software Interface Selection Status Read Reg */ 10719a38d8eSLiu Junliang #define SR_CMD_SW_PHY_STATUS 0x21 10819a38d8eSLiu Junliang /* command : Software Interface Selection Status Write Reg */ 10919a38d8eSLiu Junliang #define SR_CMD_SW_PHY_SELECT 0x22 11019a38d8eSLiu Junliang /* command : BULK in Buffer Size Reg */ 11119a38d8eSLiu Junliang #define SR_CMD_BULKIN_SIZE 0x2A 11219a38d8eSLiu Junliang /* command : LED_MUX Control Reg */ 11319a38d8eSLiu Junliang #define SR_CMD_LED_MUX 0x70 11419a38d8eSLiu Junliang #define SR_LED_MUX_TX_ACTIVE (1 << 0) 11519a38d8eSLiu Junliang #define SR_LED_MUX_RX_ACTIVE (1 << 1) 11619a38d8eSLiu Junliang #define SR_LED_MUX_COLLISION (1 << 2) 11719a38d8eSLiu Junliang #define SR_LED_MUX_DUP_COL (1 << 3) 11819a38d8eSLiu Junliang #define SR_LED_MUX_DUP (1 << 4) 11919a38d8eSLiu Junliang #define SR_LED_MUX_SPEED (1 << 5) 12019a38d8eSLiu Junliang #define SR_LED_MUX_LINK_ACTIVE (1 << 6) 12119a38d8eSLiu Junliang #define SR_LED_MUX_LINK (1 << 7) 12219a38d8eSLiu Junliang 12319a38d8eSLiu Junliang /* Register Access Flags */ 12419a38d8eSLiu Junliang #define SR_REQ_RD_REG (USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE) 12519a38d8eSLiu Junliang #define SR_REQ_WR_REG (USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE) 12619a38d8eSLiu Junliang 12719a38d8eSLiu Junliang /* Multicast Filter Array size & Max Number */ 12819a38d8eSLiu Junliang #define SR_MCAST_FILTER_SIZE 8 12919a38d8eSLiu Junliang #define SR_MAX_MCAST 64 13019a38d8eSLiu Junliang 13119a38d8eSLiu Junliang /* IPG0/1/2 Default Value */ 13219a38d8eSLiu Junliang #define SR9800_IPG0_DEFAULT 0x15 13319a38d8eSLiu Junliang #define SR9800_IPG1_DEFAULT 0x0c 13419a38d8eSLiu Junliang #define SR9800_IPG2_DEFAULT 0x12 13519a38d8eSLiu Junliang 13619a38d8eSLiu Junliang /* Medium Status Default Mode */ 13719a38d8eSLiu Junliang #define SR9800_MEDIUM_DEFAULT \ 13819a38d8eSLiu Junliang (SR_MEDIUM_FD | SR_MEDIUM_RFC | \ 13919a38d8eSLiu Junliang SR_MEDIUM_TFC | SR_MEDIUM_PS | \ 14019a38d8eSLiu Junliang SR_MEDIUM_AC | SR_MEDIUM_RE) 14119a38d8eSLiu Junliang 14219a38d8eSLiu Junliang /* RX Control Default Setting */ 14319a38d8eSLiu Junliang #define SR_DEFAULT_RX_CTL \ 14419a38d8eSLiu Junliang (SR_RX_CTL_SO | SR_RX_CTL_AB | SR_RX_CTL_RH1M) 14519a38d8eSLiu Junliang 14619a38d8eSLiu Junliang /* EEPROM Magic Number & EEPROM Size */ 14719a38d8eSLiu Junliang #define SR_EEPROM_MAGIC 0xdeadbeef 14819a38d8eSLiu Junliang #define SR9800_EEPROM_LEN 0xff 14919a38d8eSLiu Junliang 15019a38d8eSLiu Junliang /* SR9800 Driver Version and Driver Name */ 15119a38d8eSLiu Junliang #define DRIVER_VERSION "11-Nov-2013" 15219a38d8eSLiu Junliang #define DRIVER_NAME "CoreChips" 15319a38d8eSLiu Junliang #define DRIVER_FLAG \ 15419a38d8eSLiu Junliang (FLAG_ETHER | FLAG_FRAMING_AX | FLAG_LINK_INTR | FLAG_MULTI_PACKET) 15519a38d8eSLiu Junliang 15619a38d8eSLiu Junliang /* SR9800 BULKIN Buffer Size */ 15719a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_2K 0 15819a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_4K 1 15919a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_6K 2 16019a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_8K 3 16119a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_16K 4 16219a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_20K 5 16319a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_24K 6 16419a38d8eSLiu Junliang #define SR9800_MAX_BULKIN_32K 7 16519a38d8eSLiu Junliang 166*0844d36fSTom Rix static const struct {unsigned short size, byte_cnt, threshold; } SR9800_BULKIN_SIZE[] = { 16719a38d8eSLiu Junliang /* 2k */ 16819a38d8eSLiu Junliang {2048, 0x8000, 0x8001}, 16919a38d8eSLiu Junliang /* 4k */ 17019a38d8eSLiu Junliang {4096, 0x8100, 0x8147}, 17119a38d8eSLiu Junliang /* 6k */ 17219a38d8eSLiu Junliang {6144, 0x8200, 0x81EB}, 17319a38d8eSLiu Junliang /* 8k */ 17419a38d8eSLiu Junliang {8192, 0x8300, 0x83D7}, 17519a38d8eSLiu Junliang /* 16 */ 17619a38d8eSLiu Junliang {16384, 0x8400, 0x851E}, 17719a38d8eSLiu Junliang /* 20k */ 17819a38d8eSLiu Junliang {20480, 0x8500, 0x8666}, 17919a38d8eSLiu Junliang /* 24k */ 18019a38d8eSLiu Junliang {24576, 0x8600, 0x87AE}, 18119a38d8eSLiu Junliang /* 32k */ 18219a38d8eSLiu Junliang {32768, 0x8700, 0x8A3D}, 18319a38d8eSLiu Junliang }; 18419a38d8eSLiu Junliang 18519a38d8eSLiu Junliang /* This structure cannot exceed sizeof(unsigned long [5]) AKA 20 bytes */ 18619a38d8eSLiu Junliang struct sr_data { 18719a38d8eSLiu Junliang u8 multi_filter[SR_MCAST_FILTER_SIZE]; 18819a38d8eSLiu Junliang u8 mac_addr[ETH_ALEN]; 18919a38d8eSLiu Junliang u8 phymode; 19019a38d8eSLiu Junliang u8 ledmode; 19119a38d8eSLiu Junliang u8 eeprom_len; 19219a38d8eSLiu Junliang }; 19319a38d8eSLiu Junliang 19419a38d8eSLiu Junliang struct sr9800_int_data { 19519a38d8eSLiu Junliang __le16 res1; 19619a38d8eSLiu Junliang u8 link; 19719a38d8eSLiu Junliang __le16 res2; 19819a38d8eSLiu Junliang u8 status; 19919a38d8eSLiu Junliang __le16 res3; 20019a38d8eSLiu Junliang } __packed; 20119a38d8eSLiu Junliang 20219a38d8eSLiu Junliang #endif /* _SR9800_H */ 203