brintos

brintos / linux-shallow public Read only

0
0
Text · 6.7 KiB · 7007eb8 Raw
247 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * NetCP driver local header4 *5 * Copyright (C) 2014 Texas Instruments Incorporated6 * 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		950422 23#define SGMII_LINK_MAC_MAC_AUTONEG	024#define SGMII_LINK_MAC_PHY		125#define SGMII_LINK_MAC_MAC_FORCED	226#define SGMII_LINK_MAC_FIBER		327#define SGMII_LINK_MAC_PHY_NO_MDIO	428#define RGMII_LINK_MAC_PHY		529#define RGMII_LINK_MAC_PHY_NO_MDIO	730#define XGMII_LINK_MAC_PHY		1031#define XGMII_LINK_MAC_MAC_FORCED	1132 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_BCAST56};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_WORDS128struct 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);236 237/* SGMII functions */238int netcp_sgmii_reset(void __iomem *sgmii_ofs, int port);239bool netcp_sgmii_rtreset(void __iomem *sgmii_ofs, int port, bool set);240int netcp_sgmii_get_port_link(void __iomem *sgmii_ofs, int port);241int netcp_sgmii_config(void __iomem *sgmii_ofs, int port, u32 interface);242 243/* XGBE SERDES init functions */244int netcp_xgbe_serdes_init(void __iomem *serdes_regs, void __iomem *xgbe_regs);245 246#endif	/* __NETCP_H__ */247