firmware/br-ext-chip-goke/board/gk7205v200/kernel/patches/00_drivers-net-ethernet-gok...

266 lines
8.8 KiB
Diff

--- linux-4.9.37/drivers/net/ethernet/goke/femac/femac.h 1970-01-01 03:00:00.000000000 +0300
+++ linux-4.9.y/drivers/net/ethernet/goke/femac/femac.h 2021-06-07 13:01:33.000000000 +0300
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
+ */
+
+#ifndef __ETH_GOKE_FEMAC_H__
+#define __ETH_GOKE_FEMAC_H__
+
+/* MAC control register list */
+#define MAC_PORTSEL 0x0200
+#define MAC_PORTSEL_STAT_CPU BIT(0)
+#define MAC_PORTSEL_RMII BIT(1)
+#define MAC_PORTSET 0x0208
+#define MAC_PORTSET_DUPLEX_FULL BIT(0)
+#define MAC_PORTSET_LINKED BIT(1)
+#define MAC_PORTSET_SPEED_100M BIT(2)
+#define MAC_SET 0x0210
+#define MAX_FRAME_SIZE 1600
+#define MAX_FRAME_SIZE_MASK GENMASK(10, 0)
+#define BIT_PAUSE_EN BIT(18)
+#define RX_COALESCE_SET 0x0340
+#define RX_COALESCED_FRAME_OFFSET 24
+#define RX_COALESCED_FRAMES 8
+#define RX_COALESCED_TIMER 0x74
+#define QLEN_SET 0x0344
+#define RX_DEPTH_OFFSET 8
+#define MAX_HW_FIFO_DEPTH 64
+#define HW_TX_FIFO_DEPTH 12
+#define HW_RX_FIFO_DEPTH (MAX_HW_FIFO_DEPTH - HW_TX_FIFO_DEPTH)
+#define FC_LEVEL 0x0348
+#define BITS_FC_ACTIVE_THR_OFFSET 8
+#define FC_DEACTIVE_THR_MASK GENMASK(5, 0)
+#define FC_ACTIVE_THR_MASK GENMASK(13, 8)
+#define BIT_FC_EN BIT(14)
+#define IQFRM_DES 0x0354
+#define RX_FRAME_LEN_MASK GENMASK(11, 0)
+#define BITS_PAYLOAD_ERR_OFFSET 28
+#define BITS_PAYLOAD_ERR_MASK 0x1
+#define BITS_HEADER_ERR_OFFSET 29
+#define BITS_HEADER_ERR_MASK 0x1
+#define BITS_PAYLOAD_DONE_OFFSET 30
+#define BITS_PAYLOAD_DONE_MASK 0x1
+#define BITS_HEADER_DONE_OFFSET 31
+#define BITS_HEADER_DONE_MASK 0x1
+#define IQ_ADDR 0x0358
+#define EQ_ADDR 0x0360
+#define EQFRM_LEN 0x0364
+#define ADDRQ_STAT 0x036C
+#define TX_CNT_INUSE_MASK GENMASK(5, 0)
+#define BIT_TX_READY BIT(24)
+#define BIT_RX_READY BIT(25)
+#define RX_COE_CTRL 0x0380
+#define BIT_COE_IPV6_UDP_ZERO_DROP BIT(13)
+#define BIT_COE_PAYLOAD_DROP BIT(14)
+#define BIT_COE_IPHDR_DROP BIT(15)
+#define COE_ERR_DROP (BIT_COE_IPHDR_DROP | \
+ BIT_COE_PAYLOAD_DROP | \
+ BIT_COE_IPV6_UDP_ZERO_DROP)
+#define TSO_DBG_EN 0x03A4
+#define BITS_TSO_DBG_EN BIT(31)
+#define TSO_DBG_STATE 0x03A8
+#define TSO_DBG_ADDR 0x03AC
+#define TSO_DBG_TX_INFO 0x03B0
+#define TSO_DBG_TX_ERR 0x03B4
+/* global control register list */
+#define GLB_HOSTMAC_L32 0x0000
+#define GLB_HOSTMAC_H16 0x0004
+#define GLB_SOFT_RESET 0x0008
+#define SOFT_RESET_ALL BIT(0)
+#define GLB_FWCTRL 0x0010
+#define FWCTRL_VLAN_ENABLE BIT(0)
+#define FWCTRL_FW2CPU_ENA BIT(5)
+#define FWCTRL_FWALL2CPU BIT(7)
+#define GLB_MACTCTRL 0x0014
+#define MACTCTRL_UNI2CPU BIT(1)
+#define MACTCTRL_MULTI2CPU BIT(3)
+#define MACTCTRL_BROAD2CPU BIT(5)
+#define MACTCTRL_MACT_ENA BIT(7)
+#define GLB_IRQ_STAT 0x0030
+#define GLB_IRQ_ENA 0x0034
+#define IRQ_ENA_PORT0_MASK GENMASK(7, 0)
+#define IRQ_ENA_PORT0 BIT(18)
+#define IRQ_ENA_ALL BIT(19)
+#define GLB_IRQ_RAW 0x0038
+#define IRQ_INT_RX_RDY BIT(0)
+#define IRQ_INT_TX_PER_PACKET BIT(1)
+#define IRQ_INT_TX_FIFO_EMPTY BIT(6)
+#define IRQ_INT_MULTI_RXRDY BIT(7)
+#define INT_TX_ERR BIT(8)
+#define DEF_INT_MASK (IRQ_INT_MULTI_RXRDY | \
+ IRQ_INT_TX_PER_PACKET | \
+ IRQ_INT_TX_FIFO_EMPTY)
+#define GLB_MAC_L32_BASE 0x0100
+#define GLB_MAC_H16_BASE 0x0104
+#define MACFLT_HI16_MASK GENMASK(15, 0)
+#define BIT_MACFLT_ENA BIT(17)
+#define BIT_MACFLT_FW2CPU BIT(21)
+#define glb_mac_h16(reg) (GLB_MAC_H16_BASE + ((reg) * 0x8))
+#define glb_mac_l32(reg) (GLB_MAC_L32_BASE + ((reg) * 0x8))
+#define MAX_MAC_FILTER_NUM 8
+#define MAX_UNICAST_ADDRESSES 2
+#define MAX_MULTICAST_ADDRESSES (MAX_MAC_FILTER_NUM - MAX_UNICAST_ADDRESSES)
+/* software tx and rx queue number, should be power of 2 */
+#define TXQ_NUM 64
+#define RXQ_NUM 128
+#define FEMAC_POLL_WEIGHT 64
+#define HW_CAP_TSO BIT(0)
+#define HW_CAP_RXCSUM BIT(1)
+#define has_tso_cap(hw_cap) ((hw_cap) & HW_CAP_TSO)
+#define has_rxcsum_cap(hw_cap) ((hw_cap) & HW_CAP_RXCSUM)
+#define RXBUF_ADDR_ALIGN_SIZE 64UL
+/* UDP header len is 2 word */
+#define UDP_HDR_LEN 2
+/* IPv6 header len is 10 word */
+#define IPV6_HDR_LEN 10
+#define WORD_TO_BYTE 4
+
+#define BIT_OFFSET_NFRAGS_NUM 11
+#define BIT_OFFSET_PROT_HEADER_LEN 16
+#define BIT_OFFSET_IP_HEADER_LEN 20
+#define BIT_FLAG_SG BIT(26)
+#define BIT_FLAG_TXCSUM BIT(27)
+#define BIT_FLAG_UDP BIT(28)
+#define BIT_FLAG_IPV6 BIT(29)
+#define BIT_FLAG_VLAN BIT(30)
+#define BIT_FLAG_TSO BIT(31)
+
+#define PHY_RESET_DELAYS_PROPERTY "goke,phy-reset-delays-us"
+
+/*
+ * The threshold for activing tx flow ctrl.
+ * When the left amount of receive queue descriptors is below this threshold,
+ * hardware will send pause frame immediately.
+ * We advise this value is set between 1 and 10.
+ * Too bigger is not a good choice.
+ * This value must be smaller than tx flow ctrl deactive threshold.
+ */
+#define TX_FLOW_CTRL_ACTIVE_THRESHOLD 3
+/*
+ * The threshold for deactiving tx flow ctrl.
+ * When the left amount of receive queue descriptors is
+ * above or equal with this threshold,
+ * hardware will exit flow control state.
+ * We advise this value is set between 1 and 10.
+ * Too bigger is not a good choice.
+ * This value must be larger than tx flow ctrl active threshold.
+ */
+#define TX_FLOW_CTRL_DEACTIVE_THRESHOLD 5
+#define FC_ACTIVE_MIN 1
+#define FC_ACTIVE_DEFAULT 3
+#define FC_ACTIVE_MAX 31
+#define FC_DEACTIVE_MIN 1
+#define FC_DEACTIVE_DEFAULT 5
+#define FC_DEACTIVE_MAX 31
+
+#ifdef CONFIG_FEPHY_OPT
+/* FEPHY register list */
+
+#define SYS_REG_ADDR 0x12028000
+#define FEPHY_TRIM_CACHE 0x3022
+#define FEPHY_TRIM_VALUE 0x20a1
+#define LOW_TEM_VALUE 117
+#define HIGH_TEM_VALUE 915
+#define LINK_STATUS 0x4
+#define IS_LINK 0X4
+#define SPEED_STATUS 0x18
+#define SPEED_100M 0x8
+#define LINK_AN_SR 0x11
+#define MISC_CTRL45 0x00B4
+#define MISC_CTRL47 0x00BC
+#define MISC_CTRL48 0x00C0
+#define TSENSOR_RESULT0 0x3ff
+#define TSENSOR_RESULT1 0x3ff0000
+#define TSENSOR_RESULT2 0x3ff
+#define TSENSOR_RESULT3 0x3ff0000
+#define TSENSOR_EN 0xc3200000
+#define HIGH_TEMP 100
+#define NORMAL_TEMP1 90
+#define NORMAL_TEMP2 20
+#define LOW_TEMP 10
+#define TSENSOR_LIMIT 0xfffff
+#define regval_to_temp(val) ((val - 117) * 165 / 798 - 40)
+#define FEPHY_OPT_TIMER (30 * HZ)
+#endif
+
+enum phy_reset_delays {
+ PRE_DELAY,
+ PULSE,
+ POST_DELAY,
+ DELAYS_NUM,
+};
+
+struct femac_queue {
+ struct sk_buff **skb;
+ dma_addr_t *dma_phys;
+ unsigned int num;
+ unsigned int head;
+ unsigned int tail;
+};
+
+struct femac_tx_desc_ring {
+ struct tx_desc *desc;
+ dma_addr_t dma_phys;
+};
+
+#define FEMAC_RX_REFILL_IN_IRQ
+
+struct femac_priv {
+ void __iomem *port_base;
+ void __iomem *glb_base;
+ struct clk *clk;
+ struct reset_control *mac_rst;
+ struct reset_control *phy_rst;
+ u32 phy_reset_delays[DELAYS_NUM];
+ u32 link_status;
+
+#ifdef CONFIG_FEPHY_OPT
+ struct delayed_work watchdog_queue;
+#endif
+ struct device *dev;
+ struct net_device *ndev;
+
+ u32 hw_cap;
+ struct femac_queue txq;
+ struct femac_queue rxq;
+#ifdef FEMAC_RX_REFILL_IN_IRQ
+ struct sk_buff_head rx_head;
+ spinlock_t rxlock;
+#endif
+ struct femac_tx_desc_ring tx_ring;
+ u32 tx_fifo_used_cnt;
+ struct napi_struct napi;
+
+ /* 802.3x flow control */
+ bool tx_pause_en;
+ u32 tx_pause_active_thresh;
+ u32 tx_pause_deactive_thresh;
+};
+
+struct frags_info {
+ /* Word(2*i+2) */
+ u32 addr;
+ /* Word(2*i+3) */
+ u32 size : 16;
+ u32 reserved : 16;
+};
+
+struct tx_desc {
+ /* Word0 */
+ u32 total_len : 17;
+ u32 reserv : 15;
+ /* Word1 */
+ u32 ipv6_id;
+ /* Word2 */
+ u32 linear_addr;
+ /* Word3 */
+ u32 linear_len : 16;
+ u32 reserv3 : 16;
+ /* MAX_SKB_FRAGS is 30 */
+ struct frags_info frags[30];
+};
+
+#endif