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