xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/cisco/enic/vnic_dev.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright 2008-2010 Cisco Systems, Inc.  All rights reserved.
3*4882a593Smuzhiyun  * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you may redistribute it and/or modify
6*4882a593Smuzhiyun  * it under the terms of the GNU General Public License as published by
7*4882a593Smuzhiyun  * the Free Software Foundation; version 2 of the License.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
10*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
11*4882a593Smuzhiyun  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
12*4882a593Smuzhiyun  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
13*4882a593Smuzhiyun  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
14*4882a593Smuzhiyun  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
15*4882a593Smuzhiyun  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
16*4882a593Smuzhiyun  * SOFTWARE.
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef _VNIC_DEV_H_
21*4882a593Smuzhiyun #define _VNIC_DEV_H_
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #include "vnic_resource.h"
24*4882a593Smuzhiyun #include "vnic_devcmd.h"
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifndef VNIC_PADDR_TARGET
27*4882a593Smuzhiyun #define VNIC_PADDR_TARGET	0x0000000000000000ULL
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifndef readq
readq(void __iomem * reg)31*4882a593Smuzhiyun static inline u64 readq(void __iomem *reg)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	return (((u64)readl(reg + 0x4UL) << 32) |
34*4882a593Smuzhiyun 		(u64)readl(reg));
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun 
writeq(u64 val,void __iomem * reg)37*4882a593Smuzhiyun static inline void writeq(u64 val, void __iomem *reg)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun 	writel(val & 0xffffffff, reg);
40*4882a593Smuzhiyun 	writel(val >> 32, reg + 0x4UL);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun #endif
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun #undef pr_fmt
45*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun enum vnic_dev_intr_mode {
48*4882a593Smuzhiyun 	VNIC_DEV_INTR_MODE_UNKNOWN,
49*4882a593Smuzhiyun 	VNIC_DEV_INTR_MODE_INTX,
50*4882a593Smuzhiyun 	VNIC_DEV_INTR_MODE_MSI,
51*4882a593Smuzhiyun 	VNIC_DEV_INTR_MODE_MSIX,
52*4882a593Smuzhiyun };
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun struct vnic_dev_bar {
55*4882a593Smuzhiyun 	void __iomem *vaddr;
56*4882a593Smuzhiyun 	dma_addr_t bus_addr;
57*4882a593Smuzhiyun 	unsigned long len;
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun struct vnic_dev_ring {
61*4882a593Smuzhiyun 	void *descs;
62*4882a593Smuzhiyun 	size_t size;
63*4882a593Smuzhiyun 	dma_addr_t base_addr;
64*4882a593Smuzhiyun 	size_t base_align;
65*4882a593Smuzhiyun 	void *descs_unaligned;
66*4882a593Smuzhiyun 	size_t size_unaligned;
67*4882a593Smuzhiyun 	dma_addr_t base_addr_unaligned;
68*4882a593Smuzhiyun 	unsigned int desc_size;
69*4882a593Smuzhiyun 	unsigned int desc_count;
70*4882a593Smuzhiyun 	unsigned int desc_avail;
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun enum vnic_proxy_type {
74*4882a593Smuzhiyun 	PROXY_NONE,
75*4882a593Smuzhiyun 	PROXY_BY_BDF,
76*4882a593Smuzhiyun 	PROXY_BY_INDEX,
77*4882a593Smuzhiyun };
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun struct vnic_res {
80*4882a593Smuzhiyun 	void __iomem *vaddr;
81*4882a593Smuzhiyun 	dma_addr_t bus_addr;
82*4882a593Smuzhiyun 	unsigned int count;
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun struct vnic_intr_coal_timer_info {
86*4882a593Smuzhiyun 	u32 mul;
87*4882a593Smuzhiyun 	u32 div;
88*4882a593Smuzhiyun 	u32 max_usec;
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun struct vnic_dev {
92*4882a593Smuzhiyun 	void *priv;
93*4882a593Smuzhiyun 	struct pci_dev *pdev;
94*4882a593Smuzhiyun 	struct vnic_res res[RES_TYPE_MAX];
95*4882a593Smuzhiyun 	enum vnic_dev_intr_mode intr_mode;
96*4882a593Smuzhiyun 	struct vnic_devcmd __iomem *devcmd;
97*4882a593Smuzhiyun 	struct vnic_devcmd_notify *notify;
98*4882a593Smuzhiyun 	struct vnic_devcmd_notify notify_copy;
99*4882a593Smuzhiyun 	dma_addr_t notify_pa;
100*4882a593Smuzhiyun 	u32 notify_sz;
101*4882a593Smuzhiyun 	dma_addr_t linkstatus_pa;
102*4882a593Smuzhiyun 	struct vnic_stats *stats;
103*4882a593Smuzhiyun 	dma_addr_t stats_pa;
104*4882a593Smuzhiyun 	struct vnic_devcmd_fw_info *fw_info;
105*4882a593Smuzhiyun 	dma_addr_t fw_info_pa;
106*4882a593Smuzhiyun 	enum vnic_proxy_type proxy;
107*4882a593Smuzhiyun 	u32 proxy_index;
108*4882a593Smuzhiyun 	u64 args[VNIC_DEVCMD_NARGS];
109*4882a593Smuzhiyun 	struct vnic_intr_coal_timer_info intr_coal_timer_info;
110*4882a593Smuzhiyun 	struct devcmd2_controller *devcmd2;
111*4882a593Smuzhiyun 	int (*devcmd_rtn)(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
112*4882a593Smuzhiyun 			  int wait);
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun struct vnic_stats;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun void *vnic_dev_priv(struct vnic_dev *vdev);
118*4882a593Smuzhiyun unsigned int vnic_dev_get_res_count(struct vnic_dev *vdev,
119*4882a593Smuzhiyun 	enum vnic_res_type type);
120*4882a593Smuzhiyun void __iomem *vnic_dev_get_res(struct vnic_dev *vdev, enum vnic_res_type type,
121*4882a593Smuzhiyun 	unsigned int index);
122*4882a593Smuzhiyun void vnic_dev_clear_desc_ring(struct vnic_dev_ring *ring);
123*4882a593Smuzhiyun int vnic_dev_alloc_desc_ring(struct vnic_dev *vdev, struct vnic_dev_ring *ring,
124*4882a593Smuzhiyun 	unsigned int desc_count, unsigned int desc_size);
125*4882a593Smuzhiyun void vnic_dev_free_desc_ring(struct vnic_dev *vdev,
126*4882a593Smuzhiyun 	struct vnic_dev_ring *ring);
127*4882a593Smuzhiyun int vnic_dev_cmd(struct vnic_dev *vdev, enum vnic_devcmd_cmd cmd,
128*4882a593Smuzhiyun 	u64 *a0, u64 *a1, int wait);
129*4882a593Smuzhiyun void vnic_dev_cmd_proxy_by_index_start(struct vnic_dev *vdev, u16 index);
130*4882a593Smuzhiyun void vnic_dev_cmd_proxy_end(struct vnic_dev *vdev);
131*4882a593Smuzhiyun int vnic_dev_fw_info(struct vnic_dev *vdev,
132*4882a593Smuzhiyun 	struct vnic_devcmd_fw_info **fw_info);
133*4882a593Smuzhiyun int vnic_dev_spec(struct vnic_dev *vdev, unsigned int offset, unsigned int size,
134*4882a593Smuzhiyun 	void *value);
135*4882a593Smuzhiyun int vnic_dev_stats_dump(struct vnic_dev *vdev, struct vnic_stats **stats);
136*4882a593Smuzhiyun int vnic_dev_hang_notify(struct vnic_dev *vdev);
137*4882a593Smuzhiyun int vnic_dev_packet_filter(struct vnic_dev *vdev, int directed, int multicast,
138*4882a593Smuzhiyun 	int broadcast, int promisc, int allmulti);
139*4882a593Smuzhiyun int vnic_dev_add_addr(struct vnic_dev *vdev, const u8 *addr);
140*4882a593Smuzhiyun int vnic_dev_del_addr(struct vnic_dev *vdev, const u8 *addr);
141*4882a593Smuzhiyun int vnic_dev_get_mac_addr(struct vnic_dev *vdev, u8 *mac_addr);
142*4882a593Smuzhiyun int vnic_dev_notify_set(struct vnic_dev *vdev, u16 intr);
143*4882a593Smuzhiyun int vnic_dev_notify_unset(struct vnic_dev *vdev);
144*4882a593Smuzhiyun int vnic_dev_link_status(struct vnic_dev *vdev);
145*4882a593Smuzhiyun u32 vnic_dev_port_speed(struct vnic_dev *vdev);
146*4882a593Smuzhiyun u32 vnic_dev_msg_lvl(struct vnic_dev *vdev);
147*4882a593Smuzhiyun u32 vnic_dev_mtu(struct vnic_dev *vdev);
148*4882a593Smuzhiyun int vnic_dev_close(struct vnic_dev *vdev);
149*4882a593Smuzhiyun int vnic_dev_enable_wait(struct vnic_dev *vdev);
150*4882a593Smuzhiyun int vnic_dev_disable(struct vnic_dev *vdev);
151*4882a593Smuzhiyun int vnic_dev_open(struct vnic_dev *vdev, int arg);
152*4882a593Smuzhiyun int vnic_dev_open_done(struct vnic_dev *vdev, int *done);
153*4882a593Smuzhiyun int vnic_dev_init(struct vnic_dev *vdev, int arg);
154*4882a593Smuzhiyun int vnic_dev_deinit(struct vnic_dev *vdev);
155*4882a593Smuzhiyun void vnic_dev_intr_coal_timer_info_default(struct vnic_dev *vdev);
156*4882a593Smuzhiyun int vnic_dev_intr_coal_timer_info(struct vnic_dev *vdev);
157*4882a593Smuzhiyun int vnic_dev_hang_reset(struct vnic_dev *vdev, int arg);
158*4882a593Smuzhiyun int vnic_dev_soft_reset(struct vnic_dev *vdev, int arg);
159*4882a593Smuzhiyun int vnic_dev_hang_reset_done(struct vnic_dev *vdev, int *done);
160*4882a593Smuzhiyun int vnic_dev_soft_reset_done(struct vnic_dev *vdev, int *done);
161*4882a593Smuzhiyun void vnic_dev_set_intr_mode(struct vnic_dev *vdev,
162*4882a593Smuzhiyun 	enum vnic_dev_intr_mode intr_mode);
163*4882a593Smuzhiyun enum vnic_dev_intr_mode vnic_dev_get_intr_mode(struct vnic_dev *vdev);
164*4882a593Smuzhiyun u32 vnic_dev_intr_coal_timer_usec_to_hw(struct vnic_dev *vdev, u32 usec);
165*4882a593Smuzhiyun u32 vnic_dev_intr_coal_timer_hw_to_usec(struct vnic_dev *vdev, u32 hw_cycles);
166*4882a593Smuzhiyun u32 vnic_dev_get_intr_coal_timer_max(struct vnic_dev *vdev);
167*4882a593Smuzhiyun void vnic_dev_unregister(struct vnic_dev *vdev);
168*4882a593Smuzhiyun int vnic_dev_set_ig_vlan_rewrite_mode(struct vnic_dev *vdev,
169*4882a593Smuzhiyun 	u8 ig_vlan_rewrite_mode);
170*4882a593Smuzhiyun struct vnic_dev *vnic_dev_register(struct vnic_dev *vdev,
171*4882a593Smuzhiyun 	void *priv, struct pci_dev *pdev, struct vnic_dev_bar *bar,
172*4882a593Smuzhiyun 	unsigned int num_bars);
173*4882a593Smuzhiyun struct pci_dev *vnic_dev_get_pdev(struct vnic_dev *vdev);
174*4882a593Smuzhiyun int vnic_dev_init_prov2(struct vnic_dev *vdev, u8 *buf, u32 len);
175*4882a593Smuzhiyun int vnic_dev_enable2(struct vnic_dev *vdev, int active);
176*4882a593Smuzhiyun int vnic_dev_enable2_done(struct vnic_dev *vdev, int *status);
177*4882a593Smuzhiyun int vnic_dev_deinit_done(struct vnic_dev *vdev, int *status);
178*4882a593Smuzhiyun int vnic_dev_set_mac_addr(struct vnic_dev *vdev, u8 *mac_addr);
179*4882a593Smuzhiyun int vnic_dev_classifier(struct vnic_dev *vdev, u8 cmd, u16 *entry,
180*4882a593Smuzhiyun 			struct filter *data);
181*4882a593Smuzhiyun int vnic_devcmd_init(struct vnic_dev *vdev);
182*4882a593Smuzhiyun int vnic_dev_overlay_offload_ctrl(struct vnic_dev *vdev, u8 overlay, u8 config);
183*4882a593Smuzhiyun int vnic_dev_overlay_offload_cfg(struct vnic_dev *vdev, u8 overlay,
184*4882a593Smuzhiyun 				 u16 vxlan_udp_port_number);
185*4882a593Smuzhiyun int vnic_dev_get_supported_feature_ver(struct vnic_dev *vdev, u8 feature,
186*4882a593Smuzhiyun 				       u64 *supported_versions, u64 *a1);
187*4882a593Smuzhiyun int vnic_dev_capable_rss_hash_type(struct vnic_dev *vdev, u8 *rss_hash_type);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #endif /* _VNIC_DEV_H_ */
190