Karicheri, Muralidharan | 84640e2 | 2015-01-15 19:12:50 -0500 | [diff] [blame] | 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 | |
| 27 | /* Maximum Ethernet frame size supported by Keystone switch */ |
| 28 | #define NETCP_MAX_FRAME_SIZE 9504 |
| 29 | |
| 30 | #define SGMII_LINK_MAC_MAC_AUTONEG 0 |
| 31 | #define SGMII_LINK_MAC_PHY 1 |
| 32 | #define SGMII_LINK_MAC_MAC_FORCED 2 |
| 33 | #define SGMII_LINK_MAC_FIBER 3 |
| 34 | #define SGMII_LINK_MAC_PHY_NO_MDIO 4 |
| 35 | #define XGMII_LINK_MAC_PHY 10 |
| 36 | #define XGMII_LINK_MAC_MAC_FORCED 11 |
| 37 | |
| 38 | struct netcp_device; |
| 39 | |
| 40 | struct netcp_tx_pipe { |
| 41 | struct netcp_device *netcp_device; |
| 42 | void *dma_queue; |
| 43 | unsigned int dma_queue_id; |
Karicheri, Muralidharan | e170f40 | 2015-03-20 16:11:21 -0400 | [diff] [blame] | 44 | /* To port for packet forwarded to switch. Used only by ethss */ |
| 45 | u8 switch_to_port; |
| 46 | #define SWITCH_TO_PORT_IN_TAGINFO BIT(0) |
| 47 | u8 flags; |
Karicheri, Muralidharan | 84640e2 | 2015-01-15 19:12:50 -0500 | [diff] [blame] | 48 | void *dma_channel; |
| 49 | const char *dma_chan_name; |
| 50 | }; |
| 51 | |
| 52 | #define ADDR_NEW BIT(0) |
| 53 | #define ADDR_VALID BIT(1) |
| 54 | |
| 55 | enum netcp_addr_type { |
| 56 | ADDR_ANY, |
| 57 | ADDR_DEV, |
| 58 | ADDR_UCAST, |
| 59 | ADDR_MCAST, |
| 60 | ADDR_BCAST |
| 61 | }; |
| 62 | |
| 63 | struct netcp_addr { |
| 64 | struct netcp_intf *netcp; |
| 65 | unsigned char addr[ETH_ALEN]; |
| 66 | enum netcp_addr_type type; |
| 67 | unsigned int flags; |
| 68 | struct list_head node; |
| 69 | }; |
| 70 | |
| 71 | struct netcp_intf { |
| 72 | struct device *dev; |
| 73 | struct device *ndev_dev; |
| 74 | struct net_device *ndev; |
| 75 | bool big_endian; |
| 76 | unsigned int tx_compl_qid; |
| 77 | void *tx_pool; |
| 78 | struct list_head txhook_list_head; |
| 79 | unsigned int tx_pause_threshold; |
| 80 | void *tx_compl_q; |
| 81 | |
| 82 | unsigned int tx_resume_threshold; |
| 83 | void *rx_queue; |
| 84 | void *rx_pool; |
| 85 | struct list_head rxhook_list_head; |
| 86 | unsigned int rx_queue_id; |
| 87 | void *rx_fdq[KNAV_DMA_FDQ_PER_CHAN]; |
| 88 | u32 rx_buffer_sizes[KNAV_DMA_FDQ_PER_CHAN]; |
| 89 | struct napi_struct rx_napi; |
| 90 | struct napi_struct tx_napi; |
| 91 | |
| 92 | void *rx_channel; |
| 93 | const char *dma_chan_name; |
| 94 | u32 rx_pool_size; |
| 95 | u32 rx_pool_region_id; |
| 96 | u32 tx_pool_size; |
| 97 | u32 tx_pool_region_id; |
| 98 | struct list_head module_head; |
| 99 | struct list_head interface_list; |
| 100 | struct list_head addr_list; |
| 101 | bool netdev_registered; |
| 102 | bool primary_module_attached; |
| 103 | |
| 104 | /* Lock used for protecting Rx/Tx hook list management */ |
| 105 | spinlock_t lock; |
| 106 | struct netcp_device *netcp_device; |
| 107 | struct device_node *node_interface; |
| 108 | |
| 109 | /* DMA configuration data */ |
| 110 | u32 msg_enable; |
| 111 | u32 rx_queue_depths[KNAV_DMA_FDQ_PER_CHAN]; |
| 112 | }; |
| 113 | |
| 114 | #define NETCP_PSDATA_LEN KNAV_DMA_NUM_PS_WORDS |
| 115 | struct netcp_packet { |
| 116 | struct sk_buff *skb; |
| 117 | u32 *epib; |
| 118 | u32 *psdata; |
| 119 | unsigned int psdata_len; |
| 120 | struct netcp_intf *netcp; |
| 121 | struct netcp_tx_pipe *tx_pipe; |
| 122 | bool rxtstamp_complete; |
| 123 | void *ts_context; |
| 124 | |
| 125 | int (*txtstamp_complete)(void *ctx, struct netcp_packet *pkt); |
| 126 | }; |
| 127 | |
| 128 | static inline u32 *netcp_push_psdata(struct netcp_packet *p_info, |
| 129 | unsigned int bytes) |
| 130 | { |
| 131 | u32 *buf; |
| 132 | unsigned int words; |
| 133 | |
| 134 | if ((bytes & 0x03) != 0) |
| 135 | return NULL; |
| 136 | words = bytes >> 2; |
| 137 | |
| 138 | if ((p_info->psdata_len + words) > NETCP_PSDATA_LEN) |
| 139 | return NULL; |
| 140 | |
| 141 | p_info->psdata_len += words; |
| 142 | buf = &p_info->psdata[NETCP_PSDATA_LEN - p_info->psdata_len]; |
| 143 | return buf; |
| 144 | } |
| 145 | |
| 146 | static inline int netcp_align_psdata(struct netcp_packet *p_info, |
| 147 | unsigned int byte_align) |
| 148 | { |
| 149 | int padding; |
| 150 | |
| 151 | switch (byte_align) { |
| 152 | case 0: |
| 153 | padding = -EINVAL; |
| 154 | break; |
| 155 | case 1: |
| 156 | case 2: |
| 157 | case 4: |
| 158 | padding = 0; |
| 159 | break; |
| 160 | case 8: |
| 161 | padding = (p_info->psdata_len << 2) % 8; |
| 162 | break; |
| 163 | case 16: |
| 164 | padding = (p_info->psdata_len << 2) % 16; |
| 165 | break; |
| 166 | default: |
| 167 | padding = (p_info->psdata_len << 2) % byte_align; |
| 168 | break; |
| 169 | } |
| 170 | return padding; |
| 171 | } |
| 172 | |
| 173 | struct netcp_module { |
| 174 | const char *name; |
| 175 | struct module *owner; |
| 176 | bool primary; |
| 177 | |
| 178 | /* probe/remove: called once per NETCP instance */ |
| 179 | int (*probe)(struct netcp_device *netcp_device, |
| 180 | struct device *device, struct device_node *node, |
| 181 | void **inst_priv); |
| 182 | int (*remove)(struct netcp_device *netcp_device, void *inst_priv); |
| 183 | |
| 184 | /* attach/release: called once per network interface */ |
| 185 | int (*attach)(void *inst_priv, struct net_device *ndev, |
| 186 | struct device_node *node, void **intf_priv); |
| 187 | int (*release)(void *intf_priv); |
| 188 | int (*open)(void *intf_priv, struct net_device *ndev); |
| 189 | int (*close)(void *intf_priv, struct net_device *ndev); |
| 190 | int (*add_addr)(void *intf_priv, struct netcp_addr *naddr); |
| 191 | int (*del_addr)(void *intf_priv, struct netcp_addr *naddr); |
| 192 | int (*add_vid)(void *intf_priv, int vid); |
| 193 | int (*del_vid)(void *intf_priv, int vid); |
| 194 | int (*ioctl)(void *intf_priv, struct ifreq *req, int cmd); |
| 195 | |
| 196 | /* used internally */ |
| 197 | struct list_head module_list; |
| 198 | struct list_head interface_list; |
| 199 | }; |
| 200 | |
| 201 | int netcp_register_module(struct netcp_module *module); |
| 202 | void netcp_unregister_module(struct netcp_module *module); |
| 203 | void *netcp_module_get_intf_data(struct netcp_module *module, |
| 204 | struct netcp_intf *intf); |
| 205 | |
| 206 | int netcp_txpipe_init(struct netcp_tx_pipe *tx_pipe, |
| 207 | struct netcp_device *netcp_device, |
| 208 | const char *dma_chan_name, unsigned int dma_queue_id); |
| 209 | int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe); |
| 210 | int netcp_txpipe_close(struct netcp_tx_pipe *tx_pipe); |
| 211 | |
| 212 | typedef int netcp_hook_rtn(int order, void *data, struct netcp_packet *packet); |
| 213 | int netcp_register_txhook(struct netcp_intf *netcp_priv, int order, |
| 214 | netcp_hook_rtn *hook_rtn, void *hook_data); |
| 215 | int netcp_unregister_txhook(struct netcp_intf *netcp_priv, int order, |
| 216 | netcp_hook_rtn *hook_rtn, void *hook_data); |
| 217 | int netcp_register_rxhook(struct netcp_intf *netcp_priv, int order, |
| 218 | netcp_hook_rtn *hook_rtn, void *hook_data); |
| 219 | int netcp_unregister_rxhook(struct netcp_intf *netcp_priv, int order, |
| 220 | netcp_hook_rtn *hook_rtn, void *hook_data); |
| 221 | void *netcp_device_find_module(struct netcp_device *netcp_device, |
| 222 | const char *name); |
| 223 | |
| 224 | /* SGMII functions */ |
| 225 | int netcp_sgmii_reset(void __iomem *sgmii_ofs, int port); |
| 226 | int netcp_sgmii_get_port_link(void __iomem *sgmii_ofs, int port); |
| 227 | int netcp_sgmii_config(void __iomem *sgmii_ofs, int port, u32 interface); |
| 228 | |
| 229 | /* XGBE SERDES init functions */ |
| 230 | int netcp_xgbe_serdes_init(void __iomem *serdes_regs, void __iomem *xgbe_regs); |
| 231 | |
| 232 | #endif /* __NETCP_H__ */ |