162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef GRETH_H 362306a36Sopenharmony_ci#define GRETH_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/phy.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* Register bits and masks */ 862306a36Sopenharmony_ci#define GRETH_RESET 0x40 962306a36Sopenharmony_ci#define GRETH_MII_BUSY 0x8 1062306a36Sopenharmony_ci#define GRETH_MII_NVALID 0x10 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define GRETH_CTRL_FD 0x10 1362306a36Sopenharmony_ci#define GRETH_CTRL_PR 0x20 1462306a36Sopenharmony_ci#define GRETH_CTRL_SP 0x80 1562306a36Sopenharmony_ci#define GRETH_CTRL_GB 0x100 1662306a36Sopenharmony_ci#define GRETH_CTRL_PSTATIEN 0x400 1762306a36Sopenharmony_ci#define GRETH_CTRL_MCEN 0x800 1862306a36Sopenharmony_ci#define GRETH_CTRL_DISDUPLEX 0x1000 1962306a36Sopenharmony_ci#define GRETH_STATUS_PHYSTAT 0x100 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define GRETH_BD_EN 0x800 2262306a36Sopenharmony_ci#define GRETH_BD_WR 0x1000 2362306a36Sopenharmony_ci#define GRETH_BD_IE 0x2000 2462306a36Sopenharmony_ci#define GRETH_BD_LEN 0x7FF 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define GRETH_TXEN 0x1 2762306a36Sopenharmony_ci#define GRETH_INT_TE 0x2 2862306a36Sopenharmony_ci#define GRETH_INT_TX 0x8 2962306a36Sopenharmony_ci#define GRETH_TXI 0x4 3062306a36Sopenharmony_ci#define GRETH_TXBD_STATUS 0x0001C000 3162306a36Sopenharmony_ci#define GRETH_TXBD_MORE 0x20000 3262306a36Sopenharmony_ci#define GRETH_TXBD_IPCS 0x40000 3362306a36Sopenharmony_ci#define GRETH_TXBD_TCPCS 0x80000 3462306a36Sopenharmony_ci#define GRETH_TXBD_UDPCS 0x100000 3562306a36Sopenharmony_ci#define GRETH_TXBD_CSALL (GRETH_TXBD_IPCS | GRETH_TXBD_TCPCS | GRETH_TXBD_UDPCS) 3662306a36Sopenharmony_ci#define GRETH_TXBD_ERR_LC 0x10000 3762306a36Sopenharmony_ci#define GRETH_TXBD_ERR_UE 0x4000 3862306a36Sopenharmony_ci#define GRETH_TXBD_ERR_AL 0x8000 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#define GRETH_INT_RE 0x1 4162306a36Sopenharmony_ci#define GRETH_INT_RX 0x4 4262306a36Sopenharmony_ci#define GRETH_RXEN 0x2 4362306a36Sopenharmony_ci#define GRETH_RXI 0x8 4462306a36Sopenharmony_ci#define GRETH_RXBD_STATUS 0xFFFFC000 4562306a36Sopenharmony_ci#define GRETH_RXBD_ERR_AE 0x4000 4662306a36Sopenharmony_ci#define GRETH_RXBD_ERR_FT 0x8000 4762306a36Sopenharmony_ci#define GRETH_RXBD_ERR_CRC 0x10000 4862306a36Sopenharmony_ci#define GRETH_RXBD_ERR_OE 0x20000 4962306a36Sopenharmony_ci#define GRETH_RXBD_ERR_LE 0x40000 5062306a36Sopenharmony_ci#define GRETH_RXBD_IP 0x80000 5162306a36Sopenharmony_ci#define GRETH_RXBD_IP_CSERR 0x100000 5262306a36Sopenharmony_ci#define GRETH_RXBD_UDP 0x200000 5362306a36Sopenharmony_ci#define GRETH_RXBD_UDP_CSERR 0x400000 5462306a36Sopenharmony_ci#define GRETH_RXBD_TCP 0x800000 5562306a36Sopenharmony_ci#define GRETH_RXBD_TCP_CSERR 0x1000000 5662306a36Sopenharmony_ci#define GRETH_RXBD_IP_FRAG 0x2000000 5762306a36Sopenharmony_ci#define GRETH_RXBD_MCAST 0x4000000 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci/* Descriptor parameters */ 6062306a36Sopenharmony_ci#define GRETH_TXBD_NUM 128 6162306a36Sopenharmony_ci#define GRETH_TXBD_NUM_MASK (GRETH_TXBD_NUM-1) 6262306a36Sopenharmony_ci#define GRETH_TX_BUF_SIZE 2048 6362306a36Sopenharmony_ci#define GRETH_RXBD_NUM 128 6462306a36Sopenharmony_ci#define GRETH_RXBD_NUM_MASK (GRETH_RXBD_NUM-1) 6562306a36Sopenharmony_ci#define GRETH_RX_BUF_SIZE 2048 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci/* Buffers per page */ 6862306a36Sopenharmony_ci#define GRETH_RX_BUF_PPGAE (PAGE_SIZE/GRETH_RX_BUF_SIZE) 6962306a36Sopenharmony_ci#define GRETH_TX_BUF_PPGAE (PAGE_SIZE/GRETH_TX_BUF_SIZE) 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* How many pages are needed for buffers */ 7262306a36Sopenharmony_ci#define GRETH_RX_BUF_PAGE_NUM (GRETH_RXBD_NUM/GRETH_RX_BUF_PPGAE) 7362306a36Sopenharmony_ci#define GRETH_TX_BUF_PAGE_NUM (GRETH_TXBD_NUM/GRETH_TX_BUF_PPGAE) 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/* Buffer size. 7662306a36Sopenharmony_ci * Gbit MAC uses tagged maximum frame size which is 1518 excluding CRC. 7762306a36Sopenharmony_ci * Set to 1520 to make all buffers word aligned for non-gbit MAC. 7862306a36Sopenharmony_ci */ 7962306a36Sopenharmony_ci#define MAX_FRAME_SIZE 1520 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/* GRETH APB registers */ 8262306a36Sopenharmony_cistruct greth_regs { 8362306a36Sopenharmony_ci u32 control; 8462306a36Sopenharmony_ci u32 status; 8562306a36Sopenharmony_ci u32 esa_msb; 8662306a36Sopenharmony_ci u32 esa_lsb; 8762306a36Sopenharmony_ci u32 mdio; 8862306a36Sopenharmony_ci u32 tx_desc_p; 8962306a36Sopenharmony_ci u32 rx_desc_p; 9062306a36Sopenharmony_ci u32 edclip; 9162306a36Sopenharmony_ci u32 hash_msb; 9262306a36Sopenharmony_ci u32 hash_lsb; 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci/* GRETH buffer descriptor */ 9662306a36Sopenharmony_cistruct greth_bd { 9762306a36Sopenharmony_ci u32 stat; 9862306a36Sopenharmony_ci u32 addr; 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistruct greth_private { 10262306a36Sopenharmony_ci struct sk_buff *rx_skbuff[GRETH_RXBD_NUM]; 10362306a36Sopenharmony_ci struct sk_buff *tx_skbuff[GRETH_TXBD_NUM]; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci unsigned char *tx_bufs[GRETH_TXBD_NUM]; 10662306a36Sopenharmony_ci unsigned char *rx_bufs[GRETH_RXBD_NUM]; 10762306a36Sopenharmony_ci u16 tx_bufs_length[GRETH_TXBD_NUM]; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci u16 tx_next; 11062306a36Sopenharmony_ci u16 tx_last; 11162306a36Sopenharmony_ci u16 tx_free; /* only used on 10/100Mbit */ 11262306a36Sopenharmony_ci u16 rx_cur; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci struct greth_regs *regs; /* Address of controller registers. */ 11562306a36Sopenharmony_ci struct greth_bd *rx_bd_base; /* Address of Rx BDs. */ 11662306a36Sopenharmony_ci struct greth_bd *tx_bd_base; /* Address of Tx BDs. */ 11762306a36Sopenharmony_ci dma_addr_t rx_bd_base_phys; 11862306a36Sopenharmony_ci dma_addr_t tx_bd_base_phys; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci int irq; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci struct device *dev; /* Pointer to platform_device->dev */ 12362306a36Sopenharmony_ci struct net_device *netdev; 12462306a36Sopenharmony_ci struct napi_struct napi; 12562306a36Sopenharmony_ci spinlock_t devlock; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci struct mii_bus *mdio; 12862306a36Sopenharmony_ci unsigned int link; 12962306a36Sopenharmony_ci unsigned int speed; 13062306a36Sopenharmony_ci unsigned int duplex; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci u32 msg_enable; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci u8 phyaddr; 13562306a36Sopenharmony_ci u8 multicast; 13662306a36Sopenharmony_ci u8 gbit_mac; 13762306a36Sopenharmony_ci u8 mdio_int_en; 13862306a36Sopenharmony_ci u8 edcl; 13962306a36Sopenharmony_ci}; 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_ci#endif 142