1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2ec21e2ecSJeff Kirsher #ifndef FS_ENET_H 3ec21e2ecSJeff Kirsher #define FS_ENET_H 4ec21e2ecSJeff Kirsher 5*7a769183SChristophe Leroy #include <linux/clk.h> 6ec21e2ecSJeff Kirsher #include <linux/mii.h> 7ec21e2ecSJeff Kirsher #include <linux/netdevice.h> 8ec21e2ecSJeff Kirsher #include <linux/types.h> 9ec21e2ecSJeff Kirsher #include <linux/list.h> 10ec21e2ecSJeff Kirsher #include <linux/phy.h> 11ec21e2ecSJeff Kirsher #include <linux/dma-mapping.h> 12ec21e2ecSJeff Kirsher 13ec21e2ecSJeff Kirsher #ifdef CONFIG_CPM1 14ec21e2ecSJeff Kirsher #include <asm/cpm1.h> 15ec21e2ecSJeff Kirsher #endif 16ec21e2ecSJeff Kirsher 17ec21e2ecSJeff Kirsher #if defined(CONFIG_FS_ENET_HAS_FEC) 18ec21e2ecSJeff Kirsher #include <asm/cpm.h> 19ec21e2ecSJeff Kirsher 20ec21e2ecSJeff Kirsher #if defined(CONFIG_FS_ENET_MPC5121_FEC) 21ec21e2ecSJeff Kirsher /* MPC5121 FEC has different register layout */ 22ec21e2ecSJeff Kirsher struct fec { 23ec21e2ecSJeff Kirsher u32 fec_reserved0; 24ec21e2ecSJeff Kirsher u32 fec_ievent; /* Interrupt event reg */ 25ec21e2ecSJeff Kirsher u32 fec_imask; /* Interrupt mask reg */ 26ec21e2ecSJeff Kirsher u32 fec_reserved1; 27ec21e2ecSJeff Kirsher u32 fec_r_des_active; /* Receive descriptor reg */ 28ec21e2ecSJeff Kirsher u32 fec_x_des_active; /* Transmit descriptor reg */ 29ec21e2ecSJeff Kirsher u32 fec_reserved2[3]; 30ec21e2ecSJeff Kirsher u32 fec_ecntrl; /* Ethernet control reg */ 31ec21e2ecSJeff Kirsher u32 fec_reserved3[6]; 32ec21e2ecSJeff Kirsher u32 fec_mii_data; /* MII manage frame reg */ 33ec21e2ecSJeff Kirsher u32 fec_mii_speed; /* MII speed control reg */ 34ec21e2ecSJeff Kirsher u32 fec_reserved4[7]; 35ec21e2ecSJeff Kirsher u32 fec_mib_ctrlstat; /* MIB control/status reg */ 36ec21e2ecSJeff Kirsher u32 fec_reserved5[7]; 37ec21e2ecSJeff Kirsher u32 fec_r_cntrl; /* Receive control reg */ 38ec21e2ecSJeff Kirsher u32 fec_reserved6[15]; 39ec21e2ecSJeff Kirsher u32 fec_x_cntrl; /* Transmit Control reg */ 40ec21e2ecSJeff Kirsher u32 fec_reserved7[7]; 41ec21e2ecSJeff Kirsher u32 fec_addr_low; /* Low 32bits MAC address */ 42ec21e2ecSJeff Kirsher u32 fec_addr_high; /* High 16bits MAC address */ 43ec21e2ecSJeff Kirsher u32 fec_opd; /* Opcode + Pause duration */ 44ec21e2ecSJeff Kirsher u32 fec_reserved8[10]; 45ec21e2ecSJeff Kirsher u32 fec_hash_table_high; /* High 32bits hash table */ 46ec21e2ecSJeff Kirsher u32 fec_hash_table_low; /* Low 32bits hash table */ 47ec21e2ecSJeff Kirsher u32 fec_grp_hash_table_high; /* High 32bits hash table */ 48ec21e2ecSJeff Kirsher u32 fec_grp_hash_table_low; /* Low 32bits hash table */ 49ec21e2ecSJeff Kirsher u32 fec_reserved9[7]; 50ec21e2ecSJeff Kirsher u32 fec_x_wmrk; /* FIFO transmit water mark */ 51ec21e2ecSJeff Kirsher u32 fec_reserved10; 52ec21e2ecSJeff Kirsher u32 fec_r_bound; /* FIFO receive bound reg */ 53ec21e2ecSJeff Kirsher u32 fec_r_fstart; /* FIFO receive start reg */ 54ec21e2ecSJeff Kirsher u32 fec_reserved11[11]; 55ec21e2ecSJeff Kirsher u32 fec_r_des_start; /* Receive descriptor ring */ 56ec21e2ecSJeff Kirsher u32 fec_x_des_start; /* Transmit descriptor ring */ 57ec21e2ecSJeff Kirsher u32 fec_r_buff_size; /* Maximum receive buff size */ 58ec21e2ecSJeff Kirsher u32 fec_reserved12[26]; 59ec21e2ecSJeff Kirsher u32 fec_dma_control; /* DMA Endian and other ctrl */ 60ec21e2ecSJeff Kirsher }; 61ec21e2ecSJeff Kirsher #endif 62ec21e2ecSJeff Kirsher 63ec21e2ecSJeff Kirsher struct fec_info { 64ec21e2ecSJeff Kirsher struct fec __iomem *fecp; 65ec21e2ecSJeff Kirsher u32 mii_speed; 66ec21e2ecSJeff Kirsher }; 67ec21e2ecSJeff Kirsher #endif 68ec21e2ecSJeff Kirsher 69ec21e2ecSJeff Kirsher #ifdef CONFIG_CPM2 70ec21e2ecSJeff Kirsher #include <asm/cpm2.h> 71ec21e2ecSJeff Kirsher #endif 72ec21e2ecSJeff Kirsher 73ec21e2ecSJeff Kirsher /* hw driver ops */ 74ec21e2ecSJeff Kirsher struct fs_ops { 75ec21e2ecSJeff Kirsher int (*setup_data)(struct net_device *dev); 76ec21e2ecSJeff Kirsher int (*allocate_bd)(struct net_device *dev); 77ec21e2ecSJeff Kirsher void (*free_bd)(struct net_device *dev); 78ec21e2ecSJeff Kirsher void (*cleanup_data)(struct net_device *dev); 79ec21e2ecSJeff Kirsher void (*set_multicast_list)(struct net_device *dev); 80ec21e2ecSJeff Kirsher void (*adjust_link)(struct net_device *dev); 81ec21e2ecSJeff Kirsher void (*restart)(struct net_device *dev); 82ec21e2ecSJeff Kirsher void (*stop)(struct net_device *dev); 838572763aSChristophe Leroy void (*napi_clear_event)(struct net_device *dev); 848572763aSChristophe Leroy void (*napi_enable)(struct net_device *dev); 858572763aSChristophe Leroy void (*napi_disable)(struct net_device *dev); 86ec21e2ecSJeff Kirsher void (*rx_bd_done)(struct net_device *dev); 87ec21e2ecSJeff Kirsher void (*tx_kickstart)(struct net_device *dev); 88ec21e2ecSJeff Kirsher u32 (*get_int_events)(struct net_device *dev); 89ec21e2ecSJeff Kirsher void (*clear_int_events)(struct net_device *dev, u32 int_events); 90ec21e2ecSJeff Kirsher void (*ev_error)(struct net_device *dev, u32 int_events); 91ec21e2ecSJeff Kirsher int (*get_regs)(struct net_device *dev, void *p, int *sizep); 92ec21e2ecSJeff Kirsher int (*get_regs_len)(struct net_device *dev); 93ec21e2ecSJeff Kirsher void (*tx_restart)(struct net_device *dev); 94ec21e2ecSJeff Kirsher }; 95ec21e2ecSJeff Kirsher 96ec21e2ecSJeff Kirsher struct phy_info { 97ec21e2ecSJeff Kirsher unsigned int id; 98ec21e2ecSJeff Kirsher const char *name; 99ec21e2ecSJeff Kirsher void (*startup) (struct net_device * dev); 100ec21e2ecSJeff Kirsher void (*shutdown) (struct net_device * dev); 101ec21e2ecSJeff Kirsher void (*ack_int) (struct net_device * dev); 102ec21e2ecSJeff Kirsher }; 103ec21e2ecSJeff Kirsher 104ec21e2ecSJeff Kirsher /* The FEC stores dest/src/type, data, and checksum for receive packets. 105ec21e2ecSJeff Kirsher */ 106ec21e2ecSJeff Kirsher #define MAX_MTU 1508 /* Allow fullsized pppoe packets over VLAN */ 107ec21e2ecSJeff Kirsher #define MIN_MTU 46 /* this is data size */ 108ec21e2ecSJeff Kirsher #define CRC_LEN 4 109ec21e2ecSJeff Kirsher 110ec21e2ecSJeff Kirsher #define PKT_MAXBUF_SIZE (MAX_MTU+ETH_HLEN+CRC_LEN) 111ec21e2ecSJeff Kirsher #define PKT_MINBUF_SIZE (MIN_MTU+ETH_HLEN+CRC_LEN) 112ec21e2ecSJeff Kirsher 113ec21e2ecSJeff Kirsher /* Must be a multiple of 32 (to cover both FEC & FCC) */ 114ec21e2ecSJeff Kirsher #define PKT_MAXBLR_SIZE ((PKT_MAXBUF_SIZE + 31) & ~31) 115ec21e2ecSJeff Kirsher /* This is needed so that invalidate_xxx wont invalidate too much */ 116ec21e2ecSJeff Kirsher #define ENET_RX_ALIGN 16 117ec21e2ecSJeff Kirsher #define ENET_RX_FRSIZE L1_CACHE_ALIGN(PKT_MAXBUF_SIZE + ENET_RX_ALIGN - 1) 118ec21e2ecSJeff Kirsher 119*7a769183SChristophe Leroy struct fs_platform_info { 120*7a769183SChristophe Leroy /* device specific information */ 121*7a769183SChristophe Leroy u32 cp_command; /* CPM page/sblock/mcn */ 122*7a769183SChristophe Leroy 123*7a769183SChristophe Leroy u32 dpram_offset; 124*7a769183SChristophe Leroy 125*7a769183SChristophe Leroy struct device_node *phy_node; 126*7a769183SChristophe Leroy 127*7a769183SChristophe Leroy int rx_ring, tx_ring; /* number of buffers on rx */ 128*7a769183SChristophe Leroy int rx_copybreak; /* limit we copy small frames */ 129*7a769183SChristophe Leroy int napi_weight; /* NAPI weight */ 130*7a769183SChristophe Leroy 131*7a769183SChristophe Leroy int use_rmii; /* use RMII mode */ 132*7a769183SChristophe Leroy 133*7a769183SChristophe Leroy struct clk *clk_per; /* 'per' clock for register access */ 134*7a769183SChristophe Leroy }; 135*7a769183SChristophe Leroy 136ec21e2ecSJeff Kirsher struct fs_enet_private { 137ec21e2ecSJeff Kirsher struct napi_struct napi; 138ec21e2ecSJeff Kirsher struct device *dev; /* pointer back to the device (must be initialized first) */ 139ec21e2ecSJeff Kirsher struct net_device *ndev; 140ec21e2ecSJeff Kirsher spinlock_t lock; /* during all ops except TX pckt processing */ 141ec21e2ecSJeff Kirsher spinlock_t tx_lock; /* during fs_start_xmit and fs_tx */ 142ec21e2ecSJeff Kirsher struct fs_platform_info *fpi; 143f8b39039SChristophe Leroy struct work_struct timeout_work; 144ec21e2ecSJeff Kirsher const struct fs_ops *ops; 145ec21e2ecSJeff Kirsher int rx_ring, tx_ring; 146ec21e2ecSJeff Kirsher dma_addr_t ring_mem_addr; 147ec21e2ecSJeff Kirsher void __iomem *ring_base; 148ec21e2ecSJeff Kirsher struct sk_buff **rx_skbuff; 149ec21e2ecSJeff Kirsher struct sk_buff **tx_skbuff; 1504fc9b87bSLEROY Christophe char *mapped_as_page; 151ec21e2ecSJeff Kirsher cbd_t __iomem *rx_bd_base; /* Address of Rx and Tx buffers. */ 152ec21e2ecSJeff Kirsher cbd_t __iomem *tx_bd_base; 153ec21e2ecSJeff Kirsher cbd_t __iomem *dirty_tx; /* ring entries to be free()ed. */ 154ec21e2ecSJeff Kirsher cbd_t __iomem *cur_rx; 155ec21e2ecSJeff Kirsher cbd_t __iomem *cur_tx; 156ec21e2ecSJeff Kirsher int tx_free; 157ec21e2ecSJeff Kirsher const struct phy_info *phy; 158ec21e2ecSJeff Kirsher u32 msg_enable; 159ec21e2ecSJeff Kirsher struct mii_if_info mii_if; 160ec21e2ecSJeff Kirsher unsigned int last_mii_status; 161ec21e2ecSJeff Kirsher int interrupt; 162ec21e2ecSJeff Kirsher 163ec21e2ecSJeff Kirsher int oldduplex, oldspeed, oldlink; /* current settings */ 164ec21e2ecSJeff Kirsher 165ec21e2ecSJeff Kirsher /* event masks */ 1668572763aSChristophe Leroy u32 ev_napi; /* mask of NAPI events */ 1678572763aSChristophe Leroy u32 ev; /* event mask */ 168ec21e2ecSJeff Kirsher u32 ev_err; /* error event mask */ 169ec21e2ecSJeff Kirsher 170ec21e2ecSJeff Kirsher u16 bd_rx_empty; /* mask of BD rx empty */ 171ec21e2ecSJeff Kirsher u16 bd_rx_err; /* mask of BD rx errors */ 172ec21e2ecSJeff Kirsher 173ec21e2ecSJeff Kirsher union { 174ec21e2ecSJeff Kirsher struct { 175ec21e2ecSJeff Kirsher int idx; /* FEC1 = 0, FEC2 = 1 */ 176ec21e2ecSJeff Kirsher void __iomem *fecp; /* hw registers */ 177ec21e2ecSJeff Kirsher u32 hthi, htlo; /* state for multicast */ 178ec21e2ecSJeff Kirsher } fec; 179ec21e2ecSJeff Kirsher 180ec21e2ecSJeff Kirsher struct { 181ec21e2ecSJeff Kirsher int idx; /* FCC1-3 = 0-2 */ 182ec21e2ecSJeff Kirsher void __iomem *fccp; /* hw registers */ 183ec21e2ecSJeff Kirsher void __iomem *ep; /* parameter ram */ 184ec21e2ecSJeff Kirsher void __iomem *fcccp; /* hw registers cont. */ 185ec21e2ecSJeff Kirsher void __iomem *mem; /* FCC DPRAM */ 186ec21e2ecSJeff Kirsher u32 gaddrh, gaddrl; /* group address */ 187ec21e2ecSJeff Kirsher } fcc; 188ec21e2ecSJeff Kirsher 189ec21e2ecSJeff Kirsher struct { 190ec21e2ecSJeff Kirsher int idx; /* FEC1 = 0, FEC2 = 1 */ 191ec21e2ecSJeff Kirsher void __iomem *sccp; /* hw registers */ 192ec21e2ecSJeff Kirsher void __iomem *ep; /* parameter ram */ 193ec21e2ecSJeff Kirsher u32 hthi, htlo; /* state for multicast */ 194ec21e2ecSJeff Kirsher } scc; 195ec21e2ecSJeff Kirsher 196ec21e2ecSJeff Kirsher }; 197ec21e2ecSJeff Kirsher }; 198ec21e2ecSJeff Kirsher 199ec21e2ecSJeff Kirsher /***************************************************************************/ 200ec21e2ecSJeff Kirsher 201ec21e2ecSJeff Kirsher void fs_init_bds(struct net_device *dev); 202ec21e2ecSJeff Kirsher void fs_cleanup_bds(struct net_device *dev); 203ec21e2ecSJeff Kirsher 204ec21e2ecSJeff Kirsher /***************************************************************************/ 205ec21e2ecSJeff Kirsher 206ec21e2ecSJeff Kirsher #define DRV_MODULE_NAME "fs_enet" 207ec21e2ecSJeff Kirsher #define PFX DRV_MODULE_NAME ": " 208ec21e2ecSJeff Kirsher 209ec21e2ecSJeff Kirsher /***************************************************************************/ 210ec21e2ecSJeff Kirsher /* buffer descriptor access macros */ 211ec21e2ecSJeff Kirsher 212ec21e2ecSJeff Kirsher /* access macros */ 213ec21e2ecSJeff Kirsher #if defined(CONFIG_CPM1) 214b1769b6eSJilin Yuan /* for a CPM1 __raw_xxx's are sufficient */ 215ec21e2ecSJeff Kirsher #define __cbd_out32(addr, x) __raw_writel(x, addr) 216ec21e2ecSJeff Kirsher #define __cbd_out16(addr, x) __raw_writew(x, addr) 217ec21e2ecSJeff Kirsher #define __cbd_in32(addr) __raw_readl(addr) 218ec21e2ecSJeff Kirsher #define __cbd_in16(addr) __raw_readw(addr) 219ec21e2ecSJeff Kirsher #else 220ec21e2ecSJeff Kirsher /* for others play it safe */ 221ec21e2ecSJeff Kirsher #define __cbd_out32(addr, x) out_be32(addr, x) 222ec21e2ecSJeff Kirsher #define __cbd_out16(addr, x) out_be16(addr, x) 223ec21e2ecSJeff Kirsher #define __cbd_in32(addr) in_be32(addr) 224ec21e2ecSJeff Kirsher #define __cbd_in16(addr) in_be16(addr) 225ec21e2ecSJeff Kirsher #endif 226ec21e2ecSJeff Kirsher 227ec21e2ecSJeff Kirsher /* write */ 228ec21e2ecSJeff Kirsher #define CBDW_SC(_cbd, _sc) __cbd_out16(&(_cbd)->cbd_sc, (_sc)) 229ec21e2ecSJeff Kirsher #define CBDW_DATLEN(_cbd, _datlen) __cbd_out16(&(_cbd)->cbd_datlen, (_datlen)) 230ec21e2ecSJeff Kirsher #define CBDW_BUFADDR(_cbd, _bufaddr) __cbd_out32(&(_cbd)->cbd_bufaddr, (_bufaddr)) 231ec21e2ecSJeff Kirsher 232ec21e2ecSJeff Kirsher /* read */ 233ec21e2ecSJeff Kirsher #define CBDR_SC(_cbd) __cbd_in16(&(_cbd)->cbd_sc) 234ec21e2ecSJeff Kirsher #define CBDR_DATLEN(_cbd) __cbd_in16(&(_cbd)->cbd_datlen) 235ec21e2ecSJeff Kirsher #define CBDR_BUFADDR(_cbd) __cbd_in32(&(_cbd)->cbd_bufaddr) 236ec21e2ecSJeff Kirsher 237ec21e2ecSJeff Kirsher /* set bits */ 238ec21e2ecSJeff Kirsher #define CBDS_SC(_cbd, _sc) CBDW_SC(_cbd, CBDR_SC(_cbd) | (_sc)) 239ec21e2ecSJeff Kirsher 240ec21e2ecSJeff Kirsher /* clear bits */ 241ec21e2ecSJeff Kirsher #define CBDC_SC(_cbd, _sc) CBDW_SC(_cbd, CBDR_SC(_cbd) & ~(_sc)) 242ec21e2ecSJeff Kirsher 243ec21e2ecSJeff Kirsher /*******************************************************************/ 244ec21e2ecSJeff Kirsher 245ec21e2ecSJeff Kirsher extern const struct fs_ops fs_fec_ops; 246ec21e2ecSJeff Kirsher extern const struct fs_ops fs_fcc_ops; 247ec21e2ecSJeff Kirsher extern const struct fs_ops fs_scc_ops; 248ec21e2ecSJeff Kirsher 249ec21e2ecSJeff Kirsher /*******************************************************************/ 250ec21e2ecSJeff Kirsher 251ec21e2ecSJeff Kirsher #endif 252