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