Commit | Line | Data |
---|---|---|
02feda17 RB |
1 | /* |
2 | * QLogic qlcnic NIC Driver | |
3 | * Copyright (c) 2009-2013 QLogic Corporation | |
4 | * | |
5 | * See LICENSE.qlcnic for copyright and licensing details. | |
6 | */ | |
7 | ||
8 | #ifndef _QLCNIC_83XX_SRIOV_H_ | |
9 | #define _QLCNIC_83XX_SRIOV_H_ | |
10 | ||
11 | #include "qlcnic.h" | |
12 | #include <linux/types.h> | |
13 | #include <linux/pci.h> | |
14 | ||
f8468331 RB |
15 | extern const u32 qlcnic_83xx_reg_tbl[]; |
16 | extern const u32 qlcnic_83xx_ext_reg_tbl[]; | |
17 | ||
f197a7aa RB |
18 | struct qlcnic_bc_payload { |
19 | u64 payload[126]; | |
20 | }; | |
21 | ||
22 | struct qlcnic_bc_hdr { | |
23 | #if defined(__LITTLE_ENDIAN) | |
24 | u8 version; | |
25 | u8 msg_type:4; | |
26 | u8 rsvd1:3; | |
27 | u8 op_type:1; | |
28 | u8 num_cmds; | |
29 | u8 num_frags; | |
30 | u8 frag_num; | |
31 | u8 cmd_op; | |
32 | u16 seq_id; | |
33 | u64 rsvd3; | |
34 | #elif defined(__BIG_ENDIAN) | |
35 | u8 num_frags; | |
36 | u8 num_cmds; | |
37 | u8 op_type:1; | |
38 | u8 rsvd1:3; | |
39 | u8 msg_type:4; | |
40 | u8 version; | |
41 | u16 seq_id; | |
42 | u8 cmd_op; | |
43 | u8 frag_num; | |
44 | u64 rsvd3; | |
45 | #endif | |
46 | }; | |
47 | ||
48 | enum qlcnic_bc_commands { | |
49 | QLCNIC_BC_CMD_CHANNEL_INIT = 0x0, | |
50 | QLCNIC_BC_CMD_CHANNEL_TERM = 0x1, | |
51 | }; | |
52 | ||
53 | #define QLC_BC_CMD 1 | |
54 | ||
55 | struct qlcnic_trans_list { | |
56 | /* Lock for manipulating list */ | |
57 | spinlock_t lock; | |
58 | struct list_head wait_list; | |
59 | int count; | |
60 | }; | |
61 | ||
62 | enum qlcnic_trans_state { | |
63 | QLC_INIT = 0, | |
64 | QLC_WAIT_FOR_CHANNEL_FREE, | |
65 | QLC_WAIT_FOR_RESP, | |
66 | QLC_ABORT, | |
67 | QLC_END, | |
68 | }; | |
69 | ||
70 | struct qlcnic_bc_trans { | |
71 | u8 func_id; | |
72 | u8 active; | |
73 | u8 curr_rsp_frag; | |
74 | u8 curr_req_frag; | |
75 | u16 cmd_id; | |
76 | u16 req_pay_size; | |
77 | u16 rsp_pay_size; | |
78 | u32 trans_id; | |
79 | enum qlcnic_trans_state trans_state; | |
80 | struct list_head list; | |
81 | struct qlcnic_bc_hdr *req_hdr; | |
82 | struct qlcnic_bc_hdr *rsp_hdr; | |
83 | struct qlcnic_bc_payload *req_pay; | |
84 | struct qlcnic_bc_payload *rsp_pay; | |
85 | struct completion resp_cmpl; | |
86 | struct qlcnic_vf_info *vf; | |
87 | }; | |
88 | ||
89 | enum qlcnic_vf_state { | |
90 | QLC_BC_VF_SEND = 0, | |
91 | QLC_BC_VF_RECV, | |
92 | QLC_BC_VF_CHANNEL, | |
93 | QLC_BC_VF_STATE, | |
94 | }; | |
95 | ||
02feda17 RB |
96 | struct qlcnic_resources { |
97 | u16 num_tx_mac_filters; | |
98 | u16 num_rx_ucast_mac_filters; | |
99 | u16 num_rx_mcast_mac_filters; | |
100 | ||
101 | u16 num_txvlan_keys; | |
102 | ||
103 | u16 num_rx_queues; | |
104 | u16 num_tx_queues; | |
105 | ||
106 | u16 num_rx_buf_rings; | |
107 | u16 num_rx_status_rings; | |
108 | ||
109 | u16 num_destip; | |
110 | u32 num_lro_flows_supported; | |
111 | u16 max_local_ipv6_addrs; | |
112 | u16 max_remote_ipv6_addrs; | |
113 | }; | |
114 | ||
f197a7aa RB |
115 | struct qlcnic_vport { |
116 | u16 handle; | |
117 | u8 mac[6]; | |
118 | }; | |
119 | ||
120 | struct qlcnic_vf_info { | |
121 | u8 pci_func; | |
7cb03b23 RB |
122 | u16 rx_ctx_id; |
123 | u16 tx_ctx_id; | |
f197a7aa RB |
124 | unsigned long state; |
125 | struct completion ch_free_cmpl; | |
126 | struct work_struct trans_work; | |
127 | /* It synchronizes commands sent from VF */ | |
128 | struct mutex send_cmd_lock; | |
129 | struct qlcnic_bc_trans *send_cmd; | |
130 | struct qlcnic_trans_list rcv_act; | |
131 | struct qlcnic_trans_list rcv_pend; | |
132 | struct qlcnic_adapter *adapter; | |
133 | struct qlcnic_vport *vp; | |
134 | }; | |
135 | ||
136 | struct qlcnic_back_channel { | |
137 | u16 trans_counter; | |
138 | struct workqueue_struct *bc_trans_wq; | |
139 | }; | |
140 | ||
02feda17 RB |
141 | struct qlcnic_sriov { |
142 | u16 vp_handle; | |
143 | u8 num_vfs; | |
144 | struct qlcnic_resources ff_max; | |
f197a7aa RB |
145 | struct qlcnic_back_channel bc; |
146 | struct qlcnic_vf_info *vf_info; | |
02feda17 RB |
147 | }; |
148 | ||
149 | int qlcnic_sriov_init(struct qlcnic_adapter *, int); | |
150 | void qlcnic_sriov_cleanup(struct qlcnic_adapter *); | |
151 | void __qlcnic_sriov_cleanup(struct qlcnic_adapter *); | |
f8468331 RB |
152 | void qlcnic_sriov_vf_register_map(struct qlcnic_hardware_context *); |
153 | int qlcnic_sriov_vf_init(struct qlcnic_adapter *, int); | |
154 | void qlcnic_sriov_vf_set_ops(struct qlcnic_adapter *); | |
f197a7aa RB |
155 | int qlcnic_sriov_func_to_index(struct qlcnic_adapter *, u8); |
156 | int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *, u8); | |
157 | void qlcnic_sriov_handle_bc_event(struct qlcnic_adapter *, u32); | |
158 | int qlcnic_sriov_cfg_bc_intr(struct qlcnic_adapter *, u8); | |
02feda17 RB |
159 | |
160 | static inline bool qlcnic_sriov_enable_check(struct qlcnic_adapter *adapter) | |
161 | { | |
162 | return test_bit(__QLCNIC_SRIOV_ENABLE, &adapter->state) ? true : false; | |
163 | } | |
164 | ||
165 | #ifdef CONFIG_QLCNIC_SRIOV | |
f197a7aa RB |
166 | void qlcnic_sriov_pf_process_bc_cmd(struct qlcnic_adapter *, |
167 | struct qlcnic_bc_trans *, | |
168 | struct qlcnic_cmd_args *); | |
02feda17 RB |
169 | void qlcnic_sriov_pf_disable(struct qlcnic_adapter *); |
170 | void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *); | |
171 | int qlcnic_pci_sriov_configure(struct pci_dev *, int); | |
7cb03b23 RB |
172 | void qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *, u32 *); |
173 | void qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *, u32 *); | |
174 | void qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *, u32 *); | |
175 | void qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *, u32 *); | |
176 | void qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *, u32 *); | |
177 | void qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *, u32 *); | |
178 | void qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *, u32 *); | |
02feda17 RB |
179 | #else |
180 | static inline void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter) {} | |
181 | static inline void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter) {} | |
7cb03b23 RB |
182 | static inline void |
183 | qlcnic_pf_set_interface_id_create_rx_ctx(struct qlcnic_adapter *adapter, | |
184 | u32 *int_id) {} | |
185 | static inline void | |
186 | qlcnic_pf_set_interface_id_create_tx_ctx(struct qlcnic_adapter *adapter, | |
187 | u32 *int_id) {} | |
188 | static inline void | |
189 | qlcnic_pf_set_interface_id_del_rx_ctx(struct qlcnic_adapter *adapter, | |
190 | u32 *int_id) {} | |
191 | static inline void | |
192 | qlcnic_pf_set_interface_id_del_tx_ctx(struct qlcnic_adapter *adapter, | |
193 | u32 *int_id) {} | |
194 | static inline void | |
195 | qlcnic_pf_set_interface_id_ipaddr(struct qlcnic_adapter *adapter, u32 *int_id) | |
196 | {} | |
197 | static inline void | |
198 | qlcnic_pf_set_interface_id_macaddr(struct qlcnic_adapter *adapter, u32 *int_id) | |
199 | {} | |
200 | static inline void | |
201 | qlcnic_pf_set_interface_id_promisc(struct qlcnic_adapter *adapter, u32 *int_id) | |
202 | {} | |
02feda17 RB |
203 | #endif |
204 | ||
205 | #endif |