netcp.h (6912B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * NetCP driver local header 4 * 5 * Copyright (C) 2014 Texas Instruments Incorporated 6 * Authors: Sandeep Nair <sandeep_n@ti.com> 7 * Sandeep Paulraj <s-paulraj@ti.com> 8 * Cyril Chemparathy <cyril@ti.com> 9 * Santosh Shilimkar <santosh.shilimkar@ti.com> 10 * Wingman Kwok <w-kwok2@ti.com> 11 * Murali Karicheri <m-karicheri2@ti.com> 12 */ 13#ifndef __NETCP_H__ 14#define __NETCP_H__ 15 16#include <linux/netdevice.h> 17#include <linux/soc/ti/knav_dma.h> 18#include <linux/u64_stats_sync.h> 19 20/* Maximum Ethernet frame size supported by Keystone switch */ 21#define NETCP_MAX_FRAME_SIZE 9504 22 23#define SGMII_LINK_MAC_MAC_AUTONEG 0 24#define SGMII_LINK_MAC_PHY 1 25#define SGMII_LINK_MAC_MAC_FORCED 2 26#define SGMII_LINK_MAC_FIBER 3 27#define SGMII_LINK_MAC_PHY_NO_MDIO 4 28#define RGMII_LINK_MAC_PHY 5 29#define RGMII_LINK_MAC_PHY_NO_MDIO 7 30#define XGMII_LINK_MAC_PHY 10 31#define XGMII_LINK_MAC_MAC_FORCED 11 32 33struct netcp_device; 34 35struct netcp_tx_pipe { 36 struct netcp_device *netcp_device; 37 void *dma_queue; 38 unsigned int dma_queue_id; 39 /* To port for packet forwarded to switch. Used only by ethss */ 40 u8 switch_to_port; 41#define SWITCH_TO_PORT_IN_TAGINFO BIT(0) 42 u8 flags; 43 void *dma_channel; 44 const char *dma_chan_name; 45}; 46 47#define ADDR_NEW BIT(0) 48#define ADDR_VALID BIT(1) 49 50enum netcp_addr_type { 51 ADDR_ANY, 52 ADDR_DEV, 53 ADDR_UCAST, 54 ADDR_MCAST, 55 ADDR_BCAST 56}; 57 58struct netcp_addr { 59 struct netcp_intf *netcp; 60 unsigned char addr[ETH_ALEN]; 61 enum netcp_addr_type type; 62 unsigned int flags; 63 struct list_head node; 64}; 65 66struct netcp_stats { 67 struct u64_stats_sync syncp_rx ____cacheline_aligned_in_smp; 68 u64 rx_packets; 69 u64 rx_bytes; 70 u32 rx_errors; 71 u32 rx_dropped; 72 73 struct u64_stats_sync syncp_tx ____cacheline_aligned_in_smp; 74 u64 tx_packets; 75 u64 tx_bytes; 76 u32 tx_errors; 77 u32 tx_dropped; 78}; 79 80struct netcp_intf { 81 struct device *dev; 82 struct device *ndev_dev; 83 struct net_device *ndev; 84 bool big_endian; 85 unsigned int tx_compl_qid; 86 void *tx_pool; 87 struct list_head txhook_list_head; 88 unsigned int tx_pause_threshold; 89 void *tx_compl_q; 90 91 unsigned int tx_resume_threshold; 92 void *rx_queue; 93 void *rx_pool; 94 struct list_head rxhook_list_head; 95 unsigned int rx_queue_id; 96 void *rx_fdq[KNAV_DMA_FDQ_PER_CHAN]; 97 struct napi_struct rx_napi; 98 struct napi_struct tx_napi; 99#define ETH_SW_CAN_REMOVE_ETH_FCS BIT(0) 100 u32 hw_cap; 101 102 /* 64-bit netcp stats */ 103 struct netcp_stats stats; 104 105 void *rx_channel; 106 const char *dma_chan_name; 107 u32 rx_pool_size; 108 u32 rx_pool_region_id; 109 u32 tx_pool_size; 110 u32 tx_pool_region_id; 111 struct list_head module_head; 112 struct list_head interface_list; 113 struct list_head addr_list; 114 bool netdev_registered; 115 bool primary_module_attached; 116 117 /* Lock used for protecting Rx/Tx hook list management */ 118 spinlock_t lock; 119 struct netcp_device *netcp_device; 120 struct device_node *node_interface; 121 122 /* DMA configuration data */ 123 u32 msg_enable; 124 u32 rx_queue_depths[KNAV_DMA_FDQ_PER_CHAN]; 125}; 126 127#define NETCP_PSDATA_LEN KNAV_DMA_NUM_PS_WORDS 128struct netcp_packet { 129 struct sk_buff *skb; 130 __le32 *epib; 131 u32 *psdata; 132 u32 eflags; 133 unsigned int psdata_len; 134 struct netcp_intf *netcp; 135 struct netcp_tx_pipe *tx_pipe; 136 bool rxtstamp_complete; 137 void *ts_context; 138 139 void (*txtstamp)(void *ctx, struct sk_buff *skb); 140}; 141 142static inline u32 *netcp_push_psdata(struct netcp_packet *p_info, 143 unsigned int bytes) 144{ 145 u32 *buf; 146 unsigned int words; 147 148 if ((bytes & 0x03) != 0) 149 return NULL; 150 words = bytes >> 2; 151 152 if ((p_info->psdata_len + words) > NETCP_PSDATA_LEN) 153 return NULL; 154 155 p_info->psdata_len += words; 156 buf = &p_info->psdata[NETCP_PSDATA_LEN - p_info->psdata_len]; 157 return buf; 158} 159 160static inline int netcp_align_psdata(struct netcp_packet *p_info, 161 unsigned int byte_align) 162{ 163 int padding; 164 165 switch (byte_align) { 166 case 0: 167 padding = -EINVAL; 168 break; 169 case 1: 170 case 2: 171 case 4: 172 padding = 0; 173 break; 174 case 8: 175 padding = (p_info->psdata_len << 2) % 8; 176 break; 177 case 16: 178 padding = (p_info->psdata_len << 2) % 16; 179 break; 180 default: 181 padding = (p_info->psdata_len << 2) % byte_align; 182 break; 183 } 184 return padding; 185} 186 187struct netcp_module { 188 const char *name; 189 struct module *owner; 190 bool primary; 191 192 /* probe/remove: called once per NETCP instance */ 193 int (*probe)(struct netcp_device *netcp_device, 194 struct device *device, struct device_node *node, 195 void **inst_priv); 196 int (*remove)(struct netcp_device *netcp_device, void *inst_priv); 197 198 /* attach/release: called once per network interface */ 199 int (*attach)(void *inst_priv, struct net_device *ndev, 200 struct device_node *node, void **intf_priv); 201 int (*release)(void *intf_priv); 202 int (*open)(void *intf_priv, struct net_device *ndev); 203 int (*close)(void *intf_priv, struct net_device *ndev); 204 int (*add_addr)(void *intf_priv, struct netcp_addr *naddr); 205 int (*del_addr)(void *intf_priv, struct netcp_addr *naddr); 206 int (*add_vid)(void *intf_priv, int vid); 207 int (*del_vid)(void *intf_priv, int vid); 208 int (*ioctl)(void *intf_priv, struct ifreq *req, int cmd); 209 int (*set_rx_mode)(void *intf_priv, bool promisc); 210 211 /* used internally */ 212 struct list_head module_list; 213 struct list_head interface_list; 214}; 215 216int netcp_register_module(struct netcp_module *module); 217void netcp_unregister_module(struct netcp_module *module); 218void *netcp_module_get_intf_data(struct netcp_module *module, 219 struct netcp_intf *intf); 220 221int netcp_txpipe_init(struct netcp_tx_pipe *tx_pipe, 222 struct netcp_device *netcp_device, 223 const char *dma_chan_name, unsigned int dma_queue_id); 224int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe); 225int netcp_txpipe_close(struct netcp_tx_pipe *tx_pipe); 226 227typedef int netcp_hook_rtn(int order, void *data, struct netcp_packet *packet); 228int netcp_register_txhook(struct netcp_intf *netcp_priv, int order, 229 netcp_hook_rtn *hook_rtn, void *hook_data); 230int netcp_unregister_txhook(struct netcp_intf *netcp_priv, int order, 231 netcp_hook_rtn *hook_rtn, void *hook_data); 232int netcp_register_rxhook(struct netcp_intf *netcp_priv, int order, 233 netcp_hook_rtn *hook_rtn, void *hook_data); 234int netcp_unregister_rxhook(struct netcp_intf *netcp_priv, int order, 235 netcp_hook_rtn *hook_rtn, void *hook_data); 236void *netcp_device_find_module(struct netcp_device *netcp_device, 237 const char *name); 238 239/* SGMII functions */ 240int netcp_sgmii_reset(void __iomem *sgmii_ofs, int port); 241bool netcp_sgmii_rtreset(void __iomem *sgmii_ofs, int port, bool set); 242int netcp_sgmii_get_port_link(void __iomem *sgmii_ofs, int port); 243int netcp_sgmii_config(void __iomem *sgmii_ofs, int port, u32 interface); 244 245/* XGBE SERDES init functions */ 246int netcp_xgbe_serdes_init(void __iomem *serdes_regs, void __iomem *xgbe_regs); 247 248#endif /* __NETCP_H__ */