brintos

brintos / linux-shallow public Read only

0
0
Text · 9.6 KiB · 49a11ec Raw
390 lines · c
1/* cnic_if.h: QLogic cnic core network driver.2 *3 * Copyright (c) 2006-2014 Broadcom Corporation4 * Copyright (c) 2014-2015 QLogic Corporation5 *6 * This program is free software; you can redistribute it and/or modify7 * it under the terms of the GNU General Public License as published by8 * the Free Software Foundation.9 *10 */11 12 13#ifndef CNIC_IF_H14#define CNIC_IF_H15 16#include "bnx2x/bnx2x_mfw_req.h"17 18#define CNIC_MODULE_VERSION	"2.5.22"19#define CNIC_MODULE_RELDATE	"July 20, 2015"20 21#define CNIC_ULP_RDMA		022#define CNIC_ULP_ISCSI		123#define CNIC_ULP_FCOE		224#define CNIC_ULP_L4		325#define MAX_CNIC_ULP_TYPE_EXT	326#define MAX_CNIC_ULP_TYPE	427 28/* Use CPU native page size up to 16K for cnic ring sizes.  */29#if (PAGE_SHIFT > 14)30#define CNIC_PAGE_BITS	1431#else32#define CNIC_PAGE_BITS	PAGE_SHIFT33#endif34#define CNIC_PAGE_SIZE	(1 << (CNIC_PAGE_BITS))35#define CNIC_PAGE_ALIGN(addr) ALIGN(addr, CNIC_PAGE_SIZE)36#define CNIC_PAGE_MASK	(~((CNIC_PAGE_SIZE) - 1))37 38struct kwqe {39	u32 kwqe_op_flag;40 41#define KWQE_QID_SHIFT		842#define KWQE_OPCODE_MASK	0x00ff000043#define KWQE_OPCODE_SHIFT	1644#define KWQE_OPCODE(x)		((x & KWQE_OPCODE_MASK) >> KWQE_OPCODE_SHIFT)45#define KWQE_LAYER_MASK			0x7000000046#define KWQE_LAYER_SHIFT		2847#define KWQE_FLAGS_LAYER_MASK_L2	(2<<28)48#define KWQE_FLAGS_LAYER_MASK_L3	(3<<28)49#define KWQE_FLAGS_LAYER_MASK_L4	(4<<28)50#define KWQE_FLAGS_LAYER_MASK_L5_RDMA	(5<<28)51#define KWQE_FLAGS_LAYER_MASK_L5_ISCSI	(6<<28)52#define KWQE_FLAGS_LAYER_MASK_L5_FCOE	(7<<28)53 54	u32 kwqe_info0;55	u32 kwqe_info1;56	u32 kwqe_info2;57	u32 kwqe_info3;58	u32 kwqe_info4;59	u32 kwqe_info5;60	u32 kwqe_info6;61};62 63struct kwqe_16 {64	u32 kwqe_info0;65	u32 kwqe_info1;66	u32 kwqe_info2;67	u32 kwqe_info3;68};69 70struct kcqe {71	u32 kcqe_info0;72	u32 kcqe_info1;73	u32 kcqe_info2;74	u32 kcqe_info3;75	u32 kcqe_info4;76	u32 kcqe_info5;77	u32 kcqe_info6;78	u32 kcqe_op_flag;79		#define KCQE_RAMROD_COMPLETION		(0x1<<27) /* Everest */80		#define KCQE_FLAGS_LAYER_MASK		(0x7<<28)81		#define KCQE_FLAGS_LAYER_MASK_MISC	(0<<28)82		#define KCQE_FLAGS_LAYER_MASK_L2	(2<<28)83		#define KCQE_FLAGS_LAYER_MASK_L3	(3<<28)84		#define KCQE_FLAGS_LAYER_MASK_L4	(4<<28)85		#define KCQE_FLAGS_LAYER_MASK_L5_RDMA	(5<<28)86		#define KCQE_FLAGS_LAYER_MASK_L5_ISCSI	(6<<28)87		#define KCQE_FLAGS_LAYER_MASK_L5_FCOE	(7<<28)88		#define KCQE_FLAGS_NEXT 		(1<<31)89		#define KCQE_FLAGS_OPCODE_MASK		(0xff<<16)90		#define KCQE_FLAGS_OPCODE_SHIFT		(16)91		#define KCQE_OPCODE(op)			\92		(((op) & KCQE_FLAGS_OPCODE_MASK) >> KCQE_FLAGS_OPCODE_SHIFT)93};94 95#define MAX_CNIC_CTL_DATA	6496#define MAX_DRV_CTL_DATA	6497 98#define CNIC_CTL_STOP_CMD		199#define CNIC_CTL_START_CMD		2100#define CNIC_CTL_COMPLETION_CMD		3101#define CNIC_CTL_STOP_ISCSI_CMD		4102#define CNIC_CTL_FCOE_STATS_GET_CMD	5103#define CNIC_CTL_ISCSI_STATS_GET_CMD	6104 105#define DRV_CTL_IO_WR_CMD		0x101106#define DRV_CTL_IO_RD_CMD		0x102107#define DRV_CTL_CTX_WR_CMD		0x103108#define DRV_CTL_CTXTBL_WR_CMD		0x104109#define DRV_CTL_RET_L5_SPQ_CREDIT_CMD	0x105110#define DRV_CTL_START_L2_CMD		0x106111#define DRV_CTL_STOP_L2_CMD		0x107112#define DRV_CTL_RET_L2_SPQ_CREDIT_CMD	0x10c113#define DRV_CTL_ISCSI_STOPPED_CMD	0x10d114#define DRV_CTL_ULP_REGISTER_CMD	0x10e115#define DRV_CTL_ULP_UNREGISTER_CMD	0x10f116 117struct cnic_ctl_completion {118	u32	cid;119	u8	opcode;120	u8	error;121};122 123struct cnic_ctl_info {124	int	cmd;125	union {126		struct cnic_ctl_completion comp;127		char bytes[MAX_CNIC_CTL_DATA];128	} data;129};130 131struct drv_ctl_spq_credit {132	u32	credit_count;133};134 135struct drv_ctl_io {136	u32		cid_addr;137	u32		offset;138	u32		data;139	dma_addr_t	dma_addr;140};141 142struct drv_ctl_l2_ring {143	u32		client_id;144	u32		cid;145};146 147struct drv_ctl_register_data {148	int ulp_type;149	struct fcoe_capabilities fcoe_features;150};151 152struct drv_ctl_info {153	int	cmd;154	int     drv_state;155#define DRV_NOP		0156#define DRV_ACTIVE	1157#define DRV_INACTIVE	2158#define DRV_UNLOADED	3159	union {160		struct drv_ctl_spq_credit credit;161		struct drv_ctl_io io;162		struct drv_ctl_l2_ring ring;163		int ulp_type;164		struct drv_ctl_register_data register_data;165		char bytes[MAX_DRV_CTL_DATA];166	} data;167};168 169#define MAX_NPIV_ENTRIES 64170#define FC_NPIV_WWN_SIZE 8171 172struct cnic_fc_npiv_tbl {173	u8 wwpn[MAX_NPIV_ENTRIES][FC_NPIV_WWN_SIZE];174	u8 wwnn[MAX_NPIV_ENTRIES][FC_NPIV_WWN_SIZE];175	u32 count;176};177 178struct cnic_ops {179	struct module	*cnic_owner;180	/* Calls to these functions are protected by RCU.  When181	 * unregistering, we wait for any calls to complete before182	 * continuing.183	 */184	int		(*cnic_handler)(void *, void *);185	int		(*cnic_ctl)(void *, struct cnic_ctl_info *);186};187 188#define MAX_CNIC_VEC	8189 190struct cnic_irq {191	unsigned int	vector;192	void		*status_blk;193	dma_addr_t	status_blk_map;194	u32		status_blk_num;195	u32		status_blk_num2;196	u32		irq_flags;197#define CNIC_IRQ_FL_MSIX		0x00000001198};199 200struct cnic_eth_dev {201	struct module	*drv_owner;202	u32		drv_state;203#define CNIC_DRV_STATE_REGD		0x00000001204#define CNIC_DRV_STATE_USING_MSIX	0x00000002205#define CNIC_DRV_STATE_NO_ISCSI_OOO	0x00000004206#define CNIC_DRV_STATE_NO_ISCSI		0x00000008207#define CNIC_DRV_STATE_NO_FCOE		0x00000010208#define CNIC_DRV_STATE_HANDLES_IRQ	0x00000020209	u32		chip_id;210	u32		max_kwqe_pending;211	struct pci_dev	*pdev;212	void __iomem	*io_base;213	void __iomem	*io_base2;214	const void	*iro_arr;215 216	u32		ctx_tbl_offset;217	u32		ctx_tbl_len;218	int		ctx_blk_size;219	u32		starting_cid;220	u32		max_iscsi_conn;221	u32		max_fcoe_conn;222	u32		max_rdma_conn;223	u32		fcoe_init_cid;224	u32		max_fcoe_exchanges;225	u32		fcoe_wwn_port_name_hi;226	u32		fcoe_wwn_port_name_lo;227	u32		fcoe_wwn_node_name_hi;228	u32		fcoe_wwn_node_name_lo;229 230	u16		iscsi_l2_client_id;231	u16		iscsi_l2_cid;232	u8		iscsi_mac[ETH_ALEN];233 234	int		num_irq;235	struct cnic_irq	irq_arr[MAX_CNIC_VEC];236	int		(*drv_register_cnic)(struct net_device *,237					     struct cnic_ops *, void *);238	int		(*drv_unregister_cnic)(struct net_device *);239	int		(*drv_submit_kwqes_32)(struct net_device *,240					       struct kwqe *[], u32);241	int		(*drv_submit_kwqes_16)(struct net_device *,242					       struct kwqe_16 *[], u32);243	int		(*drv_ctl)(struct net_device *, struct drv_ctl_info *);244	int		(*drv_get_fc_npiv_tbl)(struct net_device *,245					       struct cnic_fc_npiv_tbl *);246	unsigned long	reserved1[2];247	union drv_info_to_mcp	*addr_drv_info_to_mcp;248};249 250struct cnic_sockaddr {251	union {252		struct sockaddr_in	v4;253		struct sockaddr_in6	v6;254	} local;255	union {256		struct sockaddr_in	v4;257		struct sockaddr_in6	v6;258	} remote;259};260 261struct cnic_sock {262	struct cnic_dev *dev;263	void	*context;264	u32	src_ip[4];265	u32	dst_ip[4];266	u16	src_port;267	u16	dst_port;268	u16	vlan_id;269	unsigned char old_ha[ETH_ALEN];270	unsigned char ha[ETH_ALEN];271	u32	mtu;272	u32	cid;273	u32	l5_cid;274	u32	pg_cid;275	int	ulp_type;276 277	u32	ka_timeout;278	u32	ka_interval;279	u8	ka_max_probe_count;280	u8	tos;281	u8	ttl;282	u8	snd_seq_scale;283	u32	rcv_buf;284	u32	snd_buf;285	u32	seed;286 287	unsigned long	tcp_flags;288#define SK_TCP_NO_DELAY_ACK	0x1289#define SK_TCP_KEEP_ALIVE	0x2290#define SK_TCP_NAGLE		0x4291#define SK_TCP_TIMESTAMP	0x8292#define SK_TCP_SACK		0x10293#define SK_TCP_SEG_SCALING	0x20294	unsigned long	flags;295#define SK_F_INUSE		0296#define SK_F_OFFLD_COMPLETE	1297#define SK_F_OFFLD_SCHED	2298#define SK_F_PG_OFFLD_COMPLETE	3299#define SK_F_CONNECT_START	4300#define SK_F_IPV6		5301#define SK_F_CLOSING		7302#define SK_F_HW_ERR		8303 304	atomic_t ref_count;305	u32 state;306	struct kwqe kwqe1;307	struct kwqe kwqe2;308	struct kwqe kwqe3;309};310 311struct cnic_dev {312	struct net_device	*netdev;313	struct pci_dev		*pcidev;314	void __iomem		*regview;315	struct list_head	list;316 317	int (*register_device)(struct cnic_dev *dev, int ulp_type,318			       void *ulp_ctx);319	int (*unregister_device)(struct cnic_dev *dev, int ulp_type);320	int (*submit_kwqes)(struct cnic_dev *dev, struct kwqe *wqes[],321				u32 num_wqes);322	int (*submit_kwqes_16)(struct cnic_dev *dev, struct kwqe_16 *wqes[],323				u32 num_wqes);324 325	int (*cm_create)(struct cnic_dev *, int, u32, u32, struct cnic_sock **,326			 void *);327	int (*cm_destroy)(struct cnic_sock *);328	int (*cm_connect)(struct cnic_sock *, struct cnic_sockaddr *);329	int (*cm_abort)(struct cnic_sock *);330	int (*cm_close)(struct cnic_sock *);331	struct cnic_dev *(*cm_select_dev)(struct sockaddr_in *, int ulp_type);332	int (*iscsi_nl_msg_recv)(struct cnic_dev *dev, u32 msg_type,333				 char *data, u16 data_size);334	int (*get_fc_npiv_tbl)(struct cnic_dev *, struct cnic_fc_npiv_tbl *);335	unsigned long	flags;336#define CNIC_F_CNIC_UP		1337#define CNIC_F_BNX2_CLASS	3338#define CNIC_F_BNX2X_CLASS	4339	atomic_t	ref_count;340	u8		mac_addr[ETH_ALEN];341 342	int		max_iscsi_conn;343	int		max_fcoe_conn;344	int		max_rdma_conn;345 346	int		max_fcoe_exchanges;347 348	union drv_info_to_mcp	*stats_addr;349	struct fcoe_capabilities	*fcoe_cap;350 351	void		*cnic_priv;352};353 354#define CNIC_WR(dev, off, val)		writel(val, dev->regview + off)355#define CNIC_WR16(dev, off, val)	writew(val, dev->regview + off)356#define CNIC_WR8(dev, off, val)		writeb(val, dev->regview + off)357#define CNIC_RD(dev, off)		readl(dev->regview + off)358#define CNIC_RD16(dev, off)		readw(dev->regview + off)359 360struct cnic_ulp_ops {361	/* Calls to these functions are protected by RCU.  When362	 * unregistering, we wait for any calls to complete before363	 * continuing.364	 */365 366	void (*cnic_init)(struct cnic_dev *dev);367	void (*cnic_exit)(struct cnic_dev *dev);368	void (*cnic_start)(void *ulp_ctx);369	void (*cnic_stop)(void *ulp_ctx);370	void (*indicate_kcqes)(void *ulp_ctx, struct kcqe *cqes[],371				u32 num_cqes);372	void (*indicate_netevent)(void *ulp_ctx, unsigned long event, u16 vid);373	void (*cm_connect_complete)(struct cnic_sock *);374	void (*cm_close_complete)(struct cnic_sock *);375	void (*cm_abort_complete)(struct cnic_sock *);376	void (*cm_remote_close)(struct cnic_sock *);377	void (*cm_remote_abort)(struct cnic_sock *);378	int (*iscsi_nl_send_msg)(void *ulp_ctx, u32 msg_type,379				  char *data, u16 data_size);380	int (*cnic_get_stats)(void *ulp_ctx);381	struct module *owner;382	atomic_t ref_count;383};384 385int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops);386 387int cnic_unregister_driver(int ulp_type);388 389#endif390