1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _NB8800_H_ 3*4882a593Smuzhiyun #define _NB8800_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/types.h> 6*4882a593Smuzhiyun #include <linux/skbuff.h> 7*4882a593Smuzhiyun #include <linux/phy.h> 8*4882a593Smuzhiyun #include <linux/clk.h> 9*4882a593Smuzhiyun #include <linux/bitops.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define RX_DESC_COUNT 256 12*4882a593Smuzhiyun #define TX_DESC_COUNT 256 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define NB8800_DESC_LOW 4 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #define RX_BUF_SIZE 1552 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #define RX_COPYBREAK 256 19*4882a593Smuzhiyun #define RX_COPYHDR 128 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define MAX_MDC_CLOCK 2500000 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* Stargate Solutions SSN8800 core registers */ 24*4882a593Smuzhiyun #define NB8800_TX_CTL1 0x000 25*4882a593Smuzhiyun #define TX_TPD BIT(5) 26*4882a593Smuzhiyun #define TX_APPEND_FCS BIT(4) 27*4882a593Smuzhiyun #define TX_PAD_EN BIT(3) 28*4882a593Smuzhiyun #define TX_RETRY_EN BIT(2) 29*4882a593Smuzhiyun #define TX_EN BIT(0) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun #define NB8800_TX_CTL2 0x001 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #define NB8800_RX_CTL 0x004 34*4882a593Smuzhiyun #define RX_BC_DISABLE BIT(7) 35*4882a593Smuzhiyun #define RX_RUNT BIT(6) 36*4882a593Smuzhiyun #define RX_AF_EN BIT(5) 37*4882a593Smuzhiyun #define RX_PAUSE_EN BIT(3) 38*4882a593Smuzhiyun #define RX_SEND_CRC BIT(2) 39*4882a593Smuzhiyun #define RX_PAD_STRIP BIT(1) 40*4882a593Smuzhiyun #define RX_EN BIT(0) 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define NB8800_RANDOM_SEED 0x008 43*4882a593Smuzhiyun #define NB8800_TX_SDP 0x14 44*4882a593Smuzhiyun #define NB8800_TX_TPDP1 0x18 45*4882a593Smuzhiyun #define NB8800_TX_TPDP2 0x19 46*4882a593Smuzhiyun #define NB8800_SLOT_TIME 0x1c 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define NB8800_MDIO_CMD 0x020 49*4882a593Smuzhiyun #define MDIO_CMD_GO BIT(31) 50*4882a593Smuzhiyun #define MDIO_CMD_WR BIT(26) 51*4882a593Smuzhiyun #define MDIO_CMD_ADDR(x) ((x) << 21) 52*4882a593Smuzhiyun #define MDIO_CMD_REG(x) ((x) << 16) 53*4882a593Smuzhiyun #define MDIO_CMD_DATA(x) ((x) << 0) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define NB8800_MDIO_STS 0x024 56*4882a593Smuzhiyun #define MDIO_STS_ERR BIT(31) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define NB8800_MC_ADDR(i) (0x028 + (i)) 59*4882a593Smuzhiyun #define NB8800_MC_INIT 0x02e 60*4882a593Smuzhiyun #define NB8800_UC_ADDR(i) (0x03c + (i)) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define NB8800_MAC_MODE 0x044 63*4882a593Smuzhiyun #define RGMII_MODE BIT(7) 64*4882a593Smuzhiyun #define HALF_DUPLEX BIT(4) 65*4882a593Smuzhiyun #define BURST_EN BIT(3) 66*4882a593Smuzhiyun #define LOOPBACK_EN BIT(2) 67*4882a593Smuzhiyun #define GMAC_MODE BIT(0) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define NB8800_IC_THRESHOLD 0x050 70*4882a593Smuzhiyun #define NB8800_PE_THRESHOLD 0x051 71*4882a593Smuzhiyun #define NB8800_PF_THRESHOLD 0x052 72*4882a593Smuzhiyun #define NB8800_TX_BUFSIZE 0x054 73*4882a593Smuzhiyun #define NB8800_FIFO_CTL 0x056 74*4882a593Smuzhiyun #define NB8800_PQ1 0x060 75*4882a593Smuzhiyun #define NB8800_PQ2 0x061 76*4882a593Smuzhiyun #define NB8800_SRC_ADDR(i) (0x06a + (i)) 77*4882a593Smuzhiyun #define NB8800_STAT_DATA 0x078 78*4882a593Smuzhiyun #define NB8800_STAT_INDEX 0x07c 79*4882a593Smuzhiyun #define NB8800_STAT_CLEAR 0x07d 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define NB8800_SLEEP_MODE 0x07e 82*4882a593Smuzhiyun #define SLEEP_MODE BIT(0) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define NB8800_WAKEUP 0x07f 85*4882a593Smuzhiyun #define WAKEUP BIT(0) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* Aurora NB8800 host interface registers */ 88*4882a593Smuzhiyun #define NB8800_TXC_CR 0x100 89*4882a593Smuzhiyun #define TCR_LK BIT(12) 90*4882a593Smuzhiyun #define TCR_DS BIT(11) 91*4882a593Smuzhiyun #define TCR_BTS(x) (((x) & 0x7) << 8) 92*4882a593Smuzhiyun #define TCR_DIE BIT(7) 93*4882a593Smuzhiyun #define TCR_TFI(x) (((x) & 0x7) << 4) 94*4882a593Smuzhiyun #define TCR_LE BIT(3) 95*4882a593Smuzhiyun #define TCR_RS BIT(2) 96*4882a593Smuzhiyun #define TCR_DM BIT(1) 97*4882a593Smuzhiyun #define TCR_EN BIT(0) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define NB8800_TXC_SR 0x104 100*4882a593Smuzhiyun #define TSR_DE BIT(3) 101*4882a593Smuzhiyun #define TSR_DI BIT(2) 102*4882a593Smuzhiyun #define TSR_TO BIT(1) 103*4882a593Smuzhiyun #define TSR_TI BIT(0) 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun #define NB8800_TX_SAR 0x108 106*4882a593Smuzhiyun #define NB8800_TX_DESC_ADDR 0x10c 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define NB8800_TX_REPORT_ADDR 0x110 109*4882a593Smuzhiyun #define TX_BYTES_TRANSFERRED(x) (((x) >> 16) & 0xffff) 110*4882a593Smuzhiyun #define TX_FIRST_DEFERRAL BIT(7) 111*4882a593Smuzhiyun #define TX_EARLY_COLLISIONS(x) (((x) >> 3) & 0xf) 112*4882a593Smuzhiyun #define TX_LATE_COLLISION BIT(2) 113*4882a593Smuzhiyun #define TX_PACKET_DROPPED BIT(1) 114*4882a593Smuzhiyun #define TX_FIFO_UNDERRUN BIT(0) 115*4882a593Smuzhiyun #define IS_TX_ERROR(r) ((r) & 0x07) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #define NB8800_TX_FIFO_SR 0x114 118*4882a593Smuzhiyun #define NB8800_TX_ITR 0x118 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #define NB8800_RXC_CR 0x200 121*4882a593Smuzhiyun #define RCR_FL BIT(13) 122*4882a593Smuzhiyun #define RCR_LK BIT(12) 123*4882a593Smuzhiyun #define RCR_DS BIT(11) 124*4882a593Smuzhiyun #define RCR_BTS(x) (((x) & 7) << 8) 125*4882a593Smuzhiyun #define RCR_DIE BIT(7) 126*4882a593Smuzhiyun #define RCR_RFI(x) (((x) & 7) << 4) 127*4882a593Smuzhiyun #define RCR_LE BIT(3) 128*4882a593Smuzhiyun #define RCR_RS BIT(2) 129*4882a593Smuzhiyun #define RCR_DM BIT(1) 130*4882a593Smuzhiyun #define RCR_EN BIT(0) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define NB8800_RXC_SR 0x204 133*4882a593Smuzhiyun #define RSR_DE BIT(3) 134*4882a593Smuzhiyun #define RSR_DI BIT(2) 135*4882a593Smuzhiyun #define RSR_RO BIT(1) 136*4882a593Smuzhiyun #define RSR_RI BIT(0) 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun #define NB8800_RX_SAR 0x208 139*4882a593Smuzhiyun #define NB8800_RX_DESC_ADDR 0x20c 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define NB8800_RX_REPORT_ADDR 0x210 142*4882a593Smuzhiyun #define RX_BYTES_TRANSFERRED(x) (((x) >> 16) & 0xFFFF) 143*4882a593Smuzhiyun #define RX_MULTICAST_PKT BIT(9) 144*4882a593Smuzhiyun #define RX_BROADCAST_PKT BIT(8) 145*4882a593Smuzhiyun #define RX_LENGTH_ERR BIT(7) 146*4882a593Smuzhiyun #define RX_FCS_ERR BIT(6) 147*4882a593Smuzhiyun #define RX_RUNT_PKT BIT(5) 148*4882a593Smuzhiyun #define RX_FIFO_OVERRUN BIT(4) 149*4882a593Smuzhiyun #define RX_LATE_COLLISION BIT(3) 150*4882a593Smuzhiyun #define RX_ALIGNMENT_ERROR BIT(2) 151*4882a593Smuzhiyun #define RX_ERROR_MASK 0xfc 152*4882a593Smuzhiyun #define IS_RX_ERROR(r) ((r) & RX_ERROR_MASK) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define NB8800_RX_FIFO_SR 0x214 155*4882a593Smuzhiyun #define NB8800_RX_ITR 0x218 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* Sigma Designs SMP86xx additional registers */ 158*4882a593Smuzhiyun #define NB8800_TANGOX_PAD_MODE 0x400 159*4882a593Smuzhiyun #define PAD_MODE_MASK 0x7 160*4882a593Smuzhiyun #define PAD_MODE_MII 0x0 161*4882a593Smuzhiyun #define PAD_MODE_RGMII 0x1 162*4882a593Smuzhiyun #define PAD_MODE_GTX_CLK_INV BIT(3) 163*4882a593Smuzhiyun #define PAD_MODE_GTX_CLK_DELAY BIT(4) 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define NB8800_TANGOX_MDIO_CLKDIV 0x420 166*4882a593Smuzhiyun #define NB8800_TANGOX_RESET 0x424 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* Hardware DMA descriptor */ 169*4882a593Smuzhiyun struct nb8800_dma_desc { 170*4882a593Smuzhiyun u32 s_addr; /* start address */ 171*4882a593Smuzhiyun u32 n_addr; /* next descriptor address */ 172*4882a593Smuzhiyun u32 r_addr; /* report address */ 173*4882a593Smuzhiyun u32 config; 174*4882a593Smuzhiyun } __aligned(8); 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun #define DESC_ID BIT(23) 177*4882a593Smuzhiyun #define DESC_EOC BIT(22) 178*4882a593Smuzhiyun #define DESC_EOF BIT(21) 179*4882a593Smuzhiyun #define DESC_LK BIT(20) 180*4882a593Smuzhiyun #define DESC_DS BIT(19) 181*4882a593Smuzhiyun #define DESC_BTS(x) (((x) & 0x7) << 16) 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun /* DMA descriptor and associated data for rx. 184*4882a593Smuzhiyun * Allocated from coherent memory. 185*4882a593Smuzhiyun */ 186*4882a593Smuzhiyun struct nb8800_rx_desc { 187*4882a593Smuzhiyun /* DMA descriptor */ 188*4882a593Smuzhiyun struct nb8800_dma_desc desc; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun /* Status report filled in by hardware */ 191*4882a593Smuzhiyun u32 report; 192*4882a593Smuzhiyun }; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun /* Address of buffer on rx ring */ 195*4882a593Smuzhiyun struct nb8800_rx_buf { 196*4882a593Smuzhiyun struct page *page; 197*4882a593Smuzhiyun unsigned long offset; 198*4882a593Smuzhiyun }; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun /* DMA descriptors and associated data for tx. 201*4882a593Smuzhiyun * Allocated from coherent memory. 202*4882a593Smuzhiyun */ 203*4882a593Smuzhiyun struct nb8800_tx_desc { 204*4882a593Smuzhiyun /* DMA descriptor. The second descriptor is used if packet 205*4882a593Smuzhiyun * data is unaligned. 206*4882a593Smuzhiyun */ 207*4882a593Smuzhiyun struct nb8800_dma_desc desc[2]; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* Status report filled in by hardware */ 210*4882a593Smuzhiyun u32 report; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* Bounce buffer for initial unaligned part of packet */ 213*4882a593Smuzhiyun u8 buf[8] __aligned(8); 214*4882a593Smuzhiyun }; 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun /* Packet in tx queue */ 217*4882a593Smuzhiyun struct nb8800_tx_buf { 218*4882a593Smuzhiyun /* Currently queued skb */ 219*4882a593Smuzhiyun struct sk_buff *skb; 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun /* DMA address of the first descriptor */ 222*4882a593Smuzhiyun dma_addr_t dma_desc; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun /* DMA address of packet data */ 225*4882a593Smuzhiyun dma_addr_t dma_addr; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun /* Length of DMA mapping, less than skb->len if alignment 228*4882a593Smuzhiyun * buffer is used. 229*4882a593Smuzhiyun */ 230*4882a593Smuzhiyun unsigned int dma_len; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* Number of packets in chain starting here */ 233*4882a593Smuzhiyun unsigned int chain_len; 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun /* Packet chain ready to be submitted to hardware */ 236*4882a593Smuzhiyun bool ready; 237*4882a593Smuzhiyun }; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun struct nb8800_priv { 240*4882a593Smuzhiyun struct napi_struct napi; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun void __iomem *base; 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun /* RX DMA descriptors */ 245*4882a593Smuzhiyun struct nb8800_rx_desc *rx_descs; 246*4882a593Smuzhiyun 247*4882a593Smuzhiyun /* RX buffers referenced by DMA descriptors */ 248*4882a593Smuzhiyun struct nb8800_rx_buf *rx_bufs; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun /* Current end of chain */ 251*4882a593Smuzhiyun u32 rx_eoc; 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* Value for rx interrupt time register in NAPI interrupt mode */ 254*4882a593Smuzhiyun u32 rx_itr_irq; 255*4882a593Smuzhiyun 256*4882a593Smuzhiyun /* Value for rx interrupt time register in NAPI poll mode */ 257*4882a593Smuzhiyun u32 rx_itr_poll; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun /* Value for config field of rx DMA descriptors */ 260*4882a593Smuzhiyun u32 rx_dma_config; 261*4882a593Smuzhiyun 262*4882a593Smuzhiyun /* TX DMA descriptors */ 263*4882a593Smuzhiyun struct nb8800_tx_desc *tx_descs; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun /* TX packet queue */ 266*4882a593Smuzhiyun struct nb8800_tx_buf *tx_bufs; 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun /* Number of free tx queue entries */ 269*4882a593Smuzhiyun atomic_t tx_free; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun /* First free tx queue entry */ 272*4882a593Smuzhiyun u32 tx_next; 273*4882a593Smuzhiyun 274*4882a593Smuzhiyun /* Next buffer to transmit */ 275*4882a593Smuzhiyun u32 tx_queue; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /* Start of current packet chain */ 278*4882a593Smuzhiyun struct nb8800_tx_buf *tx_chain; 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun /* Next buffer to reclaim */ 281*4882a593Smuzhiyun u32 tx_done; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* Lock for DMA activation */ 284*4882a593Smuzhiyun spinlock_t tx_lock; 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun struct mii_bus *mii_bus; 287*4882a593Smuzhiyun struct device_node *phy_node; 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun /* PHY connection type from DT */ 290*4882a593Smuzhiyun phy_interface_t phy_mode; 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun /* Current link status */ 293*4882a593Smuzhiyun int speed; 294*4882a593Smuzhiyun int duplex; 295*4882a593Smuzhiyun int link; 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun /* Pause settings */ 298*4882a593Smuzhiyun bool pause_aneg; 299*4882a593Smuzhiyun bool pause_rx; 300*4882a593Smuzhiyun bool pause_tx; 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun /* DMA base address of rx descriptors, see rx_descs above */ 303*4882a593Smuzhiyun dma_addr_t rx_desc_dma; 304*4882a593Smuzhiyun 305*4882a593Smuzhiyun /* DMA base address of tx descriptors, see tx_descs above */ 306*4882a593Smuzhiyun dma_addr_t tx_desc_dma; 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun struct clk *clk; 309*4882a593Smuzhiyun }; 310*4882a593Smuzhiyun 311*4882a593Smuzhiyun struct nb8800_ops { 312*4882a593Smuzhiyun int (*init)(struct net_device *dev); 313*4882a593Smuzhiyun int (*reset)(struct net_device *dev); 314*4882a593Smuzhiyun }; 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun #endif /* _NB8800_H_ */ 317