diff options
author | xiong <xiong@qca.qualcomm.com> | 2012-12-03 18:34:45 -0500 |
---|---|---|
committer | Luis R. Rodriguez <mcgrof@do-not-panic.com> | 2012-12-17 13:18:47 -0800 |
commit | f1fb77cb93c8055a7630bfde676e7db87e0272c3 (patch) | |
tree | 4565bd6c65c29609add4fa20c3011f2629294f4b | |
parent | 7fe03b3180d486072b94a2d3a251546c691d2407 (diff) | |
download | alx-f1fb77cb93c8055a7630bfde676e7db87e0272c3.tar.gz |
alx: split register definitions to seperated file
this patch include:
1. split register definitions to alx_reg.h.
2. MAC/DMA is reset when PHY link change Down.
3. fixed all error/warnings found by checkpatch.
Signed-off-by: xiong <xiong@qca.qualcomm.com>
Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
-rw-r--r-- | src/alx.h | 672 | ||||
-rw-r--r-- | src/alx_ethtool.c | 84 | ||||
-rw-r--r-- | src/alx_hw.c | 852 | ||||
-rw-r--r-- | src/alx_hw.h | 2688 | ||||
-rw-r--r-- | src/alx_main.c | 1367 | ||||
-rw-r--r-- | src/alx_reg.h | 2129 |
6 files changed, 4124 insertions, 3668 deletions
@@ -17,485 +17,91 @@ #ifndef _ALX_H_ #define _ALX_H_ -#include <linux/module.h> -#include <linux/pci.h> -#include <linux/interrupt.h> -#include <linux/ip.h> -#include <linux/ipv6.h> -#include <linux/if_vlan.h> -#include <linux/mii.h> -#include <linux/aer.h> -#include <linux/bitops.h> -#include <linux/ethtool.h> -#include <linux/crc32.h> -#include <linux/mdio.h> -#include "alx_hw.h" - -/* specific error info */ -#define ALX_ERR_SUCCESS 0x0000 -#define ALX_ERR_ALOAD 0x0001 -#define ALX_ERR_RSTMAC 0x0002 -#define ALX_ERR_PARM 0x0003 -#define ALX_ERR_MIIBUSY 0x0004 - - -/* Transmit Packet Descriptor, contains 4 32-bit words. - * - * 31 16 0 - * +----------------+----------------+ - * | vlan-tag | buf length | - * +----------------+----------------+ - * | Word 1 | - * +----------------+----------------+ - * | Word 2: buf addr lo | - * +----------------+----------------+ - * | Word 3: buf addr hi | - * +----------------+----------------+ - * - * Word 2 and 3 combine to form a 64-bit buffer address - * - * Word 1 has three forms, depending on the state of bit 8/12/13: - * if bit8 =='1', the definition is just for custom checksum offload. - * if bit8 == '0' && bit12 == '1' && bit13 == '1', the *FIRST* descriptor - * for the skb is special for LSO V2, Word 2 become total skb length , - * Word 3 is meaningless. - * other condition, the definition is for general skb or ip/tcp/udp - * checksum or LSO(TSO) offload. - * - * Here is the depiction: - * - * 0-+ 0-+ - * 1 | 1 | - * 2 | 2 | - * 3 | Payload offset 3 | L4 header offset - * 4 | (7:0) 4 | (7:0) - * 5 | 5 | - * 6 | 6 | - * 7-+ 7-+ - * 8 Custom csum enable = 1 8 Custom csum enable = 0 - * 9 General IPv4 checksum 9 General IPv4 checksum - * 10 General TCP checksum 10 General TCP checksum - * 11 General UDP checksum 11 General UDP checksum - * 12 Large Send Segment enable 12 Large Send Segment enable - * 13 Large Send Segment type 13 Large Send Segment type - * 14 VLAN tagged 14 VLAN tagged - * 15 Insert VLAN tag 15 Insert VLAN tag - * 16 IPv4 packet 16 IPv4 packet - * 17 Ethernet frame type 17 Ethernet frame type - * 18-+ 18-+ - * 19 | 19 | - * 20 | 20 | - * 21 | Custom csum offset 21 | - * 22 | (25:18) 22 | - * 23 | 23 | MSS (30:18) - * 24 | 24 | - * 25-+ 25 | - * 26-+ 26 | - * 27 | 27 | - * 28 | Reserved 28 | - * 29 | 29 | - * 30-+ 30-+ - * 31 End of packet 31 End of packet - */ - -struct tpd_desc { - __le32 word0; - __le32 word1; - union { - __le64 addr; - struct { - __le32 pkt_len; - __le32 resvd; - } l; - } adrl; -} __packed; - -/* tpd word 0 */ -#define TPD_BUFLEN_MASK 0xFFFF -#define TPD_BUFLEN_SHIFT 0 -#define TPD_VLTAG_MASK 0xFFFF -#define TPD_VLTAG_SHIFT 16 - -/* tpd word 1 */ -#define TPD_CXSUMSTART_MASK 0x00FF -#define TPD_CXSUMSTART_SHIFT 0 -#define TPD_L4HDROFFSET_MASK 0x00FF -#define TPD_L4HDROFFSET_SHIFT 0 -#define TPD_CXSUM_EN_MASK 0x0001 -#define TPD_CXSUM_EN_SHIFT 8 -#define TPD_IP_XSUM_MASK 0x0001 -#define TPD_IP_XSUM_SHIFT 9 -#define TPD_TCP_XSUM_MASK 0x0001 -#define TPD_TCP_XSUM_SHIFT 10 -#define TPD_UDP_XSUM_MASK 0x0001 -#define TPD_UDP_XSUm_SHIFT 11 -#define TPD_LSO_EN_MASK 0x0001 -#define TPD_LSO_EN_SHIFT 12 -#define TPD_LSO_V2_MASK 0x0001 -#define TPD_LSO_V2_SHIFT 13 -#define TPD_VLTAGGED_MASK 0x0001 -#define TPD_VLTAGGED_SHIFT 14 -#define TPD_INS_VLTAG_MASK 0x0001 -#define TPD_INS_VLTAG_SHIFT 15 -#define TPD_IPV4_MASK 0x0001 -#define TPD_IPV4_SHIFT 16 -#define TPD_ETHTYPE_MASK 0x0001 -#define TPD_ETHTYPE_SHIFT 17 -#define TPD_CXSUMOFFSET_MASK 0x00FF -#define TPD_CXSUMOFFSET_SHIFT 18 -#define TPD_MSS_MASK 0x1FFF -#define TPD_MSS_SHIFT 18 -#define TPD_EOP_MASK 0x0001 -#define TPD_EOP_SHIFT 31 - -#define DESC_GET(_x, _name) ((_x) >> _name##SHIFT & _name##MASK) - -/* Receive Free Descriptor */ -struct rfd_desc { - __le64 addr; /* data buffer address, length is - * declared in register --- every - * buffer has the same size - */ -} __packed; - -/* Receive Return Descriptor, contains 4 32-bit words. - * - * 31 16 0 - * +----------------+----------------+ - * | Word 0 | - * +----------------+----------------+ - * | Word 1: RSS Hash value | - * +----------------+----------------+ - * | Word 2 | - * +----------------+----------------+ - * | Word 3 | - * +----------------+----------------+ - * - * Word 0 depiction & Word 2 depiction: - * - * 0--+ 0--+ - * 1 | 1 | - * 2 | 2 | - * 3 | 3 | - * 4 | 4 | - * 5 | 5 | - * 6 | 6 | - * 7 | IP payload checksum 7 | VLAN tag - * 8 | (15:0) 8 | (15:0) - * 9 | 9 | - * 10 | 10 | - * 11 | 11 | - * 12 | 12 | - * 13 | 13 | - * 14 | 14 | - * 15-+ 15-+ - * 16-+ 16-+ - * 17 | Number of RFDs 17 | - * 18 | (19:16) 18 | - * 19-+ 19 | Protocol ID - * 20-+ 20 | (23:16) - * 21 | 21 | - * 22 | 22 | - * 23 | 23-+ - * 24 | 24 | Reserved - * 25 | Start index of RFD-ring 25-+ - * 26 | (31:20) 26 | RSS Q-num (27:25) - * 27 | 27-+ - * 28 | 28-+ - * 29 | 29 | RSS Hash algorithm - * 30 | 30 | (31:28) - * 31-+ 31-+ - * - * Word 3 depiction: - * - * 0--+ - * 1 | - * 2 | - * 3 | - * 4 | - * 5 | - * 6 | - * 7 | Packet length (include FCS) - * 8 | (13:0) - * 9 | - * 10 | - * 11 | - * 12 | - * 13-+ - * 14 L4 Header checksum error - * 15 IPv4 checksum error - * 16 VLAN tagged - * 17-+ - * 18 | Protocol ID (19:17) - * 19-+ - * 20 Receive error summary - * 21 FCS(CRC) error - * 22 Frame alignment error - * 23 Truncated packet - * 24 Runt packet - * 25 Incomplete packet due to insufficient rx-desc - * 26 Broadcast packet - * 27 Multicast packet - * 28 Ethernet type (EII or 802.3) - * 29 FIFO overflow - * 30 Length error (for 802.3, length field mismatch with actual len) - * 31 Updated, indicate to driver that this RRD is refreshed. - */ - -struct rrd_desc { - __le32 word0; - __le32 rss_hash; - __le32 word2; - __le32 word3; -} __packed; - -/* rrd word 0 */ -#define RRD_XSUM_MASK 0xFFFF -#define RRD_XSUM_SHIFT 0 -#define RRD_NOR_MASK 0x000F -#define RRD_NOR_SHIFT 16 -#define RRD_SI_MASK 0x0FFF -#define RRD_SI_SHIFT 20 - -/* rrd word 2 */ -#define RRD_VLTAG_MASK 0xFFFF -#define RRD_VLTAG_SHIFT 0 -#define RRD_PID_MASK 0x00FF -#define RRD_PID_SHIFT 16 -#define RRD_PID_NONIP 0 /* non-ip packet */ -#define RRD_PID_IPV4 1 /* ipv4(only) */ -#define RRD_PID_IPV6TCP 2 /* tcp/ipv6 */ -#define RRD_PID_IPV4TCP 3 /* tcp/ipv4 */ -#define RRD_PID_IPV6UDP 4 /* udp/ipv6 */ -#define RRD_PID_IPV4UDP 5 /* udp/ipv4 */ -#define RRD_PID_IPV6 6 /* ipv6(only) */ -#define RRD_PID_LLDP 7 /* LLDP packet */ -#define RRD_PID_1588 8 /* 1588 packet */ -#define RRD_RSSQ_MASK 0x0007 -#define RRD_RSSQ_SHIFT 25 -#define RRD_RSSALG_MASK 0x000F -#define RRD_RSSALG_SHIFT 28 -#define RRD_RSSALG_TCPV6 0x1 /* TCP(IPV6) hash algorithm */ -#define RRD_RSSALG_IPV6 0x2 /* IPV6 hash algorithm */ -#define RRD_RSSALG_TCPV4 0x4 /* TCP(IPV4) hash algorithm */ -#define RRD_RSSALG_IPV4 0x8 /* IPV4 hash algorithm */ - -/* rrd word 3 */ -#define RRD_PKTLEN_MASK 0x3FFF -#define RRD_PKTLEN_SHIFT 0 -#define RRD_ERR_L4_MASK 0x0001 -#define RRD_ERR_L4_SHIFT 14 -#define RRD_ERR_IPV4_MASK 0x0001 -#define RRD_ERR_IPV4_SHIFT 15 -#define RRD_VLTAGGED_MASK 0x0001 -#define RRD_VLTAGGED_SHIFT 16 -#define RRD_OLD_PID_MASK 0x0007 -#define RRD_OLD_PID_SHIFT 17 -#define RRD_ERR_RES_MASK 0x0001 -#define RRD_ERR_RES_SHIFT 20 -#define RRD_ERR_FCS_MASK 0x0001 -#define RRD_ERR_FCS_SHIFT 21 -#define RRD_ERR_FAE_MASK 0x0001 -#define RRD_ERR_FAE_SHIFT 22 -#define RRD_ERR_TRUNC_MASK 0x0001 -#define RRD_ERR_TRUNC_SHIFT 23 -#define RRD_ERR_RUNT_MASK 0x0001 -#define RRD_ERR_RUNT_SHIFT 24 -#define RRD_ERR_ICMP_MASK 0x0001 -#define RRD_ERR_ICMP_SHIFT 25 -#define RRD_BCAST_MASK 0x0001 -#define RRD_BCAST_SHIFT 26 -#define RRD_MCAST_MASK 0x0001 -#define RRD_MCAST_SHIFT 27 -#define RRD_ETHTYPE_MASK 0x0001 -#define RRD_ETHTYPE_SHIFT 28 -#define RRD_ERR_FIFOV_MASK 0x0001 -#define RRD_ERR_FIFOV_SHIFT 29 -#define RRD_ERR_LEN_MASK 0x0001 -#define RRD_ERR_LEN_SHIFT 30 -#define RRD_UPDATED_MASK 0x0001 -#define RRD_UPDATED_SHIFT 31 - - -/* Statistics counters collected by the MAC */ -struct alx_hw_stats { - /* rx */ - unsigned long rx_ok; - unsigned long rx_bcast; - unsigned long rx_mcast; - unsigned long rx_pause; - unsigned long rx_ctrl; - unsigned long rx_fcs_err; - unsigned long rx_len_err; - unsigned long rx_byte_cnt; - unsigned long rx_runt; - unsigned long rx_frag; - unsigned long rx_sz_64B; - unsigned long rx_sz_127B; - unsigned long rx_sz_255B; - unsigned long rx_sz_511B; - unsigned long rx_sz_1023B; - unsigned long rx_sz_1518B; - unsigned long rx_sz_max; - unsigned long rx_ov_sz; - unsigned long rx_ov_rxf; - unsigned long rx_ov_rrd; - unsigned long rx_align_err; - unsigned long rx_bc_byte_cnt; - unsigned long rx_mc_byte_cnt; - unsigned long rx_err_addr; - - /* tx */ - unsigned long tx_ok; - unsigned long tx_bcast; - unsigned long tx_mcast; - unsigned long tx_pause; - unsigned long tx_exc_defer; - unsigned long tx_ctrl; - unsigned long tx_defer; - unsigned long tx_byte_cnt; - unsigned long tx_sz_64B; - unsigned long tx_sz_127B; - unsigned long tx_sz_255B; - unsigned long tx_sz_511B; - unsigned long tx_sz_1023B; - unsigned long tx_sz_1518B; - unsigned long tx_sz_max; - unsigned long tx_single_col; - unsigned long tx_multi_col; - unsigned long tx_late_col; - unsigned long tx_abort_col; - unsigned long tx_underrun; - unsigned long tx_trd_eop; - unsigned long tx_len_err; - unsigned long tx_trunc; - unsigned long tx_bc_byte_cnt; - unsigned long tx_mc_byte_cnt; - unsigned long update; -}; - -#define SPEED_0 0 -#define HALF_DUPLEX 1 -#define FULL_DUPLEX 2 -#define ALX_MAX_SETUP_LNK_CYCLE 50 - -#define ALX_SPEED_TO_ETHADV(_speed) (\ -(_speed) == SPEED_1000 + FULL_DUPLEX ? ADVERTISED_1000baseT_Full : \ -(_speed) == SPEED_100 + FULL_DUPLEX ? ADVERTISED_100baseT_Full : \ -(_speed) == SPEED_100 + HALF_DUPLEX ? ADVERTISED_10baseT_Half : \ -(_speed) == SPEED_10 + FULL_DUPLEX ? ADVERTISED_10baseT_Full : \ -(_speed) == SPEED_10 + HALF_DUPLEX ? ADVERTISED_10baseT_Half : \ -0) - - -#define ALX_DEF_RXBUF_SIZE 1536 -#define ALX_MAX_JUMBO_PKT_SIZE (9*1024) -#define ALX_MAX_TSO_PKT_SIZE (7*1024) -#define ALX_MAX_FRAME_SIZE ALX_MAX_JUMBO_PKT_SIZE -#define ALX_MIN_FRAME_SIZE 68 -#define ALX_RAW_MTU(_mtu) (_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN) - -#define ALX_MAX_RX_QUEUES 8 /* for RSS */ -#define ALX_MAX_TX_QUEUES 4 /* multiple tx queues */ -#define ALX_MAX_HANDLED_INTRS 5 - -#define ALX_ISR_MISC (\ - ALX_ISR_PCIE_LNKDOWN | \ - ALX_ISR_PHY | \ - ALX_ISR_DMAW | \ - ALX_ISR_DMAR | \ - ALX_ISR_SMB | \ - ALX_ISR_MANU | \ - ALX_ISR_TIMER | \ - ALX_ISR_RXF_OV | \ - ALX_ISR_TXF_UR | \ - ALX_ISR_RFD_UR) - -#define ALX_ISR_FATAL (\ - ALX_ISR_PCIE_LNKDOWN | \ - ALX_ISR_DMAW | \ - ALX_ISR_DMAR) - -#define ALX_ISR_ALERT (\ - ALX_ISR_RXF_OV | \ - ALX_ISR_TXF_UR | \ - ALX_ISR_RFD_UR) - -#define ALX_ISR_ALL_QUEUES (\ - ALX_ISR_TX_Q0 | \ - ALX_ISR_TX_Q1 | \ - ALX_ISR_TX_Q2 | \ - ALX_ISR_TX_Q3 | \ - ALX_ISR_RX_Q0 | \ - ALX_ISR_RX_Q1 | \ - ALX_ISR_RX_Q2 | \ - ALX_ISR_RX_Q3 | \ - ALX_ISR_RX_Q4 | \ - ALX_ISR_RX_Q5 | \ - ALX_ISR_RX_Q6 | \ - ALX_ISR_RX_Q7) - -#define ALX_MAX_MSIX_INTRS 16 /* maximum interrupt vectors for msix */ #define ALX_WATCHDOG_TIME (5 * HZ) -/* - * alx_ring_header is a single, contiguous block of memory space +/* alx_ring_header is a single, contiguous block of memory space * used by the three descriptor rings (tpd, rfd, rrd) */ struct alx_ring_header { - void *desc; /* virt addr */ - dma_addr_t dma; /* phy addr */ - u32 size; /* length in bytes */ + /* virt addr */ + void *desc; + /* phy addr */ + dma_addr_t dma; + u32 size; }; -/* - * alx_buffer wraps around a pointer to a socket buffer +/* alx_buffer wraps around a pointer to a socket buffer * so a DMA physical address can be stored along with the skb */ struct alx_buffer { - struct sk_buff *skb; /* socket buffer */ - DEFINE_DMA_UNMAP_ADDR(dma); /* DMA address */ - DEFINE_DMA_UNMAP_LEN(size); /* buffer size */ - u16 flags; /* information of this buffer */ + struct sk_buff *skb; + /* DMA address */ + DEFINE_DMA_UNMAP_ADDR(dma); + /* buffer size */ + DEFINE_DMA_UNMAP_LEN(size); + /* information of this buffer */ + u16 flags; }; #define ALX_BUF_TX_FIRSTFRAG 0x1 /* rx queue */ struct alx_rx_queue { struct net_device *netdev; - struct device *dev; /* device pointer for dma operation */ - struct rrd_desc *rrd_hdr; /* rrd ring virtual addr */ - dma_addr_t rrd_dma; /* rrd ring physical addr */ - struct rfd_desc *rfd_hdr; /* rfd ring virtual addr */ - dma_addr_t rfd_dma; /* rfd ring physical addr */ - struct alx_buffer *bf_info; /* info for rx-skbs */ - - u16 count; /* number of ring elements */ - u16 pidx; /* rfd producer index */ - u16 cidx; /* rfd consumer index */ + /* device pointer for dma operation */ + struct device *dev; + /* rrd ring virtual addr */ + struct rrd_desc *rrd_hdr; + /* rrd ring physical addr */ + dma_addr_t rrd_dma; + /* rfd ring virtual addr */ + struct rfd_desc *rfd_hdr; + /* rfd ring physical addr */ + dma_addr_t rfd_dma; + /* info for rx-skbs */ + struct alx_buffer *bf_info; + + /* number of ring elements */ + u16 count; + /* rfd producer index */ + u16 pidx; + /* rfd consumer index */ + u16 cidx; u16 rrd_cidx; - u16 p_reg; /* register saving producer index */ - u16 c_reg; /* register saving consumer index */ - u16 qidx; /* queue index */ + /* register saving producer index */ + u16 p_reg; + /* register saving consumer index */ + u16 c_reg; + /* queue index */ + u16 qidx; unsigned long flag; struct sk_buff_head list; }; #define ALX_RQ_USING 1 #define ALX_RX_ALLOC_THRESH 32 + /* tx queue */ struct alx_tx_queue { struct net_device *netdev; - struct device *dev; /* device pointer for dma operation */ - struct tpd_desc *tpd_hdr; /* tpd ring virtual addr */ - dma_addr_t tpd_dma; /* tpd ring physical addr */ - struct alx_buffer *bf_info; /* info for tx-skbs pending on HW */ - u16 count; /* number of ring elements */ - u16 pidx; /* producer index */ - atomic_t cidx; /* consumer index */ - u16 p_reg; /* register saving producer index */ - u16 c_reg; /* register saving consumer index */ - u16 qidx; /* queue index */ + /* device pointer for dma operation */ + struct device *dev; + /* tpd ring virtual addr */ + struct tpd_desc *tpd_hdr; + dma_addr_t tpd_dma; + /* info for tx-skbs pending on HW */ + struct alx_buffer *bf_info; + /* number of ring elements */ + u16 count; + /* producer index */ + u16 pidx; + /* consumer index */ + atomic_t cidx; + /* register saving producer index */ + u16 p_reg; + /* register saving consumer index */ + u16 c_reg; + /* queue index */ + u16 qidx; }; #define ALX_TX_WAKEUP_THRESH(_tq) ((_tq)->count / 4) @@ -512,46 +118,36 @@ struct alx_napi { }; enum ALX_FLAGS { - ALX_FLAG_CAP_GIGA = 0, /* support gigabit speed */ - ALX_FLAG_CAP_PTP, /* support 1588 */ - ALX_FLAG_CAP_AZ, /* support EEE */ - ALX_FLAG_CAP_L0S, /* support ASPM L0S */ - ALX_FLAG_CAP_L1, /* support ASPM L1 */ - ALX_FLAG_CAP_SWOI, /* support SWOI feature */ - ALX_FLAG_CAP_RSS, /* support RSS */ - ALX_FLAG_CAP_MSIX, /* support MSI-X */ - ALX_FLAG_CAP_MTQ, /* support Multi-TX-Q */ - ALX_FLAG_CAP_MRQ, /* support Multi-RX-Q */ - ALX_FLAG_USING_MSIX, /* using MSI-X */ - ALX_FLAG_USING_MSI, /* using MSI */ - ALX_FLAG_RESETING, /* hw is in reset process */ - ALX_FLAG_TESTING, /* self testing */ - ALX_FLAG_HALT, /* hw is down */ - ALX_FLAG_FPGA, /* FPGA, not ASIC */ - ALX_FLAG_TASK_PENDING, /* work is pending */ - ALX_FLAG_TASK_CHK_LINK, /* check PHY link */ - ALX_FLAG_TASK_RESET, /* reset whole chip */ - ALX_FLAG_TASK_UPDATE_SMB, /* update SMB */ + ALX_FLAG_USING_MSIX = 0, + ALX_FLAG_USING_MSI, + ALX_FLAG_RESETING, + ALX_FLAG_TESTING, + ALX_FLAG_HALT, + ALX_FLAG_FPGA, + ALX_FLAG_TASK_PENDING, + ALX_FLAG_TASK_CHK_LINK, + ALX_FLAG_TASK_RESET, + ALX_FLAG_TASK_UPDATE_SMB, ALX_FLAG_NUMBER_OF_FLAGS, }; + +struct alx_hw; /* *board specific private data structure */ struct alx_adapter { - u8 __iomem *hw_addr; /* memory mapped PCI base address */ - - u8 mac_addr[ETH_ALEN]; /* current mac address */ - u8 perm_addr[ETH_ALEN]; /* permanent mac address */ - struct net_device *netdev; struct pci_dev *pdev; - u16 bd_number; /* board number;*/ + struct alx_hw hw; + + u16 bd_number; - unsigned int nr_vec; /* totally msix vectors */ - struct msix_entry *msix_ent; /* msix entries */ + /* totally msix vectors */ + int nr_vec; + struct msix_entry *msix_ent; /* all descriptor memory */ struct alx_ring_header ring_header; @@ -560,104 +156,34 @@ struct alx_adapter { int rxbuf_size; struct alx_napi *qnapi[8]; - int nr_txq; /* number of napi for TX-Q */ - int nr_rxq; /* number of napi for RX-Q */ - int nr_napi; /* total napi for TX-Q/RX-Q */ - u16 mtu; /* MTU */ - u16 imt; /* interrupt moderation timer */ - u8 dma_chnl; /* number of DMA channels */ - u8 max_dma_chnl; - u32 rx_ctrl; /* main rx control */ - u32 mc_hash[2]; /* multicast addr hash table */ - - u8 rss_key[40]; /* RSS hash algorithm key */ - u32 rss_idt[32]; /* RSS indirection table */ - u16 rss_idt_size; /* RSS indirection table size */ - u8 rss_hash_type; /* RSS hash type */ - - u32 wrr[ALX_MAX_TX_QUEUES]; /* weight round robin - * for multiple-tx-Q */ - u32 wrr_ctrl; /* prioirty control */ - - u32 imask; /* interrupt mask for ALX_IMR */ - u32 smb_timer; /* statistic counts refresh - * timeout, million-seconds */ - spinlock_t smb_lock; /* lock for updating stats */ - - bool link_up; /* link up flag */ - u16 link_speed; /* current link speed */ - u8 link_duplex; /* current link duplex */ - - u32 adv_cfg; /* auto-neg advertisement - * or force mode config - */ - u8 flowctrl; /* flow control */ - - struct work_struct task; /* any delayed work */ - struct net_device_stats net_stats; /* statistics counters */ - struct alx_hw_stats hw_stats; /* statistics counters, - * same order with hw - */ - u32 sleep_ctrl; /* control used when sleep */ - atomic_t irq_sem; /* interrupt sync */ - u16 msg_enable; /* msg level */ - - DECLARE_BITMAP(flags, ALX_FLAG_NUMBER_OF_FLAGS); - - spinlock_t mdio_lock; /* used for MII bus access */ - struct mdio_if_info mdio; - u16 phy_id[2]; - - bool lnk_patch; /* PHY link patch flag */ - bool hib_patch; /* PHY hibernation patch flag */ + /* number of napi for TX-Q */ + int nr_txq; + /* number of napi for RX-Q */ + int nr_rxq; + /* number independent hw RX-Q */ + int nr_hwrxq; + /* total napi for TX-Q/RX-Q */ + int nr_napi; + + /* lock for updating stats */ + spinlock_t smb_lock; + + struct work_struct task; + struct net_device_stats net_stats; + atomic_t irq_sem; + u16 msg_enable; + + unsigned long flags; }; -#define ALX_VID(_a) ((_a)->pdev->vendor) -#define ALX_DID(_a) ((_a)->pdev->device) -#define ALX_SUB_VID(_a) ((_a)->pdev->subsystem_vendor) -#define ALX_SUB_DID(_a) ((_a)->pdev->subsystem_device) -#define ALX_REVID(_a) ((_a)->pdev->revision >> ALX_PCI_REVID_SHIFT) -#define ALX_WITH_CR(_a) ((_a)->pdev->revision & 1) #define ALX_FLAG(_adpt, _FLAG) (\ - test_bit(ALX_FLAG_##_FLAG, (_adpt)->flags)) + test_bit(ALX_FLAG_##_FLAG, &(_adpt)->flags)) #define ALX_FLAG_SET(_adpt, _FLAG) (\ - set_bit(ALX_FLAG_##_FLAG, (_adpt)->flags)) + set_bit(ALX_FLAG_##_FLAG, &(_adpt)->flags)) #define ALX_FLAG_CLEAR(_adpt, _FLAG) (\ - clear_bit(ALX_FLAG_##_FLAG, (_adpt)->flags)) - - -/* write to 8bit register via pci memory space */ -#define ALX_MEM_W8(s, reg, val) (writeb((val), ((s)->hw_addr + reg))) - -/* read from 8bit register via pci memory space */ -#define ALX_MEM_R8(s, reg, pdat) (\ - *(u8 *)(pdat) = readb((s)->hw_addr + reg)) - -/* write to 16bit register via pci memory space */ -#define ALX_MEM_W16(s, reg, val) (writew((val), ((s)->hw_addr + reg))) - -/* read from 16bit register via pci memory space */ -#define ALX_MEM_R16(s, reg, pdat) (\ - *(u16 *)(pdat) = readw((s)->hw_addr + reg)) - -/* write to 32bit register via pci memory space */ -#define ALX_MEM_W32(s, reg, val) (writel((val), ((s)->hw_addr + reg))) - -/* read from 32bit register via pci memory space */ -#define ALX_MEM_R32(s, reg, pdat) (\ - *(u32 *)(pdat) = readl((s)->hw_addr + reg)) - -/* read from 16bit register via pci config space */ -#define ALX_CFG_R16(s, reg, pdat) (\ - pci_read_config_word((s)->pdev, (reg), (pdat))) - -/* write to 16bit register via pci config space */ -#define ALX_CFG_W16(s, reg, val) (\ - pci_write_config_word((s)->pdev, (reg), (val))) + clear_bit(ALX_FLAG_##_FLAG, &(_adpt)->flags)) -/* flush regs */ -#define ALX_MEM_FLUSH(s) (readl((s)->hw_addr)) /* needed by alx_ethtool.c */ extern void alx_reinit(struct alx_adapter *adpt); @@ -665,4 +191,4 @@ extern void __devinit alx_set_ethtool_ops(struct net_device *dev); extern char alx_drv_name[]; -#endif /* _ALX_H_ */ +#endif diff --git a/src/alx_ethtool.c b/src/alx_ethtool.c index d32372c..0c04f56 100644 --- a/src/alx_ethtool.c +++ b/src/alx_ethtool.c @@ -15,14 +15,20 @@ */ #include <linux/pci.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> #include <linux/ethtool.h> +#include <linux/mdio.h> +#include "alx_reg.h" +#include "alx_hw.h" #include "alx.h" static int alx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; ecmd->supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full | @@ -30,22 +36,22 @@ static int alx_get_settings(struct net_device *netdev, SUPPORTED_100baseT_Full | SUPPORTED_Autoneg | SUPPORTED_TP); - if (ALX_FLAG(adpt, CAP_GIGA)) + if (ALX_CAP(hw, GIGA)) ecmd->supported |= SUPPORTED_1000baseT_Full; ecmd->advertising = ADVERTISED_TP; - if (adpt->adv_cfg & ADVERTISED_Autoneg) - ecmd->advertising |= adpt->adv_cfg; + if (hw->adv_cfg & ADVERTISED_Autoneg) + ecmd->advertising |= hw->adv_cfg; ecmd->port = PORT_TP; ecmd->phy_address = 0; - ecmd->autoneg = (adpt->adv_cfg & ADVERTISED_Autoneg) ? + ecmd->autoneg = (hw->adv_cfg & ADVERTISED_Autoneg) ? AUTONEG_ENABLE : AUTONEG_DISABLE; ecmd->transceiver = XCVR_INTERNAL; - if (adpt->link_up) { - ethtool_cmd_speed_set(ecmd, adpt->link_speed); - ecmd->duplex = adpt->link_duplex; + if (hw->link_up) { + ethtool_cmd_speed_set(ecmd, hw->link_speed); + ecmd->duplex = hw->link_duplex; } else { ethtool_cmd_speed_set(ecmd, -1); ecmd->duplex = -1; @@ -58,10 +64,11 @@ static int alx_set_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; u32 adv_cfg; int err = 0; - while (test_and_set_bit(ALX_FLAG_RESETING, adpt->flags)) + while (test_and_set_bit(ALX_FLAG_RESETING, &adpt->flags)) msleep(20); if (ecmd->autoneg == AUTONEG_ENABLE) { @@ -71,7 +78,7 @@ static int alx_set_settings(struct net_device *netdev, return -EINVAL; } adv_cfg = ecmd->advertising | ADVERTISED_Autoneg; - } else { /* force mode */ + } else { int speed = ethtool_cmd_speed(ecmd); switch (speed + ecmd->duplex) { @@ -94,8 +101,8 @@ static int alx_set_settings(struct net_device *netdev, } if (!err) { - adpt->adv_cfg = adv_cfg; - err = alx_setup_speed_duplex(adpt, adv_cfg, adpt->flowctrl); + hw->adv_cfg = adv_cfg; + err = alx_setup_speed_duplex(hw, adv_cfg, hw->flowctrl); if (err) { dev_warn(&adpt->pdev->dev, "config PHY speed/duplex failed,err=%d\n", @@ -113,19 +120,20 @@ static void alx_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; - if (adpt->flowctrl & ALX_FC_ANEG && - adpt->adv_cfg & ADVERTISED_Autoneg) + if (hw->flowctrl & ALX_FC_ANEG && + hw->adv_cfg & ADVERTISED_Autoneg) pause->autoneg = AUTONEG_ENABLE; else pause->autoneg = AUTONEG_DISABLE; - if (adpt->flowctrl & ALX_FC_TX) + if (hw->flowctrl & ALX_FC_TX) pause->tx_pause = 1; else pause->tx_pause = 0; - if (adpt->flowctrl & ALX_FC_RX) + if (hw->flowctrl & ALX_FC_RX) pause->rx_pause = 1; else pause->rx_pause = 0; @@ -136,6 +144,7 @@ static int alx_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; int err = 0; bool reconfig_phy = false; u8 fc = 0; @@ -147,20 +156,20 @@ static int alx_set_pauseparam(struct net_device *netdev, if (pause->autoneg) fc |= ALX_FC_ANEG; - while (test_and_set_bit(ALX_FLAG_RESETING, adpt->flags)) + while (test_and_set_bit(ALX_FLAG_RESETING, &adpt->flags)) msleep(20); /* restart auto-neg for auto-mode */ - if (adpt->adv_cfg & ADVERTISED_Autoneg) { - if (!((fc ^ adpt->flowctrl) & ALX_FC_ANEG)) - reconfig_phy = true; /* auto/force change */ - if (fc & adpt->flowctrl & ALX_FC_ANEG && - (fc ^ adpt->flowctrl) & (ALX_FC_RX | ALX_FC_TX)) + if (hw->adv_cfg & ADVERTISED_Autoneg) { + if (!((fc ^ hw->flowctrl) & ALX_FC_ANEG)) + reconfig_phy = true; + if (fc & hw->flowctrl & ALX_FC_ANEG && + (fc ^ hw->flowctrl) & (ALX_FC_RX | ALX_FC_TX)) reconfig_phy = true; } if (reconfig_phy) { - err = alx_setup_speed_duplex(adpt, adpt->adv_cfg, fc); + err = alx_setup_speed_duplex(hw, hw->adv_cfg, fc); if (err) { dev_warn(&adpt->pdev->dev, "config PHY flow control failed,err=%d\n", @@ -170,10 +179,10 @@ static int alx_set_pauseparam(struct net_device *netdev, } /* flow control on mac */ - if ((fc ^ adpt->flowctrl) & (ALX_FC_RX | ALX_FC_TX)) - alx_cfg_mac_fc(adpt, fc); + if ((fc ^ hw->flowctrl) & (ALX_FC_RX | ALX_FC_TX)) + alx_cfg_mac_fc(hw, fc); - adpt->flowctrl = fc; + hw->flowctrl = fc; ALX_FLAG_CLEAR(adpt, RESETING); @@ -237,18 +246,19 @@ static void alx_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *buff) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; u32 *p = buff; int i; - regs->version = (ALX_DID(adpt) << 16) | (ALX_REVID(adpt) << 8) | 1; + regs->version = (ALX_DID(hw) << 16) | (ALX_REVID(hw) << 8) | 1; memset(buff, 0, (ARRAY_SIZE(hw_regs) + 1) * 4); for (i = 0; i < ARRAY_SIZE(hw_regs); i++, p++) - ALX_MEM_R32(adpt, hw_regs[i], p); + ALX_MEM_R32(hw, hw_regs[i], p); /* last one for PHY Link Status */ - alx_read_phy_reg(adpt, MII_BMSR, (u16 *)p); + alx_read_phy_reg(hw, MII_BMSR, (u16 *)p); } static void alx_get_drvinfo(struct net_device *netdev, @@ -270,34 +280,38 @@ static void alx_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; wol->supported = WAKE_MAGIC | WAKE_PHY; wol->wolopts = 0; - if (adpt->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) + if (hw->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) wol->wolopts |= WAKE_MAGIC; - if (adpt->sleep_ctrl & ALX_SLEEP_WOL_PHY) + if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) wol->wolopts |= WAKE_PHY; - netdev_info(adpt->netdev, "wolopts = %x\n", wol->wolopts); + netif_info(adpt, wol, adpt->netdev, + "wolopts = %x\n", + wol->wolopts); } static int alx_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST)) return -EOPNOTSUPP; - adpt->sleep_ctrl = 0; + hw->sleep_ctrl = 0; if (wol->wolopts & WAKE_MAGIC) - adpt->sleep_ctrl |= ALX_SLEEP_WOL_MAGIC; + hw->sleep_ctrl |= ALX_SLEEP_WOL_MAGIC; if (wol->wolopts & WAKE_PHY) - adpt->sleep_ctrl |= ALX_SLEEP_WOL_PHY; + hw->sleep_ctrl |= ALX_SLEEP_WOL_PHY; - device_set_wakeup_enable(&adpt->pdev->dev, adpt->sleep_ctrl); + device_set_wakeup_enable(&adpt->pdev->dev, hw->sleep_ctrl); return 0; } diff --git a/src/alx_hw.c b/src/alx_hw.c index 6310984..7a220c6 100644 --- a/src/alx_hw.c +++ b/src/alx_hw.c @@ -13,19 +13,18 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ - -#include <linux/pci_regs.h> -#include <linux/mii.h> -#include <linux/netdevice.h> +#include <linux/pci.h> +#include <linux/crc32.h> #include <linux/etherdevice.h> +#include <linux/mdio.h> -#include "alx.h" - -#define ALX_REV_A(_r) ((_r) == ALX_REV_A0 || (_r) == ALX_REV_A1) +#include "alx_reg.h" +#include "alx_hw.h" +#define ALX_REV_A(_r) ((_r) == ALX_REV_A0 || (_r) == ALX_REV_A1) /* get permanent mac address from */ -int alx_get_perm_macaddr(struct alx_adapter *adpt, u8 *addr) +int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr) { u32 val, mac0, mac1; u16 flag, i; @@ -39,8 +38,8 @@ int alx_get_perm_macaddr(struct alx_adapter *adpt, u8 *addr) read_mcadr: /* get it from register first */ - ALX_MEM_R32(adpt, ALX_STAD0, &mac0); - ALX_MEM_R32(adpt, ALX_STAD1, &mac1); + ALX_MEM_R32(hw, ALX_STAD0, &mac0); + ALX_MEM_R32(hw, ALX_STAD1, &mac1); /* addr should be big-endian */ *(__be32 *)(addr + 2) = cpu_to_be32(mac0); @@ -52,17 +51,17 @@ read_mcadr: if ((flag & INTN_LOADED) == 0) { /* load from efuse ? */ for (i = 0; i < ALX_SLD_MAX_TO; i++) { - ALX_MEM_R32(adpt, ALX_SLD, &val); + ALX_MEM_R32(hw, ALX_SLD, &val); if ((val & (ALX_SLD_STAT | ALX_SLD_START)) == 0) break; mdelay(1); } if (i == ALX_SLD_MAX_TO) goto out; - ALX_MEM_W32(adpt, ALX_SLD, val | ALX_SLD_START); + ALX_MEM_W32(hw, ALX_SLD, val | ALX_SLD_START); for (i = 0; i < ALX_SLD_MAX_TO; i++) { mdelay(1); - ALX_MEM_R32(adpt, ALX_SLD, &val); + ALX_MEM_R32(hw, ALX_SLD, &val); if ((val & ALX_SLD_START) == 0) break; } @@ -73,11 +72,11 @@ read_mcadr: } if ((flag & EXTN_LOADED) == 0) { - ALX_MEM_R32(adpt, ALX_EFLD, &val); + ALX_MEM_R32(hw, ALX_EFLD, &val); if ((val & (ALX_EFLD_F_EXIST | ALX_EFLD_E_EXIST)) != 0) { /* load from eeprom/flash ? */ for (i = 0; i < ALX_SLD_MAX_TO; i++) { - ALX_MEM_R32(adpt, ALX_EFLD, &val); + ALX_MEM_R32(hw, ALX_EFLD, &val); if ((val & (ALX_EFLD_STAT | ALX_EFLD_START)) == 0) { break; @@ -86,10 +85,10 @@ read_mcadr: } if (i == ALX_SLD_MAX_TO) goto out; - ALX_MEM_W32(adpt, ALX_EFLD, val | ALX_EFLD_START); + ALX_MEM_W32(hw, ALX_EFLD, val | ALX_EFLD_START); for (i = 0; i < ALX_SLD_MAX_TO; i++) { mdelay(1); - ALX_MEM_R32(adpt, ALX_EFLD, &val); + ALX_MEM_R32(hw, ALX_EFLD, &val); if ((val & ALX_EFLD_START) == 0) break; } @@ -104,42 +103,60 @@ out: return ALX_ERR_ALOAD; } -void alx_set_macaddr(struct alx_adapter *adpt, u8 *addr) +void alx_set_macaddr(struct alx_hw *hw, u8 *addr) { u32 val; - /* for example: 00-0B-6A-F6-00-DC - * STAD0=6AF600DC, STAD1=000B. - */ + /* for example: 00-0B-6A-F6-00-DC * STAD0=6AF600DC, STAD1=000B */ val = be32_to_cpu(*(__be32 *)(addr + 2)); - ALX_MEM_W32(adpt, ALX_STAD0, val); + ALX_MEM_W32(hw, ALX_STAD0, val); val = be16_to_cpu(*(__be16 *)addr); - ALX_MEM_W32(adpt, ALX_STAD1, val); + ALX_MEM_W32(hw, ALX_STAD1, val); +} + +void alx_add_mc_addr(struct alx_hw *hw, u8 *addr) +{ + u32 crc32, bit, reg; + + crc32 = ether_crc(ETH_ALEN, addr); + + /* The HASH Table is a register array of 2 32-bit registers. + * It is treated like an array of 64 bits. We want to set + * bit BitArray[hash_value]. So we figure out what register + * the bit is in, read it, OR in the new bit, then write + * back the new value. The register is determined by the + * upper 7 bits of the hash value and the bit within that + * register are determined by the lower 5 bits of the value. + */ + reg = (crc32 >> 31) & 0x1; + bit = (crc32 >> 26) & 0x1F; + + hw->mc_hash[reg] |= (0x1 << bit); } -void alx_enable_osc(struct alx_adapter *adpt) +void alx_enable_osc(struct alx_hw *hw) { u32 val; /* rising edge */ - ALX_MEM_R32(adpt, ALX_MISC, &val); - ALX_MEM_W32(adpt, ALX_MISC, val & ~ALX_MISC_INTNLOSC_OPEN); - ALX_MEM_W32(adpt, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); + ALX_MEM_R32(hw, ALX_MISC, &val); + ALX_MEM_W32(hw, ALX_MISC, val & ~ALX_MISC_INTNLOSC_OPEN); + ALX_MEM_W32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); } -void alx_reset_osc(struct alx_adapter *adpt, u8 rev) +void alx_reset_osc(struct alx_hw *hw, u8 rev) { u32 val, val2; /* clear Internal OSC settings, switching OSC by hw itself */ - ALX_MEM_R32(adpt, ALX_MISC3, &val); - ALX_MEM_W32(adpt, ALX_MISC3, + ALX_MEM_R32(hw, ALX_MISC3, &val); + ALX_MEM_W32(hw, ALX_MISC3, (val & ~ALX_MISC3_25M_BY_SW) | ALX_MISC3_25M_NOTO_INTNL); /* 25M clk from chipset may be unstable 1s after de-assert of * PERST, driver need re-calibrate before enter Sleep for WoL */ - ALX_MEM_R32(adpt, ALX_MISC, &val); + ALX_MEM_R32(hw, ALX_MISC, &val); if (rev == ALX_REV_B0) { /* restore over current protection def-val, * this val could be reset by MAC-RST @@ -147,27 +164,27 @@ void alx_reset_osc(struct alx_adapter *adpt, u8 rev) FIELD_SET32(val, ALX_MISC_PSW_OCP, ALX_MISC_PSW_OCP_DEF); /* a 0->1 change will update the internal val of osc */ val &= ~ALX_MISC_INTNLOSC_OPEN; - ALX_MEM_W32(adpt, ALX_MISC, val); - ALX_MEM_W32(adpt, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); + ALX_MEM_W32(hw, ALX_MISC, val); + ALX_MEM_W32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); /* hw will automatically dis OSC after cab. */ - ALX_MEM_R32(adpt, ALX_MSIC2, &val2); + ALX_MEM_R32(hw, ALX_MSIC2, &val2); val2 &= ~ALX_MSIC2_CALB_START; - ALX_MEM_W32(adpt, ALX_MSIC2, val2); - ALX_MEM_W32(adpt, ALX_MSIC2, val2 | ALX_MSIC2_CALB_START); + ALX_MEM_W32(hw, ALX_MSIC2, val2); + ALX_MEM_W32(hw, ALX_MSIC2, val2 | ALX_MSIC2_CALB_START); } else { val &= ~ALX_MISC_INTNLOSC_OPEN; /* disable isoloate for A0 */ if (ALX_REV_A(rev)) val &= ~ALX_MISC_ISO_EN; - ALX_MEM_W32(adpt, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); - ALX_MEM_W32(adpt, ALX_MISC, val); + ALX_MEM_W32(hw, ALX_MISC, val | ALX_MISC_INTNLOSC_OPEN); + ALX_MEM_W32(hw, ALX_MISC, val); } udelay(20); } -int alx_reset_mac(struct alx_adapter *adpt) +int alx_reset_mac(struct alx_hw *hw) { u32 val, pmctrl; int i, ret; @@ -175,46 +192,46 @@ int alx_reset_mac(struct alx_adapter *adpt) bool a_cr; pmctrl = 0; - rev = (u8)ALX_REVID(adpt); - a_cr = ALX_REV_A(rev) && ALX_WITH_CR(adpt); + rev = (u8)ALX_REVID(hw); + a_cr = ALX_REV_A(rev) && ALX_WITH_CR(hw); /* disable all interrupts, RXQ/TXQ */ - ALX_MEM_W32(adpt, ALX_MSIX_MASK, 0xFFFFFFFF); /* msi-x */ - ALX_MEM_W32(adpt, ALX_IMR, 0); - ALX_MEM_W32(adpt, ALX_ISR, ALX_ISR_DIS); + ALX_MEM_W32(hw, ALX_MSIX_MASK, 0xFFFFFFFF); + ALX_MEM_W32(hw, ALX_IMR, 0); + ALX_MEM_W32(hw, ALX_ISR, ALX_ISR_DIS); - ret = alx_stop_mac(adpt); + ret = alx_stop_mac(hw); if (ret) return ret; /* mac reset workaroud */ - ALX_MEM_W32(adpt, ALX_RFD_PIDX, 1); + ALX_MEM_W32(hw, ALX_RFD_PIDX, 1); /* dis l0s/l1 before mac reset */ if (a_cr) { - ALX_MEM_R32(adpt, ALX_PMCTRL, &pmctrl); + ALX_MEM_R32(hw, ALX_PMCTRL, &pmctrl); if ((pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN)) != 0) { - ALX_MEM_W32(adpt, ALX_PMCTRL, + ALX_MEM_W32(hw, ALX_PMCTRL, pmctrl & ~(ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN)); } } /* reset whole mac safely */ - ALX_MEM_R32(adpt, ALX_MASTER, &val); - ALX_MEM_W32(adpt, ALX_MASTER, + ALX_MEM_R32(hw, ALX_MASTER, &val); + ALX_MEM_W32(hw, ALX_MASTER, val | ALX_MASTER_DMA_MAC_RST | ALX_MASTER_OOB_DIS); /* make sure it's real idle */ udelay(10); for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) { - ALX_MEM_R32(adpt, ALX_RFD_PIDX, &val); + ALX_MEM_R32(hw, ALX_RFD_PIDX, &val); if (val == 0) break; udelay(10); } for (; i < ALX_DMA_MAC_RST_TO; i++) { - ALX_MEM_R32(adpt, ALX_MASTER, &val); + ALX_MEM_R32(hw, ALX_MASTER, &val); if ((val & ALX_MASTER_DMA_MAC_RST) == 0) break; udelay(10); @@ -225,32 +242,32 @@ int alx_reset_mac(struct alx_adapter *adpt) if (a_cr) { /* set ALX_MASTER_PCLKSEL_SRDS (affect by soft-rst, PERST) */ - ALX_MEM_W32(adpt, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS); + ALX_MEM_W32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS); /* resoter l0s / l1 */ if (pmctrl & (ALX_PMCTRL_L1_EN | ALX_PMCTRL_L0S_EN)) - ALX_MEM_W32(adpt, ALX_PMCTRL, pmctrl); + ALX_MEM_W32(hw, ALX_PMCTRL, pmctrl); } - alx_reset_osc(adpt, rev); + alx_reset_osc(hw, rev); /* clear Internal OSC settings, switching OSC by hw itself, * disable isoloate for A version */ - ALX_MEM_R32(adpt, ALX_MISC3, &val); - ALX_MEM_W32(adpt, ALX_MISC3, + ALX_MEM_R32(hw, ALX_MISC3, &val); + ALX_MEM_W32(hw, ALX_MISC3, (val & ~ALX_MISC3_25M_BY_SW) | ALX_MISC3_25M_NOTO_INTNL); - ALX_MEM_R32(adpt, ALX_MISC, &val); + ALX_MEM_R32(hw, ALX_MISC, &val); val &= ~ALX_MISC_INTNLOSC_OPEN; if (ALX_REV_A(rev)) val &= ~ALX_MISC_ISO_EN; - ALX_MEM_W32(adpt, ALX_MISC, val); + ALX_MEM_W32(hw, ALX_MISC, val); udelay(20); /* driver control speed/duplex, hash-alg */ - ALX_MEM_W32(adpt, ALX_MAC_CTRL, adpt->rx_ctrl); + ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl); /* clk sw */ - ALX_MEM_R32(adpt, ALX_SERDES, &val); - ALX_MEM_W32(adpt, ALX_SERDES, + ALX_MEM_R32(hw, ALX_SERDES, &val); + ALX_MEM_W32(hw, ALX_SERDES, val | ALX_SERDES_MACCLK_SLWDWN | ALX_SERDES_PHYCLK_SLWDWN); return ret; @@ -260,14 +277,14 @@ int alx_reset_mac(struct alx_adapter *adpt) * completely reset phy, all settings/workaround will be re-configureed * hib_en: enable/disable hibernation on PHY */ -void alx_reset_phy(struct alx_adapter *adpt, bool hib_en) +void alx_reset_phy(struct alx_hw *hw, bool hib_en) { int i; u32 val; u16 phy_val; /* (DSP)reset PHY core */ - ALX_MEM_R32(adpt, ALX_PHY_CTRL, &val); + ALX_MEM_R32(hw, ALX_PHY_CTRL, &val); val &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_IDDQ | ALX_PHY_CTRL_GATE_25M | ALX_PHY_CTRL_POWER_DOWN | ALX_PHY_CTRL_CLS); @@ -277,9 +294,9 @@ void alx_reset_phy(struct alx_adapter *adpt, bool hib_en) val |= (ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN); else val &= ~(ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN); - ALX_MEM_W32(adpt, ALX_PHY_CTRL, val); - udelay(10); /* 5us is enough */ - ALX_MEM_W32(adpt, ALX_PHY_CTRL, val | ALX_PHY_CTRL_DSPRST_OUT); + ALX_MEM_W32(hw, ALX_PHY_CTRL, val); + udelay(10); + ALX_MEM_W32(hw, ALX_PHY_CTRL, val | ALX_PHY_CTRL_DSPRST_OUT); /* delay 800us */ for (i = 0; i < ALX_PHY_CTRL_DSPRST_TO; i++) @@ -287,68 +304,68 @@ void alx_reset_phy(struct alx_adapter *adpt, bool hib_en) /* phy power saving & hib */ if (hib_en) { - alx_write_phy_dbg(adpt, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF); - alx_write_phy_dbg(adpt, ALX_MIIDBG_SYSMODCTRL, + alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF); + alx_write_phy_dbg(hw, ALX_MIIDBG_SYSMODCTRL, ALX_SYSMODCTRL_IECHOADJ_DEF); - alx_write_phy_ext(adpt, ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS, + alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_VDRVBIAS, ALX_VDRVBIAS_DEF); } else { - alx_write_phy_dbg(adpt, ALX_MIIDBG_LEGCYPS, + alx_write_phy_dbg(hw, ALX_MIIDBG_LEGCYPS, ALX_LEGCYPS_DEF & ~ALX_LEGCYPS_EN); - alx_write_phy_dbg(adpt, ALX_MIIDBG_HIBNEG, ALX_HIBNEG_NOHIB); - alx_write_phy_dbg(adpt, ALX_MIIDBG_GREENCFG, ALX_GREENCFG_DEF); + alx_write_phy_dbg(hw, ALX_MIIDBG_HIBNEG, ALX_HIBNEG_NOHIB); + alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG, ALX_GREENCFG_DEF); } /* EEE advertisement */ - if (ALX_FLAG(adpt, CAP_AZ)) { - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, + if (ALX_CAP(hw, AZ)) { + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_LOCAL_EEEADV, - ALX_FLAG(adpt, CAP_GIGA) ? + ALX_CAP(hw, GIGA) ? ALX_LOCAL_EEEADV_1000BT | ALX_LOCAL_EEEADV_100BT : ALX_LOCAL_EEEADV_100BT); /* half amplify */ - alx_write_phy_dbg(adpt, ALX_MIIDBG_AZ_ANADECT, + alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT, ALX_AZ_ANADECT_DEF); - } else { /* disable az */ - ALX_MEM_R32(adpt, ALX_LPI_CTRL, &val); - ALX_MEM_W32(adpt, ALX_LPI_CTRL, val & ~ALX_LPI_CTRL_EN); - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, + } else { + ALX_MEM_R32(hw, ALX_LPI_CTRL, &val); + ALX_MEM_W32(hw, ALX_LPI_CTRL, val & ~ALX_LPI_CTRL_EN); + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_LOCAL_EEEADV, 0); } /* phy power saving */ - alx_write_phy_dbg(adpt, ALX_MIIDBG_TST10BTCFG, ALX_TST10BTCFG_DEF); - alx_write_phy_dbg(adpt, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF); - alx_write_phy_dbg(adpt, ALX_MIIDBG_TST100BTCFG, ALX_TST100BTCFG_DEF); - alx_write_phy_dbg(adpt, ALX_MIIDBG_ANACTRL, ALX_ANACTRL_DEF); - alx_read_phy_dbg(adpt, ALX_MIIDBG_GREENCFG2, &phy_val); - alx_write_phy_dbg(adpt, ALX_MIIDBG_GREENCFG2, + alx_write_phy_dbg(hw, ALX_MIIDBG_TST10BTCFG, ALX_TST10BTCFG_DEF); + alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF); + alx_write_phy_dbg(hw, ALX_MIIDBG_TST100BTCFG, ALX_TST100BTCFG_DEF); + alx_write_phy_dbg(hw, ALX_MIIDBG_ANACTRL, ALX_ANACTRL_DEF); + alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val); + alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, phy_val & ~ALX_GREENCFG2_GATE_DFSE_EN); /* rtl8139c, 120m issue */ - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_NLP78, + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_NLP78, ALX_MIIEXT_NLP78_120M_DEF); - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10, + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10, ALX_MIIEXT_S3DIG10_DEF); - if (adpt->lnk_patch) { + if (hw->lnk_patch) { /* Turn off half amplitude */ - alx_read_phy_ext(adpt, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3, + alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3, &phy_val); - alx_write_phy_ext(adpt, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3, + alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL3, phy_val | ALX_CLDCTRL3_BP_CABLE1TH_DET_GT); /* Turn off Green feature */ - alx_read_phy_dbg(adpt, ALX_MIIDBG_GREENCFG2, &phy_val); - alx_write_phy_dbg(adpt, ALX_MIIDBG_GREENCFG2, + alx_read_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, &phy_val); + alx_write_phy_dbg(hw, ALX_MIIDBG_GREENCFG2, phy_val | ALX_GREENCFG2_BP_GREEN); /* Turn off half Bias */ - alx_read_phy_ext(adpt, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5, + alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5, &phy_val); - alx_write_phy_ext(adpt, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5, + alx_write_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL5, phy_val | ALX_CLDCTRL5_BP_VD_HLFBIAS); } /* set phy interrupt mask */ - alx_write_phy_reg(adpt, ALX_MII_IER, + alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP | ALX_IER_LINK_DOWN); } @@ -360,54 +377,52 @@ void alx_reset_phy(struct alx_adapter *adpt, bool hib_en) * alx_reset_pcie * reset pcie relative registers (pci command, clk, aspm...) */ -void alx_reset_pcie(struct alx_adapter *adpt) +void alx_reset_pcie(struct alx_hw *hw) { u32 val; u16 val16; - u8 rev = (u8)ALX_REVID(adpt); + u8 rev = (u8)ALX_REVID(hw); /* Workaround for PCI problem when BIOS sets MMRBC incorrectly. */ - ALX_CFG_R16(adpt, PCI_COMMAND, &val16); + ALX_CFG_R16(hw, PCI_COMMAND, &val16); if (!(val16 & ALX_PCI_CMD) || (val16 & PCI_COMMAND_INTX_DISABLE)) { val16 = (val16 | ALX_PCI_CMD) & ~PCI_COMMAND_INTX_DISABLE; - ALX_CFG_W16(adpt, PCI_COMMAND, val16); + ALX_CFG_W16(hw, PCI_COMMAND, val16); } /* clear WoL setting/status */ - ALX_MEM_R32(adpt, ALX_WOL0, &val); - ALX_MEM_W32(adpt, ALX_WOL0, 0); + ALX_MEM_R32(hw, ALX_WOL0, &val); + ALX_MEM_W32(hw, ALX_WOL0, 0); /* deflt val of PDLL D3PLLOFF */ - ALX_MEM_R32(adpt, ALX_PDLL_TRNS1, &val); - ALX_MEM_W32(adpt, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN); + ALX_MEM_R32(hw, ALX_PDLL_TRNS1, &val); + ALX_MEM_W32(hw, ALX_PDLL_TRNS1, val & ~ALX_PDLL_TRNS1_D3PLLOFF_EN); /* mask some pcie error bits */ - ALX_MEM_R32(adpt, ALX_UE_SVRT, &val); + ALX_MEM_R32(hw, ALX_UE_SVRT, &val); val &= ~(ALX_UE_SVRT_DLPROTERR | ALX_UE_SVRT_FCPROTERR); - ALX_MEM_W32(adpt, ALX_UE_SVRT, val); + ALX_MEM_W32(hw, ALX_UE_SVRT, val); /* wol 25M & pclk */ - ALX_MEM_R32(adpt, ALX_MASTER, &val); - if (ALX_REV_A(rev) && ALX_WITH_CR(adpt)) { + ALX_MEM_R32(hw, ALX_MASTER, &val); + if (ALX_REV_A(rev) && ALX_WITH_CR(hw)) { if ((val & ALX_MASTER_WAKEN_25M) == 0 || (val & ALX_MASTER_PCLKSEL_SRDS) == 0) { - ALX_MEM_W32(adpt, ALX_MASTER, + ALX_MEM_W32(hw, ALX_MASTER, val | ALX_MASTER_PCLKSEL_SRDS | ALX_MASTER_WAKEN_25M); } } else { if ((val & ALX_MASTER_WAKEN_25M) == 0 || (val & ALX_MASTER_PCLKSEL_SRDS) != 0) { - ALX_MEM_W32(adpt, ALX_MASTER, + ALX_MEM_W32(hw, ALX_MASTER, (val & ~ALX_MASTER_PCLKSEL_SRDS) | ALX_MASTER_WAKEN_25M); } } /* ASPM setting */ - alx_enable_aspm(adpt, - ALX_FLAG(adpt, CAP_L0S), - ALX_FLAG(adpt, CAP_L1)); + alx_enable_aspm(hw, ALX_CAP(hw, L0S), ALX_CAP(hw, L1)); udelay(10); } @@ -416,23 +431,23 @@ void alx_reset_pcie(struct alx_adapter *adpt) * stop the mac, transmit & receive modules * return : 0 if ok, none-0 if busy */ -int alx_stop_mac(struct alx_adapter *adpt) +int alx_stop_mac(struct alx_hw *hw) { u32 rxq, txq, val; u16 i; - ALX_MEM_R32(adpt, ALX_RXQ0, &rxq); - ALX_MEM_W32(adpt, ALX_RXQ0, rxq & ~ALX_RXQ0_EN); - ALX_MEM_R32(adpt, ALX_TXQ0, &txq); - ALX_MEM_W32(adpt, ALX_TXQ0, txq & ~ALX_TXQ0_EN); + ALX_MEM_R32(hw, ALX_RXQ0, &rxq); + ALX_MEM_W32(hw, ALX_RXQ0, rxq & ~ALX_RXQ0_EN); + ALX_MEM_R32(hw, ALX_TXQ0, &txq); + ALX_MEM_W32(hw, ALX_TXQ0, txq & ~ALX_TXQ0_EN); udelay(40); - adpt->rx_ctrl &= ~(ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN); - ALX_MEM_W32(adpt, ALX_MAC_CTRL, adpt->rx_ctrl); + hw->rx_ctrl &= ~(ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN); + ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl); for (i = 0; i < ALX_DMA_MAC_RST_TO; i++) { - ALX_MEM_R32(adpt, ALX_MAC_STS, &val); + ALX_MEM_R32(hw, ALX_MAC_STS, &val); if (!(val & ALX_MAC_STS_IDLE)) break; udelay(10); @@ -444,56 +459,56 @@ int alx_stop_mac(struct alx_adapter *adpt) /* alx_start_mac * enable rx/tx MAC module */ -void alx_start_mac(struct alx_adapter *adpt) +void alx_start_mac(struct alx_hw *hw) { u32 mac, txq, rxq; - ALX_MEM_R32(adpt, ALX_RXQ0, &rxq); - ALX_MEM_W32(adpt, ALX_RXQ0, rxq | ALX_RXQ0_EN); - ALX_MEM_R32(adpt, ALX_TXQ0, &txq); - ALX_MEM_W32(adpt, ALX_TXQ0, txq | ALX_TXQ0_EN); + ALX_MEM_R32(hw, ALX_RXQ0, &rxq); + ALX_MEM_W32(hw, ALX_RXQ0, rxq | ALX_RXQ0_EN); + ALX_MEM_R32(hw, ALX_TXQ0, &txq); + ALX_MEM_W32(hw, ALX_TXQ0, txq | ALX_TXQ0_EN); - mac = adpt->rx_ctrl; - if (adpt->link_duplex == FULL_DUPLEX) + mac = hw->rx_ctrl; + if (hw->link_duplex == FULL_DUPLEX) mac |= ALX_MAC_CTRL_FULLD; else mac &= ~ALX_MAC_CTRL_FULLD; - FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, adpt->link_speed == SPEED_1000 ? + FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, hw->link_speed == SPEED_1000 ? ALX_MAC_CTRL_SPEED_1000 : ALX_MAC_CTRL_SPEED_10_100); mac |= ALX_MAC_CTRL_TX_EN | ALX_MAC_CTRL_RX_EN; - adpt->rx_ctrl = mac; - ALX_MEM_W32(adpt, ALX_MAC_CTRL, mac); + hw->rx_ctrl = mac; + ALX_MEM_W32(hw, ALX_MAC_CTRL, mac); } /* set flow control on MAC side */ -void alx_cfg_mac_fc(struct alx_adapter *adpt, u8 fc) +void alx_cfg_mac_fc(struct alx_hw *hw, u8 fc) { if (fc & ALX_FC_RX) - adpt->rx_ctrl |= ALX_MAC_CTRL_RX_EN; + hw->rx_ctrl |= ALX_MAC_CTRL_RXFC_EN; else - adpt->rx_ctrl &= ~ALX_MAC_CTRL_RX_EN; + hw->rx_ctrl &= ~ALX_MAC_CTRL_RXFC_EN; if (fc & ALX_FC_TX) - adpt->rx_ctrl |= ALX_MAC_CTRL_TX_EN; + hw->rx_ctrl |= ALX_MAC_CTRL_TXFC_EN; else - adpt->rx_ctrl &= ~ALX_MAC_CTRL_TX_EN; + hw->rx_ctrl &= ~ALX_MAC_CTRL_TXFC_EN; - ALX_MEM_W32(adpt, ALX_MAC_CTRL, adpt->rx_ctrl); + ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl); } /* enable/disable aspm support */ -void alx_enable_aspm(struct alx_adapter *adpt, bool l0s_en, bool l1_en) +void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en) { u32 pmctrl; - u8 rev = (u8)ALX_REVID(adpt); + u8 rev = (u8)ALX_REVID(hw); - ALX_MEM_R32(adpt, ALX_PMCTRL, &pmctrl); + ALX_MEM_R32(hw, ALX_PMCTRL, &pmctrl); FIELD_SET32(pmctrl, ALX_PMCTRL_LCKDET_TIMER, ALX_PMCTRL_LCKDET_TIMER_DEF); - pmctrl |= ALX_PMCTRL_RCVR_WT_1US | /* wait 1us */ - ALX_PMCTRL_L1_CLKSW_EN | /* pcie clk sw */ - ALX_PMCTRL_L1_SRDSRX_PWD ; /* pwd serdes */ + pmctrl |= ALX_PMCTRL_RCVR_WT_1US | + ALX_PMCTRL_L1_CLKSW_EN | + ALX_PMCTRL_L1_SRDSRX_PWD ; FIELD_SET32(pmctrl, ALX_PMCTRL_L1REQ_TO, ALX_PMCTRL_L1REG_TO_DEF); FIELD_SET32(pmctrl, ALX_PMCTRL_L1_TIMER, ALX_PMCTRL_L1_TIMER_16US); pmctrl &= ~(ALX_PMCTRL_L1_SRDS_EN | @@ -507,7 +522,7 @@ void alx_enable_aspm(struct alx_adapter *adpt, bool l0s_en, bool l1_en) ALX_PMCTRL_TXL1_AFTER_L0S | ALX_PMCTRL_RXL1_AFTER_L0S ); - if (ALX_REV_A(rev) && ALX_WITH_CR(adpt)) + if (ALX_REV_A(rev) && ALX_WITH_CR(hw)) pmctrl |= ALX_PMCTRL_L1_SRDS_EN | ALX_PMCTRL_L1_SRDSPLL_EN; if (l0s_en) @@ -515,16 +530,16 @@ void alx_enable_aspm(struct alx_adapter *adpt, bool l0s_en, bool l1_en) if (l1_en) pmctrl |= (ALX_PMCTRL_L1_EN | ALX_PMCTRL_ASPM_FCEN); - ALX_MEM_W32(adpt, ALX_PMCTRL, pmctrl); + ALX_MEM_W32(hw, ALX_PMCTRL, pmctrl); } /* translate ethtool adv /speed/duplex settting to hw specific value */ -u32 ethadv_to_hw_cfg(struct alx_adapter *adpt, u32 ethadv_cfg) +u32 ethadv_to_hw_cfg(struct alx_hw *hw, u32 ethadv_cfg) { u32 cfg = 0; - if (ethadv_cfg & ADVERTISED_Autoneg) { /* auto-neg */ + if (ethadv_cfg & ADVERTISED_Autoneg) { cfg |= ALX_DRV_PHY_AUTO; if (ethadv_cfg & ADVERTISED_10baseT_Half) cfg |= ALX_DRV_PHY_10; @@ -542,9 +557,9 @@ u32 ethadv_to_hw_cfg(struct alx_adapter *adpt, u32 ethadv_cfg) cfg |= ADVERTISE_PAUSE_CAP; if (ethadv_cfg & ADVERTISED_Asym_Pause) cfg |= ADVERTISE_PAUSE_ASYM; - if (ALX_FLAG(adpt, CAP_AZ)) + if (ALX_CAP(hw, AZ)) cfg |= ALX_DRV_PHY_EEE; - } else { /* force mode */ + } else { switch (ethadv_cfg) { case ADVERTISED_10baseT_Half: cfg |= ALX_DRV_PHY_10; @@ -568,18 +583,18 @@ u32 ethadv_to_hw_cfg(struct alx_adapter *adpt, u32 ethadv_cfg) * ethadv: * format from ethtool, we use it for both autoneg and force mode */ -int alx_setup_speed_duplex(struct alx_adapter *adpt, u32 ethadv, u8 flowctrl) +int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl) { u16 adv, giga, cr; u32 val; int err = 0; /* clear flag */ - alx_write_phy_reg(adpt, ALX_MII_DBG_ADDR, 0); - ALX_MEM_R32(adpt, ALX_DRV, &val); + alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, 0); + ALX_MEM_R32(hw, ALX_DRV, &val); FIELD_SET32(val, ALX_DRV_PHY, 0); - if (ethadv & ADVERTISED_Autoneg) { /* auto-neg */ + if (ethadv & ADVERTISED_Autoneg) { adv = ADVERTISE_CSMA; adv |= ethtool_adv_to_mii_adv_t(ethadv); @@ -592,16 +607,16 @@ int alx_setup_speed_duplex(struct alx_adapter *adpt, u32 ethadv, u8 flowctrl) adv |= ADVERTISED_Asym_Pause; } giga = 0; - if (ALX_FLAG(adpt, CAP_GIGA)) + if (ALX_CAP(hw, GIGA)) giga = ethtool_adv_to_mii_ctrl1000_t(ethadv); cr = BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART; - if (alx_write_phy_reg(adpt, MII_ADVERTISE, adv) || - alx_write_phy_reg(adpt, MII_CTRL1000, giga) || - alx_write_phy_reg(adpt, MII_BMCR, cr)) + if (alx_write_phy_reg(hw, MII_ADVERTISE, adv) || + alx_write_phy_reg(hw, MII_CTRL1000, giga) || + alx_write_phy_reg(hw, MII_BMCR, cr)) err = ALX_ERR_MIIBUSY; - } else { /* force mode */ + } else { cr = BMCR_RESET; if (ethadv == ADVERTISED_100baseT_Half || ethadv == ADVERTISED_100baseT_Full) @@ -610,26 +625,26 @@ int alx_setup_speed_duplex(struct alx_adapter *adpt, u32 ethadv, u8 flowctrl) ethadv == ADVERTISED_100baseT_Full) cr |= BMCR_FULLDPLX; - err = alx_write_phy_reg(adpt, MII_BMCR, cr); + err = alx_write_phy_reg(hw, MII_BMCR, cr); } if (!err) { - alx_write_phy_reg(adpt, ALX_MII_DBG_ADDR, ALX_PHY_INITED); + alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, ALX_PHY_INITED); /* save config to HW */ - val |= ethadv_to_hw_cfg(adpt, ethadv); + val |= ethadv_to_hw_cfg(hw, ethadv); } - ALX_MEM_W32(adpt, ALX_DRV, val); + ALX_MEM_W32(hw, ALX_DRV, val); return err; } /* do post setting on phy if link up/down event occur */ -void alx_post_phy_link(struct alx_adapter *adpt, u16 speed, bool az_en) +void alx_post_phy_link(struct alx_hw *hw, u16 speed, bool az_en) { u16 phy_val, len, agc; - u8 revid = (u8)ALX_REVID(adpt); + u8 revid = (u8)ALX_REVID(hw); bool adj_th; if (revid != ALX_REV_B0 && @@ -640,11 +655,11 @@ void alx_post_phy_link(struct alx_adapter *adpt, u16 speed, bool az_en) adj_th = (revid == ALX_REV_B0) ? true : false; /* 1000BT/AZ, wrong cable length */ - if (speed != SPEED_0) { /* link up */ - alx_read_phy_ext(adpt, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL6, + if (speed != SPEED_0) { + alx_read_phy_ext(hw, ALX_MIIEXT_PCS, ALX_MIIEXT_CLDCTRL6, &phy_val); len = FIELD_GETX(phy_val, ALX_CLDCTRL6_CAB_LEN); - alx_read_phy_dbg(adpt, ALX_MIIDBG_AGC, &phy_val); + alx_read_phy_dbg(hw, ALX_MIIDBG_AGC, &phy_val); agc = FIELD_GETX(phy_val, ALX_AGC_2_VGA); if ((speed == SPEED_1000 && @@ -653,59 +668,59 @@ void alx_post_phy_link(struct alx_adapter *adpt, u16 speed, bool az_en) (speed == SPEED_100 && (len > ALX_CLDCTRL6_CAB_LEN_SHORT100M || (0 == len && agc > ALX_AGC_LONG100M_LIMT)))) { - alx_write_phy_dbg(adpt, ALX_MIIDBG_AZ_ANADECT, + alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT, ALX_AZ_ANADECT_LONG); - alx_read_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, + alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, &phy_val); - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, phy_val | ALX_AFE_10BT_100M_TH); } else { - alx_write_phy_dbg(adpt, ALX_MIIDBG_AZ_ANADECT, + alx_write_phy_dbg(hw, ALX_MIIDBG_AZ_ANADECT, ALX_AZ_ANADECT_DEF); - alx_read_phy_ext(adpt, ALX_MIIEXT_ANEG, + alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, &phy_val); - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, phy_val & ~ALX_AFE_10BT_100M_TH); } /* threashold adjust */ - if (adj_th && adpt->lnk_patch) { + if (adj_th && hw->lnk_patch) { if (speed == SPEED_100) { - alx_write_phy_dbg(adpt, ALX_MIIDBG_MSE16DB, + alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB, ALX_MSE16DB_UP); } else if (speed == SPEED_1000) { /* * Giga link threshold, raise the tolerance of * noise 50% */ - alx_read_phy_dbg(adpt, ALX_MIIDBG_MSE20DB, + alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, &phy_val); FIELD_SETS(phy_val, ALX_MSE20DB_TH, ALX_MSE20DB_TH_HI); - alx_write_phy_dbg(adpt, ALX_MIIDBG_MSE20DB, + alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, phy_val); } } /* phy link-down in 1000BT/AZ mode */ if (az_en && revid == ALX_REV_B0 && speed == SPEED_1000) { - alx_write_phy_dbg(adpt, ALX_MIIDBG_SRDSYSMOD, + alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF & ~ALX_SRDSYSMOD_DEEMP_EN); } } else { - alx_read_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, + alx_read_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, &phy_val); - alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, + alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_AFE, phy_val & ~ALX_AFE_10BT_100M_TH); - if (adj_th && adpt->lnk_patch) { - alx_write_phy_dbg(adpt, ALX_MIIDBG_MSE16DB, + if (adj_th && hw->lnk_patch) { + alx_write_phy_dbg(hw, ALX_MIIDBG_MSE16DB, ALX_MSE16DB_DOWN); - alx_read_phy_dbg(adpt, ALX_MIIDBG_MSE20DB, &phy_val); + alx_read_phy_dbg(hw, ALX_MIIDBG_MSE20DB, &phy_val); FIELD_SETS(phy_val, ALX_MSE20DB_TH, ALX_MSE20DB_TH_DEF); - alx_write_phy_dbg(adpt, ALX_MIIDBG_MSE20DB, phy_val); + alx_write_phy_dbg(hw, ALX_MIIDBG_MSE20DB, phy_val); } if (az_en && revid == ALX_REV_B0) { - alx_write_phy_dbg(adpt, ALX_MIIDBG_SRDSYSMOD, + alx_write_phy_dbg(hw, ALX_MIIDBG_SRDSYSMOD, ALX_SRDSYSMOD_DEF); } } @@ -717,75 +732,75 @@ void alx_post_phy_link(struct alx_adapter *adpt, u16 speed, bool az_en) * 1. phy link must be established before calling this function * 2. wol option (pattern,magic,link,etc.) is configed before call it. */ -int alx_pre_suspend(struct alx_adapter *adpt, u16 speed) +int alx_pre_suspend(struct alx_hw *hw, u16 speed) { u32 master, mac, phy, val; int err = 0; - ALX_MEM_R32(adpt, ALX_MASTER, &master); + ALX_MEM_R32(hw, ALX_MASTER, &master); master &= ~ALX_MASTER_PCLKSEL_SRDS; - mac = adpt->rx_ctrl; + mac = hw->rx_ctrl; /* 10/100 half */ FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, ALX_MAC_CTRL_SPEED_10_100); mac &= ~(ALX_MAC_CTRL_FULLD | ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_TX_EN); - ALX_MEM_R32(adpt, ALX_PHY_CTRL, &phy); + ALX_MEM_R32(hw, ALX_PHY_CTRL, &phy); phy &= ~(ALX_PHY_CTRL_DSPRST_OUT | ALX_PHY_CTRL_CLS); phy |= ALX_PHY_CTRL_RST_ANALOG | ALX_PHY_CTRL_HIB_PULSE | ALX_PHY_CTRL_HIB_EN; /* without any activity */ - if (!(adpt->sleep_ctrl & ALX_SLEEP_ACTIVE)) { - err = alx_write_phy_reg(adpt, ALX_MII_IER, 0); + if (!(hw->sleep_ctrl & ALX_SLEEP_ACTIVE)) { + err = alx_write_phy_reg(hw, ALX_MII_IER, 0); phy |= ALX_PHY_CTRL_IDDQ | ALX_PHY_CTRL_POWER_DOWN; goto config_reg; } - if (adpt->sleep_ctrl & (ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_CIFS)) + if (hw->sleep_ctrl & (ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_CIFS)) mac |= ALX_MAC_CTRL_RX_EN | ALX_MAC_CTRL_BRD_EN; - if (adpt->sleep_ctrl & ALX_SLEEP_CIFS) + if (hw->sleep_ctrl & ALX_SLEEP_CIFS) mac |= ALX_MAC_CTRL_TX_EN; if (speed % 10 == FULL_DUPLEX) mac |= ALX_MAC_CTRL_FULLD; if (speed >= SPEED_1000) FIELD_SET32(mac, ALX_MAC_CTRL_SPEED, ALX_MAC_CTRL_SPEED_1000); phy |= ALX_PHY_CTRL_DSPRST_OUT; - if (adpt->sleep_ctrl & ALX_SLEEP_WOL_PHY) - err = alx_write_phy_reg(adpt, ALX_MII_IER, ALX_IER_LINK_UP); + if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) + err = alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP); if (!err) - err = alx_write_phy_ext(adpt, ALX_MIIEXT_ANEG, + err = alx_write_phy_ext(hw, ALX_MIIEXT_ANEG, ALX_MIIEXT_S3DIG10, ALX_MIIEXT_S3DIG10_SL); config_reg: if (!err) { - alx_enable_osc(adpt); - adpt->rx_ctrl = mac; - ALX_MEM_W32(adpt, ALX_MASTER, master); - ALX_MEM_W32(adpt, ALX_MAC_CTRL, mac); - ALX_MEM_W32(adpt, ALX_PHY_CTRL, phy); + alx_enable_osc(hw); + hw->rx_ctrl = mac; + ALX_MEM_W32(hw, ALX_MASTER, master); + ALX_MEM_W32(hw, ALX_MAC_CTRL, mac); + ALX_MEM_W32(hw, ALX_PHY_CTRL, phy); /* set val of PDLL D3PLLOFF */ - ALX_MEM_R32(adpt, ALX_PDLL_TRNS1, &val); + ALX_MEM_R32(hw, ALX_PDLL_TRNS1, &val); val |= ALX_PDLL_TRNS1_D3PLLOFF_EN; - ALX_MEM_W32(adpt, ALX_PDLL_TRNS1, val); + ALX_MEM_W32(hw, ALX_PDLL_TRNS1, val); } return err; } /* wait mdio module to be idle */ -bool __alx_wait_mdio_idle(struct alx_adapter *adpt) +bool __alx_wait_mdio_idle(struct alx_hw *hw) { u32 val; int i; for (i = 0; i < ALX_MDIO_MAX_AC_TO; i++) { - ALX_MEM_R32(adpt, ALX_MDIO, &val); + ALX_MEM_R32(hw, ALX_MDIO, &val); if (!(val & ALX_MDIO_BUSY)) break; udelay(10); } - return i == ALX_MDIO_MAX_AC_TO; + return i != ALX_MDIO_MAX_AC_TO; } /* __alx_read_phy_core @@ -794,7 +809,7 @@ bool __alx_wait_mdio_idle(struct alx_adapter *adpt) * dev: device address (see IEEE 802.3 DEVAD, PRTAD is fixed to 0) * reg: register to read */ -int __alx_read_phy_core(struct alx_adapter *adpt, bool ext, u8 dev, +int __alx_read_phy_core(struct alx_hw *hw, bool ext, u8 dev, u16 reg, u16 *phy_data) { u32 val, clk_sel; @@ -803,13 +818,13 @@ int __alx_read_phy_core(struct alx_adapter *adpt, bool ext, u8 dev, *phy_data = 0; /* use slow clock when it's in hibernation status */ - clk_sel = adpt->link_up ? + clk_sel = hw->link_up ? ALX_MDIO_CLK_SEL_25MD128 : ALX_MDIO_CLK_SEL_25MD4; if (ext) { val = FIELDX(ALX_MDIO_EXTN_DEVAD, dev) | FIELDX(ALX_MDIO_EXTN_REG, reg); - ALX_MEM_W32(adpt, ALX_MDIO_EXTN, val); + ALX_MEM_W32(hw, ALX_MDIO_EXTN, val); val = ALX_MDIO_SPRES_PRMBL | FIELDX(ALX_MDIO_CLK_SEL, clk_sel) | @@ -823,12 +838,12 @@ int __alx_read_phy_core(struct alx_adapter *adpt, bool ext, u8 dev, ALX_MDIO_START | ALX_MDIO_OP_READ; } - ALX_MEM_W32(adpt, ALX_MDIO, val); + ALX_MEM_W32(hw, ALX_MDIO, val); - if (unlikely(!__alx_wait_mdio_idle(adpt))) + if (unlikely(!__alx_wait_mdio_idle(hw))) err = ALX_ERR_MIIBUSY; else { - ALX_MEM_R32(adpt, ALX_MDIO, &val); + ALX_MEM_R32(hw, ALX_MDIO, &val); *phy_data = (u16)FIELD_GETX(val, ALX_MDIO_DATA); err = 0; } @@ -842,20 +857,20 @@ int __alx_read_phy_core(struct alx_adapter *adpt, bool ext, u8 dev, * dev: device address (see IEEE 802.3 DEVAD, PRTAD is fixed to 0) * reg: register to write */ -int __alx_write_phy_core(struct alx_adapter *adpt, bool ext, u8 dev, +int __alx_write_phy_core(struct alx_hw *hw, bool ext, u8 dev, u16 reg, u16 phy_data) { u32 val, clk_sel; int err = 0; /* use slow clock when it's in hibernation status */ - clk_sel = adpt->link_up ? + clk_sel = hw->link_up ? ALX_MDIO_CLK_SEL_25MD128 : ALX_MDIO_CLK_SEL_25MD4; if (ext) { val = FIELDX(ALX_MDIO_EXTN_DEVAD, dev) | FIELDX(ALX_MDIO_EXTN_REG, reg); - ALX_MEM_W32(adpt, ALX_MDIO_EXTN, val); + ALX_MEM_W32(hw, ALX_MDIO_EXTN, val); val = ALX_MDIO_SPRES_PRMBL | FIELDX(ALX_MDIO_CLK_SEL, clk_sel) | @@ -869,175 +884,175 @@ int __alx_write_phy_core(struct alx_adapter *adpt, bool ext, u8 dev, FIELDX(ALX_MDIO_DATA, phy_data) | ALX_MDIO_START; } - ALX_MEM_W32(adpt, ALX_MDIO, val); + ALX_MEM_W32(hw, ALX_MDIO, val); - if (unlikely(!__alx_wait_mdio_idle(adpt))) + if (unlikely(!__alx_wait_mdio_idle(hw))) err = ALX_ERR_MIIBUSY; return err; } /* read from PHY normal register */ -int __alx_read_phy_reg(struct alx_adapter *adpt, u16 reg, u16 *phy_data) +int __alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data) { - return __alx_read_phy_core(adpt, false, 0, reg, phy_data); + return __alx_read_phy_core(hw, false, 0, reg, phy_data); } /* write to PHY normal register */ -int __alx_write_phy_reg(struct alx_adapter *adpt, u16 reg, u16 phy_data) +int __alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data) { - return __alx_write_phy_core(adpt, false, 0, reg, phy_data); + return __alx_write_phy_core(hw, false, 0, reg, phy_data); } /* read from PHY extension register */ -int __alx_read_phy_ext(struct alx_adapter *adpt, u8 dev, u16 reg, u16 *pdata) +int __alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata) { - return __alx_read_phy_core(adpt, true, dev, reg, pdata); + return __alx_read_phy_core(hw, true, dev, reg, pdata); } /* write to PHY extension register */ -int __alx_write_phy_ext(struct alx_adapter *adpt, u8 dev, u16 reg, u16 data) +int __alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data) { - return __alx_write_phy_core(adpt, true, dev, reg, data); + return __alx_write_phy_core(hw, true, dev, reg, data); } /* read from PHY debug port */ -int __alx_read_phy_dbg(struct alx_adapter *adpt, u16 reg, u16 *pdata) +int __alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata) { int err; - err = __alx_write_phy_reg(adpt, ALX_MII_DBG_ADDR, reg); + err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg); if (unlikely(err)) return err; else - err = __alx_read_phy_reg(adpt, ALX_MII_DBG_DATA, pdata); + err = __alx_read_phy_reg(hw, ALX_MII_DBG_DATA, pdata); return err; } /* write to PHY debug port */ -int __alx_write_phy_dbg(struct alx_adapter *adpt, u16 reg, u16 data) +int __alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data) { int err; - err = __alx_write_phy_reg(adpt, ALX_MII_DBG_ADDR, reg); + err = __alx_write_phy_reg(hw, ALX_MII_DBG_ADDR, reg); if (unlikely(err)) return err; else - err = __alx_write_phy_reg(adpt, ALX_MII_DBG_DATA, data); + err = __alx_write_phy_reg(hw, ALX_MII_DBG_DATA, data); return err; } -int alx_read_phy_reg(struct alx_adapter *adpt, u16 reg, u16 *phy_data) +int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data) { int err; - spin_lock(&adpt->mdio_lock); - err = __alx_read_phy_reg(adpt, reg, phy_data); - spin_unlock(&adpt->mdio_lock); + spin_lock(&hw->mdio_lock); + err = __alx_read_phy_reg(hw, reg, phy_data); + spin_unlock(&hw->mdio_lock); return err; } -int alx_write_phy_reg(struct alx_adapter *adpt, u16 reg, u16 phy_data) +int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data) { int err; - spin_lock(&adpt->mdio_lock); - err = __alx_write_phy_reg(adpt, reg, phy_data); - spin_unlock(&adpt->mdio_lock); + spin_lock(&hw->mdio_lock); + err = __alx_write_phy_reg(hw, reg, phy_data); + spin_unlock(&hw->mdio_lock); return err; } -int alx_read_phy_ext(struct alx_adapter *adpt, u8 dev, u16 reg, u16 *pdata) +int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata) { int err; - spin_lock(&adpt->mdio_lock); - err = __alx_read_phy_ext(adpt, dev, reg, pdata); - spin_unlock(&adpt->mdio_lock); + spin_lock(&hw->mdio_lock); + err = __alx_read_phy_ext(hw, dev, reg, pdata); + spin_unlock(&hw->mdio_lock); return err; } -int alx_write_phy_ext(struct alx_adapter *adpt, u8 dev, u16 reg, u16 data) +int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data) { int err; - spin_lock(&adpt->mdio_lock); - err = __alx_write_phy_ext(adpt, dev, reg, data); - spin_unlock(&adpt->mdio_lock); + spin_lock(&hw->mdio_lock); + err = __alx_write_phy_ext(hw, dev, reg, data); + spin_unlock(&hw->mdio_lock); return err; } -int alx_read_phy_dbg(struct alx_adapter *adpt, u16 reg, u16 *pdata) +int alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata) { int err; - spin_lock(&adpt->mdio_lock); - err = __alx_read_phy_dbg(adpt, reg, pdata); - spin_unlock(&adpt->mdio_lock); + spin_lock(&hw->mdio_lock); + err = __alx_read_phy_dbg(hw, reg, pdata); + spin_unlock(&hw->mdio_lock); return err; } -int alx_write_phy_dbg(struct alx_adapter *adpt, u16 reg, u16 data) +int alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data) { int err; - spin_lock(&adpt->mdio_lock); - err = __alx_write_phy_dbg(adpt, reg, data); - spin_unlock(&adpt->mdio_lock); + spin_lock(&hw->mdio_lock); + err = __alx_write_phy_dbg(hw, reg, data); + spin_unlock(&hw->mdio_lock); return err; } -u16 alx_get_phy_config(struct alx_adapter *adpt) +u16 alx_get_phy_config(struct alx_hw *hw) { u32 val; u16 phy_val; - ALX_MEM_R32(adpt, ALX_PHY_CTRL, &val); + ALX_MEM_R32(hw, ALX_PHY_CTRL, &val); /* phy in rst */ if ((val & ALX_PHY_CTRL_DSPRST_OUT) == 0) return ALX_DRV_PHY_UNKNOWN; - ALX_MEM_R32(adpt, ALX_DRV, &val); + ALX_MEM_R32(hw, ALX_DRV, &val); val = FIELD_GETX(val, ALX_DRV_PHY); if (ALX_DRV_PHY_UNKNOWN == val) return ALX_DRV_PHY_UNKNOWN; - alx_read_phy_reg(adpt, ALX_MII_DBG_ADDR, &phy_val); + alx_read_phy_reg(hw, ALX_MII_DBG_ADDR, &phy_val); if (ALX_PHY_INITED == phy_val) return (u16) val; return ALX_DRV_PHY_UNKNOWN; } -bool alx_phy_configed(struct alx_adapter *adpt) +bool alx_phy_configed(struct alx_hw *hw) { u32 cfg, hw_cfg; - cfg = ethadv_to_hw_cfg(adpt, adpt->adv_cfg); + cfg = ethadv_to_hw_cfg(hw, hw->adv_cfg); cfg = FIELD_GETX(cfg, ALX_DRV_PHY); - hw_cfg = alx_get_phy_config(adpt); + hw_cfg = alx_get_phy_config(hw); if (hw_cfg == ALX_DRV_PHY_UNKNOWN) return false; return cfg == hw_cfg; } -int alx_get_phy_link(struct alx_adapter *adpt, bool *link_up, u16 *speed) +int alx_get_phy_link(struct alx_hw *hw, bool *link_up, u16 *speed) { - struct pci_dev *pdev = adpt->pdev; + struct pci_dev *pdev = hw->pdev; u16 bmsr, giga; int err; - err = alx_read_phy_reg(adpt, MII_BMSR, &bmsr); - err = alx_read_phy_reg(adpt, MII_BMSR, &bmsr); + err = alx_read_phy_reg(hw, MII_BMSR, &bmsr); + err = alx_read_phy_reg(hw, MII_BMSR, &bmsr); if (unlikely(err)) goto out; @@ -1049,7 +1064,7 @@ int alx_get_phy_link(struct alx_adapter *adpt, bool *link_up, u16 *speed) *link_up = true; /* speed/duplex result is saved in PHY Specific Status Register */ - err = alx_read_phy_reg(adpt, ALX_MII_GIGA_PSSR, &giga); + err = alx_read_phy_reg(hw, ALX_MII_GIGA_PSSR, &giga); if (unlikely(err)) goto out; @@ -1079,35 +1094,322 @@ out: return err; } -int alx_clear_phy_intr(struct alx_adapter *adpt) +int alx_clear_phy_intr(struct alx_hw *hw) { u16 isr; /* clear interrupt status by read it */ - return alx_read_phy_reg(adpt, ALX_MII_ISR, &isr); + return alx_read_phy_reg(hw, ALX_MII_ISR, &isr); } -int alx_config_wol(struct alx_adapter *adpt) +int alx_config_wol(struct alx_hw *hw) { u32 wol; int err = 0; wol = 0; /* turn on magic packet event */ - if (adpt->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) { + if (hw->sleep_ctrl & ALX_SLEEP_WOL_MAGIC) { wol |= ALX_WOL0_MAGIC_EN | ALX_WOL0_PME_MAGIC_EN; /* magic packet maybe Broadcast&multicast&Unicast frame */ /* mac |= MAC_CTRL_BC_EN; */ } /* turn on link up event */ - if (adpt->sleep_ctrl & ALX_SLEEP_WOL_PHY) { + if (hw->sleep_ctrl & ALX_SLEEP_WOL_PHY) { wol |= ALX_WOL0_LINK_EN | ALX_WOL0_PME_LINK; /* only link up can wake up */ - err = alx_write_phy_reg(adpt, ALX_MII_IER, ALX_IER_LINK_UP); + err = alx_write_phy_reg(hw, ALX_MII_IER, ALX_IER_LINK_UP); + } + ALX_MEM_W32(hw, ALX_WOL0, wol); + + return err; +} + +void alx_configure_rss(struct alx_hw *hw, bool en) +{ + u32 ctrl; + int i; + + ALX_MEM_R32(hw, ALX_RXQ0, &ctrl); + + if (en) { + for (i = 0; i < sizeof(hw->rss_key); i++) { + /* rss key should be saved in chip with + * reversed order. + */ + int j = sizeof(hw->rss_key) - i - 1; + + ALX_MEM_W8(hw, ALX_RSS_KEY0 + j, hw->rss_key[i]); + } + + for (i = 0; i < ARRAY_SIZE(hw->rss_idt); i++) + ALX_MEM_W32(hw, ALX_RSS_IDT_TBL0, hw->rss_idt[i]); + + FIELD_SET32(ctrl, ALX_RXQ0_RSS_HSTYP, hw->rss_hash_type); + FIELD_SET32(ctrl, ALX_RXQ0_RSS_MODE, ALX_RXQ0_RSS_MODE_MQMI); + FIELD_SET32(ctrl, ALX_RXQ0_IDT_TBL_SIZE, hw->rss_idt_size); + ctrl |= ALX_RXQ0_RSS_HASH_EN; + } else { + ctrl &= ~ALX_RXQ0_RSS_HASH_EN; + } + + ALX_MEM_W32(hw, ALX_RXQ0, ctrl); +} + +void alx_configure_basic(struct alx_hw *hw) +{ + u32 val, raw_mtu, max_payload; + u16 val16; + u8 chip_rev = ALX_REVID(hw); + + /* mac address */ + alx_set_macaddr(hw, hw->mac_addr); + + /* clk gating */ + ALX_MEM_W32(hw, ALX_CLK_GATE, ALX_CLK_GATE_ALL_A0); + + /* idle timeout to switch clk_125M */ + if (chip_rev == ALX_REV_B0) { + ALX_MEM_W32(hw, ALX_IDLE_DECISN_TIMER, + ALX_IDLE_DECISN_TIMER_DEF); + } + + /* stats refresh timeout */ + ALX_MEM_W32(hw, ALX_SMB_TIMER, hw->smb_timer * 500UL); + + /* intr moduration */ + ALX_MEM_R32(hw, ALX_MASTER, &val); + val = val | ALX_MASTER_IRQMOD2_EN | + ALX_MASTER_IRQMOD1_EN | + ALX_MASTER_SYSALVTIMER_EN; + ALX_MEM_W32(hw, ALX_MASTER, val); + ALX_MEM_W32(hw, ALX_IRQ_MODU_TIMER, + FIELDX(ALX_IRQ_MODU_TIMER1, hw->imt >> 1)); + /* intr re-trig timeout */ + ALX_MEM_W32(hw, ALX_INT_RETRIG, ALX_INT_RETRIG_TO); + /* tpd threshold to trig int */ + ALX_MEM_W32(hw, ALX_TINT_TPD_THRSHLD, hw->ith_tpd); + ALX_MEM_W32(hw, ALX_TINT_TIMER, hw->imt); + + /* mtu, 8:fcs+vlan */ + raw_mtu = hw->mtu + ETH_HLEN; + ALX_MEM_W32(hw, ALX_MTU, raw_mtu + 8); + if (raw_mtu > ALX_MTU_JUMBO_TH) + hw->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE; + + /* txq */ + if ((raw_mtu + 8) < ALX_TXQ1_JUMBO_TSO_TH) + val = (raw_mtu + 8 + 7) >> 3; + else + val = ALX_TXQ1_JUMBO_TSO_TH >> 3; + ALX_MEM_W32(hw, ALX_TXQ1, val | ALX_TXQ1_ERRLGPKT_DROP_EN); + max_payload = alx_get_readrq(hw) >> 8; + /* + * if BIOS had changed the default dma read max length, + * restore it to default value + */ + if (max_payload < ALX_DEV_CTRL_MAXRRS_MIN) + alx_set_readrq(hw, 128 << ALX_DEV_CTRL_MAXRRS_MIN); + + val = FIELDX(ALX_TXQ0_TPD_BURSTPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | + ALX_TXQ0_MODE_ENHANCE | + ALX_TXQ0_LSO_8023_EN | + ALX_TXQ0_SUPT_IPOPT | + FIELDX(ALX_TXQ0_TXF_BURST_PREF, ALX_TXQ_TXF_BURST_PREF_DEF); + ALX_MEM_W32(hw, ALX_TXQ0, val); + val = FIELDX(ALX_HQTPD_Q1_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | + FIELDX(ALX_HQTPD_Q2_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | + FIELDX(ALX_HQTPD_Q3_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | + ALX_HQTPD_BURST_EN; + ALX_MEM_W32(hw, ALX_HQTPD, val); + + /* rxq, flow control */ + ALX_MEM_R32(hw, ALX_SRAM5, &val); + val = FIELD_GETX(val, ALX_SRAM_RXF_LEN) << 3; + if (val > ALX_SRAM_RXF_LEN_8K) { + val16 = ALX_MTU_STD_ALGN >> 3; + val = (val - ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >> 3; + } else { + val16 = ALX_MTU_STD_ALGN >> 3; + val = (val - ALX_MTU_STD_ALGN) >> 3; + } + ALX_MEM_W32(hw, ALX_RXQ2, + FIELDX(ALX_RXQ2_RXF_XOFF_THRESH, val16) | + FIELDX(ALX_RXQ2_RXF_XON_THRESH, val)); + val = FIELDX(ALX_RXQ0_NUM_RFD_PREF, ALX_RXQ0_NUM_RFD_PREF_DEF) | + FIELDX(ALX_RXQ0_RSS_MODE, ALX_RXQ0_RSS_MODE_DIS) | + FIELDX(ALX_RXQ0_IDT_TBL_SIZE, ALX_RXQ0_IDT_TBL_SIZE_DEF) | + ALX_RXQ0_RSS_HSTYP_ALL | + ALX_RXQ0_RSS_HASH_EN | + ALX_RXQ0_IPV6_PARSE_EN; + if (ALX_CAP(hw, GIGA)) { + FIELD_SET32(val, ALX_RXQ0_ASPM_THRESH, + ALX_RXQ0_ASPM_THRESH_100M); + } + ALX_MEM_W32(hw, ALX_RXQ0, val); + + /* DMA */ + ALX_MEM_R32(hw, ALX_DMA, &val); + val = FIELDX(ALX_DMA_RORDER_MODE, ALX_DMA_RORDER_MODE_OUT) | + ALX_DMA_RREQ_PRI_DATA | + FIELDX(ALX_DMA_RREQ_BLEN, max_payload) | + FIELDX(ALX_DMA_WDLY_CNT, ALX_DMA_WDLY_CNT_DEF) | + FIELDX(ALX_DMA_RDLY_CNT, ALX_DMA_RDLY_CNT_DEF) | + FIELDX(ALX_DMA_RCHNL_SEL, hw->dma_chnl - 1); + ALX_MEM_W32(hw, ALX_DMA, val); + + /* multi-tx-q weight */ + if (ALX_CAP(hw, MTQ)) { + val = FIELDX(ALX_WRR_PRI, hw->wrr_ctrl) | + FIELDX(ALX_WRR_PRI0, hw->wrr[0]) | + FIELDX(ALX_WRR_PRI1, hw->wrr[1]) | + FIELDX(ALX_WRR_PRI2, hw->wrr[2]) | + FIELDX(ALX_WRR_PRI3, hw->wrr[3]); + ALX_MEM_W32(hw, ALX_WRR, val); + } +} + +void alx_mask_msix(struct alx_hw *hw, int index, bool mask) +{ + u32 reg, val; + + reg = ALX_MSIX_ENTRY_BASE + index * PCI_MSIX_ENTRY_SIZE + + PCI_MSIX_ENTRY_VECTOR_CTRL; + + val = mask ? PCI_MSIX_ENTRY_CTRL_MASKBIT : 0; + + ALX_MEM_W32(hw, reg, val); + ALX_MEM_FLUSH(hw); +} + +int alx_select_powersaving_speed(struct alx_hw *hw, u16 *speed) +{ + int i, err; + u16 spd, lpa; + bool linkup; + + err = alx_get_phy_link(hw, &linkup, &spd); + if (err) + goto out; + + if (!linkup) { + *speed = SPEED_0; + goto out; + } + + err = alx_read_phy_reg(hw, MII_LPA, &lpa); + if (err) + goto out; + + if (!(lpa & LPA_LPACK)) { + *speed = spd; + goto out; + } + if (lpa & LPA_100FULL) + *speed = SPEED_100 + FULL_DUPLEX; + else if (lpa & LPA_100HALF) + *speed = SPEED_100 + HALF_DUPLEX; + else if (lpa & LPA_10FULL) + *speed = SPEED_10 + FULL_DUPLEX; + else + *speed = SPEED_10 + HALF_DUPLEX; + + if (*speed != spd) { + + err = alx_setup_speed_duplex(hw, + ALX_SPEED_TO_ETHADV(*speed) | ADVERTISED_Autoneg, + ALX_FC_ANEG | ALX_FC_RX | ALX_FC_TX); + if (err) + goto out; + + /* wait for linkup */ + for (i = 0; i < ALX_MAX_SETUP_LNK_CYCLE; i++) { + u16 speed2; + bool link_on; + + msleep(100); + err = alx_get_phy_link(hw, &link_on, &speed2); + if (err) + goto out; + if (link_on) + break; + } + if (i == ALX_MAX_SETUP_LNK_CYCLE) { + err = ALX_LINK_TIMEOUT; + goto out; + } } - ALX_MEM_W32(adpt, ALX_WOL0, wol); +out: return err; } +void __alx_update_hw_stats(struct alx_hw *hw) +{ + u16 reg; + u32 data; + unsigned long *p; + + /* RX stats */ + reg = ALX_RX_STATS_BIN; + p = &hw->stats.rx_ok; + while (reg <= ALX_RX_STATS_END) { + ALX_MEM_R32(hw, reg, &data); + *p++ += data; + reg += 4; + } + + /* TX stats */ + reg = ALX_TX_STATS_BIN; + p = &hw->stats.tx_ok; + while (reg <= ALX_TX_STATS_END) { + ALX_MEM_R32(hw, reg, &data); + *p++ += data; + reg += 4; + } +} + +static const struct alx_platform_patch plats[] __devinitdata = { +{0x1091, 0x00, 0x1969, 0x0091, 0x1001}, +{0}, +}; + +void __devinit alx_patch_assign(struct alx_hw *hw) +{ + int i = 0; + + while (plats[i].pci_did != 0) { + if (plats[i].pci_did == ALX_DID(hw) && + plats[i].subsystem_vid == ALX_SUB_VID(hw) && + plats[i].subsystem_did == ALX_SUB_DID(hw) && + (plats[i].pflag & ALX_PF_ANY_REV || + plats[i].pci_rev == hw->revision)) { + if (plats[i].pflag & ALX_PF_LINK) + hw->lnk_patch = true; + if (plats[i].pflag & ALX_PF_HIB) + hw->hib_patch = true; + } + i++; + } +} + +bool __devinit alx_get_phy_info(struct alx_hw *hw) +{ + u16 devs1, devs2; + + if (alx_read_phy_reg(hw, MII_PHYSID1, &hw->phy_id[0]) || + alx_read_phy_reg(hw, MII_PHYSID2, &hw->phy_id[1])) + return false; + + /* since we haven't PMA/PMD status2 register, we can't + * use mdio45_probe function for prtad and mmds. + * use fixed MMD3 to get mmds. + */ + if (alx_read_phy_ext(hw, 3, MDIO_DEVS1, &devs1) || + alx_read_phy_ext(hw, 3, MDIO_DEVS2, &devs2)) + return false; + hw->mdio.mmds = devs1 | devs2 << 16; + + return true; +} diff --git a/src/alx_hw.h b/src/alx_hw.h index fc7f602..8790869 100644 --- a/src/alx_hw.h +++ b/src/alx_hw.h @@ -17,2098 +17,370 @@ #ifndef ALX_HW_H_ #define ALX_HW_H_ -#include <linux/types.h> -#include <linux/mii.h> -#include "alx.h" - -#define FIELD_GETX(_x, _name) (((_x) >> (_name##_SHIFT)) & (_name##_MASK)) -#define FIELD_SETS(_x, _name, _v) (\ -(_x) = \ -((_x) & ~((_name##_MASK) << (_name##_SHIFT))) |\ -(((u16)(_v) & (_name##_MASK)) << (_name##_SHIFT))) -#define FIELD_SET32(_x, _name, _v) (\ -(_x) = \ -((_x) & ~((_name##_MASK) << (_name##_SHIFT))) |\ -(((_v) & (_name##_MASK)) << (_name##_SHIFT))) -#define FIELDX(_name, _v) (((_v) & (_name##_MASK)) << (_name##_SHIFT)) - -/******************************************************************************/ -struct alx_adapter; -/* function prototype */ - -int alx_get_perm_macaddr(struct alx_adapter *adpt, u8 *addr); -void alx_reset_phy(struct alx_adapter *adpt, bool hib_en); -void alx_reset_pcie(struct alx_adapter *adpt); -void alx_enable_aspm(struct alx_adapter *adpt, bool l0s_en, bool l1_en); -int alx_setup_speed_duplex(struct alx_adapter *adpt, u32 ethadv, u8 flowctrl); -void alx_post_phy_link(struct alx_adapter *adpt, u16 speed, bool az_en); -int alx_pre_suspend(struct alx_adapter *adpt, u16 speed); -int alx_read_phy_reg(struct alx_adapter *adpt, u16 reg, u16 *phy_data); -int alx_write_phy_reg(struct alx_adapter *adpt, u16 reg, u16 phy_data); -int alx_read_phy_ext(struct alx_adapter *adpt, u8 dev, u16 reg, u16 *pdata); -int alx_write_phy_ext(struct alx_adapter *adpt, u8 dev, u16 reg, u16 data); -int alx_read_phy_dbg(struct alx_adapter *adpt, u16 reg, u16 *pdata); -int alx_write_phy_dbg(struct alx_adapter *adpt, u16 reg, u16 data); -int alx_get_phy_link(struct alx_adapter *adpt, bool *link_up, u16 *speed); -int alx_clear_phy_intr(struct alx_adapter *adpt); -int alx_config_wol(struct alx_adapter *adpt); -void alx_cfg_mac_fc(struct alx_adapter *adpt, u8 fc); -void alx_start_mac(struct alx_adapter *adpt); -int alx_stop_mac(struct alx_adapter *adpt); -int alx_reset_mac(struct alx_adapter *adpt); -void alx_set_macaddr(struct alx_adapter *adpt, u8 *addr); -bool alx_phy_configed(struct alx_adapter *adpt); - -/******************************************************************************/ -/* register definition */ -#define ALX_VENDOR_ID PCI_VENDOR_ID_ATTANSIC - -/* pci dev-id */ -#define ALX_DEV_ID_AR8161 0x1091 /* l1f */ -#define ALX_DEV_ID_AR8162 0x1090 /* l2f */ -#define ALX_DEV_ID_AR8171 0x10A1 -#define ALX_DEV_ID_AR8172 0x10A0 - -/* rev definition */ -#define ALX_PCI_REVID_WTH_CR BIT(1) /* bit1: with CardReader */ -#define ALX_PCI_REVID_WTH_XD BIT(0) /* bit0: with xD support */ -#define ALX_PCI_REVID_MASK 0x1FU /* bit[7:2]: real revision */ -#define ALX_PCI_REVID_SHIFT 3 -#define ALX_REV_A0 0 -#define ALX_REV_A1 1 -#define ALX_REV_B0 2 -#define ALX_REV_C0 3 - -#define ALX_PM_CSR 0x0044 /* 16bit */ -#define ALX_PM_CSR_PME_STAT BIT(15) -#define ALX_PM_CSR_DSCAL_MASK 0x3U -#define ALX_PM_CSR_DSCAL_SHIFT 13 -#define ALX_PM_CSR_DSEL_MASK 0xFU -#define ALX_PM_CSR_DSEL_SHIFT 9 -#define ALX_PM_CSR_PME_EN BIT(8) -#define ALX_PM_CSR_PWST_MASK 0x3U -#define ALX_PM_CSR_PWST_SHIFT 0 - -#define ALX_DEV_CAP 0x005C -#define ALX_DEV_CAP_SPLSL_MASK 0x3UL -#define ALX_DEV_CAP_SPLSL_SHIFT 26 -#define ALX_DEV_CAP_SPLV_MASK 0xFFUL -#define ALX_DEV_CAP_SPLV_SHIFT 18 -#define ALX_DEV_CAP_RBER BIT(15) -#define ALX_DEV_CAP_PIPRS BIT(14) -#define ALX_DEV_CAP_AIPRS BIT(13) -#define ALX_DEV_CAP_ABPRS BIT(12) -#define ALX_DEV_CAP_L1ACLAT_MASK 0x7UL -#define ALX_DEV_CAP_L1ACLAT_SHIFT 9 -#define ALX_DEV_CAP_L0SACLAT_MASK 0x7UL -#define ALX_DEV_CAP_L0SACLAT_SHIFT 6 -#define ALX_DEV_CAP_EXTAG BIT(5) -#define ALX_DEV_CAP_PHANTOM BIT(4) -#define ALX_DEV_CAP_MPL_MASK 0x7UL -#define ALX_DEV_CAP_MPL_SHIFT 0 -#define ALX_DEV_CAP_MPL_128 1 -#define ALX_DEV_CAP_MPL_256 2 -#define ALX_DEV_CAP_MPL_512 3 -#define ALX_DEV_CAP_MPL_1024 4 -#define ALX_DEV_CAP_MPL_2048 5 -#define ALX_DEV_CAP_MPL_4096 6 - -#define ALX_DEV_CTRL 0x0060 /* 16bit */ -#define ALX_DEV_CTRL_MAXRRS_MASK 0x7U -#define ALX_DEV_CTRL_MAXRRS_SHIFT 12 -#define ALX_DEV_CTRL_MAXRRS_MIN 2 -#define ALX_DEV_CTRL_NOSNP_EN BIT(11) -#define ALX_DEV_CTRL_AUXPWR_EN BIT(10) -#define ALX_DEV_CTRL_PHANTOM_EN BIT(9) -#define ALX_DEV_CTRL_EXTAG_EN BIT(8) -#define ALX_DEV_CTRL_MPL_MASK 0x7U -#define ALX_DEV_CTRL_MPL_SHIFT 5 -#define ALX_DEV_CTRL_RELORD_EN BIT(4) -#define ALX_DEV_CTRL_URR_EN BIT(3) -#define ALX_DEV_CTRL_FERR_EN BIT(2) -#define ALX_DEV_CTRL_NFERR_EN BIT(1) -#define ALX_DEV_CTRL_CERR_EN BIT(0) - - -#define ALX_DEV_STAT 0x0062 /* 16bit */ -#define ALX_DEV_STAT_XS_PEND BIT(5) -#define ALX_DEV_STAT_AUXPWR BIT(4) -#define ALX_DEV_STAT_UR BIT(3) -#define ALX_DEV_STAT_FERR BIT(2) -#define ALX_DEV_STAT_NFERR BIT(1) -#define ALX_DEV_STAT_CERR BIT(0) - -#define ALX_LNK_CAP 0x0064 -#define ALX_LNK_CAP_PRTNUM_MASK 0xFFUL -#define ALX_LNK_CAP_PRTNUM_SHIFT 24 -#define ALX_LNK_CAP_CLK_PM BIT(18) -#define ALX_LNK_CAP_L1EXTLAT_MASK 0x7UL -#define ALX_LNK_CAP_L1EXTLAT_SHIFT 15 -#define ALX_LNK_CAP_L0SEXTLAT_MASK 0x7UL -#define ALX_LNK_CAP_L0SEXTLAT_SHIFT 12 -#define ALX_LNK_CAP_ASPM_SUP_MASK 0x3UL -#define ALX_LNK_CAP_ASPM_SUP_SHIFT 10 -#define ALX_LNK_CAP_ASPM_SUP_L0S 1 -#define ALX_LNK_CAP_ASPM_SUP_L0SL1 3 -#define ALX_LNK_CAP_MAX_LWH_MASK 0x3FUL -#define ALX_LNK_CAP_MAX_LWH_SHIFT 4 -#define ALX_LNK_CAP_MAX_LSPD_MASK 0xFUL -#define ALX_LNK_CAP_MAX_LSPD_SHIFT 0 - -#define ALX_LNK_CTRL 0x0068 /* 16bit */ -#define ALX_LNK_CTRL_CLK_PM_EN BIT(8) -#define ALX_LNK_CTRL_EXTSYNC BIT(7) -#define ALX_LNK_CTRL_CMNCLK_CFG BIT(6) -#define ALX_LNK_CTRL_RCB_128B BIT(3) /* 0:64b,1:128b */ -#define ALX_LNK_CTRL_ASPM_MASK 0x3U -#define ALX_LNK_CTRL_ASPM_SHIFT 0 -#define ALX_LNK_CTRL_ASPM_DIS 0 -#define ALX_LNK_CTRL_ASPM_ENL0S 1 -#define ALX_LNK_CTRL_ASPM_ENL1 2 -#define ALX_LNK_CTRL_ASPM_ENL0SL1 3 - -#define ALX_LNK_STAT 0x006A /* 16bit */ -#define ALX_LNK_STAT_SCLKCFG BIT(12) -#define ALX_LNK_STAT_LNKTRAIN BIT(11) -#define ALX_LNK_STAT_TRNERR BIT(10) -#define ALX_LNK_STAT_LNKSPD_MASK 0xFU -#define ALX_LNK_STAT_LNKSPD_SHIFT 0 -#define ALX_LNK_STAT_NEGLW_MASK 0x3FU -#define ALX_LNK_STAT_NEGLW_SHIFT 4 - -#define ALX_MSIX_MASK 0x0090 -#define ALX_MSIX_PENDING 0x0094 - -#define ALX_UE_SVRT 0x010C -#define ALX_UE_SVRT_UR BIT(20) -#define ALX_UE_SVRT_ECRCERR BIT(19) -#define ALX_UE_SVRT_MTLP BIT(18) -#define ALX_UE_SVRT_RCVOVFL BIT(17) -#define ALX_UE_SVRT_UNEXPCPL BIT(16) -#define ALX_UE_SVRT_CPLABRT BIT(15) -#define ALX_UE_SVRT_CPLTO BIT(14) -#define ALX_UE_SVRT_FCPROTERR BIT(13) -#define ALX_UE_SVRT_PTLP BIT(12) -#define ALX_UE_SVRT_DLPROTERR BIT(4) -#define ALX_UE_SVRT_TRNERR BIT(0) - -#define ALX_EFLD 0x0204 /* eeprom/flash load */ -#define ALX_EFLD_F_ENDADDR_MASK 0x3FFUL -#define ALX_EFLD_F_ENDADDR_SHIFT 16 -#define ALX_EFLD_F_EXIST BIT(10) -#define ALX_EFLD_E_EXIST BIT(9) -#define ALX_EFLD_EXIST BIT(8) -#define ALX_EFLD_STAT BIT(5) /* 0:finish,1:in progress */ -#define ALX_EFLD_IDLE BIT(4) -#define ALX_EFLD_START BIT(0) - -#define ALX_SLD 0x0218 /* efuse load */ -#define ALX_SLD_FREQ_MASK 0x3UL -#define ALX_SLD_FREQ_SHIFT 24 -#define ALX_SLD_FREQ_100K 0 -#define ALX_SLD_FREQ_200K 1 -#define ALX_SLD_FREQ_300K 2 -#define ALX_SLD_FREQ_400K 3 -#define ALX_SLD_EXIST BIT(23) -#define ALX_SLD_SLVADDR_MASK 0x7FUL -#define ALX_SLD_SLVADDR_SHIFT 16 -#define ALX_SLD_IDLE BIT(13) -#define ALX_SLD_STAT BIT(12) /* 0:finish,1:in progress */ -#define ALX_SLD_START BIT(11) -#define ALX_SLD_STARTADDR_MASK 0xFFUL -#define ALX_SLD_STARTADDR_SHIFT 0 -#define ALX_SLD_MAX_TO 100 - -#define ALX_PCIE_MSIC 0x021C -#define ALX_PCIE_MSIC_MSIX_DIS BIT(22) -#define ALX_PCIE_MSIC_MSI_DIS BIT(21) - -#define ALX_PPHY_MISC1 0x1000 -#define ALX_PPHY_MISC1_RCVDET BIT(2) -#define ALX_PPHY_MISC1_NFTS_MASK 0xFFUL -#define ALX_PPHY_MISC1_NFTS_SHIFT 16 -#define ALX_PPHY_MISC1_NFTS_HIPERF 0xA0 - -#define ALX_PPHY_MISC2 0x1004 -#define ALX_PPHY_MISC2_L0S_TH_MASK 0x3UL -#define ALX_PPHY_MISC2_L0S_TH_SHIFT 18 -#define ALX_PPHY_MISC2_CDR_BW_MASK 0x3UL -#define ALX_PPHY_MISC2_CDR_BW_SHIFT 16 - -#define ALX_PDLL_TRNS1 0x1104 -#define ALX_PDLL_TRNS1_D3PLLOFF_EN BIT(11) -#define ALX_PDLL_TRNS1_REGCLK_SEL_NORM BIT(10) -#define ALX_PDLL_TRNS1_REPLY_TO_MASK 0x3FFUL -#define ALX_PDLL_TRNS1_REPLY_TO_SHIFT 0 - - -#define ALX_TLEXTN_STATS 0x1208 -#define ALX_TLEXTN_STATS_DEVNO_MASK 0x1FUL -#define ALX_TLEXTN_STATS_DEVNO_SHIFT 16 -#define ALX_TLEXTN_STATS_BUSNO_MASK 0xFFUL -#define ALX_TLEXTN_STATS_BUSNO_SHIFT 8 - -#define ALX_EFUSE_CTRL 0x12C0 -#define ALX_EFUSE_CTRL_FLAG BIT(31) /* 0:read,1:write */ -#define ALX_EUFSE_CTRL_ACK BIT(30) -#define ALX_EFUSE_CTRL_ADDR_MASK 0x3FFUL -#define ALX_EFUSE_CTRL_ADDR_SHIFT 16 - -#define ALX_EFUSE_DATA 0x12C4 - -#define ALX_SPI_OP1 0x12C8 -#define ALX_SPI_OP1_RDID_MASK 0xFFUL -#define ALX_SPI_OP1_RDID_SHIFT 24 -#define ALX_SPI_OP1_CE_MASK 0xFFUL -#define ALX_SPI_OP1_CE_SHIFT 16 -#define ALX_SPI_OP1_SE_MASK 0xFFUL -#define ALX_SPI_OP1_SE_SHIFT 8 -#define ALX_SPI_OP1_PRGRM_MASK 0xFFUL -#define ALX_SPI_OP1_PRGRM_SHIFT 0 - -#define ALX_SPI_OP2 0x12CC -#define ALX_SPI_OP2_READ_MASK 0xFFUL -#define ALX_SPI_OP2_READ_SHIFT 24 -#define ALX_SPI_OP2_WRSR_MASK 0xFFUL -#define ALX_SPI_OP2_WRSR_SHIFT 16 -#define ALX_SPI_OP2_RDSR_MASK 0xFFUL -#define ALX_SPI_OP2_RDSR_SHIFT 8 -#define ALX_SPI_OP2_WREN_MASK 0xFFUL -#define ALX_SPI_OP2_WREN_SHIFT 0 - -#define ALX_SPI_OP3 0x12E4 -#define ALX_SPI_OP3_WRDI_MASK 0xFFUL -#define ALX_SPI_OP3_WRDI_SHIFT 8 -#define ALX_SPI_OP3_EWSR_MASK 0xFFUL -#define ALX_SPI_OP3_EWSR_SHIFT 0 - -#define ALX_EF_CTRL 0x12D0 -#define ALX_EF_CTRL_FSTS_MASK 0xFFUL -#define ALX_EF_CTRL_FSTS_SHIFT 20 -#define ALX_EF_CTRL_CLASS_MASK 0x7UL -#define ALX_EF_CTRL_CLASS_SHIFT 16 -#define ALX_EF_CTRL_CLASS_F_UNKNOWN 0 -#define ALX_EF_CTRL_CLASS_F_STD 1 -#define ALX_EF_CTRL_CLASS_F_SST 2 -#define ALX_EF_CTRL_CLASS_E_UNKNOWN 0 -#define ALX_EF_CTRL_CLASS_E_1K 1 -#define ALX_EF_CTRL_CLASS_E_4K 2 -#define ALX_EF_CTRL_FRET BIT(15) /* 0:OK,1:fail */ -#define ALX_EF_CTRL_TYP_MASK 0x3UL -#define ALX_EF_CTRL_TYP_SHIFT 12 -#define ALX_EF_CTRL_TYP_NONE 0 -#define ALX_EF_CTRL_TYP_F 1 -#define ALX_EF_CTRL_TYP_E 2 -#define ALX_EF_CTRL_TYP_UNKNOWN 3 -#define ALX_EF_CTRL_ONE_CLK BIT(10) -#define ALX_EF_CTRL_ECLK_MASK 0x3UL -#define ALX_EF_CTRL_ECLK_SHIFT 8 -#define ALX_EF_CTRL_ECLK_125K 0 -#define ALX_EF_CTRL_ECLK_250K 1 -#define ALX_EF_CTRL_ECLK_500K 2 -#define ALX_EF_CTRL_ECLK_1M 3 -#define ALX_EF_CTRL_FBUSY BIT(7) -#define ALX_EF_CTRL_ACTION BIT(6) /* 1:start,0:stop */ -#define ALX_EF_CTRL_AUTO_OP BIT(5) -#define ALX_EF_CTRL_SST_MODE BIT(4) /* force using sst */ -#define ALX_EF_CTRL_INST_MASK 0xFUL -#define ALX_EF_CTRL_INST_SHIFT 0 -#define ALX_EF_CTRL_INST_NONE 0 -#define ALX_EF_CTRL_INST_READ 1 /* for flash & eeprom */ -#define ALX_EF_CTRL_INST_RDID 2 -#define ALX_EF_CTRL_INST_RDSR 3 -#define ALX_EF_CTRL_INST_WREN 4 -#define ALX_EF_CTRL_INST_PRGRM 5 -#define ALX_EF_CTRL_INST_SE 6 -#define ALX_EF_CTRL_INST_CE 7 -#define ALX_EF_CTRL_INST_WRSR 10 -#define ALX_EF_CTRL_INST_EWSR 11 -#define ALX_EF_CTRL_INST_WRDI 12 -#define ALX_EF_CTRL_INST_WRITE 2 /* only for eeprom */ - -#define ALX_EF_ADDR 0x12D4 -#define ALX_EF_DATA 0x12D8 -#define ALX_SPI_ID 0x12DC - -#define ALX_SPI_CFG_START 0x12E0 - -#define ALX_PMCTRL 0x12F8 -#define ALX_PMCTRL_HOTRST_WTEN BIT(31) -#define ALX_PMCTRL_ASPM_FCEN BIT(30) /* L0s/L1 dis by MAC based on - * thrghput(setting in 15A0) - */ -#define ALX_PMCTRL_SADLY_EN BIT(29) -#define ALX_PMCTRL_L0S_BUFSRX_EN BIT(28) -#define ALX_PMCTRL_LCKDET_TIMER_MASK 0xFUL -#define ALX_PMCTRL_LCKDET_TIMER_SHIFT 24 -#define ALX_PMCTRL_LCKDET_TIMER_DEF 0xC -#define ALX_PMCTRL_L1REQ_TO_MASK 0xFUL -#define ALX_PMCTRL_L1REQ_TO_SHIFT 20 /* pm_request_l1 time > @ - * ->L0s not L1 - */ -#define ALX_PMCTRL_L1REG_TO_DEF 0xF -#define ALX_PMCTRL_TXL1_AFTER_L0S BIT(19) -#define ALX_PMCTRL_L1_TIMER_MASK 0x7UL -#define ALX_PMCTRL_L1_TIMER_SHIFT 16 -#define ALX_PMCTRL_L1_TIMER_DIS 0 -#define ALX_PMCTRL_L1_TIMER_2US 1 -#define ALX_PMCTRL_L1_TIMER_4US 2 -#define ALX_PMCTRL_L1_TIMER_8US 3 -#define ALX_PMCTRL_L1_TIMER_16US 4 -#define ALX_PMCTRL_L1_TIMER_24US 5 -#define ALX_PMCTRL_L1_TIMER_32US 6 -#define ALX_PMCTRL_L1_TIMER_63US 7 -#define ALX_PMCTRL_RCVR_WT_1US BIT(15) /* 1:1us, 0:2ms */ -#define ALX_PMCTRL_PWM_VER_11 BIT(14) /* 0:1.0a,1:1.1 */ -#define ALX_PMCTRL_L1_CLKSW_EN BIT(13) /* en pcie clk sw in L1 */ -#define ALX_PMCTRL_L0S_EN BIT(12) -#define ALX_PMCTRL_RXL1_AFTER_L0S BIT(11) -#define ALX_PMCTRL_L0S_TIMER_MASK 0x7UL -#define ALX_PMCTRL_L0S_TIMER_SHIFT 8 -#define ALX_PMCTRL_L1_BUFSRX_EN BIT(7) -#define ALX_PMCTRL_L1_SRDSRX_PWD BIT(6) /* power down serdes rx */ -#define ALX_PMCTRL_L1_SRDSPLL_EN BIT(5) -#define ALX_PMCTRL_L1_SRDS_EN BIT(4) -#define ALX_PMCTRL_L1_EN BIT(3) -#define ALX_PMCTRL_CLKREQ_EN BIT(2) -#define ALX_PMCTRL_RBER_EN BIT(1) -#define ALX_PMCTRL_SPRSDWER_EN BIT(0) - -#define ALX_LTSSM_CTRL 0x12FC -#define ALX_LTSSM_WRO_EN BIT(12) - - -/******************************************************************************/ - -#define ALX_MASTER 0x1400 -#define ALX_MASTER_OTP_FLG BIT(31) -#define ALX_MASTER_DEV_NUM_MASK 0x7FUL -#define ALX_MASTER_DEV_NUM_SHIFT 24 -#define ALX_MASTER_REV_NUM_MASK 0xFFUL -#define ALX_MASTER_REV_NUM_SHIFT 16 -#define ALX_MASTER_DEASSRT BIT(15) /*ISSUE DE-ASSERT MSG */ -#define ALX_MASTER_RDCLR_INT BIT(14) -#define ALX_MASTER_DMA_RST BIT(13) -#define ALX_MASTER_PCLKSEL_SRDS BIT(12) /* 1:alwys sel pclk from - * serdes, not sw to 25M */ -#define ALX_MASTER_IRQMOD2_EN BIT(11) /* IRQ MODURATION FOR RX */ -#define ALX_MASTER_IRQMOD1_EN BIT(10) /* MODURATION FOR TX/RX */ -#define ALX_MASTER_MANU_INT BIT(9) /* SOFT MANUAL INT */ -#define ALX_MASTER_MANUTIMER_EN BIT(8) -#define ALX_MASTER_SYSALVTIMER_EN BIT(7) /* SYS ALIVE TIMER EN */ -#define ALX_MASTER_OOB_DIS BIT(6) /* OUT OF BOX DIS */ -#define ALX_MASTER_WAKEN_25M BIT(5) /* WAKE WO. PCIE CLK */ -#define ALX_MASTER_BERT_START BIT(4) -#define ALX_MASTER_PCIE_TSTMOD_MASK 0x3UL -#define ALX_MASTER_PCIE_TSTMOD_SHIFT 2 -#define ALX_MASTER_PCIE_RST BIT(1) -#define ALX_MASTER_DMA_MAC_RST BIT(0) /* RST MAC & DMA */ -#define ALX_DMA_MAC_RST_TO 50 - -#define ALX_MANU_TIMER 0x1404 - -#define ALX_IRQ_MODU_TIMER 0x1408 -#define ALX_IRQ_MODU_TIMER2_MASK 0xFFFFUL -#define ALX_IRQ_MODU_TIMER2_SHIFT 16 /* ONLY FOR RX */ -#define ALX_IRQ_MODU_TIMER1_MASK 0xFFFFUL -#define ALX_IRQ_MODU_TIMER1_SHIFT 0 - -#define ALX_PHY_CTRL 0x140C -#define ALX_PHY_CTRL_ADDR_MASK 0x1FUL -#define ALX_PHY_CTRL_ADDR_SHIFT 19 -#define ALX_PHY_CTRL_BP_VLTGSW BIT(18) -#define ALX_PHY_CTRL_100AB_EN BIT(17) -#define ALX_PHY_CTRL_10AB_EN BIT(16) -#define ALX_PHY_CTRL_PLL_BYPASS BIT(15) -#define ALX_PHY_CTRL_POWER_DOWN BIT(14) /* affect MAC & PHY, - * go to low power sts - */ -#define ALX_PHY_CTRL_PLL_ON BIT(13) /* 1:PLL ALWAYS ON - * 0:CAN SWITCH IN LPW - */ -#define ALX_PHY_CTRL_RST_ANALOG BIT(12) -#define ALX_PHY_CTRL_HIB_PULSE BIT(11) -#define ALX_PHY_CTRL_HIB_EN BIT(10) -#define ALX_PHY_CTRL_GIGA_DIS BIT(9) -#define ALX_PHY_CTRL_IDDQ_DIS BIT(8) /* POWER ON RST */ -#define ALX_PHY_CTRL_IDDQ BIT(7) /* WHILE REBOOT, BIT8(1) - * EFFECTS BIT7 - */ -#define ALX_PHY_CTRL_LPW_EXIT BIT(6) -#define ALX_PHY_CTRL_GATE_25M BIT(5) -#define ALX_PHY_CTRL_RVRS_ANEG BIT(4) -#define ALX_PHY_CTRL_ANEG_NOW BIT(3) -#define ALX_PHY_CTRL_LED_MODE BIT(2) -#define ALX_PHY_CTRL_RTL_MODE BIT(1) -#define ALX_PHY_CTRL_DSPRST_OUT BIT(0) /* OUT OF DSP RST STATE */ -#define ALX_PHY_CTRL_DSPRST_TO 80 -#define ALX_PHY_CTRL_CLS (\ - ALX_PHY_CTRL_LED_MODE |\ - ALX_PHY_CTRL_100AB_EN |\ - ALX_PHY_CTRL_PLL_ON) - -#define ALX_MAC_STS 0x1410 -#define ALX_MAC_STS_SFORCE_MASK 0xFUL -#define ALX_MAC_STS_SFORCE_SHIFT 14 -#define ALX_MAC_STS_CALIB_DONE BIT13 -#define ALX_MAC_STS_CALIB_RES_MASK 0x1FUL -#define ALX_MAC_STS_CALIB_RES_SHIFT 8 -#define ALX_MAC_STS_CALIBERR_MASK 0xFUL -#define ALX_MAC_STS_CALIBERR_SHIFT 4 -#define ALX_MAC_STS_TXQ_BUSY BIT(3) -#define ALX_MAC_STS_RXQ_BUSY BIT(2) -#define ALX_MAC_STS_TXMAC_BUSY BIT(1) -#define ALX_MAC_STS_RXMAC_BUSY BIT(0) -#define ALX_MAC_STS_IDLE (\ - ALX_MAC_STS_TXQ_BUSY |\ - ALX_MAC_STS_RXQ_BUSY |\ - ALX_MAC_STS_TXMAC_BUSY |\ - ALX_MAC_STS_RXMAC_BUSY) - -#define ALX_MDIO 0x1414 -#define ALX_MDIO_MODE_EXT BIT(30) /* 0:normal,1:ext */ -#define ALX_MDIO_POST_READ BIT(29) -#define ALX_MDIO_AUTO_POLLING BIT(28) -#define ALX_MDIO_BUSY BIT(27) -#define ALX_MDIO_CLK_SEL_MASK 0x7UL -#define ALX_MDIO_CLK_SEL_SHIFT 24 -#define ALX_MDIO_CLK_SEL_25MD4 0 /* 25M DIV 4 */ -#define ALX_MDIO_CLK_SEL_25MD6 2 -#define ALX_MDIO_CLK_SEL_25MD8 3 -#define ALX_MDIO_CLK_SEL_25MD10 4 -#define ALX_MDIO_CLK_SEL_25MD32 5 -#define ALX_MDIO_CLK_SEL_25MD64 6 -#define ALX_MDIO_CLK_SEL_25MD128 7 -#define ALX_MDIO_START BIT(23) -#define ALX_MDIO_SPRES_PRMBL BIT(22) -#define ALX_MDIO_OP_READ BIT(21) /* 1:read,0:write */ -#define ALX_MDIO_REG_MASK 0x1FUL -#define ALX_MDIO_REG_SHIFT 16 -#define ALX_MDIO_DATA_MASK 0xFFFFUL -#define ALX_MDIO_DATA_SHIFT 0 -#define ALX_MDIO_MAX_AC_TO 120 - -#define ALX_MDIO_EXTN 0x1448 -#define ALX_MDIO_EXTN_PORTAD_MASK 0x1FUL -#define ALX_MDIO_EXTN_PORTAD_SHIFT 21 -#define ALX_MDIO_EXTN_DEVAD_MASK 0x1FUL -#define ALX_MDIO_EXTN_DEVAD_SHIFT 16 -#define ALX_MDIO_EXTN_REG_MASK 0xFFFFUL -#define ALX_MDIO_EXTN_REG_SHIFT 0 - -#define ALX_PHY_STS 0x1418 -#define ALX_PHY_STS_LPW BIT(31) -#define ALX_PHY_STS_LPI BIT(30) -#define ALX_PHY_STS_PWON_STRIP_MASK 0xFFFUL -#define ALX_PHY_STS_PWON_STRIP_SHIFT 16 - -#define ALX_PHY_STS_DUPLEX BIT(3) -#define ALX_PHY_STS_LINKUP BIT(2) -#define ALX_PHY_STS_SPEED_MASK 0x3UL -#define ALX_PHY_STS_SPEED_SHIFT 0 -#define ALX_PHY_STS_SPEED_1000M 2 -#define ALX_PHY_STS_SPEED_100M 1 -#define ALX_PHY_STS_SPEED_10M 0 - -#define ALX_BIST0 0x141C -#define ALX_BIST0_COL_MASK 0x3FUL -#define ALX_BIST0_COL_SHIFT 24 -#define ALX_BIST0_ROW_MASK 0xFFFUL -#define ALX_BIST0_ROW_SHIFT 12 -#define ALX_BIST0_STEP_MASK 0xFUL -#define ALX_BIST0_STEP_SHIFT 8 -#define ALX_BIST0_PATTERN_MASK 0x7UL -#define ALX_BIST0_PATTERN_SHIFT 4 -#define ALX_BIST0_CRIT BIT(3) -#define ALX_BIST0_FIXED BIT(2) -#define ALX_BIST0_FAIL BIT(1) -#define ALX_BIST0_START BIT(0) - -#define ALX_BIST1 0x1420 -#define ALX_BIST1_COL_MASK 0x3FUL -#define ALX_BIST1_COL_SHIFT 24 -#define ALX_BIST1_ROW_MASK 0xFFFUL -#define ALX_BIST1_ROW_SHIFT 12 -#define ALX_BIST1_STEP_MASK 0xFUL -#define ALX_BIST1_STEP_SHIFT 8 -#define ALX_BIST1_PATTERN_MASK 0x7UL -#define ALX_BIST1_PATTERN_SHIFT 4 -#define ALX_BIST1_CRIT BIT(3) -#define ALX_BIST1_FIXED BIT(2) -#define ALX_BIST1_FAIL BIT(1) -#define ALX_BIST1_START BIT(0) - -#define ALX_SERDES 0x1424 -#define ALX_SERDES_PHYCLK_SLWDWN BIT(18) -#define ALX_SERDES_MACCLK_SLWDWN BIT(17) -#define ALX_SERDES_SELFB_PLL_MASK 0x3UL -#define ALX_SERDES_SELFB_PLL_SHIFT 14 -#define ALX_SERDES_PHYCLK_SEL_GTX BIT(13) /* 1:gtx_clk, 0:25M */ -#define ALX_SERDES_PCIECLK_SEL_SRDS BIT(12) /* 1:serdes,0:25M */ -#define ALX_SERDES_BUFS_RX_EN BIT(11) -#define ALX_SERDES_PD_RX BIT(10) -#define ALX_SERDES_PLL_EN BIT(9) -#define ALX_SERDES_EN BIT(8) -#define ALX_SERDES_SELFB_PLL_SEL_CSR BIT(6) /* 0:state-machine,1:csr */ -#define ALX_SERDES_SELFB_PLL_CSR_MASK 0x3UL -#define ALX_SERDES_SELFB_PLL_CSR_SHIFT 4 -#define ALX_SERDES_SELFB_PLL_CSR_4 3 /* 4-12% OV-CLK */ -#define ALX_SERDES_SELFB_PLL_CSR_0 2 /* 0-4% OV-CLK */ -#define ALX_SERDES_SELFB_PLL_CSR_12 1 /* 12-18% OV-CLK */ -#define ALX_SERDES_SELFB_PLL_CSR_18 0 /* 18-25% OV-CLK */ -#define ALX_SERDES_VCO_SLOW BIT(3) -#define ALX_SERDES_VCO_FAST BIT(2) -#define ALX_SERDES_LOCKDCT_EN BIT(1) -#define ALX_SERDES_LOCKDCTED BIT(0) - -#define ALX_LED_CTRL 0x1428 -#define ALX_LED_CTRL_PATMAP2_MASK 0x3UL -#define ALX_LED_CTRL_PATMAP2_SHIFT 8 -#define ALX_LED_CTRL_PATMAP1_MASK 0x3UL -#define ALX_LED_CTRL_PATMAP1_SHIFT 6 -#define ALX_LED_CTRL_PATMAP0_MASK 0x3UL -#define ALX_LED_CTRL_PATMAP0_SHIFT 4 -#define ALX_LED_CTRL_D3_MODE_MASK 0x3UL -#define ALX_LED_CTRL_D3_MODE_SHIFT 2 -#define ALX_LED_CTRL_D3_MODE_NORMAL 0 -#define ALX_LED_CTRL_D3_MODE_WOL_DIS 1 -#define ALX_LED_CTRL_D3_MODE_WOL_ANY 2 -#define ALX_LED_CTRL_D3_MODE_WOL_EN 3 -#define ALX_LED_CTRL_DUTY_CYCL_MASK 0x3UL -#define ALX_LED_CTRL_DUTY_CYCL_SHIFT 0 -#define ALX_LED_CTRL_DUTY_CYCL_50 0 /* 50% */ -#define ALX_LED_CTRL_DUTY_CYCL_125 1 /* 12.5% */ -#define ALX_LED_CTRL_DUTY_CYCL_25 2 /* 25% */ -#define ALX_LED_CTRL_DUTY_CYCL_75 3 /* 75% */ - -#define ALX_LED_PATN 0x142C -#define ALX_LED_PATN1_MASK 0xFFFFUL -#define ALX_LED_PATN1_SHIFT 16 -#define ALX_LED_PATN0_MASK 0xFFFFUL -#define ALX_LED_PATN0_SHIFT 0 - -#define ALX_LED_PATN2 0x1430 -#define ALX_LED_PATN2_MASK 0xFFFFUL -#define ALX_LED_PATN2_SHIFT 0 - -#define ALX_SYSALV 0x1434 -#define ALX_SYSALV_FLAG BIT(0) - -#define ALX_PCIERR_INST 0x1438 -#define ALX_PCIERR_INST_TX_RATE_MASK 0xFUL -#define ALX_PCIERR_INST_TX_RATE_SHIFT 4 -#define ALX_PCIERR_INST_RX_RATE_MASK 0xFUL -#define ALX_PCIERR_INST_RX_RATE_SHIFT 0 - -#define ALX_LPI_DECISN_TIMER 0x143C - -#define ALX_LPI_CTRL 0x1440 -#define ALX_LPI_CTRL_CHK_DA BIT(31) -#define ALX_LPI_CTRL_ENH_TO_MASK 0x1FFFUL -#define ALX_LPI_CTRL_ENH_TO_SHIFT 12 -#define ALX_LPI_CTRL_ENH_TH_MASK 0x1FUL -#define ALX_LPI_CTRL_ENH_TH_SHIFT 6 -#define ALX_LPI_CTRL_ENH_EN BIT(5) -#define ALX_LPI_CTRL_CHK_RX BIT(4) -#define ALX_LPI_CTRL_CHK_STATE BIT(3) -#define ALX_LPI_CTRL_GMII BIT(2) -#define ALX_LPI_CTRL_TO_PHY BIT(1) -#define ALX_LPI_CTRL_EN BIT(0) - -#define ALX_LPI_WAIT 0x1444 -#define ALX_LPI_WAIT_TIMER_MASK 0xFFFFUL -#define ALX_LPI_WAIT_TIMER_SHIFT 0 - -#define ALX_HRTBT_VLAN 0x1450 /* HEARTBEAT, FOR CIFS */ -#define ALX_HRTBT_VLANID_MASK 0xFFFFUL /* OR CLOUD */ -#define ALX_HRRBT_VLANID_SHIFT 0 - -#define ALX_HRTBT_CTRL 0x1454 -#define ALX_HRTBT_CTRL_EN BIT(31) -#define ALX_HRTBT_CTRL_PERIOD_MASK 0x3FUL -#define ALX_HRTBT_CTRL_PERIOD_SHIFT 25 -#define ALX_HRTBT_CTRL_HASVLAN BIT(24) -#define ALX_HRTBT_CTRL_HDRADDR_MASK 0xFFFUL /* A0 */ -#define ALX_HRTBT_CTRL_HDRADDR_SHIFT 12 -#define ALX_HRTBT_CTRL_HDRADDRB0_MASK 0x7FFUL /* B0 */ -#define ALX_HRTBT_CTRL_HDRADDRB0_SHIFT 13 -#define ALX_HRTBT_CTRL_PKT_FRAG BIT(12) /* B0 */ -#define ALX_HRTBT_CTRL_PKTLEN_MASK 0xFFFUL -#define ALX_HRTBT_CTRL_PKTLEN_SHIFT 0 - -#define ALX_HRTBT_EXT_CTRL 0x1AD0 /* B0 */ -#define ALX_HRTBT_EXT_CTRL_NS_EN BIT(12) -#define ALX_HRTBT_EXT_CTRL_FRAG_LEN_MASK 0xFFUL -#define ALX_HRTBT_EXT_CTRL_FRAG_LEN_SHIFT 4 -#define ALX_HRTBT_EXT_CTRL_IS_8023 BIT(3) -#define ALX_HRTBT_EXT_CTRL_IS_IPV6 BIT(2) -#define ALX_HRTBT_EXT_CTRL_WAKEUP_EN BIT(1) -#define ALX_HRTBT_EXT_CTRL_ARP_EN BIT(0) - -#define ALX_HRTBT_REM_IPV4_ADDR 0x1AD4 -#define ALX_HRTBT_HOST_IPV4_ADDR 0x1478/*use ALX_TRD_BUBBLE_DA_IP4*/ -#define ALX_HRTBT_REM_IPV6_ADDR3 0x1AD8 -#define ALX_HRTBT_REM_IPV6_ADDR2 0x1ADC -#define ALX_HRTBT_REM_IPV6_ADDR1 0x1AE0 -#define ALX_HRTBT_REM_IPV6_ADDR0 0x1AE4 -/*SWOI_HOST_IPV6_ADDR reuse reg1a60-1a6c, 1a70-1a7c, 1aa0-1aac, 1ab0-1abc.*/ -#define ALX_HRTBT_WAKEUP_PORT 0x1AE8 -#define ALX_HRTBT_WAKEUP_PORT_SRC_MASK 0xFFFFUL -#define ALX_HRTBT_WAKEUP_PORT_SRC_SHIFT 16 -#define ALX_HRTBT_WAKEUP_PORT_DEST_MASK 0xFFFFUL -#define ALX_HRTBT_WAKEUP_PORT_DEST_SHIFT 0 - -#define ALX_HRTBT_WAKEUP_DATA7 0x1AEC -#define ALX_HRTBT_WAKEUP_DATA6 0x1AF0 -#define ALX_HRTBT_WAKEUP_DATA5 0x1AF4 -#define ALX_HRTBT_WAKEUP_DATA4 0x1AF8 -#define ALX_HRTBT_WAKEUP_DATA3 0x1AFC -#define ALX_HRTBT_WAKEUP_DATA2 0x1B80 -#define ALX_HRTBT_WAKEUP_DATA1 0x1B84 -#define ALX_HRTBT_WAKEUP_DATA0 0x1B88 - -#define ALX_RXPARSE 0x1458 -#define ALX_RXPARSE_FLT6_L4_MASK 0x3UL -#define ALX_RXPARSE_FLT6_L4_SHIFT 30 -#define ALX_RXPARSE_FLT6_L3_MASK 0x3UL -#define ALX_RXPARSE_FLT6_L3_SHIFT 28 -#define ALX_RXPARSE_FLT5_L4_MASK 0x3UL -#define ALX_RXPARSE_FLT5_L4_SHIFT 26 -#define ALX_RXPARSE_FLT5_L3_MASK 0x3UL -#define ALX_RXPARSE_FLT5_L3_SHIFT 24 -#define ALX_RXPARSE_FLT4_L4_MASK 0x3UL -#define ALX_RXPARSE_FLT4_L4_SHIFT 22 -#define ALX_RXPARSE_FLT4_L3_MASK 0x3UL -#define ALX_RXPARSE_FLT4_L3_SHIFT 20 -#define ALX_RXPARSE_FLT3_L4_MASK 0x3UL -#define ALX_RXPARSE_FLT3_L4_SHIFT 18 -#define ALX_RXPARSE_FLT3_L3_MASK 0x3UL -#define ALX_RXPARSE_FLT3_L3_SHIFT 16 -#define ALX_RXPARSE_FLT2_L4_MASK 0x3UL -#define ALX_RXPARSE_FLT2_L4_SHIFT 14 -#define ALX_RXPARSE_FLT2_L3_MASK 0x3UL -#define ALX_RXPARSE_FLT2_L3_SHIFT 12 -#define ALX_RXPARSE_FLT1_L4_MASK 0x3UL -#define ALX_RXPARSE_FLT1_L4_SHIFT 10 -#define ALX_RXPARSE_FLT1_L3_MASK 0x3UL -#define ALX_RXPARSE_FLT1_L3_SHIFT 8 -#define ALX_RXPARSE_FLT6_EN BIT(5) -#define ALX_RXPARSE_FLT5_EN BIT(4) -#define ALX_RXPARSE_FLT4_EN BIT(3) -#define ALX_RXPARSE_FLT3_EN BIT(2) -#define ALX_RXPARSE_FLT2_EN BIT(1) -#define ALX_RXPARSE_FLT1_EN BIT(0) -#define ALX_RXPARSE_FLT_L4_UDP 0 -#define ALX_RXPARSE_FLT_L4_TCP 1 -#define ALX_RXPARSE_FLT_L4_BOTH 2 -#define ALX_RXPARSE_FLT_L4_NONE 3 -#define ALX_RXPARSE_FLT_L3_IPV6 0 -#define ALX_RXPARSE_FLT_L3_IPV4 1 -#define ALX_RXPARSE_FLT_L3_BOTH 2 - -/* Terodo support */ -#define ALX_TRD_CTRL 0x145C -#define ALX_TRD_CTRL_EN BIT(31) -#define ALX_TRD_CTRL_BUBBLE_WAKE_EN BIT(30) -#define ALX_TRD_CTRL_PREFIX_CMP_HW BIT(28) -#define ALX_TRD_CTRL_RSHDR_ADDR_MASK 0xFFFUL -#define ALX_TRD_CTRL_RSHDR_ADDR_SHIFT 16 -#define ALX_TRD_CTRL_SINTV_MAX_MASK 0xFFUL -#define ALX_TRD_CTRL_SINTV_MAX_SHIFT 8 -#define ALX_TRD_CTRL_SINTV_MIN_MASK 0xFFUL -#define ALX_TRD_CTRL_SINTV_MIN_SHIFT 0 - -#define ALX_TRD_RS 0x1460 -#define ALX_TRD_RS_SZ_MASK 0xFFFUL -#define ALX_TRD_RS_SZ_SHIFT 20 -#define ALX_TRD_RS_NONCE_OFS_MASK 0xFFFUL -#define ALX_TRD_RS_NONCE_OFS_SHIFT 8 -#define ALX_TRD_RS_SEQ_OFS_MASK 0xFFUL -#define ALX_TRD_RS_SEQ_OFS_SHIFT 0 - -#define ALX_TRD_SRV_IP4 0x1464 - -#define ALX_TRD_CLNT_EXTNL_IP4 0x1468 - -#define ALX_TRD_PORT 0x146C -#define ALX_TRD_PORT_CLNT_EXTNL_MASK 0xFFFFUL -#define ALX_TRD_PORT_CLNT_EXTNL_SHIFT 16 -#define ALX_TRD_PORT_SRV_MASK 0xFFFFUL -#define ALX_TRD_PORT_SRV_SHIFT 0 - -#define ALX_TRD_PREFIX 0x1470 - -#define ALX_TRD_BUBBLE_DA_IP4 0x1478 - -#define ALX_TRD_BUBBLE_DA_PORT 0x147C - - -#define ALX_IDLE_DECISN_TIMER 0x1474 /* B0 */ -#define ALX_IDLE_DECISN_TIMER_DEF 0x400 /* 1ms */ - - -#define ALX_MAC_CTRL 0x1480 -#define ALX_MAC_CTRL_FAST_PAUSE BIT(31) -#define ALX_MAC_CTRL_WOLSPED_SWEN BIT(30) -#define ALX_MAC_CTRL_MHASH_ALG_HI5B BIT(29) /* 1:legacy, 0:marvl(low5b)*/ -#define ALX_MAC_CTRL_SPAUSE_EN BIT(28) -#define ALX_MAC_CTRL_DBG_EN BIT(27) -#define ALX_MAC_CTRL_BRD_EN BIT(26) -#define ALX_MAC_CTRL_MULTIALL_EN BIT(25) -#define ALX_MAC_CTRL_RX_XSUM_EN BIT(24) -#define ALX_MAC_CTRL_THUGE BIT(23) -#define ALX_MAC_CTRL_MBOF BIT(22) -#define ALX_MAC_CTRL_SPEED_MASK 0x3UL -#define ALX_MAC_CTRL_SPEED_SHIFT 20 -#define ALX_MAC_CTRL_SPEED_10_100 1 -#define ALX_MAC_CTRL_SPEED_1000 2 -#define ALX_MAC_CTRL_SIMR BIT(19) -#define ALX_MAC_CTRL_SSTCT BIT(17) -#define ALX_MAC_CTRL_TPAUSE BIT(16) -#define ALX_MAC_CTRL_PROMISC_EN BIT(15) -#define ALX_MAC_CTRL_VLANSTRIP BIT(14) -#define ALX_MAC_CTRL_PRMBLEN_MASK 0xFUL -#define ALX_MAC_CTRL_PRMBLEN_SHIFT 10 -#define ALX_MAC_CTRL_RHUGE_EN BIT(9) -#define ALX_MAC_CTRL_FLCHK BIT(8) -#define ALX_MAC_CTRL_PCRCE BIT(7) -#define ALX_MAC_CTRL_CRCE BIT(6) -#define ALX_MAC_CTRL_FULLD BIT(5) -#define ALX_MAC_CTRL_LPBACK_EN BIT(4) -#define ALX_MAC_CTRL_RXFC_EN BIT(3) -#define ALX_MAC_CTRL_TXFC_EN BIT(2) -#define ALX_MAC_CTRL_RX_EN BIT(1) -#define ALX_MAC_CTRL_TX_EN BIT(0) - -#define ALX_GAP 0x1484 -#define ALX_GAP_IPGR2_MASK 0x7FUL -#define ALX_GAP_IPGR2_SHIFT 24 -#define ALX_GAP_IPGR1_MASK 0x7FUL -#define ALX_GAP_IPGR1_SHIFT 16 -#define ALX_GAP_MIN_IFG_MASK 0xFFUL -#define ALX_GAP_MIN_IFG_SHIFT 8 -#define ALX_GAP_IPGT_MASK 0x7FUL /* A0 diff with B0 */ -#define ALX_GAP_IPGT_SHIFT 0 - -#define ALX_STAD0 0x1488 -#define ALX_STAD1 0x148C - -#define ALX_HASH_TBL0 0x1490 -#define ALX_HASH_TBL1 0x1494 - -#define ALX_HALFD 0x1498 -#define ALX_HALFD_JAM_IPG_MASK 0xFUL -#define ALX_HALFD_JAM_IPG_SHIFT 24 -#define ALX_HALFD_ABEBT_MASK 0xFUL -#define ALX_HALFD_ABEBT_SHIFT 20 -#define ALX_HALFD_ABEBE BIT(19) -#define ALX_HALFD_BPNB BIT(18) -#define ALX_HALFD_NOBO BIT(17) -#define ALX_HALFD_EDXSDFR BIT(16) -#define ALX_HALFD_RETRY_MASK 0xFUL -#define ALX_HALFD_RETRY_SHIFT 12 -#define ALX_HALFD_LCOL_MASK 0x3FFUL -#define ALX_HALFD_LCOL_SHIFT 0 - -#define ALX_MTU 0x149C -#define ALX_MTU_JUMBO_TH 1514 -#define ALX_MTU_STD_ALGN 1536 -#define ALX_MTU_MIN 64 - -#define ALX_SRAM0 0x1500 -#define ALX_SRAM_RFD_TAIL_ADDR_MASK 0xFFFUL -#define ALX_SRAM_RFD_TAIL_ADDR_SHIFT 16 -#define ALX_SRAM_RFD_HEAD_ADDR_MASK 0xFFFUL -#define ALX_SRAM_RFD_HEAD_ADDR_SHIFT 0 - -#define ALX_SRAM1 0x1510 -#define ALX_SRAM_RFD_LEN_MASK 0xFFFUL /* 8BYTES UNIT */ -#define ALX_SRAM_RFD_LEN_SHIFT 0 - -#define ALX_SRAM2 0x1518 -#define ALX_SRAM_TRD_TAIL_ADDR_MASK 0xFFFUL -#define ALX_SRAM_TRD_TAIL_ADDR_SHIFT 16 -#define ALX_SRMA_TRD_HEAD_ADDR_MASK 0xFFFUL -#define ALX_SRAM_TRD_HEAD_ADDR_SHIFT 0 - -#define ALX_SRAM3 0x151C -#define ALX_SRAM_TRD_LEN_MASK 0xFFFUL /* 8BYTES UNIT */ -#define ALX_SRAM_TRD_LEN_SHIFT 0 - -#define ALX_SRAM4 0x1520 -#define ALX_SRAM_RXF_TAIL_ADDR_MASK 0xFFFUL -#define ALX_SRAM_RXF_TAIL_ADDR_SHIFT 16 -#define ALX_SRAM_RXF_HEAD_ADDR_MASK 0xFFFUL -#define ALX_SRAM_RXF_HEAD_ADDR_SHIFT 0 - -#define ALX_SRAM5 0x1524 -#define ALX_SRAM_RXF_LEN_MASK 0xFFFUL /* 8BYTES UNIT */ -#define ALX_SRAM_RXF_LEN_SHIFT 0 -#define ALX_SRAM_RXF_LEN_8K (8*1024) - -#define ALX_SRAM6 0x1528 -#define ALX_SRAM_TXF_TAIL_ADDR_MASK 0xFFFUL -#define ALX_SRAM_TXF_TAIL_ADDR_SHIFT 16 -#define ALX_SRAM_TXF_HEAD_ADDR_MASK 0xFFFUL -#define ALX_SRAM_TXF_HEAD_ADDR_SHIFT 0 - -#define ALX_SRAM7 0x152C -#define ALX_SRAM_TXF_LEN_MASK 0xFFFUL /* 8BYTES UNIT */ -#define ALX_SRAM_TXF_LEN_SHIFT 0 - -#define ALX_SRAM8 0x1530 -#define ALX_SRAM_PATTERN_ADDR_MASK 0xFFFUL -#define ALX_SRAM_PATTERN_ADDR_SHIFT 16 -#define ALX_SRAM_TSO_ADDR_MASK 0xFFFUL -#define ALX_SRAM_TSO_ADDR_SHIFT 0 - -#define ALX_SRAM9 0x1534 -#define ALX_SRAM_LOAD_PTR BIT(0) - -#define ALX_RX_BASE_ADDR_HI 0x1540 - -#define ALX_TX_BASE_ADDR_HI 0x1544 - -#define ALX_RFD_ADDR_LO 0x1550 -#define ALX_RFD_RING_SZ 0x1560 -#define ALX_RFD_BUF_SZ 0x1564 -#define ALX_RFD_BUF_SZ_MASK 0xFFFFUL -#define ALX_RFD_BUF_SZ_SHIFT 0 - -#define ALX_RRD_ADDR_LO 0x1568 -#define ALX_RRD_RING_SZ 0x1578 -#define ALX_RRD_RING_SZ_MASK 0xFFFUL -#define ALX_RRD_RING_SZ_SHIFT 0 - -#define ALX_TPD_PRI3_ADDR_LO 0x14E4 /* HIGHEST PRIORITY */ -#define ALX_TPD_PRI2_ADDR_LO 0x14E0 -#define ALX_TPD_PRI1_ADDR_LO 0x157C -#define ALX_TPD_PRI0_ADDR_LO 0x1580 /* LOWEST PRORITY */ - -#define ALX_TPD_PRI3_PIDX 0x1618 /* 16BIT */ -#define ALX_TPD_PRI2_PIDX 0x161A /* 16BIT */ -#define ALX_TPD_PRI1_PIDX 0x15F0 /* 16BIT */ -#define ALX_TPD_PRI0_PIDX 0x15F2 /* 16BIT */ - -#define ALX_TPD_PRI3_CIDX 0x161C /* 16BIT */ -#define ALX_TPD_PRI2_CIDX 0x161E /* 16BIT */ -#define ALX_TPD_PRI1_CIDX 0x15F4 /* 16BIT */ -#define ALX_TPD_PRI0_CIDX 0x15F6 /* 16BIT */ - -#define ALX_TPD_RING_SZ 0x1584 -#define ALX_TPD_RING_SZ_MASK 0xFFFFUL -#define ALX_TPD_RING_SZ_SHIFT 0 - -#define ALX_CMB_ADDR_LO 0x1588 /* NOT USED */ - -#define ALX_TXQ0 0x1590 -#define ALX_TXQ0_TXF_BURST_PREF_MASK 0xFFFFUL -#define ALX_TXQ0_TXF_BURST_PREF_SHIFT 16 -#define ALX_TXQ_TXF_BURST_PREF_DEF 0x200 -#define ALX_TXQ0_PEDING_CLR BIT(8) -#define ALX_TXQ0_LSO_8023_EN BIT(7) -#define ALX_TXQ0_MODE_ENHANCE BIT(6) -#define ALX_TXQ0_EN BIT(5) -#define ALX_TXQ0_SUPT_IPOPT BIT(4) -#define ALX_TXQ0_TPD_BURSTPREF_MASK 0xFUL -#define ALX_TXQ0_TPD_BURSTPREF_SHIFT 0 -#define ALX_TXQ_TPD_BURSTPREF_DEF 5 - -#define ALX_TXQ1 0x1594 -#define ALX_TXQ1_ERRLGPKT_DROP_EN BIT(11) /* drop error large - * (>rfd buf) packet - */ -#define ALX_TXQ1_JUMBO_TSOTHR_MASK 0x7FFUL /* 8BYTES UNIT */ -#define ALX_TXQ1_JUMBO_TSOTHR_SHIFT 0 -#define ALX_TXQ1_JUMBO_TSO_TH (7*1024) /* byte */ - -#define ALX_TXQ2 0x1598 /* ENTER L1 CONTROL */ -#define ALX_TXQ2_BURST_EN BIT(31) -#define ALX_TXQ2_BURST_HI_WM_MASK 0xFFFUL -#define ALX_TXQ2_BURST_HI_WM_SHIFT 16 -#define ALX_TXQ2_BURST_LO_WM_MASK 0xFFFUL -#define ALX_TXQ2_BURST_LO_WM_SHIFT 0 - -#define ALX_RXQ0 0x15A0 -#define ALX_RXQ0_EN BIT(31) -#define ALX_RXQ0_CUT_THRU_EN BIT(30) -#define ALX_RXQ0_RSS_HASH_EN BIT(29) -#define ALX_RXQ0_NON_IP_QTBL BIT(28) /* 0:q0,1:table */ -#define ALX_RXQ0_RSS_MODE_MASK 0x3UL -#define ALX_RXQ0_RSS_MODE_SHIFT 26 -#define ALX_RXQ0_RSS_MODE_DIS 0 -#define ALX_RXQ0_RSS_MODE_SQSI 1 -#define ALX_RXQ0_RSS_MODE_MQSI 2 -#define ALX_RXQ0_RSS_MODE_MQMI 3 -#define ALX_RXQ0_NUM_RFD_PREF_MASK 0x3FUL -#define ALX_RXQ0_NUM_RFD_PREF_SHIFT 20 -#define ALX_RXQ0_NUM_RFD_PREF_DEF 8 -#define ALX_RXQ0_IDT_TBL_SIZE_MASK 0x1FFUL -#define ALX_RXQ0_IDT_TBL_SIZE_SHIFT 8 -#define ALX_RXQ0_IDT_TBL_SIZE_DEF 0x100 -#define ALX_RXQ0_IPV6_PARSE_EN BIT(7) -#define ALX_RXQ0_RSS_HSTYP_MASK 0xFUL -#define ALX_RXQ0_RSS_HSTYP_SHIFT 2 -#define ALX_RXQ0_RSS_HSTYP_IPV6_TCP_EN BIT(5) -#define ALX_RXQ0_RSS_HSTYP_IPV6_EN BIT(4) -#define ALX_RXQ0_RSS_HSTYP_IPV4_TCP_EN BIT(3) -#define ALX_RXQ0_RSS_HSTYP_IPV4_EN BIT(2) -#define ALX_RXQ0_RSS_HSTYP_ALL (\ - ALX_RXQ0_RSS_HSTYP_IPV6_TCP_EN |\ - ALX_RXQ0_RSS_HSTYP_IPV4_TCP_EN |\ - ALX_RXQ0_RSS_HSTYP_IPV6_EN |\ - ALX_RXQ0_RSS_HSTYP_IPV4_EN) -#define ALX_RXQ0_ASPM_THRESH_MASK 0x3UL -#define ALX_RXQ0_ASPM_THRESH_SHIFT 0 -#define ALX_RXQ0_ASPM_THRESH_NO 0 -#define ALX_RXQ0_ASPM_THRESH_1M 1 -#define ALX_RXQ0_ASPM_THRESH_10M 2 -#define ALX_RXQ0_ASPM_THRESH_100M 3 - -#define ALX_RXQ1 0x15A4 -#define ALX_RXQ1_JUMBO_LKAH_MASK 0xFUL /* 32BYTES UNIT */ -#define ALX_RXQ1_JUMBO_LKAH_SHIFT 12 -#define ALX_RXQ1_RFD_PREF_DOWN_MASK 0x3FUL -#define ALX_RXQ1_RFD_PREF_DOWN_SHIFT 6 -#define ALX_RXQ1_RFD_PREF_UP_MASK 0x3FUL -#define ALX_RXQ1_RFD_PREF_UP_SHIFT 0 - -#define ALX_RXQ2 0x15A8 -/* XOFF: USED SRAM LOWER THAN IT, THEN NOTIFY THE PEER TO SEND AGAIN */ -#define ALX_RXQ2_RXF_XOFF_THRESH_MASK 0xFFFUL -#define ALX_RXQ2_RXF_XOFF_THRESH_SHIFT 16 -#define ALX_RXQ2_RXF_XON_THRESH_MASK 0xFFFUL -#define ALX_RXQ2_RXF_XON_THRESH_SHIFT 0 -/* Size = tx-packet(1522) + IPG(12) + SOF(8) + 64(Pause) + IPG(12) + SOF(8) + - * rx-packet(1522) + delay-of-link(64) - * = 3212. +/* specific error info */ +#define ALX_ERR_SUCCESS 0x0000 +#define ALX_ERR_ALOAD 0x0001 +#define ALX_ERR_RSTMAC 0x0002 +#define ALX_ERR_PARM 0x0003 +#define ALX_ERR_MIIBUSY 0x0004 +#define ALX_LINK_TIMEOUT 0x0008 + +/* Transmit Packet Descriptor, contains 4 32-bit words. + * + * 31 16 0 + * +----------------+----------------+ + * | vlan-tag | buf length | + * +----------------+----------------+ + * | Word 1 | + * +----------------+----------------+ + * | Word 2: buf addr lo | + * +----------------+----------------+ + * | Word 3: buf addr hi | + * +----------------+----------------+ + * + * Word 2 and 3 combine to form a 64-bit buffer address + * + * Word 1 has three forms, depending on the state of bit 8/12/13: + * if bit8 =='1', the definition is just for custom checksum offload. + * if bit8 == '0' && bit12 == '1' && bit13 == '1', the *FIRST* descriptor + * for the skb is special for LSO V2, Word 2 become total skb length , + * Word 3 is meaningless. + * other condition, the definition is for general skb or ip/tcp/udp + * checksum or LSO(TSO) offload. + * + * Here is the depiction: + * + * 0-+ 0-+ + * 1 | 1 | + * 2 | 2 | + * 3 | Payload offset 3 | L4 header offset + * 4 | (7:0) 4 | (7:0) + * 5 | 5 | + * 6 | 6 | + * 7-+ 7-+ + * 8 Custom csum enable = 1 8 Custom csum enable = 0 + * 9 General IPv4 checksum 9 General IPv4 checksum + * 10 General TCP checksum 10 General TCP checksum + * 11 General UDP checksum 11 General UDP checksum + * 12 Large Send Segment enable 12 Large Send Segment enable + * 13 Large Send Segment type 13 Large Send Segment type + * 14 VLAN tagged 14 VLAN tagged + * 15 Insert VLAN tag 15 Insert VLAN tag + * 16 IPv4 packet 16 IPv4 packet + * 17 Ethernet frame type 17 Ethernet frame type + * 18-+ 18-+ + * 19 | 19 | + * 20 | 20 | + * 21 | Custom csum offset 21 | + * 22 | (25:18) 22 | + * 23 | 23 | MSS (30:18) + * 24 | 24 | + * 25-+ 25 | + * 26-+ 26 | + * 27 | 27 | + * 28 | Reserved 28 | + * 29 | 29 | + * 30-+ 30-+ + * 31 End of packet 31 End of packet */ -#define ALX_RXQ2_RXF_FLOW_CTRL_RSVD 3212 - -#define ALX_RXQ3 0x15AC -#define ALX_RXQ3_RXD_TIMER_MASK 0x7FFFUL -#define ALX_RXQ3_RXD_TIMER_SHIFT 16 -#define ALX_RXQ3_RXD_THRESH_MASK 0xFFFUL /* 8BYTES UNIT */ -#define ALX_RXQ3_RXD_THRESH_SHIFT 0 - -#define ALX_DMA 0x15C0 -#define ALX_DMA_SMB_NOW BIT(31) -#define ALX_DMA_WPEND_CLR BIT(30) -#define ALX_DMA_RPEND_CLR BIT(29) -#define ALX_DMA_WSRAM_RDCTRL BIT(28) -#define ALX_DMA_RCHNL_SEL_MASK 0x3UL -#define ALX_DMA_RCHNL_SEL_SHIFT 26 -#define ALX_DMA_RCHNL_SEL_1 0 -#define ALX_DMA_RCHNL_SEL_2 1 -#define ALX_DMA_RCHNL_SEL_3 2 -#define ALX_DMA_RCHNL_SEL_4 3 -#define ALX_DMA_SMB_EN BIT(21) /* smb dma enable */ -#define ALX_DMA_WDLY_CNT_MASK 0xFUL -#define ALX_DMA_WDLY_CNT_SHIFT 16 -#define ALX_DMA_WDLY_CNT_DEF 4 -#define ALX_DMA_RDLY_CNT_MASK 0x1FUL -#define ALX_DMA_RDLY_CNT_SHIFT 11 -#define ALX_DMA_RDLY_CNT_DEF 15 -#define ALX_DMA_RREQ_PRI_DATA BIT(10) /* 0:tpd, 1:data */ -#define ALX_DMA_WREQ_BLEN_MASK 0x7UL -#define ALX_DMA_WREQ_BLEN_SHIFT 7 -#define ALX_DMA_RREQ_BLEN_MASK 0x7UL -#define ALX_DMA_RREQ_BLEN_SHIFT 4 -#define ALX_DMA_PENDING_AUTO_RST BIT(3) -#define ALX_DMA_RORDER_MODE_MASK 0x7UL -#define ALX_DMA_RORDER_MODE_SHIFT 0 -#define ALX_DMA_RORDER_MODE_OUT 4 -#define ALX_DMA_RORDER_MODE_ENHANCE 2 -#define ALX_DMA_RORDER_MODE_IN 1 - -#define ALX_WOL0 0x14A0 -#define ALX_WOL0_PT7_MATCH BIT(31) -#define ALX_WOL0_PT6_MATCH BIT(30) -#define ALX_WOL0_PT5_MATCH BIT(29) -#define ALX_WOL0_PT4_MATCH BIT(28) -#define ALX_WOL0_PT3_MATCH BIT(27) -#define ALX_WOL0_PT2_MATCH BIT(26) -#define ALX_WOL0_PT1_MATCH BIT(25) -#define ALX_WOL0_PT0_MATCH BIT(24) -#define ALX_WOL0_PT7_EN BIT(23) -#define ALX_WOL0_PT6_EN BIT(22) -#define ALX_WOL0_PT5_EN BIT(21) -#define ALX_WOL0_PT4_EN BIT(20) -#define ALX_WOL0_PT3_EN BIT(19) -#define ALX_WOL0_PT2_EN BIT(18) -#define ALX_WOL0_PT1_EN BIT(17) -#define ALX_WOL0_PT0_EN BIT(16) -#define ALX_WOL0_IPV4_SYNC_EVT BIT(14) -#define ALX_WOL0_IPV6_SYNC_EVT BIT(13) -#define ALX_WOL0_LINK_EVT BIT(10) -#define ALX_WOL0_MAGIC_EVT BIT(9) -#define ALX_WOL0_PATTERN_EVT BIT(8) -#define ALX_WOL0_SWOI_EVT BIT(7) -#define ALX_WOL0_OOB_EN BIT(6) -#define ALX_WOL0_PME_LINK BIT(5) -#define ALX_WOL0_LINK_EN BIT(4) -#define ALX_WOL0_PME_MAGIC_EN BIT(3) -#define ALX_WOL0_MAGIC_EN BIT(2) -#define ALX_WOL0_PME_PATTERN_EN BIT(1) -#define ALX_WOL0_PATTERN_EN BIT(0) - -#define ALX_WOL1 0x14A4 -#define ALX_WOL1_PT3_LEN_MASK 0xFFUL -#define ALX_WOL1_PT3_LEN_SHIFT 24 -#define ALX_WOL1_PT2_LEN_MASK 0xFFUL -#define ALX_WOL1_PT2_LEN_SHIFT 16 -#define ALX_WOL1_PT1_LEN_MASK 0xFFUL -#define ALX_WOL1_PT1_LEN_SHIFT 8 -#define ALX_WOL1_PT0_LEN_MASK 0xFFUL -#define ALX_WOL1_PT0_LEN_SHIFT 0 - -#define ALX_WOL2 0x14A8 -#define ALX_WOL2_PT7_LEN_MASK 0xFFUL -#define ALX_WOL2_PT7_LEN_SHIFT 24 -#define ALX_WOL2_PT6_LEN_MASK 0xFFUL -#define ALX_WOL2_PT6_LEN_SHIFT 16 -#define ALX_WOL2_PT5_LEN_MASK 0xFFUL -#define ALX_WOL2_PT5_LEN_SHIFT 8 -#define ALX_WOL2_PT4_LEN_MASK 0xFFUL -#define ALX_WOL2_PT4_LEN_SHIFT 0 - -#define ALX_RFD_PIDX 0x15E0 -#define ALX_RFD_PIDX_MASK 0xFFFUL -#define ALX_RFD_PIDX_SHIFT 0 - -#define ALX_RFD_CIDX 0x15F8 -#define ALX_RFD_CIDX_MASK 0xFFFUL -#define ALX_RFD_CIDX_SHIFT 0 - -/* MIB */ -#define ALX_MIB_BASE 0x1700 -#define ALX_MIB_RX_OK (ALX_MIB_BASE + 0) -#define ALX_MIB_RX_BC (ALX_MIB_BASE + 4) -#define ALX_MIB_RX_MC (ALX_MIB_BASE + 8) -#define ALX_MIB_RX_PAUSE (ALX_MIB_BASE + 12) -#define ALX_MIB_RX_CTRL (ALX_MIB_BASE + 16) -#define ALX_MIB_RX_FCS (ALX_MIB_BASE + 20) -#define ALX_MIB_RX_LENERR (ALX_MIB_BASE + 24) -#define ALX_MIB_RX_BYTCNT (ALX_MIB_BASE + 28) -#define ALX_MIB_RX_RUNT (ALX_MIB_BASE + 32) -#define ALX_MIB_RX_FRAGMENT (ALX_MIB_BASE + 36) -#define ALX_MIB_RX_64B (ALX_MIB_BASE + 40) -#define ALX_MIB_RX_127B (ALX_MIB_BASE + 44) -#define ALX_MIB_RX_255B (ALX_MIB_BASE + 48) -#define ALX_MIB_RX_511B (ALX_MIB_BASE + 52) -#define ALX_MIB_RX_1023B (ALX_MIB_BASE + 56) -#define ALX_MIB_RX_1518B (ALX_MIB_BASE + 60) -#define ALX_MIB_RX_SZMAX (ALX_MIB_BASE + 64) -#define ALX_MIB_RX_OVSZ (ALX_MIB_BASE + 68) -#define ALX_MIB_RXF_OV (ALX_MIB_BASE + 72) -#define ALX_MIB_RRD_OV (ALX_MIB_BASE + 76) -#define ALX_MIB_RX_ALIGN (ALX_MIB_BASE + 80) -#define ALX_MIB_RX_BCCNT (ALX_MIB_BASE + 84) -#define ALX_MIB_RX_MCCNT (ALX_MIB_BASE + 88) -#define ALX_MIB_RX_ERRADDR (ALX_MIB_BASE + 92) -#define ALX_MIB_TX_OK (ALX_MIB_BASE + 96) -#define ALX_MIB_TX_BC (ALX_MIB_BASE + 100) -#define ALX_MIB_TX_MC (ALX_MIB_BASE + 104) -#define ALX_MIB_TX_PAUSE (ALX_MIB_BASE + 108) -#define ALX_MIB_TX_EXCDEFER (ALX_MIB_BASE + 112) -#define ALX_MIB_TX_CTRL (ALX_MIB_BASE + 116) -#define ALX_MIB_TX_DEFER (ALX_MIB_BASE + 120) -#define ALX_MIB_TX_BYTCNT (ALX_MIB_BASE + 124) -#define ALX_MIB_TX_64B (ALX_MIB_BASE + 128) -#define ALX_MIB_TX_127B (ALX_MIB_BASE + 132) -#define ALX_MIB_TX_255B (ALX_MIB_BASE + 136) -#define ALX_MIB_TX_511B (ALX_MIB_BASE + 140) -#define ALX_MIB_TX_1023B (ALX_MIB_BASE + 144) -#define ALX_MIB_TX_1518B (ALX_MIB_BASE + 148) -#define ALX_MIB_TX_SZMAX (ALX_MIB_BASE + 152) -#define ALX_MIB_TX_1COL (ALX_MIB_BASE + 156) -#define ALX_MIB_TX_2COL (ALX_MIB_BASE + 160) -#define ALX_MIB_TX_LATCOL (ALX_MIB_BASE + 164) -#define ALX_MIB_TX_ABRTCOL (ALX_MIB_BASE + 168) -#define ALX_MIB_TX_UNDRUN (ALX_MIB_BASE + 172) -#define ALX_MIB_TX_TRDBEOP (ALX_MIB_BASE + 176) -#define ALX_MIB_TX_LENERR (ALX_MIB_BASE + 180) -#define ALX_MIB_TX_TRUNC (ALX_MIB_BASE + 184) -#define ALX_MIB_TX_BCCNT (ALX_MIB_BASE + 188) -#define ALX_MIB_TX_MCCNT (ALX_MIB_BASE + 192) -#define ALX_MIB_UPDATE (ALX_MIB_BASE + 196) - -#define ALX_RX_STATS_BIN ALX_MIB_RX_OK -#define ALX_RX_STATS_END ALX_MIB_RX_ERRADDR -#define ALX_TX_STATS_BIN ALX_MIB_TX_OK -#define ALX_TX_STATS_END ALX_MIB_TX_MCCNT -/******************************************************************************/ - -#define ALX_ISR 0x1600 -#define ALX_ISR_DIS BIT(31) -#define ALX_ISR_RX_Q7 BIT(30) -#define ALX_ISR_RX_Q6 BIT(29) -#define ALX_ISR_RX_Q5 BIT(28) -#define ALX_ISR_RX_Q4 BIT(27) -#define ALX_ISR_PCIE_LNKDOWN BIT(26) -#define ALX_ISR_PCIE_CERR BIT(25) -#define ALX_ISR_PCIE_NFERR BIT(24) -#define ALX_ISR_PCIE_FERR BIT(23) -#define ALX_ISR_PCIE_UR BIT(22) -#define ALX_ISR_MAC_TX BIT(21) -#define ALX_ISR_MAC_RX BIT(20) -#define ALX_ISR_RX_Q3 BIT(19) -#define ALX_ISR_RX_Q2 BIT(18) -#define ALX_ISR_RX_Q1 BIT(17) -#define ALX_ISR_RX_Q0 BIT(16) -#define ALX_ISR_TX_Q0 BIT(15) -#define ALX_ISR_TXQ_TO BIT(14) -#define ALX_ISR_PHY_LPW BIT(13) -#define ALX_ISR_PHY BIT(12) -#define ALX_ISR_TX_CREDIT BIT(11) -#define ALX_ISR_DMAW BIT(10) -#define ALX_ISR_DMAR BIT(9) -#define ALX_ISR_TXF_UR BIT(8) -#define ALX_ISR_TX_Q3 BIT(7) -#define ALX_ISR_TX_Q2 BIT(6) -#define ALX_ISR_TX_Q1 BIT(5) -#define ALX_ISR_RFD_UR BIT(4) -#define ALX_ISR_RXF_OV BIT(3) -#define ALX_ISR_MANU BIT(2) -#define ALX_ISR_TIMER BIT(1) -#define ALX_ISR_SMB BIT(0) - -#define ALX_IMR 0x1604 - -#define ALX_INT_RETRIG 0x1608 /* re-send deassrt/assert - * if sw no reflect - */ -#define ALX_INT_RETRIG_TIMER_MASK 0xFFFFUL -#define ALX_INT_RETRIG_TIMER_SHIFT 0 -#define ALX_INT_RETRIG_TO 20000 /* 40ms */ - -#define ALX_INT_DEASST_TIMER 0x1614 /* re-send deassert - * if sw no reflect - */ - -#define ALX_PATTERN_MASK 0x1620 /* 128bytes, sleep state */ -#define ALX_PATTERN_MASK_LEN 128 - - -#define ALX_FLT1_SRC_IP0 0x1A00 -#define ALX_FLT1_SRC_IP1 0x1A04 -#define ALX_FLT1_SRC_IP2 0x1A08 -#define ALX_FLT1_SRC_IP3 0x1A0C -#define ALX_FLT1_DST_IP0 0x1A10 -#define ALX_FLT1_DST_IP1 0x1A14 -#define ALX_FLT1_DST_IP2 0x1A18 -#define ALX_FLT1_DST_IP3 0x1A1C -#define ALX_FLT1_PORT 0x1A20 -#define ALX_FLT1_PORT_DST_MASK 0xFFFFUL -#define ALX_FLT1_PORT_DST_SHIFT 16 -#define ALX_FLT1_PORT_SRC_MASK 0xFFFFUL -#define ALX_FLT1_PORT_SRC_SHIFT 0 - -#define ALX_FLT2_SRC_IP0 0x1A24 -#define ALX_FLT2_SRC_IP1 0x1A28 -#define ALX_FLT2_SRC_IP2 0x1A2C -#define ALX_FLT2_SRC_IP3 0x1A30 -#define ALX_FLT2_DST_IP0 0x1A34 -#define ALX_FLT2_DST_IP1 0x1A38 -#define ALX_FLT2_DST_IP2 0x1A40 -#define ALX_FLT2_DST_IP3 0x1A44 -#define ALX_FLT2_PORT 0x1A48 -#define ALX_FLT2_PORT_DST_MASK 0xFFFFUL -#define ALX_FLT2_PORT_DST_SHIFT 16 -#define ALX_FLT2_PORT_SRC_MASK 0xFFFFUL -#define ALX_FLT2_PORT_SRC_SHIFT 0 - -#define ALX_FLT3_SRC_IP0 0x1A4C -#define ALX_FLT3_SRC_IP1 0x1A50 -#define ALX_FLT3_SRC_IP2 0x1A54 -#define ALX_FLT3_SRC_IP3 0x1A58 -#define ALX_FLT3_DST_IP0 0x1A5C -#define ALX_FLT3_DST_IP1 0x1A60 -#define ALX_FLT3_DST_IP2 0x1A64 -#define ALX_FLT3_DST_IP3 0x1A68 -#define ALX_FLT3_PORT 0x1A6C -#define ALX_FLT3_PORT_DST_MASK 0xFFFFUL -#define ALX_FLT3_PORT_DST_SHIFT 16 -#define ALX_FLT3_PORT_SRC_MASK 0xFFFFUL -#define ALX_FLT3_PORT_SRC_SHIFT 0 - -#define ALX_FLT4_SRC_IP0 0x1A70 -#define ALX_FLT4_SRC_IP1 0x1A74 -#define ALX_FLT4_SRC_IP2 0x1A78 -#define ALX_FLT4_SRC_IP3 0x1A7C -#define ALX_FLT4_DST_IP0 0x1A80 -#define ALX_FLT4_DST_IP1 0x1A84 -#define ALX_FLT4_DST_IP2 0x1A88 -#define ALX_FLT4_DST_IP3 0x1A8C -#define ALX_FLT4_PORT 0x1A90 -#define ALX_FLT4_PORT_DST_MASK 0xFFFFUL -#define ALX_FLT4_PORT_DST_SHIFT 16 -#define ALX_FLT4_PORT_SRC_MASK 0xFFFFUL -#define ALX_FLT4_PORT_SRC_SHIFT 0 - -#define ALX_FLT5_SRC_IP0 0x1A94 -#define ALX_FLT5_SRC_IP1 0x1A98 -#define ALX_FLT5_SRC_IP2 0x1A9C -#define ALX_FLT5_SRC_IP3 0x1AA0 -#define ALX_FLT5_DST_IP0 0x1AA4 -#define ALX_FLT5_DST_IP1 0x1AA8 -#define ALX_FLT5_DST_IP2 0x1AAC -#define ALX_FLT5_DST_IP3 0x1AB0 -#define ALX_FLT5_PORT 0x1AB4 -#define ALX_FLT5_PORT_DST_MASK 0xFFFFUL -#define ALX_FLT5_PORT_DST_SHIFT 16 -#define ALX_FLT5_PORT_SRC_MASK 0xFFFFUL -#define ALX_FLT5_PORT_SRC_SHIFT 0 - -#define ALX_FLT6_SRC_IP0 0x1AB8 -#define ALX_FLT6_SRC_IP1 0x1ABC -#define ALX_FLT6_SRC_IP2 0x1AC0 -#define ALX_FLT6_SRC_IP3 0x1AC8 -#define ALX_FLT6_DST_IP0 0x1620 /* only S0 state */ -#define ALX_FLT6_DST_IP1 0x1624 -#define ALX_FLT6_DST_IP2 0x1628 -#define ALX_FLT6_DST_IP3 0x162C -#define ALX_FLT6_PORT 0x1630 -#define ALX_FLT6_PORT_DST_MASK 0xFFFFUL -#define ALX_FLT6_PORT_DST_SHIFT 16 -#define ALX_FLT6_PORT_SRC_MASK 0xFFFFUL -#define ALX_FLT6_PORT_SRC_SHIFT 0 - -#define ALX_FLTCTRL 0x1634 -#define ALX_FLTCTRL_PSTHR_TIMER_MASK 0xFFUL -#define ALX_FLTCTRL_PSTHR_TIMER_SHIFT 24 -#define ALX_FLTCTRL_CHK_DSTPRT6 BIT(23) -#define ALX_FLTCTRL_CHK_SRCPRT6 BIT(22) -#define ALX_FLTCTRL_CHK_DSTIP6 BIT(21) -#define ALX_FLTCTRL_CHK_SRCIP6 BIT(20) -#define ALX_FLTCTRL_CHK_DSTPRT5 BIT(19) -#define ALX_FLTCTRL_CHK_SRCPRT5 BIT(18) -#define ALX_FLTCTRL_CHK_DSTIP5 BIT(17) -#define ALX_FLTCTRL_CHK_SRCIP5 BIT(16) -#define ALX_FLTCTRL_CHK_DSTPRT4 BIT(15) -#define ALX_FLTCTRL_CHK_SRCPRT4 BIT(14) -#define ALX_FLTCTRL_CHK_DSTIP4 BIT(13) -#define ALX_FLTCTRL_CHK_SRCIP4 BIT(12) -#define ALX_FLTCTRL_CHK_DSTPRT3 BIT(11) -#define ALX_FLTCTRL_CHK_SRCPRT3 BIT(10) -#define ALX_FLTCTRL_CHK_DSTIP3 BIT(9) -#define ALX_FLTCTRL_CHK_SRCIP3 BIT(8) -#define ALX_FLTCTRL_CHK_DSTPRT2 BIT(7) -#define ALX_FLTCTRL_CHK_SRCPRT2 BIT(6) -#define ALX_FLTCTRL_CHK_DSTIP2 BIT(5) -#define ALX_FLTCTRL_CHK_SRCIP2 BIT(4) -#define ALX_FLTCTRL_CHK_DSTPRT1 BIT(3) -#define ALX_FLTCTRL_CHK_SRCPRT1 BIT(2) -#define ALX_FLTCTRL_CHK_DSTIP1 BIT(1) -#define ALX_FLTCTRL_CHK_SRCIP1 BIT(0) - -#define ALX_DROP_ALG1 0x1638 -#define ALX_DROP_ALG1_BWCHGVAL_MASK 0xFFFFFUL -#define ALX_DROP_ALG1_BWCHGVAL_SHIFT 12 -#define ALX_DROP_ALG1_BWCHGSCL_6 BIT(11) /* 0:3.125%, 1:6.25% */ -#define ALX_DROP_ALG1_ASUR_LWQ_EN BIT(10) -#define ALX_DROP_ALG1_BWCHGVAL_EN BIT(9) -#define ALX_DROP_ALG1_BWCHGSCL_EN BIT(8) -#define ALX_DROP_ALG1_PSTHR_AUTO BIT(7) /* 0:manual, 1:auto */ -#define ALX_DROP_ALG1_MIN_PSTHR_MASK 0x3UL -#define ALX_DROP_ALG1_MIN_PSTHR_SHIFT 5 -#define ALX_DROP_ALG1_MIN_PSTHR_1_16 0 -#define ALX_DROP_ALG1_MIN_PSTHR_1_8 1 -#define ALX_DROP_ALG1_MIN_PSTHR_1_4 2 -#define ALX_DROP_ALG1_MIN_PSTHR_1_2 3 -#define ALX_DROP_ALG1_PSCL_MASK 0x3UL -#define ALX_DROP_ALG1_PSCL_SHIFT 3 -#define ALX_DROP_ALG1_PSCL_1_4 0 -#define ALX_DROP_ALG1_PSCL_1_8 1 -#define ALX_DROP_ALG1_PSCL_1_16 2 -#define ALX_DROP_ALG1_PSCL_1_32 3 -#define ALX_DROP_ALG1_TIMESLOT_MASK 0x7UL -#define ALX_DROP_ALG1_TIMESLOT_SHIFT 0 -#define ALX_DROP_ALG1_TIMESLOT_4MS 0 -#define ALX_DROP_ALG1_TIMESLOT_8MS 1 -#define ALX_DROP_ALG1_TIMESLOT_16MS 2 -#define ALX_DROP_ALG1_TIMESLOT_32MS 3 -#define ALX_DROP_ALG1_TIMESLOT_64MS 4 -#define ALX_DROP_ALG1_TIMESLOT_128MS 5 -#define ALX_DROP_ALG1_TIMESLOT_256MS 6 -#define ALX_DROP_ALG1_TIMESLOT_512MS 7 - -#define ALX_DROP_ALG2 0x163C -#define ALX_DROP_ALG2_SMPLTIME_MASK 0xFUL -#define ALX_DROP_ALG2_SMPLTIME_SHIFT 24 -#define ALX_DROP_ALG2_LWQBW_MASK 0xFFFFFFUL -#define ALX_DROP_ALG2_LWQBW_SHIFT 0 - -#define ALX_SMB_TIMER 0x15C4 - -#define ALX_TINT_TPD_THRSHLD 0x15C8 - -#define ALX_TINT_TIMER 0x15CC - -#define ALX_CLK_GATE 0x1814 -#define ALX_CLK_GATE_125M_SW_DIS_CR BIT(8) /* B0 */ -#define ALX_CLK_GATE_125M_SW_AZ BIT(7) /* B0 */ -#define ALX_CLK_GATE_125M_SW_IDLE BIT(6) /* B0 */ -#define ALX_CLK_GATE_RXMAC BIT(5) -#define ALX_CLK_GATE_TXMAC BIT(4) -#define ALX_CLK_GATE_RXQ BIT(3) -#define ALX_CLK_GATE_TXQ BIT(2) -#define ALX_CLK_GATE_DMAR BIT(1) -#define ALX_CLK_GATE_DMAW BIT(0) -#define ALX_CLK_GATE_ALL_A0 (\ - ALX_CLK_GATE_RXMAC |\ - ALX_CLK_GATE_TXMAC |\ - ALX_CLK_GATE_RXQ |\ - ALX_CLK_GATE_TXQ |\ - ALX_CLK_GATE_DMAR |\ - ALX_CLK_GATE_DMAW) -#define ALX_CLK_GATE_ALL_B0 (\ - ALX_CLK_GATE_ALL_A0) - - - - - -#define ALX_BTROM_CFG 0x1800 /* pwon rst */ - -/* interop between drivers */ -#define ALX_DRV 0x1804 -#define ALX_DRV_PHY_AUTO BIT(28) /* 1:auto, 0:force */ -#define ALX_DRV_PHY_1000 BIT(27) -#define ALX_DRV_PHY_100 BIT(26) -#define ALX_DRV_PHY_10 BIT(25) -#define ALX_DRV_PHY_DUPLEX BIT(24) /* 1:full, 0:half */ -#define ALX_DRV_PHY_PAUSE BIT(23) /* adv Pause */ -#define ALX_DRV_PHY_APAUSE BIT(22) /* adv Asym Pause */ -#define ALX_DRV_PHY_EEE BIT(21) /* 1:en AZ */ -#define ALX_DRV_PHY_MASK 0xFFUL -#define ALX_DRV_PHY_SHIFT 21 -#define ALX_DRV_PHY_UNKNOWN 0 -#define ALX_DRV_DISABLE BIT(18) -#define ALX_DRV_WOLS5_EN BIT(17) -#define ALX_DRV_WOLS5_BIOS_EN BIT(16) -#define ALX_DRV_AZ_EN BIT(12) -#define ALX_DRV_WOLPATTERN_EN BIT(11) -#define ALX_DRV_WOLLINKUP_EN BIT(10) -#define ALX_DRV_WOLMAGIC_EN BIT(9) -#define ALX_DRV_WOLCAP_BIOS_EN BIT(8) -#define ALX_DRV_ASPM_SPD1000LMT_MASK 0x3UL -#define ALX_DRV_ASPM_SPD1000LMT_SHIFT 4 -#define ALX_DRV_ASPM_SPD1000LMT_100M 0 -#define ALX_DRV_ASPM_SPD1000LMT_NO 1 -#define ALX_DRV_ASPM_SPD1000LMT_1M 2 -#define ALX_DRV_ASPM_SPD1000LMT_10M 3 -#define ALX_DRV_ASPM_SPD100LMT_MASK 0x3UL -#define ALX_DRV_ASPM_SPD100LMT_SHIFT 2 -#define ALX_DRV_ASPM_SPD100LMT_1M 0 -#define ALX_DRV_ASPM_SPD100LMT_10M 1 -#define ALX_DRV_ASPM_SPD100LMT_100M 2 -#define ALX_DRV_ASPM_SPD100LMT_NO 3 -#define ALX_DRV_ASPM_SPD10LMT_MASK 0x3UL -#define ALX_DRV_ASPM_SPD10LMT_SHIFT 0 -#define ALX_DRV_ASPM_SPD10LMT_1M 0 -#define ALX_DRV_ASPM_SPD10LMT_10M 1 -#define ALX_DRV_ASPM_SPD10LMT_100M 2 -#define ALX_DRV_ASPM_SPD10LMT_NO 3 - -/* flag of phy inited */ -#define ALX_PHY_INITED 0x003F - -#define ALX_DRV_ERR1 0x1808 /* perst */ -#define ALX_DRV_ERR1_GEN BIT(31) /* geneneral err */ -#define ALX_DRV_ERR1_NOR BIT(30) /* rrd.nor */ -#define ALX_DRV_ERR1_TRUNC BIT(29) -#define ALX_DRV_ERR1_RES BIT(28) -#define ALX_DRV_ERR1_INTFATAL BIT(27) -#define ALX_DRV_ERR1_TXQPEND BIT(26) -#define ALX_DRV_ERR1_DMAW BIT(25) -#define ALX_DRV_ERR1_DMAR BIT(24) -#define ALX_DRV_ERR1_PCIELNKDWN BIT(23) -#define ALX_DRV_ERR1_PKTSIZE BIT(22) -#define ALX_DRV_ERR1_FIFOFUL BIT(21) -#define ALX_DRV_ERR1_RFDUR BIT(20) -#define ALX_DRV_ERR1_RRDSI BIT(19) -#define ALX_DRV_ERR1_UPDATE BIT(18) - -#define ALX_DRV_ERR2 0x180C - -#define ALX_DBG_ADDR 0x1900 /* DWORD reg */ -#define ALX_DBG_DATA 0x1904 /* DWORD reg */ - -#define ALX_SYNC_IPV4_SA 0x1A00 -#define ALX_SYNC_IPV4_DA 0x1A04 - -#define ALX_SYNC_V4PORT 0x1A08 -#define ALX_SYNC_V4PORT_DST_MASK 0xFFFFUL -#define ALX_SYNC_V4PORT_DST_SHIFT 16 -#define ALX_SYNC_V4PORT_SRC_MASK 0xFFFFUL -#define ALX_SYNC_V4PORT_SRC_SHIFT 0 - -#define ALX_SYNC_IPV6_SA0 0x1A0C -#define ALX_SYNC_IPV6_SA1 0x1A10 -#define ALX_SYNC_IPV6_SA2 0x1A14 -#define ALX_SYNC_IPV6_SA3 0x1A18 -#define ALX_SYNC_IPV6_DA0 0x1A1C -#define ALX_SYNC_IPV6_DA1 0x1A20 -#define ALX_SYNC_IPV6_DA2 0x1A24 -#define ALX_SYNC_IPV6_DA3 0x1A28 - -#define ALX_SYNC_V6PORT 0x1A2C -#define ALX_SYNC_V6PORT_DST_MASK 0xFFFFUL -#define ALX_SYNC_V6PORT_DST_SHIFT 16 -#define ALX_SYNC_V6PORT_SRC_MASK 0xFFFFUL -#define ALX_SYNC_V6PORT_SRC_SHIFT 0 - -#define ALX_ARP_REMOTE_IPV4 0x1A30 -#define ALX_ARP_HOST_IPV4 0x1A34 -#define ALX_ARP_MAC0 0x1A38 -#define ALX_ARP_MAC1 0x1A3C - -#define ALX_1ST_REMOTE_IPV6_0 0x1A40 -#define ALX_1ST_REMOTE_IPV6_1 0x1A44 -#define ALX_1ST_REMOTE_IPV6_2 0x1A48 -#define ALX_1ST_REMOTE_IPV6_3 0x1A4C - -#define ALX_1ST_SN_IPV6_0 0x1A50 -#define ALX_1ST_SN_IPV6_1 0x1A54 -#define ALX_1ST_SN_IPV6_2 0x1A58 -#define ALX_1ST_SN_IPV6_3 0x1A5C - -#define ALX_1ST_TAR_IPV6_1_0 0x1A60 -#define ALX_1ST_TAR_IPV6_1_1 0x1A64 -#define ALX_1ST_TAR_IPV6_1_2 0x1A68 -#define ALX_1ST_TAR_IPV6_1_3 0x1A6C -#define ALX_1ST_TAR_IPV6_2_0 0x1A70 -#define ALX_1ST_TAR_IPV6_2_1 0x1A74 -#define ALX_1ST_TAR_IPV6_2_2 0x1A78 -#define ALX_1ST_TAR_IPV6_2_3 0x1A7C - -#define ALX_2ND_REMOTE_IPV6_0 0x1A80 -#define ALX_2ND_REMOTE_IPV6_1 0x1A84 -#define ALX_2ND_REMOTE_IPV6_2 0x1A88 -#define ALX_2ND_REMOTE_IPV6_3 0x1A8C - -#define ALX_2ND_SN_IPV6_0 0x1A90 -#define ALX_2ND_SN_IPV6_1 0x1A94 -#define ALX_2ND_SN_IPV6_2 0x1A98 -#define ALX_2ND_SN_IPV6_3 0x1A9C - -#define ALX_2ND_TAR_IPV6_1_0 0x1AA0 -#define ALX_2ND_TAR_IPV6_1_1 0x1AA4 -#define ALX_2ND_TAR_IPV6_1_2 0x1AA8 -#define ALX_2ND_TAR_IPV6_1_3 0x1AAC -#define ALX_2ND_TAR_IPV6_2_0 0x1AB0 -#define ALX_2ND_TAR_IPV6_2_1 0x1AB4 -#define ALX_2ND_TAR_IPV6_2_2 0x1AB8 -#define ALX_2ND_TAR_IPV6_2_3 0x1ABC - -#define ALX_1ST_NS_MAC0 0x1AC0 -#define ALX_1ST_NS_MAC1 0x1AC4 - -#define ALX_2ND_NS_MAC0 0x1AC8 -#define ALX_2ND_NS_MAC1 0x1ACC - -#define ALX_PMOFLD 0x144C -#define ALX_PMOFLD_ECMA_IGNR_FRG_SSSR BIT(11) /* B0 */ -#define ALX_PMOFLD_ARP_CNFLCT_WAKEUP BIT(10) /* B0 */ -#define ALX_PMOFLD_MULTI_SOLD BIT(9) -#define ALX_PMOFLD_ICMP_XSUM BIT(8) -#define ALX_PMOFLD_GARP_REPLY BIT(7) -#define ALX_PMOFLD_SYNCV6_ANY BIT(6) -#define ALX_PMOFLD_SYNCV4_ANY BIT(5) -#define ALX_PMOFLD_BY_HW BIT(4) -#define ALX_PMOFLD_NS_EN BIT(3) -#define ALX_PMOFLD_ARP_EN BIT(2) -#define ALX_PMOFLD_SYNCV6_EN BIT(1) -#define ALX_PMOFLD_SYNCV4_EN BIT(0) - -#define ALX_RSS_KEY0 0x14B0 -#define ALX_RSS_KEY1 0x14B4 -#define ALX_RSS_KEY2 0x14B8 -#define ALX_RSS_KEY3 0x14BC -#define ALX_RSS_KEY4 0x14C0 -#define ALX_RSS_KEY5 0x14C4 -#define ALX_RSS_KEY6 0x14C8 -#define ALX_RSS_KEY7 0x14CC -#define ALX_RSS_KEY8 0x14D0 -#define ALX_RSS_KEY9 0x14D4 - -#define ALX_RSS_IDT_TBL0 0x1B00 -#define ALX_RSS_IDT_TBL1 0x1B04 -#define ALX_RSS_IDT_TBL2 0x1B08 -#define ALX_RSS_IDT_TBL3 0x1B0C -#define ALX_RSS_IDT_TBL4 0x1B10 -#define ALX_RSS_IDT_TBL5 0x1B14 -#define ALX_RSS_IDT_TBL6 0x1B18 -#define ALX_RSS_IDT_TBL7 0x1B1C -#define ALX_RSS_IDT_TBL8 0x1B20 -#define ALX_RSS_IDT_TBL9 0x1B24 -#define ALX_RSS_IDT_TBL10 0x1B28 -#define ALX_RSS_IDT_TBL11 0x1B2C -#define ALX_RSS_IDT_TBL12 0x1B30 -#define ALX_RSS_IDT_TBL13 0x1B34 -#define ALX_RSS_IDT_TBL14 0x1B38 -#define ALX_RSS_IDT_TBL15 0x1B3C -#define ALX_RSS_IDT_TBL16 0x1B40 -#define ALX_RSS_IDT_TBL17 0x1B44 -#define ALX_RSS_IDT_TBL18 0x1B48 -#define ALX_RSS_IDT_TBL19 0x1B4C -#define ALX_RSS_IDT_TBL20 0x1B50 -#define ALX_RSS_IDT_TBL21 0x1B54 -#define ALX_RSS_IDT_TBL22 0x1B58 -#define ALX_RSS_IDT_TBL23 0x1B5C -#define ALX_RSS_IDT_TBL24 0x1B60 -#define ALX_RSS_IDT_TBL25 0x1B64 -#define ALX_RSS_IDT_TBL26 0x1B68 -#define ALX_RSS_IDT_TBL27 0x1B6C -#define ALX_RSS_IDT_TBL28 0x1B70 -#define ALX_RSS_IDT_TBL29 0x1B74 -#define ALX_RSS_IDT_TBL30 0x1B78 -#define ALX_RSS_IDT_TBL31 0x1B7C - -#define ALX_RSS_HASH_VAL 0x15B0 -#define ALX_RSS_HASH_FLAG 0x15B4 - -#define ALX_RSS_BASE_CPU_NUM 0x15B8 - -#define ALX_MSI_MAP_TBL1 0x15D0 -#define ALX_MSI_MAP_TBL1_ALERT_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_ALERT_SHIFT 28 -#define ALX_MSI_MAP_TBL1_TIMER_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_TIMER_SHIFT 24 -#define ALX_MSI_MAP_TBL1_TXQ1_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_TXQ1_SHIFT 20 -#define ALX_MSI_MAP_TBL1_TXQ0_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_TXQ0_SHIFT 16 -#define ALX_MSI_MAP_TBL1_RXQ3_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_RXQ3_SHIFT 12 -#define ALX_MSI_MAP_TBL1_RXQ2_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_RXQ2_SHIFT 8 -#define ALX_MSI_MAP_TBL1_RXQ1_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_RXQ1_SHIFT 4 -#define ALX_MSI_MAP_TBL1_RXQ0_MASK 0xFUL -#define ALX_MSI_MAP_TBL1_RXQ0_SHIFT 0 - -#define ALX_MSI_MAP_TBL2 0x15D8 -#define ALX_MSI_MAP_TBL2_PHY_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_PHY_SHIFT 28 -#define ALX_MSI_MAP_TBL2_SMB_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_SMB_SHIFT 24 -#define ALX_MSI_MAP_TBL2_TXQ3_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_TXQ3_SHIFT 20 -#define ALX_MSI_MAP_TBL2_TXQ2_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_TXQ2_SHIFT 16 -#define ALX_MSI_MAP_TBL2_RXQ7_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_RXQ7_SHIFT 12 -#define ALX_MSI_MAP_TBL2_RXQ6_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_RXQ6_SHIFT 8 -#define ALX_MSI_MAP_TBL2_RXQ5_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_RXQ5_SHIFT 4 -#define ALX_MSI_MAP_TBL2_RXQ4_MASK 0xFUL -#define ALX_MSI_MAP_TBL2_RXQ4_SHIFT 0 - -#define ALX_MSI_ID_MAP 0x15D4 -#define ALX_MSI_ID_MAP_RXQ7 BIT(30) -#define ALX_MSI_ID_MAP_RXQ6 BIT(29) -#define ALX_MSI_ID_MAP_RXQ5 BIT(28) -#define ALX_MSI_ID_MAP_RXQ4 BIT(27) -#define ALX_MSI_ID_MAP_PCIELNKDW BIT(26) /* 0:common,1:timer */ -#define ALX_MSI_ID_MAP_PCIECERR BIT(25) -#define ALX_MSI_ID_MAP_PCIENFERR BIT(24) -#define ALX_MSI_ID_MAP_PCIEFERR BIT(23) -#define ALX_MSI_ID_MAP_PCIEUR BIT(22) -#define ALX_MSI_ID_MAP_MACTX BIT(21) -#define ALX_MSI_ID_MAP_MACRX BIT(20) -#define ALX_MSI_ID_MAP_RXQ3 BIT(19) -#define ALX_MSI_ID_MAP_RXQ2 BIT(18) -#define ALX_MSI_ID_MAP_RXQ1 BIT(17) -#define ALX_MSI_ID_MAP_RXQ0 BIT(16) -#define ALX_MSI_ID_MAP_TXQ0 BIT(15) -#define ALX_MSI_ID_MAP_TXQTO BIT(14) -#define ALX_MSI_ID_MAP_LPW BIT(13) -#define ALX_MSI_ID_MAP_PHY BIT(12) -#define ALX_MSI_ID_MAP_TXCREDIT BIT(11) -#define ALX_MSI_ID_MAP_DMAW BIT(10) -#define ALX_MSI_ID_MAP_DMAR BIT(9) -#define ALX_MSI_ID_MAP_TXFUR BIT(8) -#define ALX_MSI_ID_MAP_TXQ3 BIT(7) -#define ALX_MSI_ID_MAP_TXQ2 BIT(6) -#define ALX_MSI_ID_MAP_TXQ1 BIT(5) -#define ALX_MSI_ID_MAP_RFDUR BIT(4) -#define ALX_MSI_ID_MAP_RXFOV BIT(3) -#define ALX_MSI_ID_MAP_MANU BIT(2) -#define ALX_MSI_ID_MAP_TIMER BIT(1) -#define ALX_MSI_ID_MAP_SMB BIT(0) - -#define ALX_MSI_RETRANS_TIMER 0x1920 -#define ALX_MSI_MASK_SEL_LINE BIT(16) /* 1:line,0:standard*/ -#define ALX_MSI_RETRANS_TM_MASK 0xFFFFUL -#define ALX_MSI_RETRANS_TM_SHIFT 0 - -#define ALX_CR_DMA_CTRL 0x1930 -#define ALX_CR_DMA_CTRL_PRI BIT(22) -#define ALX_CR_DMA_CTRL_RRDRXD_JOINT BIT(21) -#define ALX_CR_DMA_CTRL_BWCREDIT_MASK 0x3UL -#define ALX_CR_DMA_CTRL_BWCREDIT_SHIFT 19 -#define ALX_CR_DMA_CTRL_BWCREDIT_2KB 0 -#define ALX_CR_DMA_CTRL_BWCREDIT_1KB 1 -#define ALX_CR_DMA_CTRL_BWCREDIT_4KB 2 -#define ALX_CR_DMA_CTRL_BWCREDIT_8KB 3 -#define ALX_CR_DMA_CTRL_BW_EN BIT(18) -#define ALX_CR_DMA_CTRL_BW_RATIO_MASK 0x3UL -#define ALX_CR_DMA_CTRL_BW_RATIO_1_2 0 -#define ALX_CR_DMA_CTRL_BW_RATIO_1_4 1 -#define ALX_CR_DMA_CTRL_BW_RATIO_1_8 2 -#define ALX_CR_DMA_CTRL_BW_RATIO_2_1 3 -#define ALX_CR_DMA_CTRL_SOFT_RST BIT(11) -#define ALX_CR_DMA_CTRL_TXEARLY_EN BIT(10) -#define ALX_CR_DMA_CTRL_RXEARLY_EN BIT(9) -#define ALX_CR_DMA_CTRL_WEARLY_EN BIT(8) -#define ALX_CR_DMA_CTRL_RXTH_MASK 0xFUL -#define ALX_CR_DMA_CTRL_WTH_MASK 0xFUL - - -#define ALX_EFUSE_BIST 0x1934 -#define ALX_EFUSE_BIST_COL_MASK 0x3FUL -#define ALX_EFUSE_BIST_COL_SHIFT 24 -#define ALX_EFUSE_BIST_ROW_MASK 0x7FUL -#define ALX_EFUSE_BIST_ROW_SHIFT 12 -#define ALX_EFUSE_BIST_STEP_MASK 0xFUL -#define ALX_EFUSE_BIST_STEP_SHIFT 8 -#define ALX_EFUSE_BIST_PAT_MASK 0x7UL -#define ALX_EFUSE_BIST_PAT_SHIFT 4 -#define ALX_EFUSE_BIST_CRITICAL BIT(3) -#define ALX_EFUSE_BIST_FIXED BIT(2) -#define ALX_EFUSE_BIST_FAIL BIT(1) -#define ALX_EFUSE_BIST_NOW BIT(0) - -/* CR DMA ctrl */ - -/* TX QoS */ -#define ALX_WRR 0x1938 -#define ALX_WRR_PRI_MASK 0x3UL -#define ALX_WRR_PRI_SHIFT 29 -#define ALX_WRR_PRI_RESTRICT_ALL 0 -#define ALX_WRR_PRI_RESTRICT_HI 1 -#define ALX_WRR_PRI_RESTRICT_HI2 2 -#define ALX_WRR_PRI_RESTRICT_NONE 3 -#define ALX_WRR_PRI3_MASK 0x1FUL -#define ALX_WRR_PRI3_SHIFT 24 -#define ALX_WRR_PRI2_MASK 0x1FUL -#define ALX_WRR_PRI2_SHIFT 16 -#define ALX_WRR_PRI1_MASK 0x1FUL -#define ALX_WRR_PRI1_SHIFT 8 -#define ALX_WRR_PRI0_MASK 0x1FUL -#define ALX_WRR_PRI0_SHIFT 0 - -#define ALX_HQTPD 0x193C -#define ALX_HQTPD_BURST_EN BIT(31) -#define ALX_HQTPD_Q3_NUMPREF_MASK 0xFUL -#define ALX_HQTPD_Q3_NUMPREF_SHIFT 8 -#define ALX_HQTPD_Q2_NUMPREF_MASK 0xFUL -#define ALX_HQTPD_Q2_NUMPREF_SHIFT 4 -#define ALX_HQTPD_Q1_NUMPREF_MASK 0xFUL -#define ALX_HQTPD_Q1_NUMPREF_SHIFT 0 - -#define ALX_CPUMAP1 0x19A0 -#define ALX_CPUMAP1_VCT7_MASK 0xFUL -#define ALX_CPUMAP1_VCT7_SHIFT 28 -#define ALX_CPUMAP1_VCT6_MASK 0xFUL -#define ALX_CPUMAP1_VCT6_SHIFT 24 -#define ALX_CPUMAP1_VCT5_MASK 0xFUL -#define ALX_CPUMAP1_VCT5_SHIFT 20 -#define ALX_CPUMAP1_VCT4_MASK 0xFUL -#define ALX_CPUMAP1_VCT4_SHIFT 16 -#define ALX_CPUMAP1_VCT3_MASK 0xFUL -#define ALX_CPUMAP1_VCT3_SHIFT 12 -#define ALX_CPUMAP1_VCT2_MASK 0xFUL -#define ALX_CPUMAP1_VCT2_SHIFT 8 -#define ALX_CPUMAP1_VCT1_MASK 0xFUL -#define ALX_CPUMAP1_VCT1_SHIFT 4 -#define ALX_CPUMAP1_VCT0_MASK 0xFUL -#define ALX_CPUMAP1_VCT0_SHIFT 0 - -#define ALX_CPUMAP2 0x19A4 -#define ALX_CPUMAP2_VCT15_MASK 0xFUL -#define ALX_CPUMAP2_VCT15_SHIFT 28 -#define ALX_CPUMAP2_VCT14_MASK 0xFUL -#define ALX_CPUMAP2_VCT14_SHIFT 24 -#define ALX_CPUMAP2_VCT13_MASK 0xFUL -#define ALX_CPUMAP2_VCT13_SHIFT 20 -#define ALX_CPUMAP2_VCT12_MASK 0xFUL -#define ALX_CPUMAP2_VCT12_SHIFT 16 -#define ALX_CPUMAP2_VCT11_MASK 0xFUL -#define ALX_CPUMAP2_VCT11_SHIFT 12 -#define ALX_CPUMAP2_VCT10_MASK 0xFUL -#define ALX_CPUMAP2_VCT10_SHIFT 8 -#define ALX_CPUMAP2_VCT9_MASK 0xFUL -#define ALX_CPUMAP2_VCT9_SHIFT 4 -#define ALX_CPUMAP2_VCT8_MASK 0xFUL -#define ALX_CPUMAP2_VCT8_SHIFT 0 - -#define ALX_MISC 0x19C0 -#define ALX_MISC_MODU BIT(31) /* 0:vector,1:cpu */ -#define ALX_MISC_OVERCUR BIT(29) -#define ALX_MISC_PSWR_EN BIT(28) -#define ALX_MISC_PSW_CTRL_MASK 0xFUL -#define ALX_MISC_PSW_CTRL_SHIFT 24 -#define ALX_MISC_PSW_OCP_MASK 0x7UL -#define ALX_MISC_PSW_OCP_SHIFT 21 -#define ALX_MISC_PSW_OCP_DEF 0x7 -#define ALX_MISC_V18_HIGH BIT(20) -#define ALX_MISC_LPO_CTRL_MASK 0xFUL -#define ALX_MISC_LPO_CTRL_SHIFT 16 -#define ALX_MISC_ISO_EN BIT(12) -#define ALX_MISC_XSTANA_ALWAYS_ON BIT(11) -#define ALX_MISC_SYS25M_SEL_ADAPTIVE BIT(10) -#define ALX_MISC_SPEED_SIM BIT(9) -#define ALX_MISC_S1_LWP_EN BIT(8) -#define ALX_MISC_MACLPW BIT(7) /* pcie/mac do pwsaving - * as phy in lpw state - */ -#define ALX_MISC_125M_SW BIT(6) -#define ALX_MISC_INTNLOSC_OFF_EN BIT(5) -#define ALX_MISC_EXTN25M_SEL BIT(4) /* 0:chipset,1:cystle */ -#define ALX_MISC_INTNLOSC_OPEN BIT(3) -#define ALX_MISC_SMBUS_AT_LED BIT(2) -#define ALX_MISC_PPS_AT_LED_MASK 0x3UL -#define ALX_MISC_PPS_AT_LED_SHIFT 0 -#define ALX_MISC_PPS_AT_LED_ACT 1 -#define ALX_MISC_PPS_AT_LED_10_100 2 -#define ALX_MISC_PPS_AT_LED_1000 3 - -#define ALX_MISC1 0x19C4 -#define ALX_MSC1_BLK_CRASPM_REQ BIT(15) - -#define ALX_MSIC2 0x19C8 -#define ALX_MSIC2_CALB_START BIT(0) - -#define ALX_MISC3 0x19CC -#define ALX_MISC3_25M_BY_SW BIT(1) /* 1:Software control 25M */ -#define ALX_MISC3_25M_NOTO_INTNL BIT(0) /* 0:25M switch to intnl OSC */ - -#define ALX_MSIX_ENTRY_BASE 0x2000 /* MSIX tbl in memory space */ - -/***************************** IO mapping registers ***************************/ -#define ALX_IO_ADDR 0x00 /* DWORD reg */ -#define ALX_IO_DATA 0x04 /* DWORD reg */ -#define ALX_IO_MASTER 0x08 /* DWORD same as reg0x1400 */ -#define ALX_IO_MAC_CTRL 0x0C /* DWORD same as reg0x1480*/ -#define ALX_IO_ISR 0x10 /* DWORD same as reg0x1600 */ -#define ALX_IO_IMR 0x14 /* DWORD same as reg0x1604 */ -#define ALX_IO_TPD_PRI1_PIDX 0x18 /* WORD same as reg0x15F0 */ -#define ALX_IO_TPD_PRI0_PIDX 0x1A /* WORD same as reg0x15F2 */ -#define ALX_IO_TPD_PRI1_CIDX 0x1C /* WORD same as reg0x15F4 */ -#define ALX_IO_TPD_PRI0_CIDX 0x1E /* WORD same as reg0x15F6 */ -#define ALX_IO_RFD_PIDX 0x20 /* WORD same as reg0x15E0 */ -#define ALX_IO_RFD_CIDX 0x30 /* WORD same as reg0x15F8 */ -#define ALX_IO_MDIO 0x38 /* WORD same as reg0x1414 */ -#define ALX_IO_PHY_CTRL 0x3C /* DWORD same as reg0x140C */ - - -/********************* PHY regs definition ***************************/ - -/* Autoneg Advertisement Register */ -#define ALX_ADVERTISE_SPEED_MASK 0x01E0 -#define ALX_ADVERTISE_DEFAULT_CAP 0x1DE0 /* diff with L1C */ - -/* 1000BASE-T Control Register (0x9) */ -#define ALX_GIGA_CR_1000T_HD_CAPS 0x0100 -#define ALX_GIGA_CR_1000T_FD_CAPS 0x0200 -#define ALX_GIGA_CR_1000T_REPEATER_DTE 0x0400 - -#define ALX_GIGA_CR_1000T_MS_VALUE 0x0800 - -#define ALX_GIGA_CR_1000T_MS_ENABLE 0x1000 - -#define ALX_GIGA_CR_1000T_TEST_MODE_NORMAL 0x0000 -#define ALX_GIGA_CR_1000T_TEST_MODE_1 0x2000 -#define ALX_GIGA_CR_1000T_TEST_MODE_2 0x4000 -#define ALX_GIGA_CR_1000T_TEST_MODE_3 0x6000 -#define ALX_GIGA_CR_1000T_TEST_MODE_4 0x8000 -#define ALX_GIGA_CR_1000T_SPEED_MASK 0x0300 -#define ALX_GIGA_CR_1000T_DEFAULT_CAP 0x0300 - -/* 1000BASE-T Status Register */ -#define ALX_MII_GIGA_SR 0x0A - -/* PHY Specific Status Register */ -#define ALX_MII_GIGA_PSSR 0x11 -#define ALX_GIGA_PSSR_FC_RXEN 0x0004 -#define ALX_GIGA_PSSR_FC_TXEN 0x0008 -#define ALX_GIGA_PSSR_SPD_DPLX_RESOLVED 0x0800 -#define ALX_GIGA_PSSR_DPLX 0x2000 -#define ALX_GIGA_PSSR_SPEED 0xC000 -#define ALX_GIGA_PSSR_10MBS 0x0000 -#define ALX_GIGA_PSSR_100MBS 0x4000 -#define ALX_GIGA_PSSR_1000MBS 0x8000 - -/* PHY Interrupt Enable Register */ -#define ALX_MII_IER 0x12 -#define ALX_IER_LINK_UP 0x0400 -#define ALX_IER_LINK_DOWN 0x0800 - -/* PHY Interrupt Status Register */ -#define ALX_MII_ISR 0x13 -#define ALX_ISR_LINK_UP 0x0400 -#define ALX_ISR_LINK_DOWN 0x0800 - -/* Cable-Detect-Test Control Register */ -#define ALX_MII_CDTC 0x16 -#define ALX_CDTC_EN 1 /* sc */ -#define ALX_CDTC_PAIR_MASK 0x3U -#define ALX_CDTC_PAIR_SHIFT 8 - - -/* Cable-Detect-Test Status Register */ -#define ALX_MII_CDTS 0x1C -#define ALX_CDTS_STATUS_MASK 0x3U -#define ALX_CDTS_STATUS_SHIFT 8 -#define ALX_CDTS_STATUS_NORMAL 0 -#define ALX_CDTS_STATUS_SHORT 1 -#define ALX_CDTS_STATUS_OPEN 2 -#define ALX_CDTS_STATUS_INVALID 3 - -#define ALX_MII_DBG_ADDR 0x1D -#define ALX_MII_DBG_DATA 0x1E - -/***************************** debug port *************************************/ - -#define ALX_MIIDBG_ANACTRL 0x00 -#define ALX_ANACTRL_CLK125M_DELAY_EN 0x8000 -#define ALX_ANACTRL_VCO_FAST 0x4000 -#define ALX_ANACTRL_VCO_SLOW 0x2000 -#define ALX_ANACTRL_AFE_MODE_EN 0x1000 -#define ALX_ANACTRL_LCKDET_PHY 0x0800 -#define ALX_ANACTRL_LCKDET_EN 0x0400 -#define ALX_ANACTRL_OEN_125M 0x0200 -#define ALX_ANACTRL_HBIAS_EN 0x0100 -#define ALX_ANACTRL_HB_EN 0x0080 -#define ALX_ANACTRL_SEL_HSP 0x0040 -#define ALX_ANACTRL_CLASSA_EN 0x0020 -#define ALX_ANACTRL_MANUSWON_SWR_MASK 0x3U -#define ALX_ANACTRL_MANUSWON_SWR_SHIFT 2 -#define ALX_ANACTRL_MANUSWON_SWR_2V 0 -#define ALX_ANACTRL_MANUSWON_SWR_1P9V 1 -#define ALX_ANACTRL_MANUSWON_SWR_1P8V 2 -#define ALX_ANACTRL_MANUSWON_SWR_1P7V 3 -#define ALX_ANACTRL_MANUSWON_BW3_4M 0x0002 -#define ALX_ANACTRL_RESTART_CAL 0x0001 -#define ALX_ANACTRL_DEF 0x02EF - - -#define ALX_MIIDBG_SYSMODCTRL 0x04 -#define ALX_SYSMODCTRL_IECHOADJ_PFMH_PHY 0x8000 -#define ALX_SYSMODCTRL_IECHOADJ_BIASGEN 0x4000 -#define ALX_SYSMODCTRL_IECHOADJ_PFML_PHY 0x2000 -#define ALX_SYSMODCTRL_IECHOADJ_PS_MASK 0x3U -#define ALX_SYSMODCTRL_IECHOADJ_PS_SHIFT 10 -#define ALX_SYSMODCTRL_IECHOADJ_PS_40 3 -#define ALX_SYSMODCTRL_IECHOADJ_PS_20 2 -#define ALX_SYSMODCTRL_IECHOADJ_PS_0 1 -#define ALX_SYSMODCTRL_IECHOADJ_10BT_100MV 0x0040 /* 1:100mv, 0:200mv */ -#define ALX_SYSMODCTRL_IECHOADJ_HLFAP_MASK 0x3U -#define ALX_SYSMODCTRL_IECHOADJ_HLFAP_SHIFT 4 -#define ALX_SYSMODCTRL_IECHOADJ_VDFULBW 0x0008 -#define ALX_SYSMODCTRL_IECHOADJ_VDBIASHLF 0x0004 -#define ALX_SYSMODCTRL_IECHOADJ_VDAMPHLF 0x0002 -#define ALX_SYSMODCTRL_IECHOADJ_VDLANSW 0x0001 -#define ALX_SYSMODCTRL_IECHOADJ_DEF 0xBB8B /* en half bias */ - - -#define ALX_MIIDBG_SRDSYSMOD 0x05 -#define ALX_SRDSYSMOD_LCKDET_EN 0x2000 -#define ALX_SRDSYSMOD_PLL_EN 0x0800 -#define ALX_SRDSYSMOD_SEL_HSP 0x0400 -#define ALX_SRDSYSMOD_HLFTXDR 0x0200 -#define ALX_SRDSYSMOD_TXCLK_DELAY_EN 0x0100 -#define ALX_SRDSYSMOD_TXELECIDLE 0x0080 -#define ALX_SRDSYSMOD_DEEMP_EN 0x0040 -#define ALX_SRDSYSMOD_MS_PAD 0x0004 -#define ALX_SRDSYSMOD_CDR_ADC_VLTG 0x0002 -#define ALX_SRDSYSMOD_CDR_DAC_1MA 0x0001 -#define ALX_SRDSYSMOD_DEF 0x2C46 - - -#define ALX_MIIDBG_HIBNEG 0x0B -#define ALX_HIBNEG_PSHIB_EN 0x8000 -#define ALX_HIBNEG_WAKE_BOTH 0x4000 -#define ALX_HIBNEG_ONOFF_ANACHG_SUDEN 0x2000 -#define ALX_HIBNEG_HIB_PULSE 0x1000 -#define ALX_HIBNEG_GATE_25M_EN 0x0800 -#define ALX_HIBNEG_RST_80U 0x0400 -#define ALX_HIBNEG_RST_TIMER_MASK 0x3U -#define ALX_HIBNEG_RST_TIMER_SHIFT 8 -#define ALX_HIBNEG_GTX_CLK_DELAY_MASK 0x3U -#define ALX_HIBNEG_GTX_CLK_DELAY_SHIFT 5 -#define ALX_HIBNEG_BYPSS_BRKTIMER 0x0010 -#define ALX_HIBNEG_DEF 0xBC40 -#define ALX_HIBNEG_NOHIB (\ -ALX_HIBNEG_DEF & ~(ALX_HIBNEG_PSHIB_EN | ALX_HIBNEG_HIB_PULSE)) - -#define ALX_MIIDBG_TST10BTCFG 0x12 -#define ALX_TST10BTCFG_INTV_TIMER_MASK 0x3U -#define ALX_TST10BTCFG_INTV_TIMER_SHIFT 14 -#define ALX_TST10BTCFG_TRIGER_TIMER_MASK 0x3U -#define ALX_TST10BTCFG_TRIGER_TIMER_SHIFT 12 -#define ALX_TST10BTCFG_DIV_MAN_MLT3_EN 0x0800 -#define ALX_TST10BTCFG_OFF_DAC_IDLE 0x0400 -#define ALX_TST10BTCFG_LPBK_DEEP 0x0004 /* 1:deep,0:shallow */ -#define ALX_TST10BTCFG_DEF 0x4C04 - -#define ALX_MIIDBG_AZ_ANADECT 0x15 -#define ALX_AZ_ANADECT_10BTRX_TH 0x8000 -#define ALX_AZ_ANADECT_BOTH_01CHNL 0x4000 -#define ALX_AZ_ANADECT_INTV_MASK 0x3FU -#define ALX_AZ_ANADECT_INTV_SHIFT 8 -#define ALX_AZ_ANADECT_THRESH_MASK 0xFU -#define ALX_AZ_ANADECT_THRESH_SHIFT 4 -#define ALX_AZ_ANADECT_CHNL_MASK 0xFU -#define ALX_AZ_ANADECT_CHNL_SHIFT 0 -#define ALX_AZ_ANADECT_DEF 0x3220 -#define ALX_AZ_ANADECT_LONG 0x3210 - -#define ALX_MIIDBG_MSE16DB 0x18 -#define ALX_MSE16DB_UP 0x05EA -#define ALX_MSE16DB_DOWN 0x02EA - -#define ALX_MIIDBG_MSE20DB 0x1C -#define ALX_MSE20DB_TH_MASK 0x7F -#define ALX_MSE20DB_TH_SHIFT 2 -#define ALX_MSE20DB_TH_DEF 0x2E -#define ALX_MSE20DB_TH_HI 0x54 - -#define ALX_MIIDBG_AGC 0x23 -#define ALX_AGC_2_VGA_MASK 0x3FU -#define ALX_AGC_2_VGA_SHIFT 8 -#define ALX_AGC_LONG1G_LIMT 40 -#define ALX_AGC_LONG100M_LIMT 44 - -#define ALX_MIIDBG_LEGCYPS 0x29 -#define ALX_LEGCYPS_EN 0x8000 -#define ALX_LEGCYPS_DAC_AMP1000_MASK 0x7U -#define ALX_LEGCYPS_DAC_AMP1000_SHIFT 12 -#define ALX_LEGCYPS_DAC_AMP100_MASK 0x7U -#define ALX_LEGCYPS_DAC_AMP100_SHIFT 9 -#define ALX_LEGCYPS_DAC_AMP10_MASK 0x7U -#define ALX_LEGCYPS_DAC_AMP10_SHIFT 6 -#define ALX_LEGCYPS_UNPLUG_TIMER_MASK 0x7U -#define ALX_LEGCYPS_UNPLUG_TIMER_SHIFT 3 -#define ALX_LEGCYPS_UNPLUG_DECT_EN 0x0004 -#define ALX_LEGCYPS_ECNC_PS_EN 0x0001 -#define ALX_LEGCYPS_DEF 0x129D - -#define ALX_MIIDBG_TST100BTCFG 0x36 -#define ALX_TST100BTCFG_NORMAL_BW_EN 0x8000 -#define ALX_TST100BTCFG_BADLNK_BYPASS 0x4000 -#define ALX_TST100BTCFG_SHORTCABL_TH_MASK 0x3FU -#define ALX_TST100BTCFG_SHORTCABL_TH_SHIFT 8 -#define ALX_TST100BTCFG_LITCH_EN 0x0080 -#define ALX_TST100BTCFG_VLT_SW 0x0040 -#define ALX_TST100BTCFG_LONGCABL_TH_MASK 0x3FU -#define ALX_TST100BTCFG_LONGCABL_TH_SHIFT 0 -#define ALX_TST100BTCFG_DEF 0xE12C - -#define ALX_MIIDBG_GREENCFG 0x3B -#define ALX_GREENCFG_MSTPS_MSETH2_MASK 0xFFU -#define ALX_GREENCFG_MSTPS_MSETH2_SHIFT 8 -#define ALX_GREENCFG_MSTPS_MSETH1_MASK 0xFFU -#define ALX_GREENCFG_MSTPS_MSETH1_SHIFT 0 -#define ALX_GREENCFG_DEF 0x7078 - -#define ALX_MIIDBG_GREENCFG2 0x3D -#define ALX_GREENCFG2_BP_GREEN 0x8000 -#define ALX_GREENCFG2_GATE_DFSE_EN 0x0080 - - -/***************************** extension **************************************/ - -/******* dev 3 *********/ -#define ALX_MIIEXT_PCS 3 - -#define ALX_MIIEXT_CLDCTRL3 0x8003 -#define ALX_CLDCTRL3_BP_CABLE1TH_DET_GT 0x8000 -#define ALX_CLDCTRL3_AZ_DISAMP 0x1000 - -#define ALX_MIIEXT_CLDCTRL5 0x8005 -#define ALX_CLDCTRL5_BP_VD_HLFBIAS 0x4000 - -#define ALX_MIIEXT_CLDCTRL6 0x8006 -#define ALX_CLDCTRL6_CAB_LEN_MASK 0xFFU -#define ALX_CLDCTRL6_CAB_LEN_SHIFT 0 -#define ALX_CLDCTRL6_CAB_LEN_SHORT1G 116 -#define ALX_CLDCTRL6_CAB_LEN_SHORT100M 152 - -#define ALX_MIIEXT_CLDCTRL7 0x8007 -#define ALX_CLDCTRL7_VDHLF_BIAS_TH_MASK 0x7FU -#define ALX_CLDCTRL7_VDHLF_BIAS_TH_SHIFT 9 -#define ALX_CLDCTRL7_AFE_AZ_MASK 0x1FU -#define ALX_CLDCTRL7_AFE_AZ_SHIFT 4 -#define ALX_CLDCTRL7_SIDE_PEAK_TH_MASK 0xFU -#define ALX_CLDCTRL7_SIDE_PEAK_TH_SHIFT 0 -#define ALX_CLDCTRL7_DEF 0x6BF6 - -#define ALX_MIIEXT_AZCTRL 0x8008 -#define ALX_AZCTRL_SHORT_TH_MASK 0xFFU -#define ALX_AZCTRL_SHORT_TH_SHIFT 8 -#define ALX_AZCTRL_LONG_TH_MASK 0xFFU -#define ALX_AZCTRL_LONG_TH_SHIFT 0 -#define ALX_AZCTRL_DEF 0x1629 - -#define ALX_MIIEXT_AZCTRL2 0x8009 -#define ALX_AZCTRL2_WAKETRNING_MASK 0xFFU -#define ALX_AZCTRL2_WAKETRNING_SHIFT 8 -#define ALX_AZCTRL2_QUIET_TIMER_MASK 0x3U -#define ALX_AZCTRL2_QUIET_TIMER_SHIFT 6 -#define ALX_AZCTRL2_PHAS_JMP2 0x0010 -#define ALX_AZCTRL2_CLKTRCV_125MD16 0x0008 -#define ALX_AZCTRL2_GATE1000_EN 0x0004 -#define ALX_AZCTRL2_AVRG_FREQ 0x0002 -#define ALX_AZCTRL2_PHAS_JMP4 0x0001 -#define ALX_AZCTRL2_DEF 0x32C0 - -#define ALX_MIIEXT_AZCTRL6 0x800D - -#define ALX_MIIEXT_VDRVBIAS 0x8062 -#define ALX_VDRVBIAS_SEL_MASK 0x3U -#define ALX_VDRVBIAS_SEL_SHIFT 0 -#define ALX_VDRVBIAS_DEF 0x3 - -/********* dev 7 **********/ -#define ALX_MIIEXT_ANEG 7 - -#define ALX_MIIEXT_LOCAL_EEEADV 0x3C -#define ALX_LOCAL_EEEADV_1000BT 0x0004 -#define ALX_LOCAL_EEEADV_100BT 0x0002 - -#define ALX_MIIEXT_REMOTE_EEEADV 0x3D -#define ALX_REMOTE_EEEADV_1000BT 0x0004 -#define ALX_REMOTE_EEEADV_100BT 0x0002 - -#define ALX_MIIEXT_EEE_ANEG 0x8000 -#define ALX_EEE_ANEG_1000M 0x0004 -#define ALX_EEE_ANEG_100M 0x0002 - -#define ALX_MIIEXT_AFE 0x801A -#define ALX_AFE_10BT_100M_TH 0x0040 - -#define ALX_MIIEXT_S3DIG10 0x8023 -#define ALX_MIIEXT_S3DIG10_SL 0x0001 /* 1=bypass 10BT rx fifo */ -#define ALX_MIIEXT_S3DIG10_DEF 0 /* 0= original 10BT rx */ - -#define ALX_MIIEXT_NLP34 0x8025 -#define ALX_MIIEXT_NLP34_DEF 0x1010 /* for 160m */ - -#define ALX_MIIEXT_NLP56 0x8026 -#define ALX_MIIEXT_NLP56_DEF 0x1010 /* for 160m */ - -#define ALX_MIIEXT_NLP78 0x8027 -#define ALX_MIIEXT_NLP78_160M_DEF 0x8D05 /* for 160m */ -#define ALX_MIIEXT_NLP78_120M_DEF 0x8A05 /* for 120m */ +struct tpd_desc { + __le32 word0; + __le32 word1; + union { + __le64 addr; + struct { + __le32 pkt_len; + __le32 resvd; + } l; + } adrl; +} __packed; + +/* tpd word 0 */ +#define TPD_BUFLEN_MASK 0xFFFF +#define TPD_BUFLEN_SHIFT 0 +#define TPD_VLTAG_MASK 0xFFFF +#define TPD_VLTAG_SHIFT 16 + +/* tpd word 1 */ +#define TPD_CXSUMSTART_MASK 0x00FF +#define TPD_CXSUMSTART_SHIFT 0 +#define TPD_L4HDROFFSET_MASK 0x00FF +#define TPD_L4HDROFFSET_SHIFT 0 +#define TPD_CXSUM_EN_MASK 0x0001 +#define TPD_CXSUM_EN_SHIFT 8 +#define TPD_IP_XSUM_MASK 0x0001 +#define TPD_IP_XSUM_SHIFT 9 +#define TPD_TCP_XSUM_MASK 0x0001 +#define TPD_TCP_XSUM_SHIFT 10 +#define TPD_UDP_XSUM_MASK 0x0001 +#define TPD_UDP_XSUm_SHIFT 11 +#define TPD_LSO_EN_MASK 0x0001 +#define TPD_LSO_EN_SHIFT 12 +#define TPD_LSO_V2_MASK 0x0001 +#define TPD_LSO_V2_SHIFT 13 +#define TPD_VLTAGGED_MASK 0x0001 +#define TPD_VLTAGGED_SHIFT 14 +#define TPD_INS_VLTAG_MASK 0x0001 +#define TPD_INS_VLTAG_SHIFT 15 +#define TPD_IPV4_MASK 0x0001 +#define TPD_IPV4_SHIFT 16 +#define TPD_ETHTYPE_MASK 0x0001 +#define TPD_ETHTYPE_SHIFT 17 +#define TPD_CXSUMOFFSET_MASK 0x00FF +#define TPD_CXSUMOFFSET_SHIFT 18 +#define TPD_MSS_MASK 0x1FFF +#define TPD_MSS_SHIFT 18 +#define TPD_EOP_MASK 0x0001 +#define TPD_EOP_SHIFT 31 + +#define DESC_GET(_x, _name) ((_x) >> _name##SHIFT & _name##MASK) + +/* Receive Free Descriptor */ +struct rfd_desc { + __le64 addr; /* data buffer address, length is + * declared in register --- every + * buffer has the same size + */ +} __packed; + +/* Receive Return Descriptor, contains 4 32-bit words. + * + * 31 16 0 + * +----------------+----------------+ + * | Word 0 | + * +----------------+----------------+ + * | Word 1: RSS Hash value | + * +----------------+----------------+ + * | Word 2 | + * +----------------+----------------+ + * | Word 3 | + * +----------------+----------------+ + * + * Word 0 depiction & Word 2 depiction: + * + * 0--+ 0--+ + * 1 | 1 | + * 2 | 2 | + * 3 | 3 | + * 4 | 4 | + * 5 | 5 | + * 6 | 6 | + * 7 | IP payload checksum 7 | VLAN tag + * 8 | (15:0) 8 | (15:0) + * 9 | 9 | + * 10 | 10 | + * 11 | 11 | + * 12 | 12 | + * 13 | 13 | + * 14 | 14 | + * 15-+ 15-+ + * 16-+ 16-+ + * 17 | Number of RFDs 17 | + * 18 | (19:16) 18 | + * 19-+ 19 | Protocol ID + * 20-+ 20 | (23:16) + * 21 | 21 | + * 22 | 22 | + * 23 | 23-+ + * 24 | 24 | Reserved + * 25 | Start index of RFD-ring 25-+ + * 26 | (31:20) 26 | RSS Q-num (27:25) + * 27 | 27-+ + * 28 | 28-+ + * 29 | 29 | RSS Hash algorithm + * 30 | 30 | (31:28) + * 31-+ 31-+ + * + * Word 3 depiction: + * + * 0--+ + * 1 | + * 2 | + * 3 | + * 4 | + * 5 | + * 6 | + * 7 | Packet length (include FCS) + * 8 | (13:0) + * 9 | + * 10 | + * 11 | + * 12 | + * 13-+ + * 14 L4 Header checksum error + * 15 IPv4 checksum error + * 16 VLAN tagged + * 17-+ + * 18 | Protocol ID (19:17) + * 19-+ + * 20 Receive error summary + * 21 FCS(CRC) error + * 22 Frame alignment error + * 23 Truncated packet + * 24 Runt packet + * 25 Incomplete packet due to insufficient rx-desc + * 26 Broadcast packet + * 27 Multicast packet + * 28 Ethernet type (EII or 802.3) + * 29 FIFO overflow + * 30 Length error (for 802.3, length field mismatch with actual len) + * 31 Updated, indicate to driver that this RRD is refreshed. + */ -/******************************************************************************/ -/* HW. related setting used by SW. */ +struct rrd_desc { + __le32 word0; + __le32 rss_hash; + __le32 word2; + __le32 word3; +} __packed; + +/* rrd word 0 */ +#define RRD_XSUM_MASK 0xFFFF +#define RRD_XSUM_SHIFT 0 +#define RRD_NOR_MASK 0x000F +#define RRD_NOR_SHIFT 16 +#define RRD_SI_MASK 0x0FFF +#define RRD_SI_SHIFT 20 + +/* rrd word 2 */ +#define RRD_VLTAG_MASK 0xFFFF +#define RRD_VLTAG_SHIFT 0 +#define RRD_PID_MASK 0x00FF +#define RRD_PID_SHIFT 16 +/* non-ip packet */ +#define RRD_PID_NONIP 0 +/* ipv4(only) */ +#define RRD_PID_IPV4 1 +/* tcp/ipv6 */ +#define RRD_PID_IPV6TCP 2 +/* tcp/ipv4 */ +#define RRD_PID_IPV4TCP 3 +/* udp/ipv6 */ +#define RRD_PID_IPV6UDP 4 +/* udp/ipv4 */ +#define RRD_PID_IPV4UDP 5 +/* ipv6(only) */ +#define RRD_PID_IPV6 6 +/* LLDP packet */ +#define RRD_PID_LLDP 7 +/* 1588 packet */ +#define RRD_PID_1588 8 +#define RRD_RSSQ_MASK 0x0007 +#define RRD_RSSQ_SHIFT 25 +#define RRD_RSSALG_MASK 0x000F +#define RRD_RSSALG_SHIFT 28 +#define RRD_RSSALG_TCPV6 0x1 +#define RRD_RSSALG_IPV6 0x2 +#define RRD_RSSALG_TCPV4 0x4 +#define RRD_RSSALG_IPV4 0x8 + +/* rrd word 3 */ +#define RRD_PKTLEN_MASK 0x3FFF +#define RRD_PKTLEN_SHIFT 0 +#define RRD_ERR_L4_MASK 0x0001 +#define RRD_ERR_L4_SHIFT 14 +#define RRD_ERR_IPV4_MASK 0x0001 +#define RRD_ERR_IPV4_SHIFT 15 +#define RRD_VLTAGGED_MASK 0x0001 +#define RRD_VLTAGGED_SHIFT 16 +#define RRD_OLD_PID_MASK 0x0007 +#define RRD_OLD_PID_SHIFT 17 +#define RRD_ERR_RES_MASK 0x0001 +#define RRD_ERR_RES_SHIFT 20 +#define RRD_ERR_FCS_MASK 0x0001 +#define RRD_ERR_FCS_SHIFT 21 +#define RRD_ERR_FAE_MASK 0x0001 +#define RRD_ERR_FAE_SHIFT 22 +#define RRD_ERR_TRUNC_MASK 0x0001 +#define RRD_ERR_TRUNC_SHIFT 23 +#define RRD_ERR_RUNT_MASK 0x0001 +#define RRD_ERR_RUNT_SHIFT 24 +#define RRD_ERR_ICMP_MASK 0x0001 +#define RRD_ERR_ICMP_SHIFT 25 +#define RRD_BCAST_MASK 0x0001 +#define RRD_BCAST_SHIFT 26 +#define RRD_MCAST_MASK 0x0001 +#define RRD_MCAST_SHIFT 27 +#define RRD_ETHTYPE_MASK 0x0001 +#define RRD_ETHTYPE_SHIFT 28 +#define RRD_ERR_FIFOV_MASK 0x0001 +#define RRD_ERR_FIFOV_SHIFT 29 +#define RRD_ERR_LEN_MASK 0x0001 +#define RRD_ERR_LEN_SHIFT 30 +#define RRD_UPDATED_MASK 0x0001 +#define RRD_UPDATED_SHIFT 31 + + +/* Statistics counters collected by the MAC */ +struct alx_hw_stats { + /* rx */ + unsigned long rx_ok; + unsigned long rx_bcast; + unsigned long rx_mcast; + unsigned long rx_pause; + unsigned long rx_ctrl; + unsigned long rx_fcs_err; + unsigned long rx_len_err; + unsigned long rx_byte_cnt; + unsigned long rx_runt; + unsigned long rx_frag; + unsigned long rx_sz_64B; + unsigned long rx_sz_127B; + unsigned long rx_sz_255B; + unsigned long rx_sz_511B; + unsigned long rx_sz_1023B; + unsigned long rx_sz_1518B; + unsigned long rx_sz_max; + unsigned long rx_ov_sz; + unsigned long rx_ov_rxf; + unsigned long rx_ov_rrd; + unsigned long rx_align_err; + unsigned long rx_bc_byte_cnt; + unsigned long rx_mc_byte_cnt; + unsigned long rx_err_addr; + + /* tx */ + unsigned long tx_ok; + unsigned long tx_bcast; + unsigned long tx_mcast; + unsigned long tx_pause; + unsigned long tx_exc_defer; + unsigned long tx_ctrl; + unsigned long tx_defer; + unsigned long tx_byte_cnt; + unsigned long tx_sz_64B; + unsigned long tx_sz_127B; + unsigned long tx_sz_255B; + unsigned long tx_sz_511B; + unsigned long tx_sz_1023B; + unsigned long tx_sz_1518B; + unsigned long tx_sz_max; + unsigned long tx_single_col; + unsigned long tx_multi_col; + unsigned long tx_late_col; + unsigned long tx_abort_col; + unsigned long tx_underrun; + unsigned long tx_trd_eop; + unsigned long tx_len_err; + unsigned long tx_trunc; + unsigned long tx_bc_byte_cnt; + unsigned long tx_mc_byte_cnt; + unsigned long update; +}; + +#define SPEED_0 0 +#define HALF_DUPLEX 1 +#define FULL_DUPLEX 2 +#define ALX_MAX_SETUP_LNK_CYCLE 50 + +#define ALX_SPEED_TO_ETHADV(_speed) (\ +(_speed) == SPEED_1000 + FULL_DUPLEX ? ADVERTISED_1000baseT_Full : \ +(_speed) == SPEED_100 + FULL_DUPLEX ? ADVERTISED_100baseT_Full : \ +(_speed) == SPEED_100 + HALF_DUPLEX ? ADVERTISED_10baseT_Half : \ +(_speed) == SPEED_10 + FULL_DUPLEX ? ADVERTISED_10baseT_Full : \ +(_speed) == SPEED_10 + HALF_DUPLEX ? ADVERTISED_10baseT_Half : \ +0) /* for FlowControl */ #define ALX_FC_RX 0x01 @@ -2116,9 +388,9 @@ ALX_HIBNEG_DEF & ~(ALX_HIBNEG_PSHIB_EN | ALX_HIBNEG_HIB_PULSE)) #define ALX_FC_ANEG 0x04 /* for sleep control */ -#define ALX_SLEEP_WOL_PHY 0x00000001 /* WoL / PHY Status Change */ -#define ALX_SLEEP_WOL_MAGIC 0x00000002 /* WoL/ Magic Packet */ -#define ALX_SLEEP_CIFS 0x00000004 /* CIFS active */ +#define ALX_SLEEP_WOL_PHY 0x00000001 +#define ALX_SLEEP_WOL_MAGIC 0x00000002 +#define ALX_SLEEP_CIFS 0x00000004 #define ALX_SLEEP_ACTIVE (\ ALX_SLEEP_WOL_PHY | \ ALX_SLEEP_WOL_MAGIC | \ @@ -2134,6 +406,236 @@ ALX_HIBNEG_DEF & ~(ALX_HIBNEG_PSHIB_EN | ALX_HIBNEG_HIB_PULSE)) ALX_RSS_HASH_TYPE_IPV4_TCP |\ ALX_RSS_HASH_TYPE_IPV6 |\ ALX_RSS_HASH_TYPE_IPV6_TCP) +#define ALX_DEF_RXBUF_SIZE 1536 +#define ALX_MAX_JUMBO_PKT_SIZE (9*1024) +#define ALX_MAX_TSO_PKT_SIZE (7*1024) +#define ALX_MAX_FRAME_SIZE ALX_MAX_JUMBO_PKT_SIZE +#define ALX_MIN_FRAME_SIZE 68 +#define ALX_RAW_MTU(_mtu) (_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN) + +#define ALX_MAX_RX_QUEUES 8 +#define ALX_MAX_TX_QUEUES 4 +#define ALX_MAX_HANDLED_INTRS 5 + +#define ALX_ISR_MISC (\ + ALX_ISR_PCIE_LNKDOWN | \ + ALX_ISR_DMAW | \ + ALX_ISR_DMAR | \ + ALX_ISR_SMB | \ + ALX_ISR_MANU | \ + ALX_ISR_TIMER) + +#define ALX_ISR_FATAL (\ + ALX_ISR_PCIE_LNKDOWN | \ + ALX_ISR_DMAW | \ + ALX_ISR_DMAR) + +#define ALX_ISR_ALERT (\ + ALX_ISR_RXF_OV | \ + ALX_ISR_TXF_UR | \ + ALX_ISR_RFD_UR) + +#define ALX_ISR_ALL_QUEUES (\ + ALX_ISR_TX_Q0 | \ + ALX_ISR_TX_Q1 | \ + ALX_ISR_TX_Q2 | \ + ALX_ISR_TX_Q3 | \ + ALX_ISR_RX_Q0 | \ + ALX_ISR_RX_Q1 | \ + ALX_ISR_RX_Q2 | \ + ALX_ISR_RX_Q3 | \ + ALX_ISR_RX_Q4 | \ + ALX_ISR_RX_Q5 | \ + ALX_ISR_RX_Q6 | \ + ALX_ISR_RX_Q7) + +/* maximum interrupt vectors for msix */ +#define ALX_MAX_MSIX_INTRS 16 +#define FIELD_GETX(_x, _name) (((_x) >> (_name##_SHIFT)) & (_name##_MASK)) +#define FIELD_SETS(_x, _name, _v) (\ +(_x) = \ +((_x) & ~((_name##_MASK) << (_name##_SHIFT))) |\ +(((u16)(_v) & (_name##_MASK)) << (_name##_SHIFT))) +#define FIELD_SET32(_x, _name, _v) (\ +(_x) = \ +((_x) & ~((_name##_MASK) << (_name##_SHIFT))) |\ +(((_v) & (_name##_MASK)) << (_name##_SHIFT))) +#define FIELDX(_name, _v) (((_v) & (_name##_MASK)) << (_name##_SHIFT)) -#endif/*ALX_HW_H_*/ +struct alx_hw { + void *pdev; + u8 __iomem *hw_addr; + + /* pci regs */ + u16 device_id; + u16 subdev_id; + u16 subven_id; + u8 revision; + + unsigned long capability; + + /* current & permanent mac addr */ + u8 mac_addr[ETH_ALEN]; + u8 perm_addr[ETH_ALEN]; + + u16 mtu; + u16 imt; + u8 dma_chnl; + u8 max_dma_chnl; + /* tpd threshold to trig INT */ + u32 ith_tpd; + u32 rx_ctrl; + u32 mc_hash[2]; + + u8 rss_key[40]; + u32 rss_idt[32]; + u16 rss_idt_size; + u8 rss_hash_type; + + /* weight round robin for multiple-tx-Q */ + u32 wrr[ALX_MAX_TX_QUEUES]; + /* prioirty control */ + u32 wrr_ctrl; + + /* interrupt mask for ALX_IMR */ + u32 imask; + u32 smb_timer; + bool link_up; + u16 link_speed; + u8 link_duplex; + + /* auto-neg advertisement or force mode config */ + u32 adv_cfg; + u8 flowctrl; + + struct alx_hw_stats hw_stats; + u32 sleep_ctrl; + + spinlock_t mdio_lock; + struct mdio_if_info mdio; + u16 phy_id[2]; + + struct alx_hw_stats stats; + /* PHY link patch flag */ + bool lnk_patch; + /* PHY hibernation patch flag */ + bool hib_patch; +}; + +#define ALX_DID(_hw) ((_hw)->device_id) +#define ALX_SUB_VID(_hw) ((_hw)->subven_id) +#define ALX_SUB_DID(_hw) ((_hw)->subdev_id) +#define ALX_REVID(_hw) ((_hw)->revision >> ALX_PCI_REVID_SHIFT) +#define ALX_WITH_CR(_hw) ((_hw)->revision & 1) + +enum ALX_CAPS { + ALX_CAP_GIGA = 0, + ALX_CAP_PTP, + ALX_CAP_AZ, + ALX_CAP_L0S, + ALX_CAP_L1, + ALX_CAP_SWOI, + ALX_CAP_RSS, + ALX_CAP_MSIX, + /* support Multi-TX-Q */ + ALX_CAP_MTQ, + /* support Multi-RX-Q */ + ALX_CAP_MRQ, +}; +#define ALX_CAP(_hw, _cap) (\ + test_bit(ALX_CAP_##_cap, &(_hw)->capability)) +#define ALX_CAP_SET(_hw, _cap) (\ + set_bit(ALX_CAP_##_cap, &(_hw)->capability)) +#define ALX_CAP_CLEAR(_hw, _cap) (\ + clear_bit(ALX_CAP_##_cap, &(_hw)->capability)) + +/* write to 8bit register via pci memory space */ +#define ALX_MEM_W8(s, reg, val) (writeb((val), ((s)->hw_addr + reg))) + +/* read from 8bit register via pci memory space */ +#define ALX_MEM_R8(s, reg, pdat) (\ + *(u8 *)(pdat) = readb((s)->hw_addr + reg)) + +/* write to 16bit register via pci memory space */ +#define ALX_MEM_W16(s, reg, val) (writew((val), ((s)->hw_addr + reg))) + +/* read from 16bit register via pci memory space */ +#define ALX_MEM_R16(s, reg, pdat) (\ + *(u16 *)(pdat) = readw((s)->hw_addr + reg)) + +/* write to 32bit register via pci memory space */ +#define ALX_MEM_W32(s, reg, val) (writel((val), ((s)->hw_addr + reg))) + +/* read from 32bit register via pci memory space */ +#define ALX_MEM_R32(s, reg, pdat) (\ + *(u32 *)(pdat) = readl((s)->hw_addr + reg)) + +/* read from 16bit register via pci config space */ +#define ALX_CFG_R16(s, reg, pdat) (\ + pci_read_config_word((s)->pdev, (reg), (pdat))) + +/* write to 16bit register via pci config space */ +#define ALX_CFG_W16(s, reg, val) (\ + pci_write_config_word((s)->pdev, (reg), (val))) + +/* flush regs */ +#define ALX_MEM_FLUSH(s) (readl((s)->hw_addr)) + + +int alx_get_perm_macaddr(struct alx_hw *hw, u8 *addr); +void alx_add_mc_addr(struct alx_hw *hw, u8 *addr); +void alx_reset_phy(struct alx_hw *hw, bool hib_en); +void alx_reset_pcie(struct alx_hw *hw); +void alx_enable_aspm(struct alx_hw *hw, bool l0s_en, bool l1_en); +int alx_setup_speed_duplex(struct alx_hw *hw, u32 ethadv, u8 flowctrl); +void alx_post_phy_link(struct alx_hw *hw, u16 speed, bool az_en); +int alx_pre_suspend(struct alx_hw *hw, u16 speed); +int alx_read_phy_reg(struct alx_hw *hw, u16 reg, u16 *phy_data); +int alx_write_phy_reg(struct alx_hw *hw, u16 reg, u16 phy_data); +int alx_read_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 *pdata); +int alx_write_phy_ext(struct alx_hw *hw, u8 dev, u16 reg, u16 data); +int alx_read_phy_dbg(struct alx_hw *hw, u16 reg, u16 *pdata); +int alx_write_phy_dbg(struct alx_hw *hw, u16 reg, u16 data); +int alx_get_phy_link(struct alx_hw *hw, bool *link_up, u16 *speed); +int alx_clear_phy_intr(struct alx_hw *hw); +int alx_config_wol(struct alx_hw *hw); +void alx_cfg_mac_fc(struct alx_hw *hw, u8 fc); +void alx_start_mac(struct alx_hw *hw); +int alx_stop_mac(struct alx_hw *hw); +int alx_reset_mac(struct alx_hw *hw); +void alx_set_macaddr(struct alx_hw *hw, u8 *addr); +bool alx_phy_configed(struct alx_hw *hw); +void alx_configure_basic(struct alx_hw *hw); +void alx_configure_rss(struct alx_hw *hw, bool en); +void alx_mask_msix(struct alx_hw *hw, int index, bool mask); +int alx_select_powersaving_speed(struct alx_hw *hw, u16 *speed); +void __alx_update_hw_stats(struct alx_hw *hw); + +#define alx_get_readrq(_hw) pcie_get_readrq((_hw)->pdev) +#define alx_set_readrq(_hw, _v) pcie_set_readrq((_hw)->pdev, _v) + + +/* some issues are relavant to specific platforms + * we assign those patches for the chip by pci device id + * vendor id, subsystem id and revision number + */ +struct alx_platform_patch { + u16 pci_did; + u8 pci_rev; + u16 subsystem_vid; + u16 subsystem_did; + u32 pflag; +}; +/* PHY link issue */ +#define ALX_PF_LINK 0x00001 +/* Hibernatation issue */ +#define ALX_PF_HIB 0x00002 +/* not care revision number */ +#define ALX_PF_ANY_REV 0x10000 + + +void __devinit alx_patch_assign(struct alx_hw *hw); +bool __devinit alx_get_phy_info(struct alx_hw *hw); + +#endif diff --git a/src/alx_main.c b/src/alx_main.c index 008bb5f..23b93f8 100644 --- a/src/alx_main.c +++ b/src/alx_main.c @@ -21,8 +21,14 @@ #include <linux/ipv6.h> #include <linux/if_vlan.h> #include <linux/mii.h> +#include <linux/mdio.h> #include <linux/aer.h> +#include <linux/bitops.h> +#include <linux/netdevice.h> +#include <linux/etherdevice.h> +#include "alx_reg.h" +#include "alx_hw.h" #include "alx.h" char alx_drv_name[] = "alx"; @@ -59,62 +65,42 @@ static irqreturn_t alx_intr_msix_misc(int irq, void *data); static irqreturn_t alx_intr_msi(int irq, void *data); static irqreturn_t alx_intr_legacy(int irq, void *data); static void alx_init_ring_ptrs(struct alx_adapter *adpt); +static int alx_reinit_rings(struct alx_adapter *adpt); static inline void alx_schedule_work(struct alx_adapter *adpt) { - if (!ALX_FLAG(adpt, HALT) && - !ALX_FLAG(adpt, TASK_PENDING)) { - ALX_FLAG_SET(adpt, TASK_PENDING); + if (!ALX_FLAG(adpt, HALT)) schedule_work(&adpt->task); - } } static inline void alx_cancel_work(struct alx_adapter *adpt) { - ALX_FLAG_CLEAR(adpt, TASK_PENDING); cancel_work_sync(&adpt->task); } -void alx_add_mc_addr(struct alx_adapter *adpt, u8 *addr) -{ - u32 crc32, bit, reg; - - crc32 = ether_crc(ETH_ALEN, addr); - - /* The HASH Table is a register array of 2 32-bit registers. - * It is treated like an array of 64 bits. We want to set - * bit BitArray[hash_value]. So we figure out what register - * the bit is in, read it, OR in the new bit, then write - * back the new value. The register is determined by the - * upper 7 bits of the hash value and the bit within that - * register are determined by the lower 5 bits of the value. - */ - reg = (crc32 >> 31) & 0x1; - bit = (crc32 >> 26) & 0x1F; - - adpt->mc_hash[reg] |= (0x1 << bit); -} static void __alx_set_rx_mode(struct net_device *netdev) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; struct netdev_hw_addr *ha; + /* comoute mc addresses' hash value ,and put it into hash table */ netdev_for_each_mc_addr(ha, netdev) - alx_add_mc_addr(adpt, ha->addr); + alx_add_mc_addr(hw, ha->addr); - ALX_MEM_W32(adpt, ALX_HASH_TBL0, adpt->mc_hash[0]); - ALX_MEM_W32(adpt, ALX_HASH_TBL1, adpt->mc_hash[1]); + ALX_MEM_W32(hw, ALX_HASH_TBL0, hw->mc_hash[0]); + ALX_MEM_W32(hw, ALX_HASH_TBL1, hw->mc_hash[1]); /* check for Promiscuous and All Multicast modes */ - adpt->rx_ctrl &= ~(ALX_MAC_CTRL_MULTIALL_EN | ALX_MAC_CTRL_PROMISC_EN); + hw->rx_ctrl &= ~(ALX_MAC_CTRL_MULTIALL_EN | ALX_MAC_CTRL_PROMISC_EN); if (netdev->flags & IFF_PROMISC) - adpt->rx_ctrl |= ALX_MAC_CTRL_PROMISC_EN; + hw->rx_ctrl |= ALX_MAC_CTRL_PROMISC_EN; if (netdev->flags & IFF_ALLMULTI) - adpt->rx_ctrl |= ALX_MAC_CTRL_MULTIALL_EN; + hw->rx_ctrl |= ALX_MAC_CTRL_MULTIALL_EN; - ALX_MEM_W32(adpt, ALX_MAC_CTRL, adpt->rx_ctrl); + ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl); } /* alx_set_rx_mode - Multicast and Promiscuous mode set */ @@ -128,6 +114,7 @@ static void alx_set_rx_mode(struct net_device *netdev) static int alx_set_mac_address(struct net_device *netdev, void *data) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; struct sockaddr *addr = data; if (!is_valid_ether_addr(addr->sa_data)) @@ -137,8 +124,8 @@ static int alx_set_mac_address(struct net_device *netdev, void *data) netdev->addr_assign_type ^= NET_ADDR_RANDOM; memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len); - memcpy(adpt->mac_addr, addr->sa_data, netdev->addr_len); - alx_set_macaddr(adpt, adpt->mac_addr); + memcpy(hw->mac_addr, addr->sa_data, netdev->addr_len); + alx_set_macaddr(hw, hw->mac_addr); return 0; } @@ -173,12 +160,13 @@ static u32 rx_vect_mask[] = {ALX_ISR_RX_Q0, ALX_ISR_RX_Q1, ALX_ISR_RX_Q6, ALX_ISR_RX_Q7}; static int alx_alloc_napis(struct alx_adapter *adpt) { + struct alx_hw *hw = &adpt->hw; struct alx_napi *np; struct alx_rx_queue *rxq; struct alx_tx_queue *txq; int i; - adpt->imask &= ~ALX_ISR_ALL_QUEUES; + hw->imask &= ~ALX_ISR_ALL_QUEUES; /* alloc alx_napi */ for (i = 0; i < adpt->nr_napi; i++) { @@ -203,7 +191,7 @@ static int alx_alloc_napis(struct alx_adapter *adpt) txq->count = adpt->tx_ringsz; txq->qidx = (u16)i; np->vec_mask |= tx_vect_mask[i]; - adpt->imask |= tx_vect_mask[i]; + hw->imask |= tx_vect_mask[i]; } /* alloc rx queue */ @@ -217,8 +205,9 @@ static int alx_alloc_napis(struct alx_adapter *adpt) rxq->c_reg = ALX_RFD_CIDX; rxq->count = adpt->rx_ringsz; rxq->qidx = (u16)i; + __skb_queue_head_init(&rxq->list); np->vec_mask |= rx_vect_mask[i]; - adpt->imask |= rx_vect_mask[i]; + hw->imask |= rx_vect_mask[i]; } return 0; @@ -233,23 +222,22 @@ static int alx_alloc_rings(struct alx_adapter *adpt) struct alx_buffer *bf; u8 *desc; dma_addr_t dma; - int i, size, hw_rxrng, offset; + int i, size, offset; /* alx_buffer */ size = sizeof(struct alx_buffer) * adpt->nr_txq * adpt->tx_ringsz + - sizeof(struct alx_buffer) * adpt->nr_rxq * adpt->rx_ringsz; + sizeof(struct alx_buffer) * adpt->nr_hwrxq * adpt->rx_ringsz; bf = vzalloc(size); if (!bf) goto err_out; /* physical rx rings */ - hw_rxrng = ALX_FLAG(adpt, CAP_MRQ) ? adpt->nr_rxq : 1; size = sizeof(struct tpd_desc) * adpt->tx_ringsz * adpt->nr_txq + (sizeof(struct rrd_desc) + sizeof(struct rfd_desc)) * - adpt->rx_ringsz * hw_rxrng + - adpt->nr_txq * 8 + /* tx align */ - hw_rxrng * 8; /* rx align */ + adpt->rx_ringsz * adpt->nr_hwrxq + + adpt->nr_txq * 8 + + adpt->nr_hwrxq * 8; desc = dma_alloc_coherent(&adpt->pdev->dev, size, &dma, GFP_KERNEL); if (!desc) goto err_out; @@ -275,20 +263,19 @@ static int alx_alloc_rings(struct alx_adapter *adpt) bf += adpt->tx_ringsz; } size = sizeof(struct rrd_desc) * adpt->rx_ringsz; - for (i = 0; i < hw_rxrng; i++) { + for (i = 0; i < adpt->nr_hwrxq; i++) { offset = ALIGN(dma, 8) - dma; desc += offset; dma += offset; - adpt->qnapi[i]->rxq->netdev = adpt->netdev; - adpt->qnapi[i]->rxq->dev = &adpt->pdev->dev; adpt->qnapi[i]->rxq->rrd_hdr = (struct rrd_desc *)desc; adpt->qnapi[i]->rxq->rrd_dma = dma; - adpt->qnapi[i]->rxq->count = adpt->rx_ringsz; + adpt->qnapi[i]->rxq->bf_info = bf; desc += size; dma += size; + bf += adpt->rx_ringsz; } size = sizeof(struct rfd_desc) * adpt->rx_ringsz; - for (i = 0; i < hw_rxrng; i++) { + for (i = 0; i < adpt->nr_hwrxq; i++) { offset = ALIGN(dma, 8) - dma; desc += offset; dma += offset; @@ -298,8 +285,9 @@ static int alx_alloc_rings(struct alx_adapter *adpt) dma += size; } for (i = 0; i < adpt->nr_rxq; i++) { - adpt->qnapi[i]->rxq->bf_info = bf; - bf += adpt->rx_ringsz; + adpt->qnapi[i]->rxq->netdev = adpt->netdev; + adpt->qnapi[i]->rxq->dev = &adpt->pdev->dev; + adpt->qnapi[i]->rxq->count = adpt->rx_ringsz; } return 0; @@ -334,6 +322,55 @@ static void alx_free_rings(struct alx_adapter *adpt) } } +/* dequeue skb from RXQ, return true if the RXQ is empty */ +static inline bool alx_skb_dequeue_n(struct alx_rx_queue *rxq, int max_pkts, + struct sk_buff_head *list) +{ + struct alx_adapter *adpt = netdev_priv(rxq->netdev); + bool use_lock = !ALX_CAP(&adpt->hw, MRQ); + bool empty; + struct sk_buff *skb; + int count = 0; + + if (use_lock) + spin_lock(&rxq->list.lock); + + while (count < max_pkts || max_pkts == -1) { + skb = __skb_dequeue(&rxq->list); + if (skb) { + __skb_queue_tail(list, skb); + count++; + } else + break; + } + + empty = skb_queue_empty(&rxq->list); + + if (use_lock) + spin_unlock(&rxq->list.lock); + + netif_info(adpt, rx_status, adpt->netdev, + "RX %d packets\n", + count); + + return empty; +} + +static inline void alx_skb_queue_tail(struct alx_rx_queue *rxq, + struct sk_buff *skb) +{ + struct alx_adapter *adpt = netdev_priv(rxq->netdev); + bool use_lock = !ALX_CAP(&adpt->hw, MRQ); + + if (use_lock) + spin_lock(&rxq->list.lock); + + __skb_queue_tail(&rxq->list, skb); + + if (use_lock) + spin_unlock(&rxq->list.lock); +} + static int alx_alloc_rxring_buf(struct alx_adapter *adpt, struct alx_rx_queue *rxq) { @@ -381,7 +418,7 @@ static int alx_alloc_rxring_buf(struct alx_adapter *adpt, if (count) { wmb(); rxq->pidx = cur; - ALX_MEM_W16(adpt, rxq->p_reg, (u16)cur); + ALX_MEM_W16(&adpt->hw, rxq->p_reg, (u16)cur); } return count; @@ -390,6 +427,7 @@ static int alx_alloc_rxring_buf(struct alx_adapter *adpt, static void alx_free_rxring_buf(struct alx_rx_queue *rxq) { struct alx_buffer *cur_buf; + struct sk_buff_head list; u16 i; if (rxq == NULL) @@ -408,6 +446,17 @@ static void alx_free_rxring_buf(struct alx_rx_queue *rxq) dma_unmap_addr_set(cur_buf, dma, 0); } } + + /* some skbs might be pending in the list */ + __skb_queue_head_init(&list); + alx_skb_dequeue_n(rxq, -1, &list); + while (!skb_queue_empty(&list)) { + struct sk_buff *skb; + + skb = __skb_dequeue(&list); + dev_kfree_skb(skb); + } + rxq->pidx = 0; rxq->cidx = 0; rxq->rrd_cidx = 0; @@ -415,30 +464,23 @@ static void alx_free_rxring_buf(struct alx_rx_queue *rxq) static int alx_setup_all_ring_resources(struct alx_adapter *adpt) { - int err, i; + int err; err = alx_alloc_napis(adpt); if (err) goto out; + err = alx_alloc_rings(adpt); if (err) goto out; - /* set ring headers to HW register */ - alx_init_ring_ptrs(adpt); + err = alx_reinit_rings(adpt); - for (i = 0; i < adpt->nr_rxq; i++) { - err = alx_alloc_rxring_buf(adpt, adpt->qnapi[i]->rxq); - if (!err) { - err = -ENOMEM; - goto out; - } - } out: if (unlikely(err)) { - dev_err(&adpt->pdev->dev, - "setup_all_ring_resources fail %d\n", - err); + netif_err(adpt, ifup, adpt->netdev, + "setup_all_ring_resources fail %d\n", + err); } return err; } @@ -491,10 +533,12 @@ static void alx_free_all_rings_buf(struct alx_adapter *adpt) int i; for (i = 0; i < adpt->nr_txq; i++) - alx_free_txring_buf(adpt->qnapi[i]->txq); + if (adpt->qnapi[i]) + alx_free_txring_buf(adpt->qnapi[i]->txq); - for (i = 0; i < adpt->nr_rxq; i++) - alx_free_rxring_buf(adpt->qnapi[i]->rxq); + for (i = 0; i < adpt->nr_hwrxq; i++) + if (adpt->qnapi[i]) + alx_free_rxring_buf(adpt->qnapi[i]->rxq); } static void alx_free_all_ring_resources(struct alx_adapter *adpt) @@ -529,29 +573,31 @@ static bool alx_clean_tx_irq(struct alx_tx_queue *txq) netque = netdev_get_tx_queue(adpt->netdev, txq->qidx); sw_cidx = atomic_read(&txq->cidx); - ALX_MEM_R16(adpt, txq->c_reg, &hw_cidx); + ALX_MEM_R16(&adpt->hw, txq->c_reg, &hw_cidx); - netdev_info(adpt->netdev, - "TX[Preg:%x]: consumer = 0x%x, hw-consumer = 0x%x\n", - txq->p_reg, sw_cidx, hw_cidx); + if (sw_cidx != hw_cidx) { - while (sw_cidx != hw_cidx && budget > 0) { - struct sk_buff *skb; + netif_info(adpt, tx_done, adpt->netdev, + "TX[Q:%d, Preg:%x]: cons = 0x%x, hw-cons = 0x%x\n", + txq->qidx, txq->p_reg, sw_cidx, hw_cidx); - skb = txq->bf_info[sw_cidx].skb; - if (skb) { - total_bytes += skb->len; - total_packets++; - budget--; + while (sw_cidx != hw_cidx && budget > 0) { + struct sk_buff *skb; + + skb = txq->bf_info[sw_cidx].skb; + if (skb) { + total_bytes += skb->len; + total_packets++; + budget--; + } + alx_txbuf_unmap_and_free(txq, sw_cidx); + if (++sw_cidx == txq->count) + sw_cidx = 0; } - alx_txbuf_unmap_and_free(txq, sw_cidx); + atomic_set(&txq->cidx, sw_cidx); - if (++sw_cidx == txq->count) - sw_cidx = 0; + netdev_tx_completed_queue(netque, total_packets, total_bytes); } - atomic_set(&txq->cidx, sw_cidx); - - netdev_tx_completed_queue(netque, total_packets, total_bytes); if (unlikely(netif_tx_queue_stopped(netque) && netif_carrier_ok(adpt->netdev) && @@ -563,50 +609,6 @@ static bool alx_clean_tx_irq(struct alx_tx_queue *txq) return sw_cidx == hw_cidx; } -static inline bool alx_skb_dequeue_n(struct alx_rx_queue *rxq, int max_pkts, - struct sk_buff_head *list) -{ - struct alx_adapter *adpt = netdev_priv(rxq->netdev); - bool use_lock = !ALX_FLAG(adpt, CAP_MRQ); - bool empty; - struct sk_buff *skb; - int count = 0; - - if (use_lock) - spin_lock(&rxq->list.lock); - - while (count < max_pkts) { - skb = __skb_dequeue(&rxq->list); - if (skb) { - __skb_queue_tail(list, skb); - count++; - } else - break; - } - - empty = count == 0; - - if (use_lock) - spin_unlock(&rxq->list.lock); - - return empty; -} - -static inline void alx_skb_queue_tail(struct alx_rx_queue *rxq, - struct sk_buff *skb) -{ - struct alx_adapter *adpt = netdev_priv(rxq->netdev); - bool use_lock = !ALX_FLAG(adpt, CAP_MRQ); - - if (use_lock) - spin_lock(&rxq->list.lock); - - __skb_queue_tail(&rxq->list, skb); - - if (use_lock) - spin_unlock(&rxq->list.lock); -} - static bool alx_dispatch_skb(struct alx_rx_queue *rxq) { struct alx_adapter *adpt = netdev_priv(rxq->netdev); @@ -628,9 +630,9 @@ static bool alx_dispatch_skb(struct alx_rx_queue *rxq) if (unlikely(FIELD_GETX(rrd->word0, RRD_SI) != rxq->cidx || FIELD_GETX(rrd->word0, RRD_NOR) != 1)) { - netdev_err(adpt->netdev, - "wrong rrd-SI/NOR packet! rrd->word0 is %08x\n", - rrd->word0); + netif_err(adpt, rx_err, adpt->netdev, + "wrong SI/NOR packet! rrd->word0= %08x\n", + rrd->word0); /* reset chip */ ALX_FLAG_SET(adpt, TASK_RESET); alx_schedule_work(adpt); @@ -683,7 +685,7 @@ static bool alx_dispatch_skb(struct alx_rx_queue *rxq) __vlan_hwaccel_put_tag(skb, ntohs(tag)); } qnum = FIELD_GETX(rrd->word2, RRD_RSSQ) % adpt->nr_rxq; - tmp_rxq = ALX_FLAG(adpt, CAP_MRQ) ? + tmp_rxq = ALX_CAP(&adpt->hw, MRQ) ? rxq : adpt->qnapi[qnum]->rxq; alx_skb_queue_tail(tmp_rxq, skb); @@ -710,39 +712,7 @@ static inline struct alx_rx_queue *alx_hw_rxq(struct alx_rx_queue *rxq) { struct alx_adapter *adpt = netdev_priv(rxq->netdev); - return ALX_FLAG(adpt, CAP_MRQ) ? rxq : adpt->qnapi[0]->rxq; -} - -static void __alx_configure_rss(struct alx_adapter *adpt) -{ - u32 ctrl; - int i; - - ALX_MEM_R32(adpt, ALX_RXQ0, &ctrl); - - if (adpt->nr_rxq > 1) { /* RSS enable */ - - for (i = 0; i < sizeof(adpt->rss_key); i++) { - /* rss key should be saved in chip with - * reversed order. - */ - int j = sizeof(adpt->rss_key) - i - 1; - - ALX_MEM_W8(adpt, ALX_RSS_KEY0 + j, adpt->rss_key[i]); - } - - for (i = 0; i < ARRAY_SIZE(adpt->rss_idt); i++) - ALX_MEM_W32(adpt, ALX_RSS_IDT_TBL0, adpt->rss_idt[i]); - - FIELD_SET32(ctrl, ALX_RXQ0_RSS_HSTYP, adpt->rss_hash_type); - FIELD_SET32(ctrl, ALX_RXQ0_RSS_MODE, ALX_RXQ0_RSS_MODE_MQMI); - FIELD_SET32(ctrl, ALX_RXQ0_IDT_TBL_SIZE, adpt->rss_idt_size); - ctrl |= ALX_RXQ0_RSS_HASH_EN; - } else { /* RSS disable */ - ctrl &= ~ALX_RXQ0_RSS_HASH_EN; - } - - ALX_MEM_W32(adpt, ALX_RXQ0, ctrl); + return ALX_CAP(&adpt->hw, MRQ) ? rxq : adpt->qnapi[0]->rxq; } static inline struct napi_struct *alx_rxq_to_napi( @@ -756,11 +726,10 @@ static inline struct napi_struct *alx_rxq_to_napi( static bool alx_clean_rx_irq(struct alx_rx_queue *rxq, int budget) { struct sk_buff_head list; - int empty; - bool collect; + bool empty; __skb_queue_head_init(&list); - collect = alx_dispatch_skb(alx_hw_rxq(rxq)); + alx_dispatch_skb(alx_hw_rxq(rxq)); empty = alx_skb_dequeue_n(rxq, budget, &list); if (!skb_queue_empty(&list)) { struct napi_struct *napi; @@ -771,9 +740,15 @@ static bool alx_clean_rx_irq(struct alx_rx_queue *rxq, int budget) skb = __skb_dequeue(&list); napi_gro_receive(napi, skb); } + } else { + struct alx_adapter *adpt = netdev_priv(rxq->netdev); + + netif_info(adpt, rx_status, adpt->netdev, + "no packet received for this rxQ\n"); } - return collect && empty; + + return empty; } static int alx_request_msix(struct alx_adapter *adpt) @@ -826,19 +801,6 @@ static void alx_disable_msix(struct alx_adapter *adpt) ALX_FLAG_CLEAR(adpt, USING_MSIX); } -static void alx_mask_msix(struct alx_adapter *adpt, int index, bool mask) -{ - u32 reg, val; - - reg = ALX_MSIX_ENTRY_BASE + index * PCI_MSIX_ENTRY_SIZE + - PCI_MSIX_ENTRY_VECTOR_CTRL; - - val = mask ? PCI_MSIX_ENTRY_CTRL_MASKBIT : 0; - - ALX_MEM_W32(adpt, reg, val); - ALX_MEM_FLUSH(adpt); -} - static void alx_disable_msi(struct alx_adapter *adpt) { if (ALX_FLAG(adpt, USING_MSI)) { @@ -847,45 +809,92 @@ static void alx_disable_msi(struct alx_adapter *adpt) } } +static int txq_vec_mapping_shift[] = { + 0, ALX_MSI_MAP_TBL1_TXQ0_SHIFT, + 0, ALX_MSI_MAP_TBL1_TXQ1_SHIFT, + 1, ALX_MSI_MAP_TBL2_TXQ2_SHIFT, + 1, ALX_MSI_MAP_TBL2_TXQ3_SHIFT, +}; +static int rxq_vec_mapping_shift[] = { + 0, ALX_MSI_MAP_TBL1_RXQ0_SHIFT, + 0, ALX_MSI_MAP_TBL1_RXQ1_SHIFT, + 0, ALX_MSI_MAP_TBL1_RXQ2_SHIFT, + 0, ALX_MSI_MAP_TBL1_RXQ3_SHIFT, + 1, ALX_MSI_MAP_TBL2_RXQ4_SHIFT, + 1, ALX_MSI_MAP_TBL2_RXQ5_SHIFT, + 1, ALX_MSI_MAP_TBL2_RXQ6_SHIFT, + 1, ALX_MSI_MAP_TBL2_RXQ7_SHIFT, +}; +static void alx_config_vector_mapping(struct alx_adapter *adpt) +{ + struct alx_hw *hw = &adpt->hw; + u32 tbl[2]; + int vect, idx, shft; + int i; + + tbl[0] = tbl[1] = 0; + + if (ALX_FLAG(adpt, USING_MSIX)) { + for (vect = 1, i = 0; i < adpt->nr_txq; i++, vect++) { + idx = txq_vec_mapping_shift[i * 2]; + shft = txq_vec_mapping_shift[i * 2 + 1]; + tbl[idx] |= vect << shft; + } + for (vect = 1, i = 0; i < adpt->nr_rxq; i++, vect++) { + idx = rxq_vec_mapping_shift[i * 2]; + shft = rxq_vec_mapping_shift[i * 2 + 1]; + tbl[idx] |= vect << shft; + } + } + ALX_MEM_W32(hw, ALX_MSI_MAP_TBL1, tbl[0]); + ALX_MEM_W32(hw, ALX_MSI_MAP_TBL2, tbl[1]); + ALX_MEM_W32(hw, ALX_MSI_ID_MAP, 0); +} + static void alx_disable_advanced_intr(struct alx_adapter *adpt) { alx_disable_msix(adpt); alx_disable_msi(adpt); + + /* clear vector/intr-event mapping */ + alx_config_vector_mapping(adpt); } static void alx_irq_enable(struct alx_adapter *adpt) { + struct alx_hw *hw = &adpt->hw; int i; if (!atomic_dec_and_test(&adpt->irq_sem)) return; /* level-1 interrupt switch */ - ALX_MEM_W32(adpt, ALX_ISR, 0); - ALX_MEM_W32(adpt, ALX_IMR, adpt->imask); - ALX_MEM_FLUSH(adpt); + ALX_MEM_W32(hw, ALX_ISR, 0); + ALX_MEM_W32(hw, ALX_IMR, hw->imask); + ALX_MEM_FLUSH(hw); if (!ALX_FLAG(adpt, USING_MSIX)) return; /* enable all individual MSIX IRQs */ for (i = 0; i < adpt->nr_vec; i++) - alx_mask_msix(adpt, i, false); + alx_mask_msix(hw, i, false); } static void alx_irq_disable(struct alx_adapter *adpt) { + struct alx_hw *hw = &adpt->hw; int i; atomic_inc(&adpt->irq_sem); - ALX_MEM_W32(adpt, ALX_ISR, ALX_ISR_DIS); - ALX_MEM_W32(adpt, ALX_IMR, 0); - ALX_MEM_FLUSH(adpt); + ALX_MEM_W32(hw, ALX_ISR, ALX_ISR_DIS); + ALX_MEM_W32(hw, ALX_IMR, 0); + ALX_MEM_FLUSH(hw); if (ALX_FLAG(adpt, USING_MSIX)) { for (i = 0; i < adpt->nr_vec; i++) { - alx_mask_msix(adpt, i, true); + alx_mask_msix(hw, i, true); synchronize_irq(adpt->msix_ent[i].vector); } } else { @@ -896,14 +905,14 @@ static void alx_irq_disable(struct alx_adapter *adpt) static int alx_request_irq(struct alx_adapter *adpt) { struct pci_dev *pdev = adpt->pdev; + struct alx_hw *hw = &adpt->hw; int err; u32 msi_ctrl; - adpt->imask = ALX_ISR_MISC; - msi_ctrl = FIELDX(ALX_MSI_RETRANS_TM, adpt->imt >> 1); + msi_ctrl = FIELDX(ALX_MSI_RETRANS_TM, hw->imt >> 1); if (ALX_FLAG(adpt, USING_MSIX)) { - ALX_MEM_W32(adpt, ALX_MSI_RETRANS_TIMER, msi_ctrl); + ALX_MEM_W32(hw, ALX_MSI_RETRANS_TIMER, msi_ctrl); err = alx_request_msix(adpt); if (!err) goto out; @@ -916,25 +925,20 @@ static int alx_request_irq(struct alx_adapter *adpt) adpt->nr_txq = 1; adpt->nr_napi = 1; adpt->nr_vec = 1; - __alx_configure_rss(adpt); /* disable RSS */ + adpt->nr_hwrxq = 1; + alx_configure_rss(hw, false); netif_set_real_num_tx_queues(adpt->netdev, adpt->nr_txq); netif_set_real_num_rx_queues(adpt->netdev, adpt->nr_rxq); if (!pci_enable_msi(pdev)) ALX_FLAG_SET(adpt, USING_MSI); err = alx_setup_all_ring_resources(adpt); - if (err) { - dev_err(&pdev->dev, - "Unable to allocate enough memory err=%d\n", - err); + if (err) goto out; - } } - adpt->imask = ALX_ISR_MISC | ALX_ISR_TX_Q0 | ALX_ISR_RX_Q0; - if (ALX_FLAG(adpt, USING_MSI)) { - ALX_MEM_W32(adpt, ALX_MSI_RETRANS_TIMER, + ALX_MEM_W32(hw, ALX_MSI_RETRANS_TIMER, msi_ctrl | ALX_MSI_MASK_SEL_LINE); err = request_irq(pdev->irq, alx_intr_msi, 0, adpt->netdev->name, adpt); @@ -944,18 +948,30 @@ static int alx_request_irq(struct alx_adapter *adpt) alx_disable_msi(adpt); } - ALX_MEM_W32(adpt, ALX_MSI_RETRANS_TIMER, 0); + ALX_MEM_W32(hw, ALX_MSI_RETRANS_TIMER, 0); err = request_irq(pdev->irq, alx_intr_legacy, IRQF_SHARED, adpt->netdev->name, adpt); if (err) - dev_err(&pdev->dev, - "request shared irq failed, err = %d\n", - err); + netif_err(adpt, intr, adpt->netdev, + "request shared irq failed, err = %d\n", + err); out: - if (unlikely(err)) - dev_err(&pdev->dev, "register IRQ fail %d\n", err); + if (likely(!err)) { + alx_config_vector_mapping(adpt); + netif_info(adpt, intr, adpt->netdev, + "nr_rxq=%d, nr_txq=%d, nr_napi=%d, nr_vec=%d\n", + adpt->nr_rxq, adpt->nr_txq, + adpt->nr_napi, adpt->nr_vec); + netif_info(adpt, intr, adpt->netdev, + "Interrupt Mode: %s\n", + ALX_FLAG(adpt, USING_MSIX) ? "MSIX" : + ALX_FLAG(adpt, USING_MSI) ? "MSI" : "INTx"); + } else + netdev_err(adpt->netdev, + "register IRQ fail %d\n", + err); return err; } @@ -979,10 +995,18 @@ static void alx_free_irq(struct alx_adapter *adpt) static int __devinit alx_identify_hw(struct alx_adapter *adpt) { - int rev = ALX_REVID(adpt); + struct pci_dev *pdev = adpt->pdev; + struct alx_hw *hw = &adpt->hw; + int rev; int err = -EINVAL; - switch (ALX_DID(adpt)) { + hw->device_id = pdev->device; + hw->subdev_id = pdev->subsystem_device; + hw->subven_id = pdev->subsystem_vendor; + hw->revision = pdev->revision; + rev = ALX_REVID(hw); + + switch (ALX_DID(hw)) { case ALX_DEV_ID_AR8161: case ALX_DEV_ID_AR8162: case ALX_DEV_ID_AR8171: @@ -990,70 +1014,22 @@ static int __devinit alx_identify_hw(struct alx_adapter *adpt) if (rev > ALX_REV_B0) break; err = 0; - ALX_FLAG_SET(adpt, CAP_L0S); - ALX_FLAG_SET(adpt, CAP_L1); - adpt->max_dma_chnl = rev == ALX_REV_B0 ? 4 : 2; + ALX_CAP_SET(hw, L0S); + ALX_CAP_SET(hw, L1); + ALX_CAP_SET(hw, MTQ); + ALX_CAP_SET(hw, RSS); + ALX_CAP_SET(hw, MSIX); + ALX_CAP_SET(hw, SWOI); + hw->max_dma_chnl = rev == ALX_REV_B0 ? 4 : 2; break; } - if (!err && ALX_DID(adpt) & 1) { /* id-bit0: gigabit flag */ - ALX_FLAG_SET(adpt, CAP_GIGA); - } + if (!err && ALX_DID(hw) & 1) + ALX_CAP_SET(hw, GIGA); return err; } -static bool __devinit alx_get_phy_id(struct alx_adapter *adpt) -{ - /* prtad is fixed to 0 for all of chips */ - if (mdio45_probe(&adpt->mdio, 0)) - return false; - - if (alx_read_phy_reg(adpt, MII_PHYSID1, &adpt->phy_id[0]) || - alx_read_phy_reg(adpt, MII_PHYSID2, &adpt->phy_id[1])) - return false; - - return true; -} - -/* some issues are relavant to specific platforms - * we assign those patches for the chip by pci device id - * vendor id, subsystem id and revision number - */ -struct alx_platform_patch { - u16 pci_did; /* pci device id */ - u8 pci_rev; /* pci revision id */ - u16 subsystem_vid; - u16 subsystem_did; - u32 pflag; /* patch flag */ -#define ALX_PF_LINK 0x00001 /* PHY link issue */ -#define ALX_PF_HIB 0x00002 /* Hibernatation issue */ -#define ALX_PF_ANY_REV 0x10000 /* not care revision number */ -}; - -static const struct alx_platform_patch plats[] __devinitdata = { -{0x1091, 0x00, 0x1969, 0x0091, 0x1001}, -{0}, -}; - -static void __devinit alx_patch_assign(struct alx_adapter *adpt) -{ - int i = 0; - - while (plats[i].pci_did != 0) { - if (plats[i].pci_did == ALX_DID(adpt) && - plats[i].subsystem_vid == ALX_SUB_VID(adpt) && - plats[i].subsystem_did == ALX_SUB_DID(adpt) && - (plats[i].pflag & ALX_PF_ANY_REV || - plats[i].pci_rev == adpt->pdev->revision)) { - if (plats[i].pflag & ALX_PF_LINK) - adpt->lnk_patch = true; - if (plats[i].pflag & ALX_PF_HIB) - adpt->hib_patch = true; - } - i++; - } -} static const u8 def_rss_key[40] __devinitdata = { 0xE2, 0x91, 0xD7, 0x3D, 0x18, 0x05, 0xEC, 0x6C, @@ -1065,18 +1041,18 @@ static const u8 def_rss_key[40] __devinitdata = { static void alx_init_def_rss_idt(struct alx_adapter *adpt) { + struct alx_hw *hw = &adpt->hw; int i, x, y; u32 val; - for (i = 0; i < adpt->rss_idt_size; i++) { + for (i = 0; i < hw->rss_idt_size; i++) { val = ethtool_rxfh_indir_default(i, adpt->nr_rxq); x = i >> 3; y = i * 4 & 0x1F; - adpt->rss_idt[x] &= ~(0xF << y); - adpt->rss_idt[x] |= (val & 0xF) << y; + hw->rss_idt[x] &= ~(0xF << y); + hw->rss_idt[x] |= (val & 0xF) << y; } } - /* alx_init_adapter - * initialize general software structure (struct alx_adapter). * fields are inited based on PCI device information. @@ -1084,6 +1060,7 @@ static void alx_init_def_rss_idt(struct alx_adapter *adpt) static int __devinit alx_init_sw(struct alx_adapter *adpt) { struct pci_dev *pdev = adpt->pdev; + struct alx_hw *hw = &adpt->hw; int i, err; err = alx_identify_hw(adpt); @@ -1093,35 +1070,42 @@ static int __devinit alx_init_sw(struct alx_adapter *adpt) } /* assign patch flag for specific platforms */ - alx_patch_assign(adpt); - - memcpy(adpt->rss_key, def_rss_key, sizeof(def_rss_key)); - adpt->rss_idt_size = 0x100; - adpt->rss_hash_type = ALX_RSS_HASH_TYPE_ALL; - adpt->smb_timer = 400; /* trigger stats interrupt per 400ms */ - adpt->mtu = adpt->netdev->mtu; - adpt->rxbuf_size = ALIGN(ALX_RAW_MTU(adpt->mtu), 8); + alx_patch_assign(hw); + + memcpy(hw->rss_key, def_rss_key, sizeof(def_rss_key)); + hw->rss_idt_size = 0x100; + hw->rss_hash_type = ALX_RSS_HASH_TYPE_ALL; + hw->smb_timer = 400; + hw->mtu = adpt->netdev->mtu; + adpt->rxbuf_size = ALIGN(ALX_RAW_MTU(hw->mtu), 8); adpt->tx_ringsz = 256; adpt->rx_ringsz = 512; - adpt->sleep_ctrl = ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_WOL_PHY; - adpt->imt = 200; /* 200us */ - adpt->dma_chnl = adpt->max_dma_chnl; - adpt->link_up = false; /* PHY init status */ - adpt->link_duplex = 0; - adpt->link_speed = SPEED_0; - adpt->adv_cfg = ADVERTISED_Autoneg | + hw->sleep_ctrl = ALX_SLEEP_WOL_MAGIC | ALX_SLEEP_WOL_PHY; + hw->imt = 200; + hw->imask = ALX_ISR_MISC; + hw->dma_chnl = hw->max_dma_chnl; + hw->ith_tpd = adpt->tx_ringsz / 3; + hw->link_up = false; + hw->link_duplex = 0; + hw->link_speed = SPEED_0; + hw->adv_cfg = ADVERTISED_Autoneg | ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | ADVERTISED_100baseT_Full | ADVERTISED_10baseT_Half | ADVERTISED_1000baseT_Full; - adpt->flowctrl = ALX_FC_ANEG | ALX_FC_RX | ALX_FC_TX; - adpt->wrr_ctrl = ALX_WRR_PRI_RESTRICT_NONE; - for (i = 0; i < ARRAY_SIZE(adpt->wrr); i++) - adpt->wrr[i] = 4; + hw->flowctrl = ALX_FC_ANEG | ALX_FC_RX | ALX_FC_TX; + hw->wrr_ctrl = ALX_WRR_PRI_RESTRICT_NONE; + for (i = 0; i < ARRAY_SIZE(hw->wrr); i++) + hw->wrr[i] = 4; - adpt->rx_ctrl = ALX_MAC_CTRL_WOLSPED_SWEN | + hw->rx_ctrl = ALX_MAC_CTRL_WOLSPED_SWEN | ALX_MAC_CTRL_MHASH_ALG_HI5B | + ALX_MAC_CTRL_BRD_EN | + ALX_MAC_CTRL_PCRCE | + ALX_MAC_CTRL_CRCE | + ALX_MAC_CTRL_RXFC_EN | + ALX_MAC_CTRL_TXFC_EN | FIELDX(ALX_MAC_CTRL_PRMBLEN, 7); atomic_set(&adpt->irq_sem, 1); @@ -1130,6 +1114,19 @@ static int __devinit alx_init_sw(struct alx_adapter *adpt) return err; } + +static void alx_set_vlan_mode(struct alx_hw *hw, + netdev_features_t features) +{ + if (features & NETIF_F_HW_VLAN_RX) + hw->rx_ctrl |= ALX_MAC_CTRL_VLANSTRIP; + else + hw->rx_ctrl &= ~ALX_MAC_CTRL_VLANSTRIP; + + ALX_MEM_W32(hw, ALX_MAC_CTRL, hw->rx_ctrl); +} + + static netdev_features_t alx_fix_features(struct net_device *netdev, netdev_features_t features) { @@ -1158,12 +1155,7 @@ static int alx_set_features(struct net_device *netdev, if (!(changed & NETIF_F_HW_VLAN_RX)) return 0; - if (features & NETIF_F_HW_VLAN_RX) - adpt->rx_ctrl |= ALX_MAC_CTRL_VLANSTRIP; - else - adpt->rx_ctrl &= ~ALX_MAC_CTRL_VLANSTRIP; - - ALX_MEM_W32(adpt, ALX_MAC_CTRL, adpt->rx_ctrl); + alx_set_vlan_mode(&adpt->hw, features); return 0; } @@ -1177,15 +1169,18 @@ static int alx_change_mtu(struct net_device *netdev, int new_mtu) if ((max_frame < ALX_MIN_FRAME_SIZE) || (max_frame > ALX_MAX_FRAME_SIZE)) { - netdev_err(netdev, "invalid MTU setting\n"); + netif_err(adpt, hw, netdev, + "invalid MTU setting (%x)\n", + new_mtu); return -EINVAL; } /* set MTU */ if (old_mtu != new_mtu && netif_running(netdev)) { - netdev_info(adpt->netdev, + netif_info(adpt, drv, adpt->netdev, "changing MTU from %d to %d\n", netdev->mtu, new_mtu); netdev->mtu = new_mtu; + adpt->hw.mtu = new_mtu; adpt->rxbuf_size = new_mtu > ALX_DEF_RXBUF_SIZE ? ALIGN(max_frame, 8) : ALX_DEF_RXBUF_SIZE; netdev_update_features(netdev); @@ -1201,131 +1196,38 @@ static int alx_change_mtu(struct net_device *netdev, int new_mtu) */ static void alx_configure(struct alx_adapter *adpt) { - u32 val, raw_mtu, max_payload; - u16 val16; - u8 chip_rev = ALX_REVID(adpt); - - /* mac address */ - alx_set_macaddr(adpt, adpt->mac_addr); + struct alx_hw *hw = &adpt->hw; -#if 0 - /* clear WoL setting/status */ - ALX_MEM_R32(hw, ALX_WOL0, &val); - ALX_MEM_W32(hw, ALX_WOL0, 0); -#endif - /* clk gating */ - ALX_MEM_W32(adpt, ALX_CLK_GATE, ALX_CLK_GATE_ALL_A0); - - /* idle timeout to switch clk_125M */ - if (chip_rev == ALX_REV_B0) { - ALX_MEM_W32(adpt, ALX_IDLE_DECISN_TIMER, - ALX_IDLE_DECISN_TIMER_DEF); - } - - /* stats refresh timeout */ - ALX_MEM_W32(adpt, ALX_SMB_TIMER, adpt->smb_timer * 500UL); - - /* intr moduration */ - ALX_MEM_R32(adpt, ALX_MASTER, &val); - val = val | ALX_MASTER_IRQMOD2_EN | - ALX_MASTER_IRQMOD1_EN | - ALX_MASTER_SYSALVTIMER_EN; /* sysalive */ - ALX_MEM_W32(adpt, ALX_MASTER, val); - ALX_MEM_W32(adpt, ALX_IRQ_MODU_TIMER, - FIELDX(ALX_IRQ_MODU_TIMER1, adpt->imt >> 1)); - /* intr re-trig timeout */ - ALX_MEM_W32(adpt, ALX_INT_RETRIG, ALX_INT_RETRIG_TO); - /* tpd threshold to trig int */ - ALX_MEM_W32(adpt, ALX_TINT_TPD_THRSHLD, adpt->tx_ringsz / 3); - ALX_MEM_W32(adpt, ALX_TINT_TIMER, adpt->imt); - - /* mtu */ - raw_mtu = adpt->mtu + ETH_HLEN; - ALX_MEM_W32(adpt, ALX_MTU, raw_mtu + 8); /* crc + vlan */ - if (raw_mtu > ALX_MTU_JUMBO_TH) - adpt->rx_ctrl &= ~ALX_MAC_CTRL_FAST_PAUSE; - - /* txq */ - if ((raw_mtu + 8) < ALX_TXQ1_JUMBO_TSO_TH) - val = (raw_mtu + 8 + 7) >> 3; /* 7 for QWORD align */ - else - val = ALX_TXQ1_JUMBO_TSO_TH >> 3; - ALX_MEM_W32(adpt, ALX_TXQ1, val | ALX_TXQ1_ERRLGPKT_DROP_EN); - max_payload = pcie_get_readrq(adpt->pdev) >> 8; - /* - * if BIOS had changed the default dma read max length, - * restore it to default value - */ - if (max_payload < ALX_DEV_CTRL_MAXRRS_MIN) - pcie_set_readrq(adpt->pdev, 128 << ALX_DEV_CTRL_MAXRRS_MIN); - - val = FIELDX(ALX_TXQ0_TPD_BURSTPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | - ALX_TXQ0_MODE_ENHANCE | - ALX_TXQ0_LSO_8023_EN | - ALX_TXQ0_SUPT_IPOPT | - FIELDX(ALX_TXQ0_TXF_BURST_PREF, ALX_TXQ_TXF_BURST_PREF_DEF); - ALX_MEM_W32(adpt, ALX_TXQ0, val); - val = FIELDX(ALX_HQTPD_Q1_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | - FIELDX(ALX_HQTPD_Q2_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | - FIELDX(ALX_HQTPD_Q3_NUMPREF, ALX_TXQ_TPD_BURSTPREF_DEF) | - ALX_HQTPD_BURST_EN; - ALX_MEM_W32(adpt, ALX_HQTPD, val); - - /* rxq, flow control */ - ALX_MEM_R32(adpt, ALX_SRAM5, &val); - val = FIELD_GETX(val, ALX_SRAM_RXF_LEN) << 3; /* bytes */ - if (val > ALX_SRAM_RXF_LEN_8K) { - val16 = ALX_MTU_STD_ALGN >> 3; - val = (val - ALX_RXQ2_RXF_FLOW_CTRL_RSVD) >> 3; - } else { - val16 = ALX_MTU_STD_ALGN >> 3; - val = (val - ALX_MTU_STD_ALGN) >> 3; - } - ALX_MEM_W32(adpt, ALX_RXQ2, - FIELDX(ALX_RXQ2_RXF_XOFF_THRESH, val16) | - FIELDX(ALX_RXQ2_RXF_XON_THRESH, val)); - val = FIELDX(ALX_RXQ0_NUM_RFD_PREF, ALX_RXQ0_NUM_RFD_PREF_DEF) | - FIELDX(ALX_RXQ0_RSS_MODE, ALX_RXQ0_RSS_MODE_DIS) | - FIELDX(ALX_RXQ0_IDT_TBL_SIZE, ALX_RXQ0_IDT_TBL_SIZE_DEF) | - ALX_RXQ0_RSS_HSTYP_ALL | - ALX_RXQ0_RSS_HASH_EN | - ALX_RXQ0_IPV6_PARSE_EN; - if (ALX_FLAG(adpt, CAP_GIGA)) { - FIELD_SET32(val, ALX_RXQ0_ASPM_THRESH, - ALX_RXQ0_ASPM_THRESH_100M); - } - ALX_MEM_W32(adpt, ALX_RXQ0, val); - - /* DMA */ - ALX_MEM_R32(adpt, ALX_DMA, &val); - val = FIELDX(ALX_DMA_RORDER_MODE, ALX_DMA_RORDER_MODE_OUT) | - ALX_DMA_RREQ_PRI_DATA | - FIELDX(ALX_DMA_RREQ_BLEN, max_payload) | - FIELDX(ALX_DMA_WDLY_CNT, ALX_DMA_WDLY_CNT_DEF) | - FIELDX(ALX_DMA_RDLY_CNT, ALX_DMA_RDLY_CNT_DEF) | - FIELDX(ALX_DMA_RCHNL_SEL, adpt->dma_chnl - 1); - ALX_MEM_W32(adpt, ALX_DMA, val); - - /* multi-tx-q weight */ - if (ALX_FLAG(adpt, CAP_MTQ)) { - val = FIELDX(ALX_WRR_PRI, adpt->wrr_ctrl) | - FIELDX(ALX_WRR_PRI0, adpt->wrr[0]) | - FIELDX(ALX_WRR_PRI1, adpt->wrr[1]) | - FIELDX(ALX_WRR_PRI2, adpt->wrr[2]) | - FIELDX(ALX_WRR_PRI3, adpt->wrr[3]); - ALX_MEM_W32(adpt, ALX_WRR, val); - } - - /* multi-rx-q */ - __alx_configure_rss(adpt); - - /* rx mode */ + alx_configure_basic(hw); + alx_configure_rss(hw, adpt->nr_rxq > 1); __alx_set_rx_mode(adpt->netdev); + alx_set_vlan_mode(hw, adpt->netdev->features); +} + +static void alx_netif_stop(struct alx_adapter *adpt) +{ + int i; + + adpt->netdev->trans_start = jiffies; + netif_carrier_off(adpt->netdev); + netif_tx_disable(adpt->netdev); + for (i = 0; i < adpt->nr_napi; i++) + napi_disable(&adpt->qnapi[i]->napi); +} + +static void alx_netif_start(struct alx_adapter *adpt) +{ + int i; + + netif_tx_wake_all_queues(adpt->netdev); + for (i = 0; i < adpt->nr_napi; i++) + napi_enable(&adpt->qnapi[i]->napi); + netif_carrier_on(adpt->netdev); } static int __alx_open(struct alx_adapter *adpt) { - int i, err; + int err; netif_carrier_off(adpt->netdev); @@ -1343,11 +1245,8 @@ static int __alx_open(struct alx_adapter *adpt) ALX_FLAG_CLEAR(adpt, HALT); - for (i = 0; i < adpt->nr_napi; i++) - napi_enable(&(adpt->qnapi[i]->napi)); - /* clear old interrupts */ - ALX_MEM_W32(adpt, ALX_ISR, (u32)~ALX_ISR_DIS); + ALX_MEM_W32(&adpt->hw, ALX_ISR, (u32)~ALX_ISR_DIS); alx_irq_enable(adpt); @@ -1366,50 +1265,31 @@ err_out: static void alx_halt(struct alx_adapter *adpt) { - struct net_device *netdev = adpt->netdev; - int i; + struct alx_hw *hw = &adpt->hw; ALX_FLAG_SET(adpt, HALT); - alx_cancel_work(adpt); - /* stop TX/RX */ - alx_stop_mac(adpt); - /* disable L0S/L1 */ - alx_enable_aspm(adpt, false, false); - - netif_carrier_off(netdev); - for (i = 0; i < adpt->nr_napi; i++) - napi_disable(&(adpt->qnapi[i]->napi)); - - netif_tx_disable(netdev); + alx_netif_stop(adpt); + alx_reset_mac(hw); + /* disable l0s/l1 */ + alx_enable_aspm(hw, false, false); alx_irq_disable(adpt); - alx_free_all_rings_buf(adpt); } static void alx_activate(struct alx_adapter *adpt) { - int i; - - for (i = 0; i < adpt->nr_rxq; i++) - alx_alloc_rxring_buf(adpt, adpt->qnapi[i]->rxq); - /* hardware setting lost, restore it */ + alx_reinit_rings(adpt); alx_configure(adpt); ALX_FLAG_CLEAR(adpt, HALT); - - for (i = 0; i < adpt->nr_napi; i++) - napi_enable(&(adpt->qnapi[i]->napi)); - /* clear old interrupts */ - ALX_MEM_W32(adpt, ALX_ISR, (u32)~ALX_ISR_DIS); + ALX_MEM_W32(&adpt->hw, ALX_ISR, (u32)~ALX_ISR_DIS); alx_irq_enable(adpt); - netif_tx_wake_all_queues(adpt->netdev); - ALX_FLAG_SET(adpt, TASK_CHK_LINK); alx_schedule_work(adpt); } @@ -1435,16 +1315,17 @@ static bool alx_enable_msix(struct alx_adapter *adpt) vec_req = max_t(int, nr_txq, nr_rxq) + 1; if (vec_req <= 2) { - netdev_info(adpt->netdev, - "cpu core num is less, MSI-X isn't necessary\n"); - return false; /* try msi */ + netif_info(adpt, intr, adpt->netdev, + "cpu core num is less, MSI-X isn't necessary\n"); + return false; } adpt->msix_ent = kcalloc(vec_req, sizeof(struct msix_entry), GFP_KERNEL); if (!adpt->msix_ent) { - netdev_info(adpt->netdev, "can't alloc msix entries\n"); + netif_warn(adpt, intr, adpt->netdev, + "can't alloc msix entries\n"); return false; } for (i = 0; i < vec_req; i++) @@ -1454,7 +1335,8 @@ static bool alx_enable_msix(struct alx_adapter *adpt) if (err) { kfree(adpt->msix_ent); adpt->msix_ent = NULL; - netdev_info(adpt->netdev, "can't enable MSI-X interrupt\n"); + netif_warn(adpt, intr, adpt->netdev, + "can't enable MSI-X interrupt\n"); return false; } @@ -1462,31 +1344,38 @@ static bool alx_enable_msix(struct alx_adapter *adpt) adpt->nr_rxq = nr_rxq; adpt->nr_vec = vec_req; adpt->nr_napi = vec_req - 1; + adpt->nr_hwrxq = ALX_CAP(&adpt->hw, MRQ) ? adpt->nr_rxq : 1; return true; } static void alx_init_intr(struct alx_adapter *adpt) { - if ((ALX_FLAG(adpt, CAP_MTQ) || ALX_FLAG(adpt, CAP_RSS)) && - ALX_FLAG(adpt, CAP_MSIX)) { + struct alx_hw *hw = &adpt->hw; + + if ((ALX_CAP(hw, MTQ) || ALX_CAP(hw, RSS)) && ALX_CAP(hw, MSIX)) { if (alx_enable_msix(adpt)) ALX_FLAG_SET(adpt, USING_MSIX); } if (!ALX_FLAG(adpt, USING_MSIX)) { - adpt->nr_txq = ALX_FLAG(adpt, CAP_MTQ) ? - ALX_MAX_TX_QUEUES : 1; + adpt->nr_txq = ALX_CAP(hw, MTQ) ? ALX_MAX_TX_QUEUES : 1; adpt->nr_rxq = 1; adpt->nr_napi = 1; adpt->nr_vec = 1; + adpt->nr_hwrxq = 1; + + if (!pci_enable_msi(adpt->pdev)) + ALX_FLAG_SET(adpt, USING_MSI); } netif_set_real_num_tx_queues(adpt->netdev, adpt->nr_txq); netif_set_real_num_rx_queues(adpt->netdev, adpt->nr_rxq); + } static void alx_init_ring_ptrs(struct alx_adapter *adpt) { + struct alx_hw *hw = &adpt->hw; struct alx_napi *np; int i, tx_idx, rx_idx; u32 addr_hi; @@ -1503,10 +1392,10 @@ static void alx_init_ring_ptrs(struct alx_adapter *adpt) np->rxq->pidx = 0; np->rxq->cidx = 0; np->rxq->rrd_cidx = 0; - if (!ALX_FLAG(adpt, CAP_MRQ) && rx_idx == 0) { - ALX_MEM_W32(adpt, rfdring_header_reg[0], + if (!ALX_CAP(hw, MRQ) && rx_idx == 0) { + ALX_MEM_W32(hw, rfdring_header_reg[0], np->rxq->rfd_dma); - ALX_MEM_W32(adpt, rrdring_header_reg[0], + ALX_MEM_W32(hw, rrdring_header_reg[0], np->rxq->rrd_dma); } rx_idx++; @@ -1514,24 +1403,25 @@ static void alx_init_ring_ptrs(struct alx_adapter *adpt) if (np->txq) { np->txq->pidx = 0; atomic_set(&np->txq->cidx, 0); - ALX_MEM_W32(adpt, txring_header_reg[tx_idx], + ALX_MEM_W32(hw, txring_header_reg[tx_idx], np->txq->tpd_dma); tx_idx++; } } addr_hi = ((u64)adpt->ring_header.dma) >> 32; - ALX_MEM_W32(adpt, ALX_TX_BASE_ADDR_HI, addr_hi); - ALX_MEM_W32(adpt, ALX_RX_BASE_ADDR_HI, addr_hi); - ALX_MEM_W32(adpt, ALX_TPD_RING_SZ, adpt->tx_ringsz); - ALX_MEM_W32(adpt, ALX_RRD_RING_SZ, adpt->rx_ringsz); - ALX_MEM_W32(adpt, ALX_RFD_RING_SZ, adpt->rx_ringsz); + ALX_MEM_W32(hw, ALX_TX_BASE_ADDR_HI, addr_hi); + ALX_MEM_W32(hw, ALX_RX_BASE_ADDR_HI, addr_hi); + ALX_MEM_W32(hw, ALX_TPD_RING_SZ, adpt->tx_ringsz); + ALX_MEM_W32(hw, ALX_RRD_RING_SZ, adpt->rx_ringsz); + ALX_MEM_W32(hw, ALX_RFD_RING_SZ, adpt->rx_ringsz); + ALX_MEM_W32(hw, ALX_RFD_BUF_SZ, adpt->rxbuf_size); /* load these ptrs into chip internal */ - ALX_MEM_W32(adpt, ALX_SRAM9, ALX_SRAM_LOAD_PTR); + ALX_MEM_W32(hw, ALX_SRAM9, ALX_SRAM_LOAD_PTR); } -static void alx_show_speed(struct net_device *dev, u16 speed) +static void alx_show_speed(struct alx_adapter *adpt, u16 speed) { char *desc; @@ -1546,70 +1436,115 @@ static void alx_show_speed(struct net_device *dev, u16 speed) speed == SPEED_10 + HALF_DUPLEX ? "10 Mbps Duplex Half" : "Unknown speed"; - netdev_info(dev, "NIC Link Up: %s\n", desc); + netif_info(adpt, link, adpt->netdev, + "NIC Link Up: %s\n", + desc); +} + +static int alx_reinit_rings(struct alx_adapter *adpt) +{ + int i, err = 0; + + alx_free_all_rings_buf(adpt); + + /* set rings' header to HW register */ + alx_init_ring_ptrs(adpt); + + /* alloc hw-rxing buf */ + for (i = 0; i < adpt->nr_hwrxq; i++) { + int count; + + count = alx_alloc_rxring_buf(adpt, adpt->qnapi[i]->rxq); + if (unlikely(!count)) { + err = -ENOMEM; + break; + } + } + + return err; } + + static void alx_check_link(struct alx_adapter *adpt) { + struct alx_hw *hw = &adpt->hw; u16 speed, old_speed; - bool link_up; - int i, err; + bool link_up, old_link_up; + int err; if (ALX_FLAG(adpt, HALT)) return; - err = alx_get_phy_link(adpt, &link_up, &speed); + /* clear PHY internal interrupt status, + * otherwise the Main interrupt status will be asserted + * for ever. + */ + alx_clear_phy_intr(hw); + + err = alx_get_phy_link(hw, &link_up, &speed); if (err) goto out; /* open interrutp mask */ - adpt->imask |= ALX_ISR_PHY; - ALX_MEM_W32(adpt, ALX_IMR, adpt->imask); + hw->imask |= ALX_ISR_PHY; + ALX_MEM_W32(hw, ALX_IMR, hw->imask); - if (!link_up && !adpt->link_up) + if (!link_up && !hw->link_up) goto out; - old_speed = adpt->link_speed + adpt->link_duplex; + old_speed = hw->link_speed + hw->link_duplex; + old_link_up = hw->link_up; if (link_up) { - if (adpt->link_up && old_speed == speed) - goto out; /* same speed */ - - alx_show_speed(adpt->netdev, speed); - adpt->link_duplex = speed % 10; - adpt->link_speed = speed - adpt->link_duplex; - adpt->link_up = true; - alx_post_phy_link(adpt, adpt->link_speed, - ALX_FLAG(adpt, CAP_AZ)); - - alx_enable_aspm(adpt, ALX_FLAG(adpt, CAP_L0S), - ALX_FLAG(adpt, CAP_L1)); - alx_start_mac(adpt); + /* same speed ? */ + if (old_link_up && old_speed == speed) + goto out; + + alx_show_speed(adpt, speed); + hw->link_duplex = speed % 10; + hw->link_speed = speed - hw->link_duplex; + hw->link_up = true; + alx_post_phy_link(hw, hw->link_speed, ALX_CAP(hw, AZ)); + alx_enable_aspm(hw, ALX_CAP(hw, L0S), ALX_CAP(hw, L1)); + alx_start_mac(hw); + /* link kept, just speed changed */ - if (adpt->link_up) + if (old_link_up) goto out; /* link changed from 'down' to 'up' */ - netif_tx_wake_all_queues(adpt->netdev); - netif_carrier_on(adpt->netdev); + alx_netif_start(adpt); goto out; } /* link changed from 'up' to 'down' */ - netif_carrier_off(adpt->netdev); - adpt->link_up = false; - adpt->link_speed = SPEED_0; - netdev_info(adpt->netdev, "NIC Link Down\n"); - - alx_stop_mac(adpt); - alx_enable_aspm(adpt, false, ALX_FLAG(adpt, CAP_L1)); - alx_post_phy_link(adpt, SPEED_0, ALX_FLAG(adpt, CAP_AZ)); + alx_netif_stop(adpt); + hw->link_up = false; + hw->link_speed = SPEED_0; + netif_info(adpt, link, adpt->netdev, "NIC Link Down\n"); + err = alx_reset_mac(hw); + if (err) { + netif_err(adpt, hw, adpt->netdev, + "linkdown:reset_mac fail %d\n", err); + err = -EIO; + goto out; + } + alx_irq_disable(adpt); - /* free any pending tx skbs */ - netif_tx_disable(adpt->netdev); - for (i = 0; i < adpt->nr_txq; i++) - alx_free_txring_buf(adpt->qnapi[i]->txq); + /* reset-mac cause all settings on HW lost, + * following steps restore all of them and + * refresh whole RX/TX rings + */ + err = alx_reinit_rings(adpt); + if (err) + goto out; + alx_configure(adpt); + alx_enable_aspm(hw, false, ALX_CAP(hw, L1)); + alx_post_phy_link(hw, SPEED_0, ALX_CAP(hw, AZ)); + alx_irq_enable(adpt); out: + if (err) { ALX_FLAG_SET(adpt, TASK_RESET); alx_schedule_work(adpt); @@ -1622,6 +1557,10 @@ static int alx_open(struct net_device *netdev) struct alx_adapter *adpt = netdev_priv(netdev); int err; + /* during diag running, disallow open */ + if (ALX_FLAG(adpt, TESTING)) + return -EBUSY; + /* decide interrupt mode, some resources allocation depend on it */ alx_init_intr(adpt); @@ -1640,80 +1579,18 @@ static int alx_stop(struct net_device *netdev) WARN_ON(ALX_FLAG(adpt, RESETING)); + netif_info(adpt, ifdown, adpt->netdev, "alx_stop\n"); + __alx_stop(adpt); return 0; } -static int alx_select_powersaving_speed(struct alx_adapter *adpt, u16 *speed) -{ - int i, err; - u16 spd, lpa; - bool linkup; - - err = alx_get_phy_link(adpt, &linkup, &spd); - if (err) - goto out; - - if (!linkup) { - *speed = SPEED_0; - goto out; - } - - err = alx_read_phy_reg(adpt, MII_LPA, &lpa); - if (err) - goto out; - - if (!(lpa & LPA_LPACK)) { /* force mode */ - *speed = spd; - goto out; - } - if (lpa & LPA_100FULL) - *speed = SPEED_100 + FULL_DUPLEX; - else if (lpa & LPA_100HALF) - *speed = SPEED_100 + HALF_DUPLEX; - else if (lpa & LPA_10FULL) - *speed = SPEED_10 + FULL_DUPLEX; - else - *speed = SPEED_10 + HALF_DUPLEX; - - if (*speed != spd) { /* restart PHY link phase */ - - err = alx_setup_speed_duplex(adpt, - ALX_SPEED_TO_ETHADV(*speed) | ADVERTISED_Autoneg, - ALX_FC_ANEG | ALX_FC_RX | ALX_FC_TX); - if (err) - goto out; - - /* wait for linkup */ - for (i = 0; i < ALX_MAX_SETUP_LNK_CYCLE; i++) { - u16 speed2; - bool link_on; - - msleep(100); - err = alx_get_phy_link(adpt, &link_on, &speed2); - if (err) - goto out; - if (link_on) - break; - } - if (i == ALX_MAX_SETUP_LNK_CYCLE) { - netdev_err(adpt->netdev, - "config PHY speed/duplex failed,err=%d\n", - err); - err = -EIO; - goto out; - } - } - -out: - return err; -} - static int __alx_shutdown(struct pci_dev *pdev, bool *wol_en) { struct alx_adapter *adpt = pci_get_drvdata(pdev); struct net_device *netdev = adpt->netdev; + struct alx_hw *hw = &adpt->hw; int err; u16 speed; @@ -1727,18 +1604,18 @@ static int __alx_shutdown(struct pci_dev *pdev, bool *wol_en) goto out; #endif - err = alx_select_powersaving_speed(adpt, &speed); + err = alx_select_powersaving_speed(hw, &speed); if (!err) - err = alx_clear_phy_intr(adpt); + err = alx_clear_phy_intr(hw); if (!err) - err = alx_config_wol(adpt); + err = alx_config_wol(hw); if (!err) - err = alx_pre_suspend(adpt, speed); + err = alx_pre_suspend(hw, speed); if (err) goto out; *wol_en = false; - if (adpt->sleep_ctrl & ALX_SLEEP_ACTIVE) { + if (hw->sleep_ctrl & ALX_SLEEP_ACTIVE) { device_set_wakeup_enable(&pdev->dev, true); *wol_en = true; } @@ -1746,6 +1623,13 @@ static int __alx_shutdown(struct pci_dev *pdev, bool *wol_en) pci_disable_device(pdev); out: + if (unlikely(err)) { + netif_info(adpt, hw, netdev, + "shutown err(%x)\n", + err); + err = -EIO; + } + return err; } @@ -1774,6 +1658,7 @@ static int alx_suspend(struct device *dev) err = __alx_shutdown(pdev, &wol_en); if (unlikely(err)) { dev_err(&pdev->dev, "shutdown fail in suspend %d\n", err); + err = -EIO; goto out; } if (wol_en) { @@ -1792,6 +1677,7 @@ static int alx_resume(struct device *dev) struct pci_dev *pdev = to_pci_dev(dev); struct alx_adapter *adpt = pci_get_drvdata(pdev); struct net_device *netdev = adpt->netdev; + struct alx_hw *hw = &adpt->hw; int err; if (!netif_running(netdev)) @@ -1804,22 +1690,24 @@ static int alx_resume(struct device *dev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); - adpt->link_up = false; - adpt->link_speed = SPEED_0; + hw->link_up = false; + hw->link_speed = SPEED_0; - alx_reset_pcie(adpt); - alx_reset_phy(adpt, !adpt->hib_patch); - err = alx_reset_mac(adpt); + alx_reset_pcie(hw); + alx_reset_phy(hw, !hw->hib_patch); + err = alx_reset_mac(hw); if (err) { - dev_err(&pdev->dev, "resume:reset_mac fail %d\n", err); - return err; + netif_err(adpt, hw, adpt->netdev, + "resume:reset_mac fail %d\n", + err); + return -EIO; } - err = alx_setup_speed_duplex(adpt, adpt->adv_cfg, adpt->flowctrl); + err = alx_setup_speed_duplex(hw, hw->adv_cfg, hw->flowctrl); if (err) { - dev_err(&pdev->dev , - "resume:setup_speed_duplex fail %d\n", - err); - return err; + netif_err(adpt, hw, adpt->netdev, + "resume:setup_speed_duplex fail %d\n", + err); + return -EIO; } if (netif_running(netdev)) { @@ -1839,30 +1727,10 @@ static int alx_resume(struct device *dev) /* alx_update_hw_stats - Update the board statistics counters. */ static void alx_update_hw_stats(struct alx_adapter *adpt) { - u16 reg; - u32 data; - unsigned long *p; - if (ALX_FLAG(adpt, HALT) || ALX_FLAG(adpt, RESETING)) return; - /* RX stats */ - reg = ALX_RX_STATS_BIN; - p = &adpt->hw_stats.rx_ok; - while (reg <= ALX_RX_STATS_END) { - ALX_MEM_R32(adpt, reg, &data); - *p++ += data; - reg += 4; - } - - /* TX stats */ - reg = ALX_TX_STATS_BIN; - p = &adpt->hw_stats.tx_ok; - while (reg <= ALX_TX_STATS_END) { - ALX_MEM_R32(adpt, reg, &data); - *p++ += data; - reg += 4; - } + __alx_update_hw_stats(&adpt->hw); } /* alx_get_stats - Get System Network Statistics @@ -1874,7 +1742,7 @@ static struct net_device_stats *alx_get_stats(struct net_device *netdev) { struct alx_adapter *adpt = netdev_priv(netdev); struct net_device_stats *net_stats = &netdev->stats; - struct alx_hw_stats *hw_stats = &adpt->hw_stats; + struct alx_hw_stats *hw_stats = &adpt->hw.stats; spin_lock(&adpt->smb_lock); @@ -1924,7 +1792,7 @@ void alx_reinit(struct alx_adapter *adpt) { WARN_ON(in_interrupt()); - while (test_and_set_bit(ALX_FLAG_RESETING, adpt->flags)) + while (test_and_set_bit(ALX_FLAG_RESETING, &adpt->flags)) msleep(20); if (ALX_FLAG(adpt, HALT)) @@ -1942,19 +1810,22 @@ static void alx_task(struct work_struct *work) struct alx_adapter *adpt = container_of(work, struct alx_adapter, task); /* don't support reentrance */ - while (test_and_set_bit(ALX_FLAG_TASK_PENDING, adpt->flags)) + while (test_and_set_bit(ALX_FLAG_TASK_PENDING, &adpt->flags)) msleep(20); if (ALX_FLAG(adpt, HALT)) goto out; - if (!test_and_clear_bit(ALX_FLAG_TASK_RESET, adpt->flags)) + if (test_and_clear_bit(ALX_FLAG_TASK_RESET, &adpt->flags)) { + netif_info(adpt, hw, adpt->netdev, + "task:alx_reinit\n"); alx_reinit(adpt); + } - if (!test_and_clear_bit(ALX_FLAG_TASK_UPDATE_SMB, adpt->flags)) + if (test_and_clear_bit(ALX_FLAG_TASK_UPDATE_SMB, &adpt->flags)) alx_update_stats(adpt); - if (!test_and_clear_bit(ALX_FLAG_TASK_CHK_LINK, adpt->flags)) + if (test_and_clear_bit(ALX_FLAG_TASK_CHK_LINK, &adpt->flags)) alx_check_link(adpt); out: @@ -1966,25 +1837,26 @@ static irqreturn_t alx_msix_ring(int irq, void *data) { struct alx_napi *np = data; struct alx_adapter *adpt = np->adpt; - u32 intr; + struct alx_hw *hw = &adpt->hw; /* mask interrupt to ACK chip */ - alx_mask_msix(adpt, np->vec_idx, true); - ALX_MEM_R32(adpt, ALX_ISR, &intr); - intr &= ~np->vec_mask; + alx_mask_msix(hw, np->vec_idx, true); + /* clear interrutp status */ + ALX_MEM_W32(hw, ALX_ISR, np->vec_mask); if (!ALX_FLAG(adpt, HALT)) napi_schedule(&np->napi); - /* clear interrutp status */ - ALX_MEM_W32(adpt, ALX_ISR, intr); - return IRQ_HANDLED; } static inline bool alx_handle_intr_misc(struct alx_adapter *adpt, u32 intr) { + struct alx_hw *hw = &adpt->hw; + if (unlikely(intr & ALX_ISR_FATAL)) { + netif_info(adpt, hw, adpt->netdev, + "intr-fatal:%08X\n", intr); ALX_FLAG_SET(adpt, TASK_RESET); alx_schedule_work(adpt); return true; @@ -2003,8 +1875,8 @@ static inline bool alx_handle_intr_misc(struct alx_adapter *adpt, u32 intr) * is from PHY internal. only the internal status * is cleared, the interrupt status could be cleared. */ - adpt->imask &= ~ALX_ISR_PHY; - ALX_MEM_W32(adpt, ALX_IMR, adpt->imask); + hw->imask &= ~ALX_ISR_PHY; + ALX_MEM_W32(hw, ALX_IMR, hw->imask); ALX_FLAG_SET(adpt, TASK_CHK_LINK); alx_schedule_work(adpt); } @@ -2015,33 +1887,39 @@ static inline bool alx_handle_intr_misc(struct alx_adapter *adpt, u32 intr) static irqreturn_t alx_intr_msix_misc(int irq, void *data) { struct alx_adapter *adpt = data; + struct alx_hw *hw = &adpt->hw; u32 intr; /* mask interrupt to ACK chip */ - alx_mask_msix(adpt, 0, true); + alx_mask_msix(hw, 0, true); /* read interrupt status */ - ALX_MEM_R32(adpt, ALX_ISR, &intr); - intr &= (adpt->imask & ~ALX_ISR_ALL_QUEUES); + ALX_MEM_R32(hw, ALX_ISR, &intr); + intr &= (hw->imask & ~ALX_ISR_ALL_QUEUES); if (alx_handle_intr_misc(adpt, intr)) return IRQ_HANDLED; /* clear interrupt status */ - ALX_MEM_W32(adpt, ALX_ISR, intr); + ALX_MEM_W32(hw, ALX_ISR, intr); /* enable interrupt again */ if (!ALX_FLAG(adpt, HALT)) - alx_mask_msix(adpt, 0, false); + alx_mask_msix(hw, 0, false); return IRQ_HANDLED; } static inline irqreturn_t alx_intr_1(struct alx_adapter *adpt, u32 intr) { + struct alx_hw *hw = &adpt->hw; + /* ACK interrupt */ - ALX_MEM_W32(adpt, ALX_ISR, ALX_ISR_DIS); - intr &= adpt->imask; + netif_info(adpt, intr, adpt->netdev, + "ACK interrupt: 0x%lx\n", + intr | ALX_ISR_DIS); + ALX_MEM_W32(hw, ALX_ISR, intr | ALX_ISR_DIS); + intr &= hw->imask; if (alx_handle_intr_misc(adpt, intr)) return IRQ_HANDLED; @@ -2049,11 +1927,11 @@ static inline irqreturn_t alx_intr_1(struct alx_adapter *adpt, u32 intr) if (intr & (ALX_ISR_TX_Q0 | ALX_ISR_RX_Q0)) { napi_schedule(&adpt->qnapi[0]->napi); /* mask rx/tx interrupt, enable them when napi complete */ - ALX_MEM_W32(adpt, ALX_IMR, adpt->imask & ~ALX_ISR_ALL_QUEUES); + hw->imask &= ~ALX_ISR_ALL_QUEUES; + ALX_MEM_W32(hw, ALX_IMR, hw->imask); } - /* clear interrupt status */ - ALX_MEM_W32(adpt, ALX_ISR, intr & ~ALX_ISR_DIS); + ALX_MEM_W32(hw, ALX_ISR, 0); return IRQ_HANDLED; } @@ -2065,7 +1943,7 @@ static irqreturn_t alx_intr_msi(int irq, void *data) u32 intr; /* read interrupt status */ - ALX_MEM_R32(adpt, ALX_ISR, &intr); + ALX_MEM_R32(&adpt->hw, ALX_ISR, &intr); return alx_intr_1(adpt, intr); } @@ -2073,12 +1951,21 @@ static irqreturn_t alx_intr_msi(int irq, void *data) static irqreturn_t alx_intr_legacy(int irq, void *data) { struct alx_adapter *adpt = data; + struct alx_hw *hw = &adpt->hw; u32 intr; /* read interrupt status */ - ALX_MEM_R32(adpt, ALX_ISR, &intr); - if (intr & ALX_ISR_DIS || 0 == (intr & adpt->imask)) + ALX_MEM_R32(hw, ALX_ISR, &intr); + if (intr & ALX_ISR_DIS || 0 == (intr & hw->imask)) { + u32 mask; + + ALX_MEM_R32(hw, ALX_IMR, &mask); + netif_info(adpt, intr, adpt->netdev, + "seems a wild interrupt, intr=%X, imask=%X, %X\n", + intr, hw->imask, mask); + return IRQ_NONE; + } return alx_intr_1(adpt, intr); } @@ -2090,6 +1977,10 @@ static int alx_poll(struct napi_struct *napi, int budget) struct alx_adapter *adpt = np->adpt; bool complete = true; + netif_info(adpt, intr, adpt->netdev, + "alx_poll, budget(%d)\n", + budget); + if (np->txq) complete = alx_clean_tx_irq(np->txq); if (np->rxq) @@ -2103,11 +1994,16 @@ static int alx_poll(struct napi_struct *napi, int budget) /* enable interrupt */ if (!ALX_FLAG(adpt, HALT)) { + struct alx_hw *hw = &adpt->hw; + if (ALX_FLAG(adpt, USING_MSIX)) - alx_mask_msix(adpt, np->vec_idx, false); - else - ALX_MEM_W32(adpt, ALX_IMR, adpt->imask); - ALX_MEM_FLUSH(adpt); + alx_mask_msix(hw, np->vec_idx, false); + else { + /* TODO: need irq spinlock for imask ?? */ + hw->imask |= ALX_ISR_TX_Q0 | ALX_ISR_RX_Q0; + ALX_MEM_W32(hw, ALX_IMR, hw->imask); + } + ALX_MEM_FLUSH(hw); } return 0; @@ -2136,6 +2032,12 @@ static inline int alx_tpd_req(struct sk_buff *skb) return num; } +/* get custom checksum offload params + * return val: + * neg-val: drop this skb + * 0: no custom checksum offload + * pos-val: have custom cksum offload + */ static int alx_tx_csum(struct sk_buff *skb, struct tpd_desc *first) { u8 cso, css; @@ -2145,7 +2047,7 @@ static int alx_tx_csum(struct sk_buff *skb, struct tpd_desc *first) cso = skb_checksum_start_offset(skb); if (cso & 0x1) - return -1; /* drop it */ + return -1; css = cso + skb->csum_offset; first->word1 |= FIELDX(TPD_CXSUMSTART, cso >> 1); @@ -2160,7 +2062,8 @@ static int alx_tso(struct sk_buff *skb, struct tpd_desc *first) int hdr_len; int err; - if (!skb_is_gso(skb)) + if (skb->ip_summed != CHECKSUM_PARTIAL || + !skb_is_gso(skb)) return 0; if (skb_header_cloned(skb)) { @@ -2251,7 +2154,7 @@ static int alx_tx_map(struct alx_tx_queue *txq, struct sk_buff *skb) dma_unmap_addr_set(buf, dma, dma); tpd->adrl.addr = cpu_to_le64(dma); - tpd->word0 |= FIELDX(TPD_BUFLEN, maplen); + FIELD_SET32(tpd->word0, TPD_BUFLEN, maplen); for (f = 0; f < skb_shinfo(skb)->nr_frags; f++) { struct skb_frag_struct *frag; @@ -2272,7 +2175,7 @@ static int alx_tx_map(struct alx_tx_queue *txq, struct sk_buff *skb) dma_unmap_addr_set(buf, dma, dma); tpd->adrl.addr = cpu_to_le64(dma); - tpd->word0 |= FIELDX(TPD_BUFLEN, maplen); + FIELD_SET32(tpd->word0, TPD_BUFLEN, maplen); } /* last TPD */ tpd->word1 |= 1 << TPD_EOP_SHIFT; @@ -2303,6 +2206,7 @@ static netdev_tx_t alx_start_xmit_ring(struct alx_tx_queue *txq, struct netdev_queue *netque; struct tpd_desc *first; int budget, tpdreq; + int do_tso; adpt = netdev_priv(txq->netdev); netque = netdev_get_tx_queue(txq->netdev, skb_get_queue_mapping(skb)); @@ -2326,8 +2230,8 @@ static netdev_tx_t alx_start_xmit_ring(struct alx_tx_queue *txq, netif_tx_wake_queue(netque); goto tx_conti; } - netdev_err(adpt->netdev, - "TPD Ring is full when queue awake!\n"); + netif_err(adpt, tx_err, adpt->netdev, + "TPD Ring is full when queue awake!\n"); } return NETDEV_TX_BUSY; } @@ -2346,24 +2250,32 @@ tx_conti: first->word1 |= 1 << TPD_VLTAGGED_SHIFT; if (skb_network_offset(skb) != ETH_HLEN) first->word1 |= 1 << TPD_ETHTYPE_SHIFT; - if (alx_tx_csum(skb, first) < 0) + + do_tso = alx_tso(skb, first); + if (do_tso < 0) goto drop; - if (alx_tso(skb, first) < 0) + else if (!do_tso && alx_tx_csum(skb, first) < 0) goto drop; + if (alx_tx_map(txq, skb) < 0) goto drop; + netdev_tx_sent_queue(netque, skb->len); + /* refresh produce idx on HW */ wmb(); - ALX_MEM_W16(adpt, txq->p_reg, txq->pidx); + ALX_MEM_W16(&adpt->hw, txq->p_reg, txq->pidx); - netdev_info(adpt->netdev, - "TX[Preg:%X]: producer = 0x%x, consumer = 0x%x\n", - txq->p_reg, txq->pidx, atomic_read(&txq->cidx)); + netif_info(adpt, tx_done, adpt->netdev, + "TX[Preg:%X]: producer = 0x%x, consumer = 0x%x\n", + txq->p_reg, txq->pidx, atomic_read(&txq->cidx)); return NETDEV_TX_OK; drop: + netif_info(adpt, tx_done, adpt->netdev, + "tx-skb(%d) dropped\n", + skb->len); memset(first, 0, sizeof(struct tpd_desc)); dev_kfree_skb(skb); @@ -2388,12 +2300,60 @@ static netdev_tx_t alx_start_xmit(struct sk_buff *skb, return alx_start_xmit_ring(alx_tx_queue_mapping(adpt, skb), skb); } + +static void alx_dump_state(struct alx_adapter *adpt) +{ + struct alx_hw *hw = &adpt->hw; + struct alx_tx_queue *txq; + struct tpd_desc *tpd; + u16 begin, end; + int i; + + for (i = 0; i < adpt->nr_txq; i++) { + + txq = adpt->qnapi[i]->txq; + begin = txq->pidx >= 16 ? (txq->pidx - 16) : + (txq->count + txq->pidx - 16); + end = txq->pidx + 4; + if (end >= txq->count) + end -= txq->count; + + netif_err(adpt, tx_err, adpt->netdev, + "-----------------TPD-ring(%d)------------------\n", + i); + + while (begin != end) { + tpd = txq->tpd_hdr + begin; + netif_err(adpt, tx_err, adpt->netdev, + "%X: W0=%08X, W1=%08X, W2=%X\n", + begin, tpd->word0, tpd->word1, + tpd->adrl.l.pkt_len); + if (++begin >= txq->count) + begin = 0; + } + } + + netif_err(adpt, tx_err, adpt->netdev, + "---------------dump registers-----------------\n"); + end = 0x2000; + for (begin = 0; begin < end; begin += 16) { + u32 v1, v2, v3, v4; + + ALX_MEM_R32(hw, begin, &v1); + ALX_MEM_R32(hw, begin+4, &v2); + ALX_MEM_R32(hw, begin+8, &v3); + ALX_MEM_R32(hw, begin+12, &v4); + netif_err(adpt, tx_err, adpt->netdev, + "%04X: %08X,%08X,%08X,%08X\n", + begin, v1, v2, v3, v4); + } +} + static void alx_tx_timeout(struct net_device *dev) { struct alx_adapter *adpt = netdev_priv(dev); - netdev_err(adpt->netdev, "tx timeout, reset\n"); - // ???? alx_dump_state(adpt); + alx_dump_state(adpt); ALX_FLAG_SET(adpt, TASK_RESET); alx_schedule_work(adpt); @@ -2403,16 +2363,21 @@ static int alx_mdio_read(struct net_device *netdev, int prtad, int devad, u16 addr) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; u16 val; int err; - if (prtad != adpt->mdio.prtad) + netif_dbg(adpt, hw, netdev, + "alx_mdio_read, prtad=%d, devad=%d, addr=%X\n", + prtad, devad, addr); + + if (prtad != hw->mdio.prtad) return -EINVAL; if (devad != MDIO_DEVAD_NONE) - err = alx_read_phy_ext(adpt, devad, addr, &val); + err = alx_read_phy_ext(hw, devad, addr, &val); else - err = alx_read_phy_reg(adpt, addr, &val); + err = alx_read_phy_reg(hw, addr, &val); return err ? -EIO : val; } @@ -2421,15 +2386,20 @@ static int alx_mdio_write(struct net_device *netdev, int prtad, int devad, u16 addr, u16 val) { struct alx_adapter *adpt = netdev_priv(netdev); + struct alx_hw *hw = &adpt->hw; int err; - if (prtad != adpt->mdio.prtad) + netif_dbg(adpt, hw, netdev, + "alx_mdio_write: prtad=%d, devad=%d, addr=%X, val=%X\n", + prtad, devad, addr, val); + + if (prtad != hw->mdio.prtad) return -EINVAL; if (devad != MDIO_DEVAD_NONE) - err = alx_write_phy_ext(adpt, devad, addr, val); + err = alx_write_phy_ext(hw, devad, addr, val); else - err = alx_write_phy_reg(adpt, addr, val); + err = alx_write_phy_reg(hw, addr, val); return err ? -EIO : 0; } @@ -2441,7 +2411,7 @@ static int alx_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) if (!netif_running(netdev)) return -EAGAIN; - return mdio_mii_ioctl(&adpt->mdio, if_mii(ifr), cmd); + return mdio_mii_ioctl(&adpt->hw.mdio, if_mii(ifr), cmd); } #ifdef CONFIG_NET_POLL_CONTROLLER @@ -2489,6 +2459,7 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct net_device *netdev; struct alx_adapter *adpt = NULL; + struct alx_hw *hw; bool phy_cfged; int bars, pm_cap, err; static int cards_found; @@ -2506,7 +2477,7 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) */ if (!dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) && !dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(64))) { - dev_info(&pdev->dev, "DMA to 64-BIT addresses\n"); + dev_dbg(&pdev->dev, "DMA to 64-BIT addresses\n"); } else { err = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32)); if (err) { @@ -2557,15 +2528,22 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } SET_NETDEV_DEV(netdev, &pdev->dev); - pci_set_drvdata(pdev, adpt); adpt = netdev_priv(netdev); adpt->netdev = netdev; adpt->pdev = pdev; - adpt->msg_enable = 0; + adpt->msg_enable = NETIF_MSG_LINK | + NETIF_MSG_HW | + NETIF_MSG_IFUP | + NETIF_MSG_TX_ERR | + NETIF_MSG_RX_ERR | + NETIF_MSG_WOL; adpt->bd_number = cards_found; + hw = &adpt->hw; + hw->pdev = pdev; + pci_set_drvdata(pdev, adpt); - adpt->hw_addr = pci_ioremap_bar(pdev, 0); - if (!adpt->hw_addr) { + hw->hw_addr = pci_ioremap_bar(pdev, 0); + if (!hw->hw_addr) { dev_err(&pdev->dev, "cannot map device registers\n"); err = -EIO; goto err_iomap; @@ -2584,17 +2562,17 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } /* reset pcie */ - alx_reset_pcie(adpt); + alx_reset_pcie(hw); /* check if phy already configed by ohter driver */ - phy_cfged = alx_phy_configed(adpt); + phy_cfged = alx_phy_configed(hw); /* reset PHY to a known stable status */ if (!phy_cfged) - alx_reset_phy(adpt, !adpt->hib_patch); + alx_reset_phy(hw, !hw->hib_patch); /* reset mac/dma controller */ - err = alx_reset_mac(adpt); + err = alx_reset_mac(hw); if (err) { dev_err(&pdev->dev, "MAC Reset failed, error = %d\n", err); err = -EIO; @@ -2603,8 +2581,8 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) /* setup link to put it in a known good starting state */ if (!phy_cfged) { - err = alx_setup_speed_duplex(adpt, - adpt->adv_cfg, adpt->flowctrl); + err = alx_setup_speed_duplex(hw, + hw->adv_cfg, hw->flowctrl); if (err) { dev_err(&pdev->dev, "config PHY speed/duplex failed,err=%d\n", @@ -2622,25 +2600,25 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) netdev->features = netdev->hw_features | NETIF_F_HW_VLAN_TX; /* read permanent mac addr from register or eFuse */ - if (alx_get_perm_macaddr(adpt, adpt->perm_addr)) { + if (alx_get_perm_macaddr(hw, hw->perm_addr)) { dev_warn(&pdev->dev, "invalid perm-address, use random one\n"); eth_hw_addr_random(netdev); - memcpy(adpt->perm_addr, netdev->dev_addr, netdev->addr_len); + memcpy(hw->perm_addr, netdev->dev_addr, netdev->addr_len); } /* using permanent address as current address */ - memcpy(adpt->mac_addr, adpt->perm_addr, ETH_ALEN); - memcpy(netdev->dev_addr, adpt->mac_addr, ETH_ALEN); - memcpy(netdev->perm_addr, adpt->perm_addr, ETH_ALEN); + memcpy(hw->mac_addr, hw->perm_addr, ETH_ALEN); + memcpy(netdev->dev_addr, hw->mac_addr, ETH_ALEN); + memcpy(netdev->perm_addr, hw->perm_addr, ETH_ALEN); /* PHY mdio */ - adpt->mdio.prtad = MDIO_PRTAD_NONE; - adpt->mdio.mmds = 0; - adpt->mdio.dev = netdev; - adpt->mdio.mode_support = + hw->mdio.prtad = 0; + hw->mdio.mmds = 0; + hw->mdio.dev = netdev; + hw->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_SUPPORTS_C22 | MDIO_EMULATE_C22; - adpt->mdio.mdio_read = alx_mdio_read; - adpt->mdio.mdio_write = alx_mdio_write; - if (!alx_get_phy_id(adpt)) { + hw->mdio.mdio_read = alx_mdio_read; + hw->mdio.mdio_write = alx_mdio_write; + if (!alx_get_phy_info(hw)) { dev_err(&pdev->dev, "identify PHY failed\n"); err = -EIO; goto err_id_phy; @@ -2657,7 +2635,7 @@ alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent) /* carrier off reporting is important to ethtool even BEFORE open */ netif_carrier_off(netdev); - device_set_wakeup_enable(&pdev->dev, adpt->sleep_ctrl); + device_set_wakeup_enable(&pdev->dev, hw->sleep_ctrl); cards_found++; dev_info(&pdev->dev, @@ -2671,7 +2649,7 @@ err_register_netdev: err_setup_link: err_rst_mac: err_init_sw: - iounmap(adpt->hw_addr); + iounmap(hw->hw_addr); err_iomap: free_netdev(netdev); err_alloc_ethdev: @@ -2688,23 +2666,28 @@ err_dma_mask: static void __devexit alx_remove(struct pci_dev *pdev) { struct alx_adapter *adpt = pci_get_drvdata(pdev); - struct net_device *netdev = adpt->netdev; + struct alx_hw *hw = &adpt->hw; + struct net_device *netdev; + + if (!adpt) + return; + + netdev = adpt->netdev; ALX_FLAG_SET(adpt, HALT); alx_cancel_work(adpt); /* restore permanent mac address */ - alx_set_macaddr(adpt, adpt->perm_addr); + alx_set_macaddr(hw, hw->perm_addr); unregister_netdev(netdev); - iounmap(adpt->hw_addr); + iounmap(hw->hw_addr); pci_release_selected_regions(pdev, pci_select_bars(pdev, IORESOURCE_MEM)); - - dev_info(&pdev->dev, "dev removed\n"); free_netdev(netdev); pci_disable_pcie_error_reporting(pdev); pci_disable_device(pdev); + pci_set_drvdata(pdev, NULL); } /* alx_pci_error_detected */ @@ -2735,6 +2718,7 @@ static pci_ers_result_t alx_pci_error_detected(struct pci_dev *pdev, static pci_ers_result_t alx_pci_error_slot_reset(struct pci_dev *pdev) { struct alx_adapter *adpt = pci_get_drvdata(pdev); + struct alx_hw *hw = &adpt->hw; pci_ers_result_t rc = PCI_ERS_RESULT_DISCONNECT; rtnl_lock(); @@ -2748,8 +2732,8 @@ static pci_ers_result_t alx_pci_error_slot_reset(struct pci_dev *pdev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); - alx_reset_pcie(adpt); - if (!alx_reset_mac(adpt)) + alx_reset_pcie(hw); + if (!alx_reset_mac(hw)) rc = PCI_ERS_RESULT_RECOVERED; out: pci_cleanup_aer_uncorrect_error_status(pdev); @@ -2807,7 +2791,6 @@ static int __init alx_init_module(void) } module_init(alx_init_module); - static void __exit alx_exit_module(void) { pci_unregister_driver(&alx_driver); diff --git a/src/alx_reg.h b/src/alx_reg.h new file mode 100644 index 0000000..a91d716 --- /dev/null +++ b/src/alx_reg.h @@ -0,0 +1,2129 @@ +/* + * Copyright (c) 2012 Qualcomm Atheros, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef ALX_REG_H +#define ALX_REG_H + +/**********************************************************************/ +/* following registers are mapped to both pci config and memory space */ +/**********************************************************************/ + +#define ALX_VENDOR_ID PCI_VENDOR_ID_ATTANSIC + +/* pci dev-ids */ +#define ALX_DEV_ID_AR8161 0x1091 +#define ALX_DEV_ID_AR8162 0x1090 +#define ALX_DEV_ID_AR8171 0x10A1 +#define ALX_DEV_ID_AR8172 0x10A0 + +/* rev definition, + * bit(0): with xD support + * bit(1): with Card Reader function + * bit(7:2): real revision + */ +#define ALX_PCI_REVID_WTH_CR BIT(1) +#define ALX_PCI_REVID_WTH_XD BIT(0) +#define ALX_PCI_REVID_MASK 0x1FU +#define ALX_PCI_REVID_SHIFT 3 +#define ALX_REV_A0 0 +#define ALX_REV_A1 1 +#define ALX_REV_B0 2 +#define ALX_REV_C0 3 + +#define ALX_PM_CSR 0x0044 +#define ALX_PM_CSR_PME_STAT BIT(15) +#define ALX_PM_CSR_DSCAL_MASK 0x3U +#define ALX_PM_CSR_DSCAL_SHIFT 13 +#define ALX_PM_CSR_DSEL_MASK 0xFU +#define ALX_PM_CSR_DSEL_SHIFT 9 +#define ALX_PM_CSR_PME_EN BIT(8) +#define ALX_PM_CSR_PWST_MASK 0x3U +#define ALX_PM_CSR_PWST_SHIFT 0 + +#define ALX_DEV_CAP 0x005C +#define ALX_DEV_CAP_SPLSL_MASK 0x3UL +#define ALX_DEV_CAP_SPLSL_SHIFT 26 +#define ALX_DEV_CAP_SPLV_MASK 0xFFUL +#define ALX_DEV_CAP_SPLV_SHIFT 18 +#define ALX_DEV_CAP_RBER BIT(15) +#define ALX_DEV_CAP_PIPRS BIT(14) +#define ALX_DEV_CAP_AIPRS BIT(13) +#define ALX_DEV_CAP_ABPRS BIT(12) +#define ALX_DEV_CAP_L1ACLAT_MASK 0x7UL +#define ALX_DEV_CAP_L1ACLAT_SHIFT 9 +#define ALX_DEV_CAP_L0SACLAT_MASK 0x7UL +#define ALX_DEV_CAP_L0SACLAT_SHIFT 6 +#define ALX_DEV_CAP_EXTAG BIT(5) +#define ALX_DEV_CAP_PHANTOM BIT(4) +#define ALX_DEV_CAP_MPL_MASK 0x7UL +#define ALX_DEV_CAP_MPL_SHIFT 0 +#define ALX_DEV_CAP_MPL_128 1 +#define ALX_DEV_CAP_MPL_256 2 +#define ALX_DEV_CAP_MPL_512 3 +#define ALX_DEV_CAP_MPL_1024 4 +#define ALX_DEV_CAP_MPL_2048 5 +#define ALX_DEV_CAP_MPL_4096 6 + +#define ALX_DEV_CTRL 0x0060 +#define ALX_DEV_CTRL_MAXRRS_MASK 0x7U +#define ALX_DEV_CTRL_MAXRRS_SHIFT 12 +#define ALX_DEV_CTRL_MAXRRS_MIN 2 +#define ALX_DEV_CTRL_NOSNP_EN BIT(11) +#define ALX_DEV_CTRL_AUXPWR_EN BIT(10) +#define ALX_DEV_CTRL_PHANTOM_EN BIT(9) +#define ALX_DEV_CTRL_EXTAG_EN BIT(8) +#define ALX_DEV_CTRL_MPL_MASK 0x7U +#define ALX_DEV_CTRL_MPL_SHIFT 5 +#define ALX_DEV_CTRL_RELORD_EN BIT(4) +#define ALX_DEV_CTRL_URR_EN BIT(3) +#define ALX_DEV_CTRL_FERR_EN BIT(2) +#define ALX_DEV_CTRL_NFERR_EN BIT(1) +#define ALX_DEV_CTRL_CERR_EN BIT(0) + +#define ALX_DEV_STAT 0x0062 +#define ALX_DEV_STAT_XS_PEND BIT(5) +#define ALX_DEV_STAT_AUXPWR BIT(4) +#define ALX_DEV_STAT_UR BIT(3) +#define ALX_DEV_STAT_FERR BIT(2) +#define ALX_DEV_STAT_NFERR BIT(1) +#define ALX_DEV_STAT_CERR BIT(0) + +#define ALX_LNK_CAP 0x0064 +#define ALX_LNK_CAP_PRTNUM_MASK 0xFFUL +#define ALX_LNK_CAP_PRTNUM_SHIFT 24 +#define ALX_LNK_CAP_CLK_PM BIT(18) +#define ALX_LNK_CAP_L1EXTLAT_MASK 0x7UL +#define ALX_LNK_CAP_L1EXTLAT_SHIFT 15 +#define ALX_LNK_CAP_L0SEXTLAT_MASK 0x7UL +#define ALX_LNK_CAP_L0SEXTLAT_SHIFT 12 +#define ALX_LNK_CAP_ASPM_SUP_MASK 0x3UL +#define ALX_LNK_CAP_ASPM_SUP_SHIFT 10 +#define ALX_LNK_CAP_ASPM_SUP_L0S 1 +#define ALX_LNK_CAP_ASPM_SUP_L0SL1 3 +#define ALX_LNK_CAP_MAX_LWH_MASK 0x3FUL +#define ALX_LNK_CAP_MAX_LWH_SHIFT 4 +#define ALX_LNK_CAP_MAX_LSPD_MASK 0xFUL +#define ALX_LNK_CAP_MAX_LSPD_SHIFT 0 + +#define ALX_LNK_CTRL 0x0068 +#define ALX_LNK_CTRL_CLK_PM_EN BIT(8) +#define ALX_LNK_CTRL_EXTSYNC BIT(7) +#define ALX_LNK_CTRL_CMNCLK_CFG BIT(6) +#define ALX_LNK_CTRL_RCB_128B BIT(3) +#define ALX_LNK_CTRL_ASPM_MASK 0x3U +#define ALX_LNK_CTRL_ASPM_SHIFT 0 +#define ALX_LNK_CTRL_ASPM_DIS 0 +#define ALX_LNK_CTRL_ASPM_ENL0S 1 +#define ALX_LNK_CTRL_ASPM_ENL1 2 +#define ALX_LNK_CTRL_ASPM_ENL0SL1 3 + +#define ALX_LNK_STAT 0x006A +#define ALX_LNK_STAT_SCLKCFG BIT(12) +#define ALX_LNK_STAT_LNKTRAIN BIT(11) +#define ALX_LNK_STAT_TRNERR BIT(10) +#define ALX_LNK_STAT_LNKSPD_MASK 0xFU +#define ALX_LNK_STAT_LNKSPD_SHIFT 0 +#define ALX_LNK_STAT_NEGLW_MASK 0x3FU +#define ALX_LNK_STAT_NEGLW_SHIFT 4 + +#define ALX_MSIX_MASK 0x0090 +#define ALX_MSIX_PENDING 0x0094 + +#define ALX_UE_SVRT 0x010C +#define ALX_UE_SVRT_UR BIT(20) +#define ALX_UE_SVRT_ECRCERR BIT(19) +#define ALX_UE_SVRT_MTLP BIT(18) +#define ALX_UE_SVRT_RCVOVFL BIT(17) +#define ALX_UE_SVRT_UNEXPCPL BIT(16) +#define ALX_UE_SVRT_CPLABRT BIT(15) +#define ALX_UE_SVRT_CPLTO BIT(14) +#define ALX_UE_SVRT_FCPROTERR BIT(13) +#define ALX_UE_SVRT_PTLP BIT(12) +#define ALX_UE_SVRT_DLPROTERR BIT(4) +#define ALX_UE_SVRT_TRNERR BIT(0) + +/* eeprom & flash load register */ +#define ALX_EFLD 0x0204 +#define ALX_EFLD_F_ENDADDR_MASK 0x3FFUL +#define ALX_EFLD_F_ENDADDR_SHIFT 16 +#define ALX_EFLD_F_EXIST BIT(10) +#define ALX_EFLD_E_EXIST BIT(9) +#define ALX_EFLD_EXIST BIT(8) +#define ALX_EFLD_STAT BIT(5) +#define ALX_EFLD_IDLE BIT(4) +#define ALX_EFLD_START BIT(0) + +/* eFuse load register */ +#define ALX_SLD 0x0218 +#define ALX_SLD_FREQ_MASK 0x3UL +#define ALX_SLD_FREQ_SHIFT 24 +#define ALX_SLD_FREQ_100K 0 +#define ALX_SLD_FREQ_200K 1 +#define ALX_SLD_FREQ_300K 2 +#define ALX_SLD_FREQ_400K 3 +#define ALX_SLD_EXIST BIT(23) +#define ALX_SLD_SLVADDR_MASK 0x7FUL +#define ALX_SLD_SLVADDR_SHIFT 16 +#define ALX_SLD_IDLE BIT(13) +#define ALX_SLD_STAT BIT(12) +#define ALX_SLD_START BIT(11) +#define ALX_SLD_STARTADDR_MASK 0xFFUL +#define ALX_SLD_STARTADDR_SHIFT 0 +#define ALX_SLD_MAX_TO 100 + +#define ALX_PCIE_MSIC 0x021C +#define ALX_PCIE_MSIC_MSIX_DIS BIT(22) +#define ALX_PCIE_MSIC_MSI_DIS BIT(21) + +#define ALX_PPHY_MISC1 0x1000 +#define ALX_PPHY_MISC1_RCVDET BIT(2) +#define ALX_PPHY_MISC1_NFTS_MASK 0xFFUL +#define ALX_PPHY_MISC1_NFTS_SHIFT 16 +#define ALX_PPHY_MISC1_NFTS_HIPERF 0xA0 + +#define ALX_PPHY_MISC2 0x1004 +#define ALX_PPHY_MISC2_L0S_TH_MASK 0x3UL +#define ALX_PPHY_MISC2_L0S_TH_SHIFT 18 +#define ALX_PPHY_MISC2_CDR_BW_MASK 0x3UL +#define ALX_PPHY_MISC2_CDR_BW_SHIFT 16 + +#define ALX_PDLL_TRNS1 0x1104 +#define ALX_PDLL_TRNS1_D3PLLOFF_EN BIT(11) +#define ALX_PDLL_TRNS1_REGCLK_SEL_NORM BIT(10) +#define ALX_PDLL_TRNS1_REPLY_TO_MASK 0x3FFUL +#define ALX_PDLL_TRNS1_REPLY_TO_SHIFT 0 + +#define ALX_TLEXTN_STATS 0x1208 +#define ALX_TLEXTN_STATS_DEVNO_MASK 0x1FUL +#define ALX_TLEXTN_STATS_DEVNO_SHIFT 16 +#define ALX_TLEXTN_STATS_BUSNO_MASK 0xFFUL +#define ALX_TLEXTN_STATS_BUSNO_SHIFT 8 + +#define ALX_EFUSE_CTRL 0x12C0 +#define ALX_EFUSE_CTRL_FLAG BIT(31) +#define ALX_EUFSE_CTRL_ACK BIT(30) +#define ALX_EFUSE_CTRL_ADDR_MASK 0x3FFUL +#define ALX_EFUSE_CTRL_ADDR_SHIFT 16 + +#define ALX_EFUSE_DATA 0x12C4 + +#define ALX_SPI_OP1 0x12C8 +#define ALX_SPI_OP1_RDID_MASK 0xFFUL +#define ALX_SPI_OP1_RDID_SHIFT 24 +#define ALX_SPI_OP1_CE_MASK 0xFFUL +#define ALX_SPI_OP1_CE_SHIFT 16 +#define ALX_SPI_OP1_SE_MASK 0xFFUL +#define ALX_SPI_OP1_SE_SHIFT 8 +#define ALX_SPI_OP1_PRGRM_MASK 0xFFUL +#define ALX_SPI_OP1_PRGRM_SHIFT 0 + +#define ALX_SPI_OP2 0x12CC +#define ALX_SPI_OP2_READ_MASK 0xFFUL +#define ALX_SPI_OP2_READ_SHIFT 24 +#define ALX_SPI_OP2_WRSR_MASK 0xFFUL +#define ALX_SPI_OP2_WRSR_SHIFT 16 +#define ALX_SPI_OP2_RDSR_MASK 0xFFUL +#define ALX_SPI_OP2_RDSR_SHIFT 8 +#define ALX_SPI_OP2_WREN_MASK 0xFFUL +#define ALX_SPI_OP2_WREN_SHIFT 0 + +#define ALX_SPI_OP3 0x12E4 +#define ALX_SPI_OP3_WRDI_MASK 0xFFUL +#define ALX_SPI_OP3_WRDI_SHIFT 8 +#define ALX_SPI_OP3_EWSR_MASK 0xFFUL +#define ALX_SPI_OP3_EWSR_SHIFT 0 + +#define ALX_EF_CTRL 0x12D0 +#define ALX_EF_CTRL_FSTS_MASK 0xFFUL +#define ALX_EF_CTRL_FSTS_SHIFT 20 +#define ALX_EF_CTRL_CLASS_MASK 0x7UL +#define ALX_EF_CTRL_CLASS_SHIFT 16 +#define ALX_EF_CTRL_CLASS_F_UNKNOWN 0 +#define ALX_EF_CTRL_CLASS_F_STD 1 +#define ALX_EF_CTRL_CLASS_F_SST 2 +#define ALX_EF_CTRL_CLASS_E_UNKNOWN 0 +#define ALX_EF_CTRL_CLASS_E_1K 1 +#define ALX_EF_CTRL_CLASS_E_4K 2 +#define ALX_EF_CTRL_FRET BIT(15) +#define ALX_EF_CTRL_TYP_MASK 0x3UL +#define ALX_EF_CTRL_TYP_SHIFT 12 +#define ALX_EF_CTRL_TYP_NONE 0 +#define ALX_EF_CTRL_TYP_F 1 +#define ALX_EF_CTRL_TYP_E 2 +#define ALX_EF_CTRL_TYP_UNKNOWN 3 +#define ALX_EF_CTRL_ONE_CLK BIT(10) +#define ALX_EF_CTRL_ECLK_MASK 0x3UL +#define ALX_EF_CTRL_ECLK_SHIFT 8 +#define ALX_EF_CTRL_ECLK_125K 0 +#define ALX_EF_CTRL_ECLK_250K 1 +#define ALX_EF_CTRL_ECLK_500K 2 +#define ALX_EF_CTRL_ECLK_1M 3 +#define ALX_EF_CTRL_FBUSY BIT(7) +#define ALX_EF_CTRL_ACTION BIT(6) +#define ALX_EF_CTRL_AUTO_OP BIT(5) +#define ALX_EF_CTRL_SST_MODE BIT(4) +#define ALX_EF_CTRL_INST_MASK 0xFUL +#define ALX_EF_CTRL_INST_SHIFT 0 +#define ALX_EF_CTRL_INST_NONE 0 +#define ALX_EF_CTRL_INST_READ 1 +#define ALX_EF_CTRL_INST_RDID 2 +#define ALX_EF_CTRL_INST_RDSR 3 +#define ALX_EF_CTRL_INST_WREN 4 +#define ALX_EF_CTRL_INST_PRGRM 5 +#define ALX_EF_CTRL_INST_SE 6 +#define ALX_EF_CTRL_INST_CE 7 +#define ALX_EF_CTRL_INST_WRSR 10 +#define ALX_EF_CTRL_INST_EWSR 11 +#define ALX_EF_CTRL_INST_WRDI 12 +#define ALX_EF_CTRL_INST_WRITE 2 + +#define ALX_EF_ADDR 0x12D4 +#define ALX_EF_DATA 0x12D8 +#define ALX_SPI_ID 0x12DC + +#define ALX_SPI_CFG_START 0x12E0 + +#define ALX_PMCTRL 0x12F8 +#define ALX_PMCTRL_HOTRST_WTEN BIT(31) +/* bit30: L0s/L1 controlled by MAC based on throughput(setting in 15A0) */ +#define ALX_PMCTRL_ASPM_FCEN BIT(30) +#define ALX_PMCTRL_SADLY_EN BIT(29) +#define ALX_PMCTRL_L0S_BUFSRX_EN BIT(28) +#define ALX_PMCTRL_LCKDET_TIMER_MASK 0xFUL +#define ALX_PMCTRL_LCKDET_TIMER_SHIFT 24 +#define ALX_PMCTRL_LCKDET_TIMER_DEF 0xC +/* bit[23:20] if pm_request_l1 time > @, then enter L0s not L1 */ +#define ALX_PMCTRL_L1REQ_TO_MASK 0xFUL +#define ALX_PMCTRL_L1REQ_TO_SHIFT 20 +#define ALX_PMCTRL_L1REG_TO_DEF 0xF +#define ALX_PMCTRL_TXL1_AFTER_L0S BIT(19) +#define ALX_PMCTRL_L1_TIMER_MASK 0x7UL +#define ALX_PMCTRL_L1_TIMER_SHIFT 16 +#define ALX_PMCTRL_L1_TIMER_DIS 0 +#define ALX_PMCTRL_L1_TIMER_2US 1 +#define ALX_PMCTRL_L1_TIMER_4US 2 +#define ALX_PMCTRL_L1_TIMER_8US 3 +#define ALX_PMCTRL_L1_TIMER_16US 4 +#define ALX_PMCTRL_L1_TIMER_24US 5 +#define ALX_PMCTRL_L1_TIMER_32US 6 +#define ALX_PMCTRL_L1_TIMER_63US 7 +#define ALX_PMCTRL_RCVR_WT_1US BIT(15) +#define ALX_PMCTRL_PWM_VER_11 BIT(14) +/* bit13: enable pcie clk switch in L1 state */ +#define ALX_PMCTRL_L1_CLKSW_EN BIT(13) +#define ALX_PMCTRL_L0S_EN BIT(12) +#define ALX_PMCTRL_RXL1_AFTER_L0S BIT(11) +#define ALX_PMCTRL_L0S_TIMER_MASK 0x7UL +#define ALX_PMCTRL_L0S_TIMER_SHIFT 8 +#define ALX_PMCTRL_L1_BUFSRX_EN BIT(7) +/* bit6: power down serdes RX */ +#define ALX_PMCTRL_L1_SRDSRX_PWD BIT(6) +#define ALX_PMCTRL_L1_SRDSPLL_EN BIT(5) +#define ALX_PMCTRL_L1_SRDS_EN BIT(4) +#define ALX_PMCTRL_L1_EN BIT(3) +#define ALX_PMCTRL_CLKREQ_EN BIT(2) +#define ALX_PMCTRL_RBER_EN BIT(1) +#define ALX_PMCTRL_SPRSDWER_EN BIT(0) + +#define ALX_LTSSM_CTRL 0x12FC +#define ALX_LTSSM_WRO_EN BIT(12) + +/*******************************************************/ +/* following registers are mapped only to memory space */ +/*******************************************************/ + +#define ALX_MASTER 0x1400 +#define ALX_MASTER_OTP_FLG BIT(31) +#define ALX_MASTER_DEV_NUM_MASK 0x7FUL +#define ALX_MASTER_DEV_NUM_SHIFT 24 +#define ALX_MASTER_REV_NUM_MASK 0xFFUL +#define ALX_MASTER_REV_NUM_SHIFT 16 +#define ALX_MASTER_DEASSRT BIT(15) +#define ALX_MASTER_RDCLR_INT BIT(14) +#define ALX_MASTER_DMA_RST BIT(13) +/* bit12: 1:alwys select pclk from serdes, not sw to 25M */ +#define ALX_MASTER_PCLKSEL_SRDS BIT(12) +/* bit11: irq moduration for rx */ +#define ALX_MASTER_IRQMOD2_EN BIT(11) +/* bit10: irq moduration for tx/rx */ +#define ALX_MASTER_IRQMOD1_EN BIT(10) +#define ALX_MASTER_MANU_INT BIT(9) +#define ALX_MASTER_MANUTIMER_EN BIT(8) +#define ALX_MASTER_SYSALVTIMER_EN BIT(7) +#define ALX_MASTER_OOB_DIS BIT(6) +/* bit5: wakeup without pcie clk */ +#define ALX_MASTER_WAKEN_25M BIT(5) +#define ALX_MASTER_BERT_START BIT(4) +#define ALX_MASTER_PCIE_TSTMOD_MASK 0x3UL +#define ALX_MASTER_PCIE_TSTMOD_SHIFT 2 +#define ALX_MASTER_PCIE_RST BIT(1) +/* bit0: MAC & DMA reset */ +#define ALX_MASTER_DMA_MAC_RST BIT(0) +#define ALX_DMA_MAC_RST_TO 50 + +#define ALX_MANU_TIMER 0x1404 + +#define ALX_IRQ_MODU_TIMER 0x1408 +/* hi-16bit is only for RX */ +#define ALX_IRQ_MODU_TIMER2_MASK 0xFFFFUL +#define ALX_IRQ_MODU_TIMER2_SHIFT 16 +#define ALX_IRQ_MODU_TIMER1_MASK 0xFFFFUL +#define ALX_IRQ_MODU_TIMER1_SHIFT 0 + +#define ALX_PHY_CTRL 0x140C +#define ALX_PHY_CTRL_ADDR_MASK 0x1FUL +#define ALX_PHY_CTRL_ADDR_SHIFT 19 +#define ALX_PHY_CTRL_BP_VLTGSW BIT(18) +#define ALX_PHY_CTRL_100AB_EN BIT(17) +#define ALX_PHY_CTRL_10AB_EN BIT(16) +#define ALX_PHY_CTRL_PLL_BYPASS BIT(15) +/* bit14: affect MAC & PHY, go to low power sts */ +#define ALX_PHY_CTRL_POWER_DOWN BIT(14) +/* bit13: 1:pll always ON, 0:can switch in lpw */ +#define ALX_PHY_CTRL_PLL_ON BIT(13) +#define ALX_PHY_CTRL_RST_ANALOG BIT(12) +#define ALX_PHY_CTRL_HIB_PULSE BIT(11) +#define ALX_PHY_CTRL_HIB_EN BIT(10) +#define ALX_PHY_CTRL_GIGA_DIS BIT(9) +/* bit8: poweron rst */ +#define ALX_PHY_CTRL_IDDQ_DIS BIT(8) +/* bit7: while reboot, it affects bit8 */ +#define ALX_PHY_CTRL_IDDQ BIT(7) +#define ALX_PHY_CTRL_LPW_EXIT BIT(6) +#define ALX_PHY_CTRL_GATE_25M BIT(5) +#define ALX_PHY_CTRL_RVRS_ANEG BIT(4) +#define ALX_PHY_CTRL_ANEG_NOW BIT(3) +#define ALX_PHY_CTRL_LED_MODE BIT(2) +#define ALX_PHY_CTRL_RTL_MODE BIT(1) +/* bit0: out of dsp RST state */ +#define ALX_PHY_CTRL_DSPRST_OUT BIT(0) +#define ALX_PHY_CTRL_DSPRST_TO 80 +#define ALX_PHY_CTRL_CLS (\ + ALX_PHY_CTRL_LED_MODE |\ + ALX_PHY_CTRL_100AB_EN |\ + ALX_PHY_CTRL_PLL_ON) + +#define ALX_MAC_STS 0x1410 +#define ALX_MAC_STS_SFORCE_MASK 0xFUL +#define ALX_MAC_STS_SFORCE_SHIFT 14 +#define ALX_MAC_STS_CALIB_DONE BIT13 +#define ALX_MAC_STS_CALIB_RES_MASK 0x1FUL +#define ALX_MAC_STS_CALIB_RES_SHIFT 8 +#define ALX_MAC_STS_CALIBERR_MASK 0xFUL +#define ALX_MAC_STS_CALIBERR_SHIFT 4 +#define ALX_MAC_STS_TXQ_BUSY BIT(3) +#define ALX_MAC_STS_RXQ_BUSY BIT(2) +#define ALX_MAC_STS_TXMAC_BUSY BIT(1) +#define ALX_MAC_STS_RXMAC_BUSY BIT(0) +#define ALX_MAC_STS_IDLE (\ + ALX_MAC_STS_TXQ_BUSY |\ + ALX_MAC_STS_RXQ_BUSY |\ + ALX_MAC_STS_TXMAC_BUSY |\ + ALX_MAC_STS_RXMAC_BUSY) + +#define ALX_MDIO 0x1414 +#define ALX_MDIO_MODE_EXT BIT(30) +#define ALX_MDIO_POST_READ BIT(29) +#define ALX_MDIO_AUTO_POLLING BIT(28) +#define ALX_MDIO_BUSY BIT(27) +#define ALX_MDIO_CLK_SEL_MASK 0x7UL +#define ALX_MDIO_CLK_SEL_SHIFT 24 +#define ALX_MDIO_CLK_SEL_25MD4 0 +#define ALX_MDIO_CLK_SEL_25MD6 2 +#define ALX_MDIO_CLK_SEL_25MD8 3 +#define ALX_MDIO_CLK_SEL_25MD10 4 +#define ALX_MDIO_CLK_SEL_25MD32 5 +#define ALX_MDIO_CLK_SEL_25MD64 6 +#define ALX_MDIO_CLK_SEL_25MD128 7 +#define ALX_MDIO_START BIT(23) +#define ALX_MDIO_SPRES_PRMBL BIT(22) +/* bit21: 1:read,0:write */ +#define ALX_MDIO_OP_READ BIT(21) +#define ALX_MDIO_REG_MASK 0x1FUL +#define ALX_MDIO_REG_SHIFT 16 +#define ALX_MDIO_DATA_MASK 0xFFFFUL +#define ALX_MDIO_DATA_SHIFT 0 +#define ALX_MDIO_MAX_AC_TO 120 + +#define ALX_MDIO_EXTN 0x1448 +#define ALX_MDIO_EXTN_PORTAD_MASK 0x1FUL +#define ALX_MDIO_EXTN_PORTAD_SHIFT 21 +#define ALX_MDIO_EXTN_DEVAD_MASK 0x1FUL +#define ALX_MDIO_EXTN_DEVAD_SHIFT 16 +#define ALX_MDIO_EXTN_REG_MASK 0xFFFFUL +#define ALX_MDIO_EXTN_REG_SHIFT 0 + +#define ALX_PHY_STS 0x1418 +#define ALX_PHY_STS_LPW BIT(31) +#define ALX_PHY_STS_LPI BIT(30) +#define ALX_PHY_STS_PWON_STRIP_MASK 0xFFFUL +#define ALX_PHY_STS_PWON_STRIP_SHIFT 16 + +#define ALX_PHY_STS_DUPLEX BIT(3) +#define ALX_PHY_STS_LINKUP BIT(2) +#define ALX_PHY_STS_SPEED_MASK 0x3UL +#define ALX_PHY_STS_SPEED_SHIFT 0 +#define ALX_PHY_STS_SPEED_1000M 2 +#define ALX_PHY_STS_SPEED_100M 1 +#define ALX_PHY_STS_SPEED_10M 0 + +#define ALX_BIST0 0x141C +#define ALX_BIST0_COL_MASK 0x3FUL +#define ALX_BIST0_COL_SHIFT 24 +#define ALX_BIST0_ROW_MASK 0xFFFUL +#define ALX_BIST0_ROW_SHIFT 12 +#define ALX_BIST0_STEP_MASK 0xFUL +#define ALX_BIST0_STEP_SHIFT 8 +#define ALX_BIST0_PATTERN_MASK 0x7UL +#define ALX_BIST0_PATTERN_SHIFT 4 +#define ALX_BIST0_CRIT BIT(3) +#define ALX_BIST0_FIXED BIT(2) +#define ALX_BIST0_FAIL BIT(1) +#define ALX_BIST0_START BIT(0) + +#define ALX_BIST1 0x1420 +#define ALX_BIST1_COL_MASK 0x3FUL +#define ALX_BIST1_COL_SHIFT 24 +#define ALX_BIST1_ROW_MASK 0xFFFUL +#define ALX_BIST1_ROW_SHIFT 12 +#define ALX_BIST1_STEP_MASK 0xFUL +#define ALX_BIST1_STEP_SHIFT 8 +#define ALX_BIST1_PATTERN_MASK 0x7UL +#define ALX_BIST1_PATTERN_SHIFT 4 +#define ALX_BIST1_CRIT BIT(3) +#define ALX_BIST1_FIXED BIT(2) +#define ALX_BIST1_FAIL BIT(1) +#define ALX_BIST1_START BIT(0) + +#define ALX_SERDES 0x1424 +#define ALX_SERDES_PHYCLK_SLWDWN BIT(18) +#define ALX_SERDES_MACCLK_SLWDWN BIT(17) +#define ALX_SERDES_SELFB_PLL_MASK 0x3UL +#define ALX_SERDES_SELFB_PLL_SHIFT 14 +/* bit13: 1:gtx_clk, 0:25M */ +#define ALX_SERDES_PHYCLK_SEL_GTX BIT(13) +/* bit12: 1:serdes,0:25M */ +#define ALX_SERDES_PCIECLK_SEL_SRDS BIT(12) +#define ALX_SERDES_BUFS_RX_EN BIT(11) +#define ALX_SERDES_PD_RX BIT(10) +#define ALX_SERDES_PLL_EN BIT(9) +#define ALX_SERDES_EN BIT(8) +/* bit6: 0:state-machine,1:csr */ +#define ALX_SERDES_SELFB_PLL_SEL_CSR BIT(6) +#define ALX_SERDES_SELFB_PLL_CSR_MASK 0x3UL +#define ALX_SERDES_SELFB_PLL_CSR_SHIFT 4 +/* 4-12% OV-CLK */ +#define ALX_SERDES_SELFB_PLL_CSR_4 3 +/* 0-4% OV-CLK */ +#define ALX_SERDES_SELFB_PLL_CSR_0 2 +/* 12-18% OV-CLK */ +#define ALX_SERDES_SELFB_PLL_CSR_12 1 +/* 18-25% OV-CLK */ +#define ALX_SERDES_SELFB_PLL_CSR_18 0 +#define ALX_SERDES_VCO_SLOW BIT(3) +#define ALX_SERDES_VCO_FAST BIT(2) +#define ALX_SERDES_LOCKDCT_EN BIT(1) +#define ALX_SERDES_LOCKDCTED BIT(0) + +#define ALX_LED_CTRL 0x1428 +#define ALX_LED_CTRL_PATMAP2_MASK 0x3UL +#define ALX_LED_CTRL_PATMAP2_SHIFT 8 +#define ALX_LED_CTRL_PATMAP1_MASK 0x3UL +#define ALX_LED_CTRL_PATMAP1_SHIFT 6 +#define ALX_LED_CTRL_PATMAP0_MASK 0x3UL +#define ALX_LED_CTRL_PATMAP0_SHIFT 4 +#define ALX_LED_CTRL_D3_MODE_MASK 0x3UL +#define ALX_LED_CTRL_D3_MODE_SHIFT 2 +#define ALX_LED_CTRL_D3_MODE_NORMAL 0 +#define ALX_LED_CTRL_D3_MODE_WOL_DIS 1 +#define ALX_LED_CTRL_D3_MODE_WOL_ANY 2 +#define ALX_LED_CTRL_D3_MODE_WOL_EN 3 +#define ALX_LED_CTRL_DUTY_CYCL_MASK 0x3UL +#define ALX_LED_CTRL_DUTY_CYCL_SHIFT 0 +/* 50% */ +#define ALX_LED_CTRL_DUTY_CYCL_50 0 +/* 12.5% */ +#define ALX_LED_CTRL_DUTY_CYCL_125 1 +/* 25% */ +#define ALX_LED_CTRL_DUTY_CYCL_25 2 +/* 75% */ +#define ALX_LED_CTRL_DUTY_CYCL_75 3 + +#define ALX_LED_PATN 0x142C +#define ALX_LED_PATN1_MASK 0xFFFFUL +#define ALX_LED_PATN1_SHIFT 16 +#define ALX_LED_PATN0_MASK 0xFFFFUL +#define ALX_LED_PATN0_SHIFT 0 + +#define ALX_LED_PATN2 0x1430 +#define ALX_LED_PATN2_MASK 0xFFFFUL +#define ALX_LED_PATN2_SHIFT 0 + +#define ALX_SYSALV 0x1434 +#define ALX_SYSALV_FLAG BIT(0) + +#define ALX_PCIERR_INST 0x1438 +#define ALX_PCIERR_INST_TX_RATE_MASK 0xFUL +#define ALX_PCIERR_INST_TX_RATE_SHIFT 4 +#define ALX_PCIERR_INST_RX_RATE_MASK 0xFUL +#define ALX_PCIERR_INST_RX_RATE_SHIFT 0 + +#define ALX_LPI_DECISN_TIMER 0x143C + +#define ALX_LPI_CTRL 0x1440 +#define ALX_LPI_CTRL_CHK_DA BIT(31) +#define ALX_LPI_CTRL_ENH_TO_MASK 0x1FFFUL +#define ALX_LPI_CTRL_ENH_TO_SHIFT 12 +#define ALX_LPI_CTRL_ENH_TH_MASK 0x1FUL +#define ALX_LPI_CTRL_ENH_TH_SHIFT 6 +#define ALX_LPI_CTRL_ENH_EN BIT(5) +#define ALX_LPI_CTRL_CHK_RX BIT(4) +#define ALX_LPI_CTRL_CHK_STATE BIT(3) +#define ALX_LPI_CTRL_GMII BIT(2) +#define ALX_LPI_CTRL_TO_PHY BIT(1) +#define ALX_LPI_CTRL_EN BIT(0) + +#define ALX_LPI_WAIT 0x1444 +#define ALX_LPI_WAIT_TIMER_MASK 0xFFFFUL +#define ALX_LPI_WAIT_TIMER_SHIFT 0 + +/* heart-beat, for swoi/cifs */ +#define ALX_HRTBT_VLAN 0x1450 +#define ALX_HRTBT_VLANID_MASK 0xFFFFUL +#define ALX_HRRBT_VLANID_SHIFT 0 + +#define ALX_HRTBT_CTRL 0x1454 +#define ALX_HRTBT_CTRL_EN BIT(31) +#define ALX_HRTBT_CTRL_PERIOD_MASK 0x3FUL +#define ALX_HRTBT_CTRL_PERIOD_SHIFT 25 +#define ALX_HRTBT_CTRL_HASVLAN BIT(24) +#define ALX_HRTBT_CTRL_HDRADDR_MASK 0xFFFUL +#define ALX_HRTBT_CTRL_HDRADDR_SHIFT 12 +#define ALX_HRTBT_CTRL_HDRADDRB0_MASK 0x7FFUL +#define ALX_HRTBT_CTRL_HDRADDRB0_SHIFT 13 +#define ALX_HRTBT_CTRL_PKT_FRAG BIT(12) +#define ALX_HRTBT_CTRL_PKTLEN_MASK 0xFFFUL +#define ALX_HRTBT_CTRL_PKTLEN_SHIFT 0 + +/* for B0 */ +#define ALX_HRTBT_EXT_CTRL 0x1AD0 +#define ALX_HRTBT_EXT_CTRL_NS_EN BIT(12) +#define ALX_HRTBT_EXT_CTRL_FRAG_LEN_MASK 0xFFUL +#define ALX_HRTBT_EXT_CTRL_FRAG_LEN_SHIFT 4 +#define ALX_HRTBT_EXT_CTRL_IS_8023 BIT(3) +#define ALX_HRTBT_EXT_CTRL_IS_IPV6 BIT(2) +#define ALX_HRTBT_EXT_CTRL_WAKEUP_EN BIT(1) +#define ALX_HRTBT_EXT_CTRL_ARP_EN BIT(0) + +#define ALX_HRTBT_REM_IPV4_ADDR 0x1AD4 +#define ALX_HRTBT_HOST_IPV4_ADDR 0x1478 +#define ALX_HRTBT_REM_IPV6_ADDR3 0x1AD8 +#define ALX_HRTBT_REM_IPV6_ADDR2 0x1ADC +#define ALX_HRTBT_REM_IPV6_ADDR1 0x1AE0 +#define ALX_HRTBT_REM_IPV6_ADDR0 0x1AE4 +/*SWOI_HOST_IPV6_ADDR reuse reg1a60-1a6c, 1a70-1a7c, 1aa0-1aac, 1ab0-1abc.*/ +#define ALX_HRTBT_WAKEUP_PORT 0x1AE8 +#define ALX_HRTBT_WAKEUP_PORT_SRC_MASK 0xFFFFUL +#define ALX_HRTBT_WAKEUP_PORT_SRC_SHIFT 16 +#define ALX_HRTBT_WAKEUP_PORT_DEST_MASK 0xFFFFUL +#define ALX_HRTBT_WAKEUP_PORT_DEST_SHIFT 0 + +#define ALX_HRTBT_WAKEUP_DATA7 0x1AEC +#define ALX_HRTBT_WAKEUP_DATA6 0x1AF0 +#define ALX_HRTBT_WAKEUP_DATA5 0x1AF4 +#define ALX_HRTBT_WAKEUP_DATA4 0x1AF8 +#define ALX_HRTBT_WAKEUP_DATA3 0x1AFC +#define ALX_HRTBT_WAKEUP_DATA2 0x1B80 +#define ALX_HRTBT_WAKEUP_DATA1 0x1B84 +#define ALX_HRTBT_WAKEUP_DATA0 0x1B88 + +#define ALX_RXPARSE 0x1458 +#define ALX_RXPARSE_FLT6_L4_MASK 0x3UL +#define ALX_RXPARSE_FLT6_L4_SHIFT 30 +#define ALX_RXPARSE_FLT6_L3_MASK 0x3UL +#define ALX_RXPARSE_FLT6_L3_SHIFT 28 +#define ALX_RXPARSE_FLT5_L4_MASK 0x3UL +#define ALX_RXPARSE_FLT5_L4_SHIFT 26 +#define ALX_RXPARSE_FLT5_L3_MASK 0x3UL +#define ALX_RXPARSE_FLT5_L3_SHIFT 24 +#define ALX_RXPARSE_FLT4_L4_MASK 0x3UL +#define ALX_RXPARSE_FLT4_L4_SHIFT 22 +#define ALX_RXPARSE_FLT4_L3_MASK 0x3UL +#define ALX_RXPARSE_FLT4_L3_SHIFT 20 +#define ALX_RXPARSE_FLT3_L4_MASK 0x3UL +#define ALX_RXPARSE_FLT3_L4_SHIFT 18 +#define ALX_RXPARSE_FLT3_L3_MASK 0x3UL +#define ALX_RXPARSE_FLT3_L3_SHIFT 16 +#define ALX_RXPARSE_FLT2_L4_MASK 0x3UL +#define ALX_RXPARSE_FLT2_L4_SHIFT 14 +#define ALX_RXPARSE_FLT2_L3_MASK 0x3UL +#define ALX_RXPARSE_FLT2_L3_SHIFT 12 +#define ALX_RXPARSE_FLT1_L4_MASK 0x3UL +#define ALX_RXPARSE_FLT1_L4_SHIFT 10 +#define ALX_RXPARSE_FLT1_L3_MASK 0x3UL +#define ALX_RXPARSE_FLT1_L3_SHIFT 8 +#define ALX_RXPARSE_FLT6_EN BIT(5) +#define ALX_RXPARSE_FLT5_EN BIT(4) +#define ALX_RXPARSE_FLT4_EN BIT(3) +#define ALX_RXPARSE_FLT3_EN BIT(2) +#define ALX_RXPARSE_FLT2_EN BIT(1) +#define ALX_RXPARSE_FLT1_EN BIT(0) +#define ALX_RXPARSE_FLT_L4_UDP 0 +#define ALX_RXPARSE_FLT_L4_TCP 1 +#define ALX_RXPARSE_FLT_L4_BOTH 2 +#define ALX_RXPARSE_FLT_L4_NONE 3 +#define ALX_RXPARSE_FLT_L3_IPV6 0 +#define ALX_RXPARSE_FLT_L3_IPV4 1 +#define ALX_RXPARSE_FLT_L3_BOTH 2 + +/* Terodo support */ +#define ALX_TRD_CTRL 0x145C +#define ALX_TRD_CTRL_EN BIT(31) +#define ALX_TRD_CTRL_BUBBLE_WAKE_EN BIT(30) +#define ALX_TRD_CTRL_PREFIX_CMP_HW BIT(28) +#define ALX_TRD_CTRL_RSHDR_ADDR_MASK 0xFFFUL +#define ALX_TRD_CTRL_RSHDR_ADDR_SHIFT 16 +#define ALX_TRD_CTRL_SINTV_MAX_MASK 0xFFUL +#define ALX_TRD_CTRL_SINTV_MAX_SHIFT 8 +#define ALX_TRD_CTRL_SINTV_MIN_MASK 0xFFUL +#define ALX_TRD_CTRL_SINTV_MIN_SHIFT 0 + +#define ALX_TRD_RS 0x1460 +#define ALX_TRD_RS_SZ_MASK 0xFFFUL +#define ALX_TRD_RS_SZ_SHIFT 20 +#define ALX_TRD_RS_NONCE_OFS_MASK 0xFFFUL +#define ALX_TRD_RS_NONCE_OFS_SHIFT 8 +#define ALX_TRD_RS_SEQ_OFS_MASK 0xFFUL +#define ALX_TRD_RS_SEQ_OFS_SHIFT 0 + +#define ALX_TRD_SRV_IP4 0x1464 + +#define ALX_TRD_CLNT_EXTNL_IP4 0x1468 + +#define ALX_TRD_PORT 0x146C +#define ALX_TRD_PORT_CLNT_EXTNL_MASK 0xFFFFUL +#define ALX_TRD_PORT_CLNT_EXTNL_SHIFT 16 +#define ALX_TRD_PORT_SRV_MASK 0xFFFFUL +#define ALX_TRD_PORT_SRV_SHIFT 0 + +#define ALX_TRD_PREFIX 0x1470 + +#define ALX_TRD_BUBBLE_DA_IP4 0x1478 + +#define ALX_TRD_BUBBLE_DA_PORT 0x147C + +/* for B0 */ +#define ALX_IDLE_DECISN_TIMER 0x1474 +/* 1ms */ +#define ALX_IDLE_DECISN_TIMER_DEF 0x400 + + +#define ALX_MAC_CTRL 0x1480 +#define ALX_MAC_CTRL_FAST_PAUSE BIT(31) +#define ALX_MAC_CTRL_WOLSPED_SWEN BIT(30) +/* bit29: 1:legacy(hi5b), 0:marvl(lo5b)*/ +#define ALX_MAC_CTRL_MHASH_ALG_HI5B BIT(29) +#define ALX_MAC_CTRL_SPAUSE_EN BIT(28) +#define ALX_MAC_CTRL_DBG_EN BIT(27) +#define ALX_MAC_CTRL_BRD_EN BIT(26) +#define ALX_MAC_CTRL_MULTIALL_EN BIT(25) +#define ALX_MAC_CTRL_RX_XSUM_EN BIT(24) +#define ALX_MAC_CTRL_THUGE BIT(23) +#define ALX_MAC_CTRL_MBOF BIT(22) +#define ALX_MAC_CTRL_SPEED_MASK 0x3UL +#define ALX_MAC_CTRL_SPEED_SHIFT 20 +#define ALX_MAC_CTRL_SPEED_10_100 1 +#define ALX_MAC_CTRL_SPEED_1000 2 +#define ALX_MAC_CTRL_SIMR BIT(19) +#define ALX_MAC_CTRL_SSTCT BIT(17) +#define ALX_MAC_CTRL_TPAUSE BIT(16) +#define ALX_MAC_CTRL_PROMISC_EN BIT(15) +#define ALX_MAC_CTRL_VLANSTRIP BIT(14) +#define ALX_MAC_CTRL_PRMBLEN_MASK 0xFUL +#define ALX_MAC_CTRL_PRMBLEN_SHIFT 10 +#define ALX_MAC_CTRL_RHUGE_EN BIT(9) +#define ALX_MAC_CTRL_FLCHK BIT(8) +#define ALX_MAC_CTRL_PCRCE BIT(7) +#define ALX_MAC_CTRL_CRCE BIT(6) +#define ALX_MAC_CTRL_FULLD BIT(5) +#define ALX_MAC_CTRL_LPBACK_EN BIT(4) +#define ALX_MAC_CTRL_RXFC_EN BIT(3) +#define ALX_MAC_CTRL_TXFC_EN BIT(2) +#define ALX_MAC_CTRL_RX_EN BIT(1) +#define ALX_MAC_CTRL_TX_EN BIT(0) + +#define ALX_GAP 0x1484 +#define ALX_GAP_IPGR2_MASK 0x7FUL +#define ALX_GAP_IPGR2_SHIFT 24 +#define ALX_GAP_IPGR1_MASK 0x7FUL +#define ALX_GAP_IPGR1_SHIFT 16 +#define ALX_GAP_MIN_IFG_MASK 0xFFUL +#define ALX_GAP_MIN_IFG_SHIFT 8 +#define ALX_GAP_IPGT_MASK 0x7FUL +#define ALX_GAP_IPGT_SHIFT 0 + +#define ALX_STAD0 0x1488 +#define ALX_STAD1 0x148C + +#define ALX_HASH_TBL0 0x1490 +#define ALX_HASH_TBL1 0x1494 + +#define ALX_HALFD 0x1498 +#define ALX_HALFD_JAM_IPG_MASK 0xFUL +#define ALX_HALFD_JAM_IPG_SHIFT 24 +#define ALX_HALFD_ABEBT_MASK 0xFUL +#define ALX_HALFD_ABEBT_SHIFT 20 +#define ALX_HALFD_ABEBE BIT(19) +#define ALX_HALFD_BPNB BIT(18) +#define ALX_HALFD_NOBO BIT(17) +#define ALX_HALFD_EDXSDFR BIT(16) +#define ALX_HALFD_RETRY_MASK 0xFUL +#define ALX_HALFD_RETRY_SHIFT 12 +#define ALX_HALFD_LCOL_MASK 0x3FFUL +#define ALX_HALFD_LCOL_SHIFT 0 + +#define ALX_MTU 0x149C +#define ALX_MTU_JUMBO_TH 1514 +#define ALX_MTU_STD_ALGN 1536 +#define ALX_MTU_MIN 64 + +#define ALX_SRAM0 0x1500 +#define ALX_SRAM_RFD_TAIL_ADDR_MASK 0xFFFUL +#define ALX_SRAM_RFD_TAIL_ADDR_SHIFT 16 +#define ALX_SRAM_RFD_HEAD_ADDR_MASK 0xFFFUL +#define ALX_SRAM_RFD_HEAD_ADDR_SHIFT 0 + +#define ALX_SRAM1 0x1510 +#define ALX_SRAM_RFD_LEN_MASK 0xFFFUL +#define ALX_SRAM_RFD_LEN_SHIFT 0 + +#define ALX_SRAM2 0x1518 +#define ALX_SRAM_TRD_TAIL_ADDR_MASK 0xFFFUL +#define ALX_SRAM_TRD_TAIL_ADDR_SHIFT 16 +#define ALX_SRMA_TRD_HEAD_ADDR_MASK 0xFFFUL +#define ALX_SRAM_TRD_HEAD_ADDR_SHIFT 0 + +#define ALX_SRAM3 0x151C +#define ALX_SRAM_TRD_LEN_MASK 0xFFFUL +#define ALX_SRAM_TRD_LEN_SHIFT 0 + +#define ALX_SRAM4 0x1520 +#define ALX_SRAM_RXF_TAIL_ADDR_MASK 0xFFFUL +#define ALX_SRAM_RXF_TAIL_ADDR_SHIFT 16 +#define ALX_SRAM_RXF_HEAD_ADDR_MASK 0xFFFUL +#define ALX_SRAM_RXF_HEAD_ADDR_SHIFT 0 + +#define ALX_SRAM5 0x1524 +#define ALX_SRAM_RXF_LEN_MASK 0xFFFUL +#define ALX_SRAM_RXF_LEN_SHIFT 0 +#define ALX_SRAM_RXF_LEN_8K (8*1024) + +#define ALX_SRAM6 0x1528 +#define ALX_SRAM_TXF_TAIL_ADDR_MASK 0xFFFUL +#define ALX_SRAM_TXF_TAIL_ADDR_SHIFT 16 +#define ALX_SRAM_TXF_HEAD_ADDR_MASK 0xFFFUL +#define ALX_SRAM_TXF_HEAD_ADDR_SHIFT 0 + +#define ALX_SRAM7 0x152C +#define ALX_SRAM_TXF_LEN_MASK 0xFFFUL +#define ALX_SRAM_TXF_LEN_SHIFT 0 + +#define ALX_SRAM8 0x1530 +#define ALX_SRAM_PATTERN_ADDR_MASK 0xFFFUL +#define ALX_SRAM_PATTERN_ADDR_SHIFT 16 +#define ALX_SRAM_TSO_ADDR_MASK 0xFFFUL +#define ALX_SRAM_TSO_ADDR_SHIFT 0 + +#define ALX_SRAM9 0x1534 +#define ALX_SRAM_LOAD_PTR BIT(0) + +#define ALX_RX_BASE_ADDR_HI 0x1540 + +#define ALX_TX_BASE_ADDR_HI 0x1544 + +#define ALX_RFD_ADDR_LO 0x1550 +#define ALX_RFD_RING_SZ 0x1560 +#define ALX_RFD_BUF_SZ 0x1564 +#define ALX_RFD_BUF_SZ_MASK 0xFFFFUL +#define ALX_RFD_BUF_SZ_SHIFT 0 + +#define ALX_RRD_ADDR_LO 0x1568 +#define ALX_RRD_RING_SZ 0x1578 +#define ALX_RRD_RING_SZ_MASK 0xFFFUL +#define ALX_RRD_RING_SZ_SHIFT 0 + +/* pri3: highest, pri0: lowest */ +#define ALX_TPD_PRI3_ADDR_LO 0x14E4 +#define ALX_TPD_PRI2_ADDR_LO 0x14E0 +#define ALX_TPD_PRI1_ADDR_LO 0x157C +#define ALX_TPD_PRI0_ADDR_LO 0x1580 + +/* producer index is 16bit */ +#define ALX_TPD_PRI3_PIDX 0x1618 +#define ALX_TPD_PRI2_PIDX 0x161A +#define ALX_TPD_PRI1_PIDX 0x15F0 +#define ALX_TPD_PRI0_PIDX 0x15F2 + +/* consumer index is 16bit */ +#define ALX_TPD_PRI3_CIDX 0x161C +#define ALX_TPD_PRI2_CIDX 0x161E +#define ALX_TPD_PRI1_CIDX 0x15F4 +#define ALX_TPD_PRI0_CIDX 0x15F6 + +#define ALX_TPD_RING_SZ 0x1584 +#define ALX_TPD_RING_SZ_MASK 0xFFFFUL +#define ALX_TPD_RING_SZ_SHIFT 0 + +#define ALX_CMB_ADDR_LO 0x1588 + +#define ALX_TXQ0 0x1590 +#define ALX_TXQ0_TXF_BURST_PREF_MASK 0xFFFFUL +#define ALX_TXQ0_TXF_BURST_PREF_SHIFT 16 +#define ALX_TXQ_TXF_BURST_PREF_DEF 0x200 +#define ALX_TXQ0_PEDING_CLR BIT(8) +#define ALX_TXQ0_LSO_8023_EN BIT(7) +#define ALX_TXQ0_MODE_ENHANCE BIT(6) +#define ALX_TXQ0_EN BIT(5) +#define ALX_TXQ0_SUPT_IPOPT BIT(4) +#define ALX_TXQ0_TPD_BURSTPREF_MASK 0xFUL +#define ALX_TXQ0_TPD_BURSTPREF_SHIFT 0 +#define ALX_TXQ_TPD_BURSTPREF_DEF 5 + +#define ALX_TXQ1 0x1594 +/* bit11: drop large packet, len > (rfd buf) */ +#define ALX_TXQ1_ERRLGPKT_DROP_EN BIT(11) +/* bit[9:0]: 8bytes unit */ +#define ALX_TXQ1_JUMBO_TSOTHR_MASK 0x7FFUL +#define ALX_TXQ1_JUMBO_TSOTHR_SHIFT 0 +#define ALX_TXQ1_JUMBO_TSO_TH (7*1024) + +/* L1 entrance control */ +#define ALX_TXQ2 0x1598 +#define ALX_TXQ2_BURST_EN BIT(31) +#define ALX_TXQ2_BURST_HI_WM_MASK 0xFFFUL +#define ALX_TXQ2_BURST_HI_WM_SHIFT 16 +#define ALX_TXQ2_BURST_LO_WM_MASK 0xFFFUL +#define ALX_TXQ2_BURST_LO_WM_SHIFT 0 + +#define ALX_RXQ0 0x15A0 +#define ALX_RXQ0_EN BIT(31) +#define ALX_RXQ0_CUT_THRU_EN BIT(30) +#define ALX_RXQ0_RSS_HASH_EN BIT(29) +/* bit28: 0:goto Q0, 1:as table */ +#define ALX_RXQ0_NON_IP_QTBL BIT(28) +#define ALX_RXQ0_RSS_MODE_MASK 0x3UL +#define ALX_RXQ0_RSS_MODE_SHIFT 26 +#define ALX_RXQ0_RSS_MODE_DIS 0 +#define ALX_RXQ0_RSS_MODE_SQSI 1 +#define ALX_RXQ0_RSS_MODE_MQSI 2 +#define ALX_RXQ0_RSS_MODE_MQMI 3 +#define ALX_RXQ0_NUM_RFD_PREF_MASK 0x3FUL +#define ALX_RXQ0_NUM_RFD_PREF_SHIFT 20 +#define ALX_RXQ0_NUM_RFD_PREF_DEF 8 +#define ALX_RXQ0_IDT_TBL_SIZE_MASK 0x1FFUL +#define ALX_RXQ0_IDT_TBL_SIZE_SHIFT 8 +#define ALX_RXQ0_IDT_TBL_SIZE_DEF 0x100 +#define ALX_RXQ0_IPV6_PARSE_EN BIT(7) +#define ALX_RXQ0_RSS_HSTYP_MASK 0xFUL +#define ALX_RXQ0_RSS_HSTYP_SHIFT 2 +#define ALX_RXQ0_RSS_HSTYP_IPV6_TCP_EN BIT(5) +#define ALX_RXQ0_RSS_HSTYP_IPV6_EN BIT(4) +#define ALX_RXQ0_RSS_HSTYP_IPV4_TCP_EN BIT(3) +#define ALX_RXQ0_RSS_HSTYP_IPV4_EN BIT(2) +#define ALX_RXQ0_RSS_HSTYP_ALL (\ + ALX_RXQ0_RSS_HSTYP_IPV6_TCP_EN |\ + ALX_RXQ0_RSS_HSTYP_IPV4_TCP_EN |\ + ALX_RXQ0_RSS_HSTYP_IPV6_EN |\ + ALX_RXQ0_RSS_HSTYP_IPV4_EN) +#define ALX_RXQ0_ASPM_THRESH_MASK 0x3UL +#define ALX_RXQ0_ASPM_THRESH_SHIFT 0 +#define ALX_RXQ0_ASPM_THRESH_NO 0 +#define ALX_RXQ0_ASPM_THRESH_1M 1 +#define ALX_RXQ0_ASPM_THRESH_10M 2 +#define ALX_RXQ0_ASPM_THRESH_100M 3 + +#define ALX_RXQ1 0x15A4 +/* 32bytes unit */ +#define ALX_RXQ1_JUMBO_LKAH_MASK 0xFUL +#define ALX_RXQ1_JUMBO_LKAH_SHIFT 12 +#define ALX_RXQ1_RFD_PREF_DOWN_MASK 0x3FUL +#define ALX_RXQ1_RFD_PREF_DOWN_SHIFT 6 +#define ALX_RXQ1_RFD_PREF_UP_MASK 0x3FUL +#define ALX_RXQ1_RFD_PREF_UP_SHIFT 0 + +#define ALX_RXQ2 0x15A8 +/* XOFF: USED SRAM LOWER THAN IT, THEN NOTIFY THE PEER TO SEND AGAIN */ +#define ALX_RXQ2_RXF_XOFF_THRESH_MASK 0xFFFUL +#define ALX_RXQ2_RXF_XOFF_THRESH_SHIFT 16 +#define ALX_RXQ2_RXF_XON_THRESH_MASK 0xFFFUL +#define ALX_RXQ2_RXF_XON_THRESH_SHIFT 0 +/* Size = tx-packet(1522) + IPG(12) + SOF(8) + 64(Pause) + IPG(12) + SOF(8) + + * rx-packet(1522) + delay-of-link(64) + * = 3212. + */ +#define ALX_RXQ2_RXF_FLOW_CTRL_RSVD 3212 + +#define ALX_RXQ3 0x15AC +#define ALX_RXQ3_RXD_TIMER_MASK 0x7FFFUL +#define ALX_RXQ3_RXD_TIMER_SHIFT 16 +/* 8bytes unit */ +#define ALX_RXQ3_RXD_THRESH_MASK 0xFFFUL +#define ALX_RXQ3_RXD_THRESH_SHIFT 0 + +#define ALX_DMA 0x15C0 +#define ALX_DMA_SMB_NOW BIT(31) +#define ALX_DMA_WPEND_CLR BIT(30) +#define ALX_DMA_RPEND_CLR BIT(29) +#define ALX_DMA_WSRAM_RDCTRL BIT(28) +#define ALX_DMA_RCHNL_SEL_MASK 0x3UL +#define ALX_DMA_RCHNL_SEL_SHIFT 26 +#define ALX_DMA_RCHNL_SEL_1 0 +#define ALX_DMA_RCHNL_SEL_2 1 +#define ALX_DMA_RCHNL_SEL_3 2 +#define ALX_DMA_RCHNL_SEL_4 3 +#define ALX_DMA_SMB_EN BIT(21) +#define ALX_DMA_WDLY_CNT_MASK 0xFUL +#define ALX_DMA_WDLY_CNT_SHIFT 16 +#define ALX_DMA_WDLY_CNT_DEF 4 +#define ALX_DMA_RDLY_CNT_MASK 0x1FUL +#define ALX_DMA_RDLY_CNT_SHIFT 11 +#define ALX_DMA_RDLY_CNT_DEF 15 +/* bit10: 0:tpd with pri, 1: data */ +#define ALX_DMA_RREQ_PRI_DATA BIT(10) +#define ALX_DMA_WREQ_BLEN_MASK 0x7UL +#define ALX_DMA_WREQ_BLEN_SHIFT 7 +#define ALX_DMA_RREQ_BLEN_MASK 0x7UL +#define ALX_DMA_RREQ_BLEN_SHIFT 4 +#define ALX_DMA_PENDING_AUTO_RST BIT(3) +#define ALX_DMA_RORDER_MODE_MASK 0x7UL +#define ALX_DMA_RORDER_MODE_SHIFT 0 +#define ALX_DMA_RORDER_MODE_OUT 4 +#define ALX_DMA_RORDER_MODE_ENHANCE 2 +#define ALX_DMA_RORDER_MODE_IN 1 + +#define ALX_WOL0 0x14A0 +#define ALX_WOL0_PT7_MATCH BIT(31) +#define ALX_WOL0_PT6_MATCH BIT(30) +#define ALX_WOL0_PT5_MATCH BIT(29) +#define ALX_WOL0_PT4_MATCH BIT(28) +#define ALX_WOL0_PT3_MATCH BIT(27) +#define ALX_WOL0_PT2_MATCH BIT(26) +#define ALX_WOL0_PT1_MATCH BIT(25) +#define ALX_WOL0_PT0_MATCH BIT(24) +#define ALX_WOL0_PT7_EN BIT(23) +#define ALX_WOL0_PT6_EN BIT(22) +#define ALX_WOL0_PT5_EN BIT(21) +#define ALX_WOL0_PT4_EN BIT(20) +#define ALX_WOL0_PT3_EN BIT(19) +#define ALX_WOL0_PT2_EN BIT(18) +#define ALX_WOL0_PT1_EN BIT(17) +#define ALX_WOL0_PT0_EN BIT(16) +#define ALX_WOL0_IPV4_SYNC_EVT BIT(14) +#define ALX_WOL0_IPV6_SYNC_EVT BIT(13) +#define ALX_WOL0_LINK_EVT BIT(10) +#define ALX_WOL0_MAGIC_EVT BIT(9) +#define ALX_WOL0_PATTERN_EVT BIT(8) +#define ALX_WOL0_SWOI_EVT BIT(7) +#define ALX_WOL0_OOB_EN BIT(6) +#define ALX_WOL0_PME_LINK BIT(5) +#define ALX_WOL0_LINK_EN BIT(4) +#define ALX_WOL0_PME_MAGIC_EN BIT(3) +#define ALX_WOL0_MAGIC_EN BIT(2) +#define ALX_WOL0_PME_PATTERN_EN BIT(1) +#define ALX_WOL0_PATTERN_EN BIT(0) + +#define ALX_WOL1 0x14A4 +#define ALX_WOL1_PT3_LEN_MASK 0xFFUL +#define ALX_WOL1_PT3_LEN_SHIFT 24 +#define ALX_WOL1_PT2_LEN_MASK 0xFFUL +#define ALX_WOL1_PT2_LEN_SHIFT 16 +#define ALX_WOL1_PT1_LEN_MASK 0xFFUL +#define ALX_WOL1_PT1_LEN_SHIFT 8 +#define ALX_WOL1_PT0_LEN_MASK 0xFFUL +#define ALX_WOL1_PT0_LEN_SHIFT 0 + +#define ALX_WOL2 0x14A8 +#define ALX_WOL2_PT7_LEN_MASK 0xFFUL +#define ALX_WOL2_PT7_LEN_SHIFT 24 +#define ALX_WOL2_PT6_LEN_MASK 0xFFUL +#define ALX_WOL2_PT6_LEN_SHIFT 16 +#define ALX_WOL2_PT5_LEN_MASK 0xFFUL +#define ALX_WOL2_PT5_LEN_SHIFT 8 +#define ALX_WOL2_PT4_LEN_MASK 0xFFUL +#define ALX_WOL2_PT4_LEN_SHIFT 0 + +#define ALX_RFD_PIDX 0x15E0 +#define ALX_RFD_PIDX_MASK 0xFFFUL +#define ALX_RFD_PIDX_SHIFT 0 + +#define ALX_RFD_CIDX 0x15F8 +#define ALX_RFD_CIDX_MASK 0xFFFUL +#define ALX_RFD_CIDX_SHIFT 0 + +/* MIB */ +#define ALX_MIB_BASE 0x1700 +#define ALX_MIB_RX_OK (ALX_MIB_BASE + 0) +#define ALX_MIB_RX_BC (ALX_MIB_BASE + 4) +#define ALX_MIB_RX_MC (ALX_MIB_BASE + 8) +#define ALX_MIB_RX_PAUSE (ALX_MIB_BASE + 12) +#define ALX_MIB_RX_CTRL (ALX_MIB_BASE + 16) +#define ALX_MIB_RX_FCS (ALX_MIB_BASE + 20) +#define ALX_MIB_RX_LENERR (ALX_MIB_BASE + 24) +#define ALX_MIB_RX_BYTCNT (ALX_MIB_BASE + 28) +#define ALX_MIB_RX_RUNT (ALX_MIB_BASE + 32) +#define ALX_MIB_RX_FRAGMENT (ALX_MIB_BASE + 36) +#define ALX_MIB_RX_64B (ALX_MIB_BASE + 40) +#define ALX_MIB_RX_127B (ALX_MIB_BASE + 44) +#define ALX_MIB_RX_255B (ALX_MIB_BASE + 48) +#define ALX_MIB_RX_511B (ALX_MIB_BASE + 52) +#define ALX_MIB_RX_1023B (ALX_MIB_BASE + 56) +#define ALX_MIB_RX_1518B (ALX_MIB_BASE + 60) +#define ALX_MIB_RX_SZMAX (ALX_MIB_BASE + 64) +#define ALX_MIB_RX_OVSZ (ALX_MIB_BASE + 68) +#define ALX_MIB_RXF_OV (ALX_MIB_BASE + 72) +#define ALX_MIB_RRD_OV (ALX_MIB_BASE + 76) +#define ALX_MIB_RX_ALIGN (ALX_MIB_BASE + 80) +#define ALX_MIB_RX_BCCNT (ALX_MIB_BASE + 84) +#define ALX_MIB_RX_MCCNT (ALX_MIB_BASE + 88) +#define ALX_MIB_RX_ERRADDR (ALX_MIB_BASE + 92) +#define ALX_MIB_TX_OK (ALX_MIB_BASE + 96) +#define ALX_MIB_TX_BC (ALX_MIB_BASE + 100) +#define ALX_MIB_TX_MC (ALX_MIB_BASE + 104) +#define ALX_MIB_TX_PAUSE (ALX_MIB_BASE + 108) +#define ALX_MIB_TX_EXCDEFER (ALX_MIB_BASE + 112) +#define ALX_MIB_TX_CTRL (ALX_MIB_BASE + 116) +#define ALX_MIB_TX_DEFER (ALX_MIB_BASE + 120) +#define ALX_MIB_TX_BYTCNT (ALX_MIB_BASE + 124) +#define ALX_MIB_TX_64B (ALX_MIB_BASE + 128) +#define ALX_MIB_TX_127B (ALX_MIB_BASE + 132) +#define ALX_MIB_TX_255B (ALX_MIB_BASE + 136) +#define ALX_MIB_TX_511B (ALX_MIB_BASE + 140) +#define ALX_MIB_TX_1023B (ALX_MIB_BASE + 144) +#define ALX_MIB_TX_1518B (ALX_MIB_BASE + 148) +#define ALX_MIB_TX_SZMAX (ALX_MIB_BASE + 152) +#define ALX_MIB_TX_1COL (ALX_MIB_BASE + 156) +#define ALX_MIB_TX_2COL (ALX_MIB_BASE + 160) +#define ALX_MIB_TX_LATCOL (ALX_MIB_BASE + 164) +#define ALX_MIB_TX_ABRTCOL (ALX_MIB_BASE + 168) +#define ALX_MIB_TX_UNDRUN (ALX_MIB_BASE + 172) +#define ALX_MIB_TX_TRDBEOP (ALX_MIB_BASE + 176) +#define ALX_MIB_TX_LENERR (ALX_MIB_BASE + 180) +#define ALX_MIB_TX_TRUNC (ALX_MIB_BASE + 184) +#define ALX_MIB_TX_BCCNT (ALX_MIB_BASE + 188) +#define ALX_MIB_TX_MCCNT (ALX_MIB_BASE + 192) +#define ALX_MIB_UPDATE (ALX_MIB_BASE + 196) + +#define ALX_RX_STATS_BIN ALX_MIB_RX_OK +#define ALX_RX_STATS_END ALX_MIB_RX_ERRADDR +#define ALX_TX_STATS_BIN ALX_MIB_TX_OK +#define ALX_TX_STATS_END ALX_MIB_TX_MCCNT + +#define ALX_ISR 0x1600 +#define ALX_ISR_DIS BIT(31) +#define ALX_ISR_RX_Q7 BIT(30) +#define ALX_ISR_RX_Q6 BIT(29) +#define ALX_ISR_RX_Q5 BIT(28) +#define ALX_ISR_RX_Q4 BIT(27) +#define ALX_ISR_PCIE_LNKDOWN BIT(26) +#define ALX_ISR_PCIE_CERR BIT(25) +#define ALX_ISR_PCIE_NFERR BIT(24) +#define ALX_ISR_PCIE_FERR BIT(23) +#define ALX_ISR_PCIE_UR BIT(22) +#define ALX_ISR_MAC_TX BIT(21) +#define ALX_ISR_MAC_RX BIT(20) +#define ALX_ISR_RX_Q3 BIT(19) +#define ALX_ISR_RX_Q2 BIT(18) +#define ALX_ISR_RX_Q1 BIT(17) +#define ALX_ISR_RX_Q0 BIT(16) +#define ALX_ISR_TX_Q0 BIT(15) +#define ALX_ISR_TXQ_TO BIT(14) +#define ALX_ISR_PHY_LPW BIT(13) +#define ALX_ISR_PHY BIT(12) +#define ALX_ISR_TX_CREDIT BIT(11) +#define ALX_ISR_DMAW BIT(10) +#define ALX_ISR_DMAR BIT(9) +#define ALX_ISR_TXF_UR BIT(8) +#define ALX_ISR_TX_Q3 BIT(7) +#define ALX_ISR_TX_Q2 BIT(6) +#define ALX_ISR_TX_Q1 BIT(5) +#define ALX_ISR_RFD_UR BIT(4) +#define ALX_ISR_RXF_OV BIT(3) +#define ALX_ISR_MANU BIT(2) +#define ALX_ISR_TIMER BIT(1) +#define ALX_ISR_SMB BIT(0) + +#define ALX_IMR 0x1604 + +/* re-send assert msg if SW no response */ +#define ALX_INT_RETRIG 0x1608 +#define ALX_INT_RETRIG_TIMER_MASK 0xFFFFUL +#define ALX_INT_RETRIG_TIMER_SHIFT 0 +/* 40ms */ +#define ALX_INT_RETRIG_TO 20000 + +/* re-send deassert msg if SW no response */ +#define ALX_INT_DEASST_TIMER 0x1614 + +/* reg1620 used for sleep status */ +#define ALX_PATTERN_MASK 0x1620 +#define ALX_PATTERN_MASK_LEN 128 + + +#define ALX_FLT1_SRC_IP0 0x1A00 +#define ALX_FLT1_SRC_IP1 0x1A04 +#define ALX_FLT1_SRC_IP2 0x1A08 +#define ALX_FLT1_SRC_IP3 0x1A0C +#define ALX_FLT1_DST_IP0 0x1A10 +#define ALX_FLT1_DST_IP1 0x1A14 +#define ALX_FLT1_DST_IP2 0x1A18 +#define ALX_FLT1_DST_IP3 0x1A1C +#define ALX_FLT1_PORT 0x1A20 +#define ALX_FLT1_PORT_DST_MASK 0xFFFFUL +#define ALX_FLT1_PORT_DST_SHIFT 16 +#define ALX_FLT1_PORT_SRC_MASK 0xFFFFUL +#define ALX_FLT1_PORT_SRC_SHIFT 0 + +#define ALX_FLT2_SRC_IP0 0x1A24 +#define ALX_FLT2_SRC_IP1 0x1A28 +#define ALX_FLT2_SRC_IP2 0x1A2C +#define ALX_FLT2_SRC_IP3 0x1A30 +#define ALX_FLT2_DST_IP0 0x1A34 +#define ALX_FLT2_DST_IP1 0x1A38 +#define ALX_FLT2_DST_IP2 0x1A40 +#define ALX_FLT2_DST_IP3 0x1A44 +#define ALX_FLT2_PORT 0x1A48 +#define ALX_FLT2_PORT_DST_MASK 0xFFFFUL +#define ALX_FLT2_PORT_DST_SHIFT 16 +#define ALX_FLT2_PORT_SRC_MASK 0xFFFFUL +#define ALX_FLT2_PORT_SRC_SHIFT 0 + +#define ALX_FLT3_SRC_IP0 0x1A4C +#define ALX_FLT3_SRC_IP1 0x1A50 +#define ALX_FLT3_SRC_IP2 0x1A54 +#define ALX_FLT3_SRC_IP3 0x1A58 +#define ALX_FLT3_DST_IP0 0x1A5C +#define ALX_FLT3_DST_IP1 0x1A60 +#define ALX_FLT3_DST_IP2 0x1A64 +#define ALX_FLT3_DST_IP3 0x1A68 +#define ALX_FLT3_PORT 0x1A6C +#define ALX_FLT3_PORT_DST_MASK 0xFFFFUL +#define ALX_FLT3_PORT_DST_SHIFT 16 +#define ALX_FLT3_PORT_SRC_MASK 0xFFFFUL +#define ALX_FLT3_PORT_SRC_SHIFT 0 + +#define ALX_FLT4_SRC_IP0 0x1A70 +#define ALX_FLT4_SRC_IP1 0x1A74 +#define ALX_FLT4_SRC_IP2 0x1A78 +#define ALX_FLT4_SRC_IP3 0x1A7C +#define ALX_FLT4_DST_IP0 0x1A80 +#define ALX_FLT4_DST_IP1 0x1A84 +#define ALX_FLT4_DST_IP2 0x1A88 +#define ALX_FLT4_DST_IP3 0x1A8C +#define ALX_FLT4_PORT 0x1A90 +#define ALX_FLT4_PORT_DST_MASK 0xFFFFUL +#define ALX_FLT4_PORT_DST_SHIFT 16 +#define ALX_FLT4_PORT_SRC_MASK 0xFFFFUL +#define ALX_FLT4_PORT_SRC_SHIFT 0 + +#define ALX_FLT5_SRC_IP0 0x1A94 +#define ALX_FLT5_SRC_IP1 0x1A98 +#define ALX_FLT5_SRC_IP2 0x1A9C +#define ALX_FLT5_SRC_IP3 0x1AA0 +#define ALX_FLT5_DST_IP0 0x1AA4 +#define ALX_FLT5_DST_IP1 0x1AA8 +#define ALX_FLT5_DST_IP2 0x1AAC +#define ALX_FLT5_DST_IP3 0x1AB0 +#define ALX_FLT5_PORT 0x1AB4 +#define ALX_FLT5_PORT_DST_MASK 0xFFFFUL +#define ALX_FLT5_PORT_DST_SHIFT 16 +#define ALX_FLT5_PORT_SRC_MASK 0xFFFFUL +#define ALX_FLT5_PORT_SRC_SHIFT 0 + +#define ALX_FLT6_SRC_IP0 0x1AB8 +#define ALX_FLT6_SRC_IP1 0x1ABC +#define ALX_FLT6_SRC_IP2 0x1AC0 +#define ALX_FLT6_SRC_IP3 0x1AC8 +#define ALX_FLT6_DST_IP0 0x1620 +#define ALX_FLT6_DST_IP1 0x1624 +#define ALX_FLT6_DST_IP2 0x1628 +#define ALX_FLT6_DST_IP3 0x162C +#define ALX_FLT6_PORT 0x1630 +#define ALX_FLT6_PORT_DST_MASK 0xFFFFUL +#define ALX_FLT6_PORT_DST_SHIFT 16 +#define ALX_FLT6_PORT_SRC_MASK 0xFFFFUL +#define ALX_FLT6_PORT_SRC_SHIFT 0 + +#define ALX_FLTCTRL 0x1634 +#define ALX_FLTCTRL_PSTHR_TIMER_MASK 0xFFUL +#define ALX_FLTCTRL_PSTHR_TIMER_SHIFT 24 +#define ALX_FLTCTRL_CHK_DSTPRT6 BIT(23) +#define ALX_FLTCTRL_CHK_SRCPRT6 BIT(22) +#define ALX_FLTCTRL_CHK_DSTIP6 BIT(21) +#define ALX_FLTCTRL_CHK_SRCIP6 BIT(20) +#define ALX_FLTCTRL_CHK_DSTPRT5 BIT(19) +#define ALX_FLTCTRL_CHK_SRCPRT5 BIT(18) +#define ALX_FLTCTRL_CHK_DSTIP5 BIT(17) +#define ALX_FLTCTRL_CHK_SRCIP5 BIT(16) +#define ALX_FLTCTRL_CHK_DSTPRT4 BIT(15) +#define ALX_FLTCTRL_CHK_SRCPRT4 BIT(14) +#define ALX_FLTCTRL_CHK_DSTIP4 BIT(13) +#define ALX_FLTCTRL_CHK_SRCIP4 BIT(12) +#define ALX_FLTCTRL_CHK_DSTPRT3 BIT(11) +#define ALX_FLTCTRL_CHK_SRCPRT3 BIT(10) +#define ALX_FLTCTRL_CHK_DSTIP3 BIT(9) +#define ALX_FLTCTRL_CHK_SRCIP3 BIT(8) +#define ALX_FLTCTRL_CHK_DSTPRT2 BIT(7) +#define ALX_FLTCTRL_CHK_SRCPRT2 BIT(6) +#define ALX_FLTCTRL_CHK_DSTIP2 BIT(5) +#define ALX_FLTCTRL_CHK_SRCIP2 BIT(4) +#define ALX_FLTCTRL_CHK_DSTPRT1 BIT(3) +#define ALX_FLTCTRL_CHK_SRCPRT1 BIT(2) +#define ALX_FLTCTRL_CHK_DSTIP1 BIT(1) +#define ALX_FLTCTRL_CHK_SRCIP1 BIT(0) + +#define ALX_DROP_ALG1 0x1638 +#define ALX_DROP_ALG1_BWCHGVAL_MASK 0xFFFFFUL +#define ALX_DROP_ALG1_BWCHGVAL_SHIFT 12 +/* bit11: 0:3.125%, 1:6.25% */ +#define ALX_DROP_ALG1_BWCHGSCL_6 BIT(11) +#define ALX_DROP_ALG1_ASUR_LWQ_EN BIT(10) +#define ALX_DROP_ALG1_BWCHGVAL_EN BIT(9) +#define ALX_DROP_ALG1_BWCHGSCL_EN BIT(8) +#define ALX_DROP_ALG1_PSTHR_AUTO BIT(7) +#define ALX_DROP_ALG1_MIN_PSTHR_MASK 0x3UL +#define ALX_DROP_ALG1_MIN_PSTHR_SHIFT 5 +#define ALX_DROP_ALG1_MIN_PSTHR_1_16 0 +#define ALX_DROP_ALG1_MIN_PSTHR_1_8 1 +#define ALX_DROP_ALG1_MIN_PSTHR_1_4 2 +#define ALX_DROP_ALG1_MIN_PSTHR_1_2 3 +#define ALX_DROP_ALG1_PSCL_MASK 0x3UL +#define ALX_DROP_ALG1_PSCL_SHIFT 3 +#define ALX_DROP_ALG1_PSCL_1_4 0 +#define ALX_DROP_ALG1_PSCL_1_8 1 +#define ALX_DROP_ALG1_PSCL_1_16 2 +#define ALX_DROP_ALG1_PSCL_1_32 3 +#define ALX_DROP_ALG1_TIMESLOT_MASK 0x7UL +#define ALX_DROP_ALG1_TIMESLOT_SHIFT 0 +#define ALX_DROP_ALG1_TIMESLOT_4MS 0 +#define ALX_DROP_ALG1_TIMESLOT_8MS 1 +#define ALX_DROP_ALG1_TIMESLOT_16MS 2 +#define ALX_DROP_ALG1_TIMESLOT_32MS 3 +#define ALX_DROP_ALG1_TIMESLOT_64MS 4 +#define ALX_DROP_ALG1_TIMESLOT_128MS 5 +#define ALX_DROP_ALG1_TIMESLOT_256MS 6 +#define ALX_DROP_ALG1_TIMESLOT_512MS 7 + +#define ALX_DROP_ALG2 0x163C +#define ALX_DROP_ALG2_SMPLTIME_MASK 0xFUL +#define ALX_DROP_ALG2_SMPLTIME_SHIFT 24 +#define ALX_DROP_ALG2_LWQBW_MASK 0xFFFFFFUL +#define ALX_DROP_ALG2_LWQBW_SHIFT 0 + +#define ALX_SMB_TIMER 0x15C4 + +#define ALX_TINT_TPD_THRSHLD 0x15C8 + +#define ALX_TINT_TIMER 0x15CC + +#define ALX_CLK_GATE 0x1814 +/* bit[8:6]: for B0+ */ +#define ALX_CLK_GATE_125M_SW_DIS_CR BIT(8) +#define ALX_CLK_GATE_125M_SW_AZ BIT(7) +#define ALX_CLK_GATE_125M_SW_IDLE BIT(6) +#define ALX_CLK_GATE_RXMAC BIT(5) +#define ALX_CLK_GATE_TXMAC BIT(4) +#define ALX_CLK_GATE_RXQ BIT(3) +#define ALX_CLK_GATE_TXQ BIT(2) +#define ALX_CLK_GATE_DMAR BIT(1) +#define ALX_CLK_GATE_DMAW BIT(0) +#define ALX_CLK_GATE_ALL_A0 (\ + ALX_CLK_GATE_RXMAC |\ + ALX_CLK_GATE_TXMAC |\ + ALX_CLK_GATE_RXQ |\ + ALX_CLK_GATE_TXQ |\ + ALX_CLK_GATE_DMAR |\ + ALX_CLK_GATE_DMAW) +#define ALX_CLK_GATE_ALL_B0 (\ + ALX_CLK_GATE_ALL_A0) + +/* PORST affect */ +#define ALX_BTROM_CFG 0x1800 + +/* interop between drivers */ +#define ALX_DRV 0x1804 +#define ALX_DRV_PHY_AUTO BIT(28) +#define ALX_DRV_PHY_1000 BIT(27) +#define ALX_DRV_PHY_100 BIT(26) +#define ALX_DRV_PHY_10 BIT(25) +#define ALX_DRV_PHY_DUPLEX BIT(24) +/* bit23: adv Pause */ +#define ALX_DRV_PHY_PAUSE BIT(23) +/* bit22: adv Asym Pause */ +#define ALX_DRV_PHY_APAUSE BIT(22) +/* bit21: 1:en AZ */ +#define ALX_DRV_PHY_EEE BIT(21) +#define ALX_DRV_PHY_MASK 0xFFUL +#define ALX_DRV_PHY_SHIFT 21 +#define ALX_DRV_PHY_UNKNOWN 0 +#define ALX_DRV_DISABLE BIT(18) +#define ALX_DRV_WOLS5_EN BIT(17) +#define ALX_DRV_WOLS5_BIOS_EN BIT(16) +#define ALX_DRV_AZ_EN BIT(12) +#define ALX_DRV_WOLPATTERN_EN BIT(11) +#define ALX_DRV_WOLLINKUP_EN BIT(10) +#define ALX_DRV_WOLMAGIC_EN BIT(9) +#define ALX_DRV_WOLCAP_BIOS_EN BIT(8) +#define ALX_DRV_ASPM_SPD1000LMT_MASK 0x3UL +#define ALX_DRV_ASPM_SPD1000LMT_SHIFT 4 +#define ALX_DRV_ASPM_SPD1000LMT_100M 0 +#define ALX_DRV_ASPM_SPD1000LMT_NO 1 +#define ALX_DRV_ASPM_SPD1000LMT_1M 2 +#define ALX_DRV_ASPM_SPD1000LMT_10M 3 +#define ALX_DRV_ASPM_SPD100LMT_MASK 0x3UL +#define ALX_DRV_ASPM_SPD100LMT_SHIFT 2 +#define ALX_DRV_ASPM_SPD100LMT_1M 0 +#define ALX_DRV_ASPM_SPD100LMT_10M 1 +#define ALX_DRV_ASPM_SPD100LMT_100M 2 +#define ALX_DRV_ASPM_SPD100LMT_NO 3 +#define ALX_DRV_ASPM_SPD10LMT_MASK 0x3UL +#define ALX_DRV_ASPM_SPD10LMT_SHIFT 0 +#define ALX_DRV_ASPM_SPD10LMT_1M 0 +#define ALX_DRV_ASPM_SPD10LMT_10M 1 +#define ALX_DRV_ASPM_SPD10LMT_100M 2 +#define ALX_DRV_ASPM_SPD10LMT_NO 3 + +/* flag of phy inited */ +#define ALX_PHY_INITED 0x003F + +/* PERST affect */ +#define ALX_DRV_ERR1 0x1808 +#define ALX_DRV_ERR1_GEN BIT(31) +#define ALX_DRV_ERR1_NOR BIT(30) +#define ALX_DRV_ERR1_TRUNC BIT(29) +#define ALX_DRV_ERR1_RES BIT(28) +#define ALX_DRV_ERR1_INTFATAL BIT(27) +#define ALX_DRV_ERR1_TXQPEND BIT(26) +#define ALX_DRV_ERR1_DMAW BIT(25) +#define ALX_DRV_ERR1_DMAR BIT(24) +#define ALX_DRV_ERR1_PCIELNKDWN BIT(23) +#define ALX_DRV_ERR1_PKTSIZE BIT(22) +#define ALX_DRV_ERR1_FIFOFUL BIT(21) +#define ALX_DRV_ERR1_RFDUR BIT(20) +#define ALX_DRV_ERR1_RRDSI BIT(19) +#define ALX_DRV_ERR1_UPDATE BIT(18) + +#define ALX_DRV_ERR2 0x180C + +#define ALX_DBG_ADDR 0x1900 +#define ALX_DBG_DATA 0x1904 + +#define ALX_SYNC_IPV4_SA 0x1A00 +#define ALX_SYNC_IPV4_DA 0x1A04 + +#define ALX_SYNC_V4PORT 0x1A08 +#define ALX_SYNC_V4PORT_DST_MASK 0xFFFFUL +#define ALX_SYNC_V4PORT_DST_SHIFT 16 +#define ALX_SYNC_V4PORT_SRC_MASK 0xFFFFUL +#define ALX_SYNC_V4PORT_SRC_SHIFT 0 + +#define ALX_SYNC_IPV6_SA0 0x1A0C +#define ALX_SYNC_IPV6_SA1 0x1A10 +#define ALX_SYNC_IPV6_SA2 0x1A14 +#define ALX_SYNC_IPV6_SA3 0x1A18 +#define ALX_SYNC_IPV6_DA0 0x1A1C +#define ALX_SYNC_IPV6_DA1 0x1A20 +#define ALX_SYNC_IPV6_DA2 0x1A24 +#define ALX_SYNC_IPV6_DA3 0x1A28 + +#define ALX_SYNC_V6PORT 0x1A2C +#define ALX_SYNC_V6PORT_DST_MASK 0xFFFFUL +#define ALX_SYNC_V6PORT_DST_SHIFT 16 +#define ALX_SYNC_V6PORT_SRC_MASK 0xFFFFUL +#define ALX_SYNC_V6PORT_SRC_SHIFT 0 + +#define ALX_ARP_REMOTE_IPV4 0x1A30 +#define ALX_ARP_HOST_IPV4 0x1A34 +#define ALX_ARP_MAC0 0x1A38 +#define ALX_ARP_MAC1 0x1A3C + +#define ALX_1ST_REMOTE_IPV6_0 0x1A40 +#define ALX_1ST_REMOTE_IPV6_1 0x1A44 +#define ALX_1ST_REMOTE_IPV6_2 0x1A48 +#define ALX_1ST_REMOTE_IPV6_3 0x1A4C + +#define ALX_1ST_SN_IPV6_0 0x1A50 +#define ALX_1ST_SN_IPV6_1 0x1A54 +#define ALX_1ST_SN_IPV6_2 0x1A58 +#define ALX_1ST_SN_IPV6_3 0x1A5C + +#define ALX_1ST_TAR_IPV6_1_0 0x1A60 +#define ALX_1ST_TAR_IPV6_1_1 0x1A64 +#define ALX_1ST_TAR_IPV6_1_2 0x1A68 +#define ALX_1ST_TAR_IPV6_1_3 0x1A6C +#define ALX_1ST_TAR_IPV6_2_0 0x1A70 +#define ALX_1ST_TAR_IPV6_2_1 0x1A74 +#define ALX_1ST_TAR_IPV6_2_2 0x1A78 +#define ALX_1ST_TAR_IPV6_2_3 0x1A7C + +#define ALX_2ND_REMOTE_IPV6_0 0x1A80 +#define ALX_2ND_REMOTE_IPV6_1 0x1A84 +#define ALX_2ND_REMOTE_IPV6_2 0x1A88 +#define ALX_2ND_REMOTE_IPV6_3 0x1A8C + +#define ALX_2ND_SN_IPV6_0 0x1A90 +#define ALX_2ND_SN_IPV6_1 0x1A94 +#define ALX_2ND_SN_IPV6_2 0x1A98 +#define ALX_2ND_SN_IPV6_3 0x1A9C + +#define ALX_2ND_TAR_IPV6_1_0 0x1AA0 +#define ALX_2ND_TAR_IPV6_1_1 0x1AA4 +#define ALX_2ND_TAR_IPV6_1_2 0x1AA8 +#define ALX_2ND_TAR_IPV6_1_3 0x1AAC +#define ALX_2ND_TAR_IPV6_2_0 0x1AB0 +#define ALX_2ND_TAR_IPV6_2_1 0x1AB4 +#define ALX_2ND_TAR_IPV6_2_2 0x1AB8 +#define ALX_2ND_TAR_IPV6_2_3 0x1ABC + +#define ALX_1ST_NS_MAC0 0x1AC0 +#define ALX_1ST_NS_MAC1 0x1AC4 + +#define ALX_2ND_NS_MAC0 0x1AC8 +#define ALX_2ND_NS_MAC1 0x1ACC + +#define ALX_PMOFLD 0x144C +/* bit[11:10]: for B0+ */ +#define ALX_PMOFLD_ECMA_IGNR_FRG_SSSR BIT(11) +#define ALX_PMOFLD_ARP_CNFLCT_WAKEUP BIT(10) +#define ALX_PMOFLD_MULTI_SOLD BIT(9) +#define ALX_PMOFLD_ICMP_XSUM BIT(8) +#define ALX_PMOFLD_GARP_REPLY BIT(7) +#define ALX_PMOFLD_SYNCV6_ANY BIT(6) +#define ALX_PMOFLD_SYNCV4_ANY BIT(5) +#define ALX_PMOFLD_BY_HW BIT(4) +#define ALX_PMOFLD_NS_EN BIT(3) +#define ALX_PMOFLD_ARP_EN BIT(2) +#define ALX_PMOFLD_SYNCV6_EN BIT(1) +#define ALX_PMOFLD_SYNCV4_EN BIT(0) + +#define ALX_RSS_KEY0 0x14B0 +#define ALX_RSS_KEY1 0x14B4 +#define ALX_RSS_KEY2 0x14B8 +#define ALX_RSS_KEY3 0x14BC +#define ALX_RSS_KEY4 0x14C0 +#define ALX_RSS_KEY5 0x14C4 +#define ALX_RSS_KEY6 0x14C8 +#define ALX_RSS_KEY7 0x14CC +#define ALX_RSS_KEY8 0x14D0 +#define ALX_RSS_KEY9 0x14D4 + +#define ALX_RSS_IDT_TBL0 0x1B00 +#define ALX_RSS_IDT_TBL1 0x1B04 +#define ALX_RSS_IDT_TBL2 0x1B08 +#define ALX_RSS_IDT_TBL3 0x1B0C +#define ALX_RSS_IDT_TBL4 0x1B10 +#define ALX_RSS_IDT_TBL5 0x1B14 +#define ALX_RSS_IDT_TBL6 0x1B18 +#define ALX_RSS_IDT_TBL7 0x1B1C +#define ALX_RSS_IDT_TBL8 0x1B20 +#define ALX_RSS_IDT_TBL9 0x1B24 +#define ALX_RSS_IDT_TBL10 0x1B28 +#define ALX_RSS_IDT_TBL11 0x1B2C +#define ALX_RSS_IDT_TBL12 0x1B30 +#define ALX_RSS_IDT_TBL13 0x1B34 +#define ALX_RSS_IDT_TBL14 0x1B38 +#define ALX_RSS_IDT_TBL15 0x1B3C +#define ALX_RSS_IDT_TBL16 0x1B40 +#define ALX_RSS_IDT_TBL17 0x1B44 +#define ALX_RSS_IDT_TBL18 0x1B48 +#define ALX_RSS_IDT_TBL19 0x1B4C +#define ALX_RSS_IDT_TBL20 0x1B50 +#define ALX_RSS_IDT_TBL21 0x1B54 +#define ALX_RSS_IDT_TBL22 0x1B58 +#define ALX_RSS_IDT_TBL23 0x1B5C +#define ALX_RSS_IDT_TBL24 0x1B60 +#define ALX_RSS_IDT_TBL25 0x1B64 +#define ALX_RSS_IDT_TBL26 0x1B68 +#define ALX_RSS_IDT_TBL27 0x1B6C +#define ALX_RSS_IDT_TBL28 0x1B70 +#define ALX_RSS_IDT_TBL29 0x1B74 +#define ALX_RSS_IDT_TBL30 0x1B78 +#define ALX_RSS_IDT_TBL31 0x1B7C + +#define ALX_RSS_HASH_VAL 0x15B0 +#define ALX_RSS_HASH_FLAG 0x15B4 + +#define ALX_RSS_BASE_CPU_NUM 0x15B8 + +#define ALX_MSI_MAP_TBL1 0x15D0 +#define ALX_MSI_MAP_TBL1_ALERT_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_ALERT_SHIFT 28 +#define ALX_MSI_MAP_TBL1_TIMER_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_TIMER_SHIFT 24 +#define ALX_MSI_MAP_TBL1_TXQ1_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_TXQ1_SHIFT 20 +#define ALX_MSI_MAP_TBL1_TXQ0_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_TXQ0_SHIFT 16 +#define ALX_MSI_MAP_TBL1_RXQ3_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_RXQ3_SHIFT 12 +#define ALX_MSI_MAP_TBL1_RXQ2_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_RXQ2_SHIFT 8 +#define ALX_MSI_MAP_TBL1_RXQ1_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_RXQ1_SHIFT 4 +#define ALX_MSI_MAP_TBL1_RXQ0_MASK 0xFUL +#define ALX_MSI_MAP_TBL1_RXQ0_SHIFT 0 + +#define ALX_MSI_MAP_TBL2 0x15D8 +#define ALX_MSI_MAP_TBL2_PHY_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_PHY_SHIFT 28 +#define ALX_MSI_MAP_TBL2_SMB_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_SMB_SHIFT 24 +#define ALX_MSI_MAP_TBL2_TXQ3_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_TXQ3_SHIFT 20 +#define ALX_MSI_MAP_TBL2_TXQ2_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_TXQ2_SHIFT 16 +#define ALX_MSI_MAP_TBL2_RXQ7_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_RXQ7_SHIFT 12 +#define ALX_MSI_MAP_TBL2_RXQ6_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_RXQ6_SHIFT 8 +#define ALX_MSI_MAP_TBL2_RXQ5_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_RXQ5_SHIFT 4 +#define ALX_MSI_MAP_TBL2_RXQ4_MASK 0xFUL +#define ALX_MSI_MAP_TBL2_RXQ4_SHIFT 0 + +#define ALX_MSI_ID_MAP 0x15D4 +#define ALX_MSI_ID_MAP_RXQ7 BIT(30) +#define ALX_MSI_ID_MAP_RXQ6 BIT(29) +#define ALX_MSI_ID_MAP_RXQ5 BIT(28) +#define ALX_MSI_ID_MAP_RXQ4 BIT(27) +/* bit26: 0:common,1:timer */ +#define ALX_MSI_ID_MAP_PCIELNKDW BIT(26) +#define ALX_MSI_ID_MAP_PCIECERR BIT(25) +#define ALX_MSI_ID_MAP_PCIENFERR BIT(24) +#define ALX_MSI_ID_MAP_PCIEFERR BIT(23) +#define ALX_MSI_ID_MAP_PCIEUR BIT(22) +#define ALX_MSI_ID_MAP_MACTX BIT(21) +#define ALX_MSI_ID_MAP_MACRX BIT(20) +#define ALX_MSI_ID_MAP_RXQ3 BIT(19) +#define ALX_MSI_ID_MAP_RXQ2 BIT(18) +#define ALX_MSI_ID_MAP_RXQ1 BIT(17) +#define ALX_MSI_ID_MAP_RXQ0 BIT(16) +#define ALX_MSI_ID_MAP_TXQ0 BIT(15) +#define ALX_MSI_ID_MAP_TXQTO BIT(14) +#define ALX_MSI_ID_MAP_LPW BIT(13) +#define ALX_MSI_ID_MAP_PHY BIT(12) +#define ALX_MSI_ID_MAP_TXCREDIT BIT(11) +#define ALX_MSI_ID_MAP_DMAW BIT(10) +#define ALX_MSI_ID_MAP_DMAR BIT(9) +#define ALX_MSI_ID_MAP_TXFUR BIT(8) +#define ALX_MSI_ID_MAP_TXQ3 BIT(7) +#define ALX_MSI_ID_MAP_TXQ2 BIT(6) +#define ALX_MSI_ID_MAP_TXQ1 BIT(5) +#define ALX_MSI_ID_MAP_RFDUR BIT(4) +#define ALX_MSI_ID_MAP_RXFOV BIT(3) +#define ALX_MSI_ID_MAP_MANU BIT(2) +#define ALX_MSI_ID_MAP_TIMER BIT(1) +#define ALX_MSI_ID_MAP_SMB BIT(0) + +#define ALX_MSI_RETRANS_TIMER 0x1920 +/* bit16: 1:line,0:standard */ +#define ALX_MSI_MASK_SEL_LINE BIT(16) +#define ALX_MSI_RETRANS_TM_MASK 0xFFFFUL +#define ALX_MSI_RETRANS_TM_SHIFT 0 + +#define ALX_CR_DMA_CTRL 0x1930 +#define ALX_CR_DMA_CTRL_PRI BIT(22) +#define ALX_CR_DMA_CTRL_RRDRXD_JOINT BIT(21) +#define ALX_CR_DMA_CTRL_BWCREDIT_MASK 0x3UL +#define ALX_CR_DMA_CTRL_BWCREDIT_SHIFT 19 +#define ALX_CR_DMA_CTRL_BWCREDIT_2KB 0 +#define ALX_CR_DMA_CTRL_BWCREDIT_1KB 1 +#define ALX_CR_DMA_CTRL_BWCREDIT_4KB 2 +#define ALX_CR_DMA_CTRL_BWCREDIT_8KB 3 +#define ALX_CR_DMA_CTRL_BW_EN BIT(18) +#define ALX_CR_DMA_CTRL_BW_RATIO_MASK 0x3UL +#define ALX_CR_DMA_CTRL_BW_RATIO_1_2 0 +#define ALX_CR_DMA_CTRL_BW_RATIO_1_4 1 +#define ALX_CR_DMA_CTRL_BW_RATIO_1_8 2 +#define ALX_CR_DMA_CTRL_BW_RATIO_2_1 3 +#define ALX_CR_DMA_CTRL_SOFT_RST BIT(11) +#define ALX_CR_DMA_CTRL_TXEARLY_EN BIT(10) +#define ALX_CR_DMA_CTRL_RXEARLY_EN BIT(9) +#define ALX_CR_DMA_CTRL_WEARLY_EN BIT(8) +#define ALX_CR_DMA_CTRL_RXTH_MASK 0xFUL +#define ALX_CR_DMA_CTRL_WTH_MASK 0xFUL + + +#define ALX_EFUSE_BIST 0x1934 +#define ALX_EFUSE_BIST_COL_MASK 0x3FUL +#define ALX_EFUSE_BIST_COL_SHIFT 24 +#define ALX_EFUSE_BIST_ROW_MASK 0x7FUL +#define ALX_EFUSE_BIST_ROW_SHIFT 12 +#define ALX_EFUSE_BIST_STEP_MASK 0xFUL +#define ALX_EFUSE_BIST_STEP_SHIFT 8 +#define ALX_EFUSE_BIST_PAT_MASK 0x7UL +#define ALX_EFUSE_BIST_PAT_SHIFT 4 +#define ALX_EFUSE_BIST_CRITICAL BIT(3) +#define ALX_EFUSE_BIST_FIXED BIT(2) +#define ALX_EFUSE_BIST_FAIL BIT(1) +#define ALX_EFUSE_BIST_NOW BIT(0) + +/* CR DMA ctrl */ + +/* TX QoS */ +#define ALX_WRR 0x1938 +#define ALX_WRR_PRI_MASK 0x3UL +#define ALX_WRR_PRI_SHIFT 29 +#define ALX_WRR_PRI_RESTRICT_ALL 0 +#define ALX_WRR_PRI_RESTRICT_HI 1 +#define ALX_WRR_PRI_RESTRICT_HI2 2 +#define ALX_WRR_PRI_RESTRICT_NONE 3 +#define ALX_WRR_PRI3_MASK 0x1FUL +#define ALX_WRR_PRI3_SHIFT 24 +#define ALX_WRR_PRI2_MASK 0x1FUL +#define ALX_WRR_PRI2_SHIFT 16 +#define ALX_WRR_PRI1_MASK 0x1FUL +#define ALX_WRR_PRI1_SHIFT 8 +#define ALX_WRR_PRI0_MASK 0x1FUL +#define ALX_WRR_PRI0_SHIFT 0 + +#define ALX_HQTPD 0x193C +#define ALX_HQTPD_BURST_EN BIT(31) +#define ALX_HQTPD_Q3_NUMPREF_MASK 0xFUL +#define ALX_HQTPD_Q3_NUMPREF_SHIFT 8 +#define ALX_HQTPD_Q2_NUMPREF_MASK 0xFUL +#define ALX_HQTPD_Q2_NUMPREF_SHIFT 4 +#define ALX_HQTPD_Q1_NUMPREF_MASK 0xFUL +#define ALX_HQTPD_Q1_NUMPREF_SHIFT 0 + +#define ALX_CPUMAP1 0x19A0 +#define ALX_CPUMAP1_VCT7_MASK 0xFUL +#define ALX_CPUMAP1_VCT7_SHIFT 28 +#define ALX_CPUMAP1_VCT6_MASK 0xFUL +#define ALX_CPUMAP1_VCT6_SHIFT 24 +#define ALX_CPUMAP1_VCT5_MASK 0xFUL +#define ALX_CPUMAP1_VCT5_SHIFT 20 +#define ALX_CPUMAP1_VCT4_MASK 0xFUL +#define ALX_CPUMAP1_VCT4_SHIFT 16 +#define ALX_CPUMAP1_VCT3_MASK 0xFUL +#define ALX_CPUMAP1_VCT3_SHIFT 12 +#define ALX_CPUMAP1_VCT2_MASK 0xFUL +#define ALX_CPUMAP1_VCT2_SHIFT 8 +#define ALX_CPUMAP1_VCT1_MASK 0xFUL +#define ALX_CPUMAP1_VCT1_SHIFT 4 +#define ALX_CPUMAP1_VCT0_MASK 0xFUL +#define ALX_CPUMAP1_VCT0_SHIFT 0 + +#define ALX_CPUMAP2 0x19A4 +#define ALX_CPUMAP2_VCT15_MASK 0xFUL +#define ALX_CPUMAP2_VCT15_SHIFT 28 +#define ALX_CPUMAP2_VCT14_MASK 0xFUL +#define ALX_CPUMAP2_VCT14_SHIFT 24 +#define ALX_CPUMAP2_VCT13_MASK 0xFUL +#define ALX_CPUMAP2_VCT13_SHIFT 20 +#define ALX_CPUMAP2_VCT12_MASK 0xFUL +#define ALX_CPUMAP2_VCT12_SHIFT 16 +#define ALX_CPUMAP2_VCT11_MASK 0xFUL +#define ALX_CPUMAP2_VCT11_SHIFT 12 +#define ALX_CPUMAP2_VCT10_MASK 0xFUL +#define ALX_CPUMAP2_VCT10_SHIFT 8 +#define ALX_CPUMAP2_VCT9_MASK 0xFUL +#define ALX_CPUMAP2_VCT9_SHIFT 4 +#define ALX_CPUMAP2_VCT8_MASK 0xFUL +#define ALX_CPUMAP2_VCT8_SHIFT 0 + +#define ALX_MISC 0x19C0 +/* bit31: 0:vector,1:cpu */ +#define ALX_MISC_MODU BIT(31) +#define ALX_MISC_OVERCUR BIT(29) +#define ALX_MISC_PSWR_EN BIT(28) +#define ALX_MISC_PSW_CTRL_MASK 0xFUL +#define ALX_MISC_PSW_CTRL_SHIFT 24 +#define ALX_MISC_PSW_OCP_MASK 0x7UL +#define ALX_MISC_PSW_OCP_SHIFT 21 +#define ALX_MISC_PSW_OCP_DEF 0x7 +#define ALX_MISC_V18_HIGH BIT(20) +#define ALX_MISC_LPO_CTRL_MASK 0xFUL +#define ALX_MISC_LPO_CTRL_SHIFT 16 +#define ALX_MISC_ISO_EN BIT(12) +#define ALX_MISC_XSTANA_ALWAYS_ON BIT(11) +#define ALX_MISC_SYS25M_SEL_ADAPTIVE BIT(10) +#define ALX_MISC_SPEED_SIM BIT(9) +#define ALX_MISC_S1_LWP_EN BIT(8) +/* bit7: pcie/mac do pwsaving as phy in lpw state */ +#define ALX_MISC_MACLPW BIT(7) +#define ALX_MISC_125M_SW BIT(6) +#define ALX_MISC_INTNLOSC_OFF_EN BIT(5) +/* bit4: 0:chipset,1:crystle */ +#define ALX_MISC_EXTN25M_SEL BIT(4) +#define ALX_MISC_INTNLOSC_OPEN BIT(3) +#define ALX_MISC_SMBUS_AT_LED BIT(2) +#define ALX_MISC_PPS_AT_LED_MASK 0x3UL +#define ALX_MISC_PPS_AT_LED_SHIFT 0 +#define ALX_MISC_PPS_AT_LED_ACT 1 +#define ALX_MISC_PPS_AT_LED_10_100 2 +#define ALX_MISC_PPS_AT_LED_1000 3 + +#define ALX_MISC1 0x19C4 +#define ALX_MSC1_BLK_CRASPM_REQ BIT(15) + +#define ALX_MSIC2 0x19C8 +#define ALX_MSIC2_CALB_START BIT(0) + +#define ALX_MISC3 0x19CC +/* bit1: 1:Software control 25M */ +#define ALX_MISC3_25M_BY_SW BIT(1) +/* bit0: 25M switch to intnl OSC */ +#define ALX_MISC3_25M_NOTO_INTNL BIT(0) + +/* MSIX tbl in memory space */ +#define ALX_MSIX_ENTRY_BASE 0x2000 + +/***************************** IO mapping registers ***************************/ +#define ALX_IO_ADDR 0x00 +#define ALX_IO_DATA 0x04 +/* same as reg1400 */ +#define ALX_IO_MASTER 0x08 +/* same as reg1480 */ +#define ALX_IO_MAC_CTRL 0x0C +/* same as reg1600 */ +#define ALX_IO_ISR 0x10 +/* same as reg 1604 */ +#define ALX_IO_IMR 0x14 +/* word, same as reg15F0 */ +#define ALX_IO_TPD_PRI1_PIDX 0x18 +/* word, same as reg15F2 */ +#define ALX_IO_TPD_PRI0_PIDX 0x1A +/* word, same as reg15F4 */ +#define ALX_IO_TPD_PRI1_CIDX 0x1C +/* word, same as reg15F6 */ +#define ALX_IO_TPD_PRI0_CIDX 0x1E +/* word, same as reg15E0 */ +#define ALX_IO_RFD_PIDX 0x20 +/* word, same as reg15F8 */ +#define ALX_IO_RFD_CIDX 0x30 +/* same as reg1414 */ +#define ALX_IO_MDIO 0x38 +/* same as reg140C */ +#define ALX_IO_PHY_CTRL 0x3C + + +/********************* PHY regs definition ***************************/ + +/* Autoneg Advertisement Register */ +#define ALX_ADVERTISE_SPEED_MASK 0x01E0 +#define ALX_ADVERTISE_DEFAULT_CAP 0x1DE0 + +/* 1000BASE-T Control Register (0x9) */ +#define ALX_GIGA_CR_1000T_HD_CAPS 0x0100 +#define ALX_GIGA_CR_1000T_FD_CAPS 0x0200 +#define ALX_GIGA_CR_1000T_REPEATER_DTE 0x0400 + +#define ALX_GIGA_CR_1000T_MS_VALUE 0x0800 + +#define ALX_GIGA_CR_1000T_MS_ENABLE 0x1000 + +#define ALX_GIGA_CR_1000T_TEST_MODE_NORMAL 0x0000 +#define ALX_GIGA_CR_1000T_TEST_MODE_1 0x2000 +#define ALX_GIGA_CR_1000T_TEST_MODE_2 0x4000 +#define ALX_GIGA_CR_1000T_TEST_MODE_3 0x6000 +#define ALX_GIGA_CR_1000T_TEST_MODE_4 0x8000 +#define ALX_GIGA_CR_1000T_SPEED_MASK 0x0300 +#define ALX_GIGA_CR_1000T_DEFAULT_CAP 0x0300 + +/* 1000BASE-T Status Register */ +#define ALX_MII_GIGA_SR 0x0A + +/* PHY Specific Status Register */ +#define ALX_MII_GIGA_PSSR 0x11 +#define ALX_GIGA_PSSR_FC_RXEN 0x0004 +#define ALX_GIGA_PSSR_FC_TXEN 0x0008 +#define ALX_GIGA_PSSR_SPD_DPLX_RESOLVED 0x0800 +#define ALX_GIGA_PSSR_DPLX 0x2000 +#define ALX_GIGA_PSSR_SPEED 0xC000 +#define ALX_GIGA_PSSR_10MBS 0x0000 +#define ALX_GIGA_PSSR_100MBS 0x4000 +#define ALX_GIGA_PSSR_1000MBS 0x8000 + +/* PHY Interrupt Enable Register */ +#define ALX_MII_IER 0x12 +#define ALX_IER_LINK_UP 0x0400 +#define ALX_IER_LINK_DOWN 0x0800 + +/* PHY Interrupt Status Register */ +#define ALX_MII_ISR 0x13 +#define ALX_ISR_LINK_UP 0x0400 +#define ALX_ISR_LINK_DOWN 0x0800 + +/* Cable-Detect-Test Control Register */ +#define ALX_MII_CDTC 0x16 +/* self clear */ +#define ALX_CDTC_EN 1 +#define ALX_CDTC_PAIR_MASK 0x3U +#define ALX_CDTC_PAIR_SHIFT 8 + + +/* Cable-Detect-Test Status Register */ +#define ALX_MII_CDTS 0x1C +#define ALX_CDTS_STATUS_MASK 0x3U +#define ALX_CDTS_STATUS_SHIFT 8 +#define ALX_CDTS_STATUS_NORMAL 0 +#define ALX_CDTS_STATUS_SHORT 1 +#define ALX_CDTS_STATUS_OPEN 2 +#define ALX_CDTS_STATUS_INVALID 3 + +#define ALX_MII_DBG_ADDR 0x1D +#define ALX_MII_DBG_DATA 0x1E + +/***************************** debug port *************************************/ + +#define ALX_MIIDBG_ANACTRL 0x00 +#define ALX_ANACTRL_CLK125M_DELAY_EN 0x8000 +#define ALX_ANACTRL_VCO_FAST 0x4000 +#define ALX_ANACTRL_VCO_SLOW 0x2000 +#define ALX_ANACTRL_AFE_MODE_EN 0x1000 +#define ALX_ANACTRL_LCKDET_PHY 0x0800 +#define ALX_ANACTRL_LCKDET_EN 0x0400 +#define ALX_ANACTRL_OEN_125M 0x0200 +#define ALX_ANACTRL_HBIAS_EN 0x0100 +#define ALX_ANACTRL_HB_EN 0x0080 +#define ALX_ANACTRL_SEL_HSP 0x0040 +#define ALX_ANACTRL_CLASSA_EN 0x0020 +#define ALX_ANACTRL_MANUSWON_SWR_MASK 0x3U +#define ALX_ANACTRL_MANUSWON_SWR_SHIFT 2 +#define ALX_ANACTRL_MANUSWON_SWR_2V 0 +#define ALX_ANACTRL_MANUSWON_SWR_1P9V 1 +#define ALX_ANACTRL_MANUSWON_SWR_1P8V 2 +#define ALX_ANACTRL_MANUSWON_SWR_1P7V 3 +#define ALX_ANACTRL_MANUSWON_BW3_4M 0x0002 +#define ALX_ANACTRL_RESTART_CAL 0x0001 +#define ALX_ANACTRL_DEF 0x02EF + + +#define ALX_MIIDBG_SYSMODCTRL 0x04 +#define ALX_SYSMODCTRL_IECHOADJ_PFMH_PHY 0x8000 +#define ALX_SYSMODCTRL_IECHOADJ_BIASGEN 0x4000 +#define ALX_SYSMODCTRL_IECHOADJ_PFML_PHY 0x2000 +#define ALX_SYSMODCTRL_IECHOADJ_PS_MASK 0x3U +#define ALX_SYSMODCTRL_IECHOADJ_PS_SHIFT 10 +#define ALX_SYSMODCTRL_IECHOADJ_PS_40 3 +#define ALX_SYSMODCTRL_IECHOADJ_PS_20 2 +#define ALX_SYSMODCTRL_IECHOADJ_PS_0 1 +#define ALX_SYSMODCTRL_IECHOADJ_10BT_100MV 0x0040 +#define ALX_SYSMODCTRL_IECHOADJ_HLFAP_MASK 0x3U +#define ALX_SYSMODCTRL_IECHOADJ_HLFAP_SHIFT 4 +#define ALX_SYSMODCTRL_IECHOADJ_VDFULBW 0x0008 +#define ALX_SYSMODCTRL_IECHOADJ_VDBIASHLF 0x0004 +#define ALX_SYSMODCTRL_IECHOADJ_VDAMPHLF 0x0002 +#define ALX_SYSMODCTRL_IECHOADJ_VDLANSW 0x0001 +/* en half bias */ +#define ALX_SYSMODCTRL_IECHOADJ_DEF 0xBB8B + + +#define ALX_MIIDBG_SRDSYSMOD 0x05 +#define ALX_SRDSYSMOD_LCKDET_EN 0x2000 +#define ALX_SRDSYSMOD_PLL_EN 0x0800 +#define ALX_SRDSYSMOD_SEL_HSP 0x0400 +#define ALX_SRDSYSMOD_HLFTXDR 0x0200 +#define ALX_SRDSYSMOD_TXCLK_DELAY_EN 0x0100 +#define ALX_SRDSYSMOD_TXELECIDLE 0x0080 +#define ALX_SRDSYSMOD_DEEMP_EN 0x0040 +#define ALX_SRDSYSMOD_MS_PAD 0x0004 +#define ALX_SRDSYSMOD_CDR_ADC_VLTG 0x0002 +#define ALX_SRDSYSMOD_CDR_DAC_1MA 0x0001 +#define ALX_SRDSYSMOD_DEF 0x2C46 + + +#define ALX_MIIDBG_HIBNEG 0x0B +#define ALX_HIBNEG_PSHIB_EN 0x8000 +#define ALX_HIBNEG_WAKE_BOTH 0x4000 +#define ALX_HIBNEG_ONOFF_ANACHG_SUDEN 0x2000 +#define ALX_HIBNEG_HIB_PULSE 0x1000 +#define ALX_HIBNEG_GATE_25M_EN 0x0800 +#define ALX_HIBNEG_RST_80U 0x0400 +#define ALX_HIBNEG_RST_TIMER_MASK 0x3U +#define ALX_HIBNEG_RST_TIMER_SHIFT 8 +#define ALX_HIBNEG_GTX_CLK_DELAY_MASK 0x3U +#define ALX_HIBNEG_GTX_CLK_DELAY_SHIFT 5 +#define ALX_HIBNEG_BYPSS_BRKTIMER 0x0010 +#define ALX_HIBNEG_DEF 0xBC40 +#define ALX_HIBNEG_NOHIB (\ +ALX_HIBNEG_DEF & ~(ALX_HIBNEG_PSHIB_EN | ALX_HIBNEG_HIB_PULSE)) + +#define ALX_MIIDBG_TST10BTCFG 0x12 +#define ALX_TST10BTCFG_INTV_TIMER_MASK 0x3U +#define ALX_TST10BTCFG_INTV_TIMER_SHIFT 14 +#define ALX_TST10BTCFG_TRIGER_TIMER_MASK 0x3U +#define ALX_TST10BTCFG_TRIGER_TIMER_SHIFT 12 +#define ALX_TST10BTCFG_DIV_MAN_MLT3_EN 0x0800 +#define ALX_TST10BTCFG_OFF_DAC_IDLE 0x0400 +#define ALX_TST10BTCFG_LPBK_DEEP 0x0004 +#define ALX_TST10BTCFG_DEF 0x4C04 + +#define ALX_MIIDBG_AZ_ANADECT 0x15 +#define ALX_AZ_ANADECT_10BTRX_TH 0x8000 +#define ALX_AZ_ANADECT_BOTH_01CHNL 0x4000 +#define ALX_AZ_ANADECT_INTV_MASK 0x3FU +#define ALX_AZ_ANADECT_INTV_SHIFT 8 +#define ALX_AZ_ANADECT_THRESH_MASK 0xFU +#define ALX_AZ_ANADECT_THRESH_SHIFT 4 +#define ALX_AZ_ANADECT_CHNL_MASK 0xFU +#define ALX_AZ_ANADECT_CHNL_SHIFT 0 +#define ALX_AZ_ANADECT_DEF 0x3220 +#define ALX_AZ_ANADECT_LONG 0x3210 + +#define ALX_MIIDBG_MSE16DB 0x18 +#define ALX_MSE16DB_UP 0x05EA +#define ALX_MSE16DB_DOWN 0x02EA + +#define ALX_MIIDBG_MSE20DB 0x1C +#define ALX_MSE20DB_TH_MASK 0x7F +#define ALX_MSE20DB_TH_SHIFT 2 +#define ALX_MSE20DB_TH_DEF 0x2E +#define ALX_MSE20DB_TH_HI 0x54 + +#define ALX_MIIDBG_AGC 0x23 +#define ALX_AGC_2_VGA_MASK 0x3FU +#define ALX_AGC_2_VGA_SHIFT 8 +#define ALX_AGC_LONG1G_LIMT 40 +#define ALX_AGC_LONG100M_LIMT 44 + +#define ALX_MIIDBG_LEGCYPS 0x29 +#define ALX_LEGCYPS_EN 0x8000 +#define ALX_LEGCYPS_DAC_AMP1000_MASK 0x7U +#define ALX_LEGCYPS_DAC_AMP1000_SHIFT 12 +#define ALX_LEGCYPS_DAC_AMP100_MASK 0x7U +#define ALX_LEGCYPS_DAC_AMP100_SHIFT 9 +#define ALX_LEGCYPS_DAC_AMP10_MASK 0x7U +#define ALX_LEGCYPS_DAC_AMP10_SHIFT 6 +#define ALX_LEGCYPS_UNPLUG_TIMER_MASK 0x7U +#define ALX_LEGCYPS_UNPLUG_TIMER_SHIFT 3 +#define ALX_LEGCYPS_UNPLUG_DECT_EN 0x0004 +#define ALX_LEGCYPS_ECNC_PS_EN 0x0001 +#define ALX_LEGCYPS_DEF 0x129D + +#define ALX_MIIDBG_TST100BTCFG 0x36 +#define ALX_TST100BTCFG_NORMAL_BW_EN 0x8000 +#define ALX_TST100BTCFG_BADLNK_BYPASS 0x4000 +#define ALX_TST100BTCFG_SHORTCABL_TH_MASK 0x3FU +#define ALX_TST100BTCFG_SHORTCABL_TH_SHIFT 8 +#define ALX_TST100BTCFG_LITCH_EN 0x0080 +#define ALX_TST100BTCFG_VLT_SW 0x0040 +#define ALX_TST100BTCFG_LONGCABL_TH_MASK 0x3FU +#define ALX_TST100BTCFG_LONGCABL_TH_SHIFT 0 +#define ALX_TST100BTCFG_DEF 0xE12C + +#define ALX_MIIDBG_GREENCFG 0x3B +#define ALX_GREENCFG_MSTPS_MSETH2_MASK 0xFFU +#define ALX_GREENCFG_MSTPS_MSETH2_SHIFT 8 +#define ALX_GREENCFG_MSTPS_MSETH1_MASK 0xFFU +#define ALX_GREENCFG_MSTPS_MSETH1_SHIFT 0 +#define ALX_GREENCFG_DEF 0x7078 + +#define ALX_MIIDBG_GREENCFG2 0x3D +#define ALX_GREENCFG2_BP_GREEN 0x8000 +#define ALX_GREENCFG2_GATE_DFSE_EN 0x0080 + + +/***************************** extension **************************************/ + +/******* dev 3 *********/ +#define ALX_MIIEXT_PCS 3 + +#define ALX_MIIEXT_CLDCTRL3 0x8003 +#define ALX_CLDCTRL3_BP_CABLE1TH_DET_GT 0x8000 +#define ALX_CLDCTRL3_AZ_DISAMP 0x1000 + +#define ALX_MIIEXT_CLDCTRL5 0x8005 +#define ALX_CLDCTRL5_BP_VD_HLFBIAS 0x4000 + +#define ALX_MIIEXT_CLDCTRL6 0x8006 +#define ALX_CLDCTRL6_CAB_LEN_MASK 0xFFU +#define ALX_CLDCTRL6_CAB_LEN_SHIFT 0 +#define ALX_CLDCTRL6_CAB_LEN_SHORT1G 116 +#define ALX_CLDCTRL6_CAB_LEN_SHORT100M 152 + +#define ALX_MIIEXT_CLDCTRL7 0x8007 +#define ALX_CLDCTRL7_VDHLF_BIAS_TH_MASK 0x7FU +#define ALX_CLDCTRL7_VDHLF_BIAS_TH_SHIFT 9 +#define ALX_CLDCTRL7_AFE_AZ_MASK 0x1FU +#define ALX_CLDCTRL7_AFE_AZ_SHIFT 4 +#define ALX_CLDCTRL7_SIDE_PEAK_TH_MASK 0xFU +#define ALX_CLDCTRL7_SIDE_PEAK_TH_SHIFT 0 +#define ALX_CLDCTRL7_DEF 0x6BF6 + +#define ALX_MIIEXT_AZCTRL 0x8008 +#define ALX_AZCTRL_SHORT_TH_MASK 0xFFU +#define ALX_AZCTRL_SHORT_TH_SHIFT 8 +#define ALX_AZCTRL_LONG_TH_MASK 0xFFU +#define ALX_AZCTRL_LONG_TH_SHIFT 0 +#define ALX_AZCTRL_DEF 0x1629 + +#define ALX_MIIEXT_AZCTRL2 0x8009 +#define ALX_AZCTRL2_WAKETRNING_MASK 0xFFU +#define ALX_AZCTRL2_WAKETRNING_SHIFT 8 +#define ALX_AZCTRL2_QUIET_TIMER_MASK 0x3U +#define ALX_AZCTRL2_QUIET_TIMER_SHIFT 6 +#define ALX_AZCTRL2_PHAS_JMP2 0x0010 +#define ALX_AZCTRL2_CLKTRCV_125MD16 0x0008 +#define ALX_AZCTRL2_GATE1000_EN 0x0004 +#define ALX_AZCTRL2_AVRG_FREQ 0x0002 +#define ALX_AZCTRL2_PHAS_JMP4 0x0001 +#define ALX_AZCTRL2_DEF 0x32C0 + +#define ALX_MIIEXT_AZCTRL6 0x800D + +#define ALX_MIIEXT_VDRVBIAS 0x8062 +#define ALX_VDRVBIAS_SEL_MASK 0x3U +#define ALX_VDRVBIAS_SEL_SHIFT 0 +#define ALX_VDRVBIAS_DEF 0x3 + +/********* dev 7 **********/ +#define ALX_MIIEXT_ANEG 7 + +#define ALX_MIIEXT_LOCAL_EEEADV 0x3C +#define ALX_LOCAL_EEEADV_1000BT 0x0004 +#define ALX_LOCAL_EEEADV_100BT 0x0002 + +#define ALX_MIIEXT_REMOTE_EEEADV 0x3D +#define ALX_REMOTE_EEEADV_1000BT 0x0004 +#define ALX_REMOTE_EEEADV_100BT 0x0002 + +#define ALX_MIIEXT_EEE_ANEG 0x8000 +#define ALX_EEE_ANEG_1000M 0x0004 +#define ALX_EEE_ANEG_100M 0x0002 + +#define ALX_MIIEXT_AFE 0x801A +#define ALX_AFE_10BT_100M_TH 0x0040 + +#define ALX_MIIEXT_S3DIG10 0x8023 +/* bit0: 1:bypass 10BT rx fifo, 0:riginal 10BT rx */ +#define ALX_MIIEXT_S3DIG10_SL 0x0001 +#define ALX_MIIEXT_S3DIG10_DEF 0 + +#define ALX_MIIEXT_NLP34 0x8025 +/* for 160m */ +#define ALX_MIIEXT_NLP34_DEF 0x1010 + +#define ALX_MIIEXT_NLP56 0x8026 +/* for 160m */ +#define ALX_MIIEXT_NLP56_DEF 0x1010 + +#define ALX_MIIEXT_NLP78 0x8027 +/* for 160m */ +#define ALX_MIIEXT_NLP78_160M_DEF 0x8D05 +#define ALX_MIIEXT_NLP78_120M_DEF 0x8A05 + +#endif |