1 | /* bnx2x_sriov.h: QLogic Everest network driver. |
2 | * |
3 | * Copyright 2009-2013 Broadcom Corporation |
4 | * Copyright 2014 QLogic Corporation |
5 | * All rights reserved |
6 | * |
7 | * Unless you and QLogic execute a separate written software license |
8 | * agreement governing use of this software, this software is licensed to you |
9 | * under the terms of the GNU General Public License version 2, available |
10 | * at http://www.gnu.org/licenses/old-licenses/gpl-2.0.html (the "GPL"). |
11 | * |
12 | * Notwithstanding the above, under no circumstances may you combine this |
13 | * software in any way with any other QLogic software provided under a |
14 | * license other than the GPL, without QLogic's express prior written |
15 | * consent. |
16 | * |
17 | * Maintained by: Ariel Elior <ariel.elior@qlogic.com> |
18 | * Written by: Shmulik Ravid |
19 | * Ariel Elior <ariel.elior@qlogic.com> |
20 | */ |
21 | #ifndef BNX2X_SRIOV_H |
22 | #define BNX2X_SRIOV_H |
23 | |
24 | #include "bnx2x_vfpf.h" |
25 | #include "bnx2x.h" |
26 | |
27 | enum sample_bulletin_result { |
28 | PFVF_BULLETIN_UNCHANGED, |
29 | PFVF_BULLETIN_UPDATED, |
30 | PFVF_BULLETIN_CRC_ERR |
31 | }; |
32 | |
33 | #ifdef CONFIG_BNX2X_SRIOV |
34 | |
35 | extern struct workqueue_struct *bnx2x_iov_wq; |
36 | |
37 | /* The bnx2x device structure holds vfdb structure described below. |
38 | * The VF array is indexed by the relative vfid. |
39 | */ |
40 | #define BNX2X_VF_MAX_QUEUES 16 |
41 | #define BNX2X_VF_MAX_TPA_AGG_QUEUES 8 |
42 | |
43 | struct bnx2x_sriov { |
44 | u32 first_vf_in_pf; |
45 | |
46 | /* standard SRIOV capability fields, mostly for debugging */ |
47 | int pos; /* capability position */ |
48 | int nres; /* number of resources */ |
49 | u32 cap; /* SR-IOV Capabilities */ |
50 | u16 ctrl; /* SR-IOV Control */ |
51 | u16 total; /* total VFs associated with the PF */ |
52 | u16 initial; /* initial VFs associated with the PF */ |
53 | u16 nr_virtfn; /* number of VFs available */ |
54 | u16 offset; /* first VF Routing ID offset */ |
55 | u16 stride; /* following VF stride */ |
56 | u32 pgsz; /* page size for BAR alignment */ |
57 | u8 link; /* Function Dependency Link */ |
58 | }; |
59 | |
60 | /* bars */ |
61 | struct bnx2x_vf_bar { |
62 | u64 bar; |
63 | u32 size; |
64 | }; |
65 | |
66 | struct bnx2x_vf_bar_info { |
67 | struct bnx2x_vf_bar bars[PCI_SRIOV_NUM_BARS]; |
68 | u8 nr_bars; |
69 | }; |
70 | |
71 | /* vf queue (used both for rx or tx) */ |
72 | struct bnx2x_vf_queue { |
73 | struct eth_context *cxt; |
74 | |
75 | /* MACs object */ |
76 | struct bnx2x_vlan_mac_obj mac_obj; |
77 | |
78 | /* VLANs object */ |
79 | struct bnx2x_vlan_mac_obj vlan_obj; |
80 | |
81 | /* VLAN-MACs object */ |
82 | struct bnx2x_vlan_mac_obj vlan_mac_obj; |
83 | |
84 | unsigned long accept_flags; /* last accept flags configured */ |
85 | |
86 | /* Queue Slow-path State object */ |
87 | struct bnx2x_queue_sp_obj sp_obj; |
88 | |
89 | u32 cid; |
90 | u16 index; |
91 | u16 sb_idx; |
92 | bool is_leading; |
93 | bool sp_initialized; |
94 | }; |
95 | |
96 | /* struct bnx2x_vf_queue_construct_params - prepare queue construction |
97 | * parameters: q-init, q-setup and SB index |
98 | */ |
99 | struct bnx2x_vf_queue_construct_params { |
100 | struct bnx2x_queue_state_params qstate; |
101 | struct bnx2x_queue_setup_params prep_qsetup; |
102 | }; |
103 | |
104 | /* forward */ |
105 | struct bnx2x_virtf; |
106 | |
107 | /* VFOP definitions */ |
108 | |
109 | struct bnx2x_vf_mac_vlan_filter { |
110 | int type; |
111 | #define BNX2X_VF_FILTER_MAC BIT(0) |
112 | #define BNX2X_VF_FILTER_VLAN BIT(1) |
113 | #define BNX2X_VF_FILTER_VLAN_MAC \ |
114 | (BNX2X_VF_FILTER_MAC | BNX2X_VF_FILTER_VLAN) /*shortcut*/ |
115 | |
116 | bool add; |
117 | bool applied; |
118 | u8 *mac; |
119 | u16 vid; |
120 | }; |
121 | |
122 | struct bnx2x_vf_mac_vlan_filters { |
123 | int count; |
124 | struct bnx2x_vf_mac_vlan_filter filters[]; |
125 | }; |
126 | |
127 | /* vf context */ |
128 | struct bnx2x_virtf { |
129 | u16 cfg_flags; |
130 | #define VF_CFG_STATS_COALESCE 0x1 |
131 | #define VF_CFG_EXT_BULLETIN 0x2 |
132 | #define VF_CFG_VLAN_FILTER 0x4 |
133 | u8 link_cfg; /* IFLA_VF_LINK_STATE_AUTO |
134 | * IFLA_VF_LINK_STATE_ENABLE |
135 | * IFLA_VF_LINK_STATE_DISABLE |
136 | */ |
137 | u8 state; |
138 | #define VF_FREE 0 /* VF ready to be acquired holds no resc */ |
139 | #define VF_ACQUIRED 1 /* VF acquired, but not initialized */ |
140 | #define VF_ENABLED 2 /* VF Enabled */ |
141 | #define VF_RESET 3 /* VF FLR'd, pending cleanup */ |
142 | #define VF_LOST 4 /* Recovery while VFs are loaded */ |
143 | |
144 | bool flr_clnup_stage; /* true during flr cleanup */ |
145 | bool malicious; /* true if FW indicated so, until FLR */ |
146 | /* 1(true) if spoof check is enabled */ |
147 | u8 spoofchk; |
148 | |
149 | /* dma */ |
150 | dma_addr_t fw_stat_map; |
151 | u16 stats_stride; |
152 | dma_addr_t bulletin_map; |
153 | |
154 | /* Allocated resources counters. Before the VF is acquired, the |
155 | * counters hold the following values: |
156 | * |
157 | * - xxq_count = 0 as the queues memory is not allocated yet. |
158 | * |
159 | * - sb_count = The number of status blocks configured for this VF in |
160 | * the IGU CAM. Initially read during probe. |
161 | * |
162 | * - xx_rules_count = The number of rules statically and equally |
163 | * allocated for each VF, during PF load. |
164 | */ |
165 | struct vf_pf_resc_request alloc_resc; |
166 | #define vf_rxq_count(vf) ((vf)->alloc_resc.num_rxqs) |
167 | #define vf_txq_count(vf) ((vf)->alloc_resc.num_txqs) |
168 | #define vf_sb_count(vf) ((vf)->alloc_resc.num_sbs) |
169 | #define vf_mac_rules_cnt(vf) ((vf)->alloc_resc.num_mac_filters) |
170 | #define vf_vlan_rules_cnt(vf) ((vf)->alloc_resc.num_vlan_filters) |
171 | #define vf_mc_rules_cnt(vf) ((vf)->alloc_resc.num_mc_filters) |
172 | |
173 | u8 sb_count; /* actual number of SBs */ |
174 | u8 igu_base_id; /* base igu status block id */ |
175 | |
176 | struct bnx2x_vf_queue *vfqs; |
177 | #define LEADING_IDX 0 |
178 | #define bnx2x_vfq_is_leading(vfq) ((vfq)->index == LEADING_IDX) |
179 | #define bnx2x_vfq(vf, nr, var) ((vf)->vfqs[(nr)].var) |
180 | #define bnx2x_leading_vfq(vf, var) ((vf)->vfqs[LEADING_IDX].var) |
181 | |
182 | u8 index; /* index in the vf array */ |
183 | u8 abs_vfid; |
184 | u8 sp_cl_id; |
185 | u32 error; /* 0 means all's-well */ |
186 | |
187 | /* BDF */ |
188 | unsigned int domain; |
189 | unsigned int bus; |
190 | unsigned int devfn; |
191 | |
192 | /* bars */ |
193 | struct bnx2x_vf_bar bars[PCI_SRIOV_NUM_BARS]; |
194 | |
195 | /* set-mac ramrod state 1-pending, 0-done */ |
196 | unsigned long filter_state; |
197 | |
198 | /* leading rss client id ~~ the client id of the first rxq, must be |
199 | * set for each txq. |
200 | */ |
201 | int ; |
202 | |
203 | /* MCAST object */ |
204 | struct bnx2x_mcast_obj mcast_obj; |
205 | |
206 | /* RSS configuration object */ |
207 | struct bnx2x_rss_config_obj ; |
208 | |
209 | /* slow-path operations */ |
210 | struct mutex op_mutex; /* one vfop at a time mutex */ |
211 | enum channel_tlvs op_current; |
212 | |
213 | u8 fp_hsi; |
214 | |
215 | struct bnx2x_credit_pool_obj vf_vlans_pool; |
216 | struct bnx2x_credit_pool_obj vf_macs_pool; |
217 | }; |
218 | |
219 | #define BNX2X_NR_VIRTFN(bp) ((bp)->vfdb->sriov.nr_virtfn) |
220 | |
221 | #define for_each_vf(bp, var) \ |
222 | for ((var) = 0; (var) < BNX2X_NR_VIRTFN(bp); (var)++) |
223 | |
224 | #define for_each_vfq(vf, var) \ |
225 | for ((var) = 0; (var) < vf_rxq_count(vf); (var)++) |
226 | |
227 | #define for_each_vf_sb(vf, var) \ |
228 | for ((var) = 0; (var) < vf_sb_count(vf); (var)++) |
229 | |
230 | #define is_vf_multi(vf) (vf_rxq_count(vf) > 1) |
231 | |
232 | #define HW_VF_HANDLE(bp, abs_vfid) \ |
233 | (u16)(BP_ABS_FUNC((bp)) | (1<<3) | ((u16)(abs_vfid) << 4)) |
234 | |
235 | #define FW_PF_MAX_HANDLE 8 |
236 | |
237 | #define FW_VF_HANDLE(abs_vfid) \ |
238 | (abs_vfid + FW_PF_MAX_HANDLE) |
239 | |
240 | #define GET_NUM_VFS_PER_PATH(bp) 64 /* use max possible value */ |
241 | #define GET_NUM_VFS_PER_PF(bp) ((bp)->vfdb ? (bp)->vfdb->sriov.total \ |
242 | : 0) |
243 | #define VF_MAC_CREDIT_CNT 1 |
244 | #define VF_VLAN_CREDIT_CNT 2 /* VLAN0 + 'real' VLAN */ |
245 | |
246 | /* locking and unlocking the channel mutex */ |
247 | void bnx2x_lock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf, |
248 | enum channel_tlvs tlv); |
249 | |
250 | void bnx2x_unlock_vf_pf_channel(struct bnx2x *bp, struct bnx2x_virtf *vf, |
251 | enum channel_tlvs expected_tlv); |
252 | |
253 | /* VF mail box (aka vf-pf channel) */ |
254 | |
255 | /* a container for the bi-directional vf<-->pf messages. |
256 | * The actual response will be placed according to the offset parameter |
257 | * provided in the request |
258 | */ |
259 | |
260 | #define MBX_MSG_ALIGN 8 |
261 | #define MBX_MSG_ALIGNED_SIZE (roundup(sizeof(struct bnx2x_vf_mbx_msg), \ |
262 | MBX_MSG_ALIGN)) |
263 | |
264 | struct bnx2x_vf_mbx_msg { |
265 | union vfpf_tlvs req; |
266 | union pfvf_tlvs resp; |
267 | }; |
268 | |
269 | struct bnx2x_vf_mbx { |
270 | struct bnx2x_vf_mbx_msg *msg; |
271 | dma_addr_t msg_mapping; |
272 | |
273 | /* VF GPA address */ |
274 | u32 vf_addr_lo; |
275 | u32 vf_addr_hi; |
276 | |
277 | struct vfpf_first_tlv first_tlv; /* saved VF request header */ |
278 | }; |
279 | |
280 | struct bnx2x_vf_sp { |
281 | union { |
282 | struct eth_classify_rules_ramrod_data e2; |
283 | } mac_rdata; |
284 | |
285 | union { |
286 | struct eth_classify_rules_ramrod_data e2; |
287 | } vlan_rdata; |
288 | |
289 | union { |
290 | struct eth_classify_rules_ramrod_data e2; |
291 | } vlan_mac_rdata; |
292 | |
293 | union { |
294 | struct eth_filter_rules_ramrod_data e2; |
295 | } rx_mode_rdata; |
296 | |
297 | union { |
298 | struct eth_multicast_rules_ramrod_data e2; |
299 | } mcast_rdata; |
300 | |
301 | union { |
302 | struct client_init_ramrod_data init_data; |
303 | struct client_update_ramrod_data update_data; |
304 | } q_data; |
305 | |
306 | union { |
307 | struct eth_rss_update_ramrod_data e2; |
308 | } ; |
309 | }; |
310 | |
311 | struct hw_dma { |
312 | void *addr; |
313 | dma_addr_t mapping; |
314 | size_t size; |
315 | }; |
316 | |
317 | struct bnx2x_vfdb { |
318 | #define BP_VFDB(bp) ((bp)->vfdb) |
319 | /* vf array */ |
320 | struct bnx2x_virtf *vfs; |
321 | #define BP_VF(bp, idx) ((BP_VFDB(bp) && (bp)->vfdb->vfs) ? \ |
322 | &((bp)->vfdb->vfs[idx]) : NULL) |
323 | #define bnx2x_vf(bp, idx, var) ((bp)->vfdb->vfs[idx].var) |
324 | |
325 | /* queue array - for all vfs */ |
326 | struct bnx2x_vf_queue *vfqs; |
327 | |
328 | /* vf HW contexts */ |
329 | struct hw_dma context[BNX2X_VF_CIDS/ILT_PAGE_CIDS]; |
330 | #define BP_VF_CXT_PAGE(bp, i) (&(bp)->vfdb->context[i]) |
331 | |
332 | /* SR-IOV information */ |
333 | struct bnx2x_sriov sriov; |
334 | struct hw_dma mbx_dma; |
335 | #define BP_VF_MBX_DMA(bp) (&((bp)->vfdb->mbx_dma)) |
336 | struct bnx2x_vf_mbx mbxs[BNX2X_MAX_NUM_OF_VFS]; |
337 | #define BP_VF_MBX(bp, vfid) (&((bp)->vfdb->mbxs[vfid])) |
338 | |
339 | struct hw_dma bulletin_dma; |
340 | #define BP_VF_BULLETIN_DMA(bp) (&((bp)->vfdb->bulletin_dma)) |
341 | #define BP_VF_BULLETIN(bp, vf) \ |
342 | (((struct pf_vf_bulletin_content *)(BP_VF_BULLETIN_DMA(bp)->addr)) \ |
343 | + (vf)) |
344 | |
345 | struct hw_dma sp_dma; |
346 | #define bnx2x_vf_sp(bp, vf, field) ((bp)->vfdb->sp_dma.addr + \ |
347 | (vf)->index * sizeof(struct bnx2x_vf_sp) + \ |
348 | offsetof(struct bnx2x_vf_sp, field)) |
349 | #define bnx2x_vf_sp_map(bp, vf, field) ((bp)->vfdb->sp_dma.mapping + \ |
350 | (vf)->index * sizeof(struct bnx2x_vf_sp) + \ |
351 | offsetof(struct bnx2x_vf_sp, field)) |
352 | |
353 | #define FLRD_VFS_DWORDS (BNX2X_MAX_NUM_OF_VFS / 32) |
354 | u32 flrd_vfs[FLRD_VFS_DWORDS]; |
355 | |
356 | /* the number of msix vectors belonging to this PF designated for VFs */ |
357 | u16 vf_sbs_pool; |
358 | u16 first_vf_igu_entry; |
359 | |
360 | /* sp_rtnl synchronization */ |
361 | struct mutex event_mutex; |
362 | u64 event_occur; |
363 | |
364 | /* bulletin board update synchronization */ |
365 | struct mutex bulletin_mutex; |
366 | }; |
367 | |
368 | /* queue access */ |
369 | static inline struct bnx2x_vf_queue *vfq_get(struct bnx2x_virtf *vf, u8 index) |
370 | { |
371 | return &(vf->vfqs[index]); |
372 | } |
373 | |
374 | /* FW ids */ |
375 | static inline u8 vf_igu_sb(struct bnx2x_virtf *vf, u16 sb_idx) |
376 | { |
377 | return vf->igu_base_id + sb_idx; |
378 | } |
379 | |
380 | static inline u8 vf_hc_qzone(struct bnx2x_virtf *vf, u16 sb_idx) |
381 | { |
382 | return vf_igu_sb(vf, sb_idx); |
383 | } |
384 | |
385 | static u8 vfq_cl_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) |
386 | { |
387 | return vf->igu_base_id + q->index; |
388 | } |
389 | |
390 | static inline u8 vfq_stat_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) |
391 | { |
392 | if (vf->cfg_flags & VF_CFG_STATS_COALESCE) |
393 | return vf->leading_rss; |
394 | else |
395 | return vfq_cl_id(vf, q); |
396 | } |
397 | |
398 | static inline u8 vfq_qzone_id(struct bnx2x_virtf *vf, struct bnx2x_vf_queue *q) |
399 | { |
400 | return vfq_cl_id(vf, q); |
401 | } |
402 | |
403 | /* global iov routines */ |
404 | int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line); |
405 | int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param, int num_vfs_param); |
406 | void bnx2x_iov_remove_one(struct bnx2x *bp); |
407 | void bnx2x_iov_free_mem(struct bnx2x *bp); |
408 | int bnx2x_iov_alloc_mem(struct bnx2x *bp); |
409 | int bnx2x_iov_nic_init(struct bnx2x *bp); |
410 | int bnx2x_iov_chip_cleanup(struct bnx2x *bp); |
411 | void bnx2x_iov_init_dq(struct bnx2x *bp); |
412 | void bnx2x_iov_init_dmae(struct bnx2x *bp); |
413 | void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid, |
414 | struct bnx2x_queue_sp_obj **q_obj); |
415 | int bnx2x_iov_eq_sp_event(struct bnx2x *bp, union event_ring_elem *elem); |
416 | void bnx2x_iov_adjust_stats_req(struct bnx2x *bp); |
417 | void bnx2x_iov_storm_stats_update(struct bnx2x *bp); |
418 | /* global vf mailbox routines */ |
419 | void bnx2x_vf_mbx(struct bnx2x *bp); |
420 | void bnx2x_vf_mbx_schedule(struct bnx2x *bp, |
421 | struct vf_pf_event_data *vfpf_event); |
422 | void bnx2x_vf_enable_mbx(struct bnx2x *bp, u8 abs_vfid); |
423 | |
424 | /* CORE VF API */ |
425 | typedef u8 bnx2x_mac_addr_t[ETH_ALEN]; |
426 | |
427 | /* acquire */ |
428 | int bnx2x_vf_acquire(struct bnx2x *bp, struct bnx2x_virtf *vf, |
429 | struct vf_pf_resc_request *resc); |
430 | /* init */ |
431 | int bnx2x_vf_init(struct bnx2x *bp, struct bnx2x_virtf *vf, |
432 | dma_addr_t *sb_map); |
433 | |
434 | /* VFOP queue construction helpers */ |
435 | void bnx2x_vfop_qctor_dump_tx(struct bnx2x *bp, struct bnx2x_virtf *vf, |
436 | struct bnx2x_queue_init_params *init_params, |
437 | struct bnx2x_queue_setup_params *setup_params, |
438 | u16 q_idx, u16 sb_idx); |
439 | |
440 | void bnx2x_vfop_qctor_dump_rx(struct bnx2x *bp, struct bnx2x_virtf *vf, |
441 | struct bnx2x_queue_init_params *init_params, |
442 | struct bnx2x_queue_setup_params *setup_params, |
443 | u16 q_idx, u16 sb_idx); |
444 | |
445 | void bnx2x_vfop_qctor_prep(struct bnx2x *bp, |
446 | struct bnx2x_virtf *vf, |
447 | struct bnx2x_vf_queue *q, |
448 | struct bnx2x_vf_queue_construct_params *p, |
449 | unsigned long q_type); |
450 | |
451 | int bnx2x_vf_mac_vlan_config_list(struct bnx2x *bp, struct bnx2x_virtf *vf, |
452 | struct bnx2x_vf_mac_vlan_filters *filters, |
453 | int qid, bool drv_only); |
454 | |
455 | int bnx2x_vf_queue_setup(struct bnx2x *bp, struct bnx2x_virtf *vf, int qid, |
456 | struct bnx2x_vf_queue_construct_params *qctor); |
457 | |
458 | int bnx2x_vf_queue_teardown(struct bnx2x *bp, struct bnx2x_virtf *vf, int qid); |
459 | |
460 | int bnx2x_vf_mcast(struct bnx2x *bp, struct bnx2x_virtf *vf, |
461 | bnx2x_mac_addr_t *mcasts, int mc_num, bool drv_only); |
462 | |
463 | int bnx2x_vf_rxmode(struct bnx2x *bp, struct bnx2x_virtf *vf, |
464 | int qid, unsigned long accept_flags); |
465 | |
466 | int bnx2x_vf_close(struct bnx2x *bp, struct bnx2x_virtf *vf); |
467 | |
468 | int bnx2x_vf_free(struct bnx2x *bp, struct bnx2x_virtf *vf); |
469 | |
470 | int (struct bnx2x *bp, struct bnx2x_virtf *vf, |
471 | struct bnx2x_config_rss_params *); |
472 | |
473 | int bnx2x_vf_tpa_update(struct bnx2x *bp, struct bnx2x_virtf *vf, |
474 | struct vfpf_tpa_tlv *tlv, |
475 | struct bnx2x_queue_update_tpa_params *params); |
476 | |
477 | /* VF release ~ VF close + VF release-resources |
478 | * |
479 | * Release is the ultimate SW shutdown and is called whenever an |
480 | * irrecoverable error is encountered. |
481 | */ |
482 | int bnx2x_vf_release(struct bnx2x *bp, struct bnx2x_virtf *vf); |
483 | int bnx2x_vf_idx_by_abs_fid(struct bnx2x *bp, u16 abs_vfid); |
484 | u8 bnx2x_vf_max_queue_cnt(struct bnx2x *bp, struct bnx2x_virtf *vf); |
485 | |
486 | /* FLR routines */ |
487 | |
488 | /* VF FLR helpers */ |
489 | int bnx2x_vf_flr_clnup_epilog(struct bnx2x *bp, u8 abs_vfid); |
490 | void bnx2x_vf_enable_access(struct bnx2x *bp, u8 abs_vfid); |
491 | |
492 | /* Handles an FLR (or VF_DISABLE) notification form the MCP */ |
493 | void bnx2x_vf_handle_flr_event(struct bnx2x *bp); |
494 | |
495 | bool bnx2x_tlv_supported(u16 tlvtype); |
496 | |
497 | u32 bnx2x_crc_vf_bulletin(struct pf_vf_bulletin_content *bulletin); |
498 | int bnx2x_post_vf_bulletin(struct bnx2x *bp, int vf); |
499 | void bnx2x_vf_bulletin_finalize(struct pf_vf_bulletin_content *bulletin, |
500 | bool support_long); |
501 | |
502 | enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp); |
503 | |
504 | /* VF side vfpf channel functions */ |
505 | int bnx2x_vfpf_acquire(struct bnx2x *bp, u8 tx_count, u8 rx_count); |
506 | int bnx2x_vfpf_release(struct bnx2x *bp); |
507 | int bnx2x_vfpf_init(struct bnx2x *bp); |
508 | void bnx2x_vfpf_close_vf(struct bnx2x *bp); |
509 | int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp, |
510 | bool is_leading); |
511 | int bnx2x_vfpf_config_mac(struct bnx2x *bp, const u8 *addr, u8 vf_qid, |
512 | bool set); |
513 | int (struct bnx2x *bp, |
514 | struct bnx2x_config_rss_params *params); |
515 | int bnx2x_vfpf_set_mcast(struct net_device *dev); |
516 | int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp); |
517 | |
518 | static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf, |
519 | size_t buf_len) |
520 | { |
521 | strscpy(buf, bp->acquire_resp.pfdev_info.fw_ver, buf_len); |
522 | } |
523 | |
524 | static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp, |
525 | struct bnx2x_fastpath *fp) |
526 | { |
527 | return PXP_VF_ADDR_USDM_QUEUES_START + |
528 | bp->acquire_resp.resc.hw_qid[fp->index] * |
529 | sizeof(struct ustorm_queue_zone_data); |
530 | } |
531 | |
532 | enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp); |
533 | void bnx2x_timer_sriov(struct bnx2x *bp); |
534 | void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp); |
535 | void bnx2x_vf_pci_dealloc(struct bnx2x *bp); |
536 | int bnx2x_vf_pci_alloc(struct bnx2x *bp); |
537 | int bnx2x_enable_sriov(struct bnx2x *bp); |
538 | void bnx2x_disable_sriov(struct bnx2x *bp); |
539 | static inline int bnx2x_vf_headroom(struct bnx2x *bp) |
540 | { |
541 | return bp->vfdb->sriov.nr_virtfn * BNX2X_CIDS_PER_VF; |
542 | } |
543 | void bnx2x_pf_set_vfs_vlan(struct bnx2x *bp); |
544 | int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs); |
545 | void bnx2x_iov_channel_down(struct bnx2x *bp); |
546 | |
547 | void bnx2x_iov_task(struct work_struct *work); |
548 | |
549 | void bnx2x_schedule_iov_task(struct bnx2x *bp, enum bnx2x_iov_flag flag); |
550 | |
551 | void bnx2x_iov_link_update(struct bnx2x *bp); |
552 | int bnx2x_iov_link_update_vf(struct bnx2x *bp, int idx); |
553 | |
554 | int bnx2x_set_vf_link_state(struct net_device *dev, int vf, int link_state); |
555 | |
556 | int bnx2x_vfpf_update_vlan(struct bnx2x *bp, u16 vid, u8 vf_qid, bool add); |
557 | #else /* CONFIG_BNX2X_SRIOV */ |
558 | |
559 | #define GET_NUM_VFS_PER_PATH(bp) 0 |
560 | #define GET_NUM_VFS_PER_PF(bp) 0 |
561 | #define VF_MAC_CREDIT_CNT 0 |
562 | #define VF_VLAN_CREDIT_CNT 0 |
563 | |
564 | static inline void bnx2x_iov_set_queue_sp_obj(struct bnx2x *bp, int vf_cid, |
565 | struct bnx2x_queue_sp_obj **q_obj) {} |
566 | static inline void bnx2x_vf_handle_flr_event(struct bnx2x *bp) {} |
567 | static inline int bnx2x_iov_eq_sp_event(struct bnx2x *bp, |
568 | union event_ring_elem *elem) {return 1; } |
569 | static inline void bnx2x_vf_mbx(struct bnx2x *bp) {} |
570 | static inline void bnx2x_vf_mbx_schedule(struct bnx2x *bp, |
571 | struct vf_pf_event_data *vfpf_event) {} |
572 | static inline int bnx2x_iov_init_ilt(struct bnx2x *bp, u16 line) {return line; } |
573 | static inline void bnx2x_iov_init_dq(struct bnx2x *bp) {} |
574 | static inline int bnx2x_iov_alloc_mem(struct bnx2x *bp) {return 0; } |
575 | static inline void bnx2x_iov_free_mem(struct bnx2x *bp) {} |
576 | static inline int bnx2x_iov_chip_cleanup(struct bnx2x *bp) {return 0; } |
577 | static inline void bnx2x_iov_init_dmae(struct bnx2x *bp) {} |
578 | static inline int bnx2x_iov_init_one(struct bnx2x *bp, int int_mode_param, |
579 | int num_vfs_param) {return 0; } |
580 | static inline void bnx2x_iov_remove_one(struct bnx2x *bp) {} |
581 | static inline int bnx2x_enable_sriov(struct bnx2x *bp) {return 0; } |
582 | static inline void bnx2x_disable_sriov(struct bnx2x *bp) {} |
583 | static inline int bnx2x_vfpf_acquire(struct bnx2x *bp, |
584 | u8 tx_count, u8 rx_count) {return 0; } |
585 | static inline int bnx2x_vfpf_release(struct bnx2x *bp) {return 0; } |
586 | static inline int bnx2x_vfpf_init(struct bnx2x *bp) {return 0; } |
587 | static inline void bnx2x_vfpf_close_vf(struct bnx2x *bp) {} |
588 | static inline int bnx2x_vfpf_setup_q(struct bnx2x *bp, struct bnx2x_fastpath *fp, bool is_leading) {return 0; } |
589 | static inline int bnx2x_vfpf_config_mac(struct bnx2x *bp, const u8 *addr, |
590 | u8 vf_qid, bool set) {return 0; } |
591 | static inline int bnx2x_vfpf_config_rss(struct bnx2x *bp, |
592 | struct bnx2x_config_rss_params *params) {return 0; } |
593 | static inline int bnx2x_vfpf_set_mcast(struct net_device *dev) {return 0; } |
594 | static inline int bnx2x_vfpf_storm_rx_mode(struct bnx2x *bp) {return 0; } |
595 | static inline int bnx2x_iov_nic_init(struct bnx2x *bp) {return 0; } |
596 | static inline int bnx2x_vf_headroom(struct bnx2x *bp) {return 0; } |
597 | static inline void bnx2x_iov_adjust_stats_req(struct bnx2x *bp) {} |
598 | static inline void bnx2x_vf_fill_fw_str(struct bnx2x *bp, char *buf, |
599 | size_t buf_len) {} |
600 | static inline int bnx2x_vf_ustorm_prods_offset(struct bnx2x *bp, |
601 | struct bnx2x_fastpath *fp) {return 0; } |
602 | static inline enum sample_bulletin_result bnx2x_sample_bulletin(struct bnx2x *bp) |
603 | { |
604 | return PFVF_BULLETIN_UNCHANGED; |
605 | } |
606 | static inline void bnx2x_timer_sriov(struct bnx2x *bp) {} |
607 | |
608 | static inline void __iomem *bnx2x_vf_doorbells(struct bnx2x *bp) |
609 | { |
610 | return NULL; |
611 | } |
612 | |
613 | static inline void bnx2x_vf_pci_dealloc(struct bnx2x *bp) {} |
614 | static inline int bnx2x_vf_pci_alloc(struct bnx2x *bp) {return 0; } |
615 | static inline void bnx2x_pf_set_vfs_vlan(struct bnx2x *bp) {} |
616 | static inline int bnx2x_sriov_configure(struct pci_dev *dev, int num_vfs) {return 0; } |
617 | static inline void bnx2x_iov_channel_down(struct bnx2x *bp) {} |
618 | |
619 | static inline void bnx2x_iov_task(struct work_struct *work) {} |
620 | static inline void bnx2x_schedule_iov_task(struct bnx2x *bp, enum bnx2x_iov_flag flag) {} |
621 | static inline void bnx2x_iov_link_update(struct bnx2x *bp) {} |
622 | static inline int bnx2x_iov_link_update_vf(struct bnx2x *bp, int idx) {return 0; } |
623 | |
624 | static inline int bnx2x_set_vf_link_state(struct net_device *dev, int vf, |
625 | int link_state) {return 0; } |
626 | struct pf_vf_bulletin_content; |
627 | static inline void bnx2x_vf_bulletin_finalize(struct pf_vf_bulletin_content *bulletin, |
628 | bool support_long) {} |
629 | |
630 | static inline int bnx2x_vfpf_update_vlan(struct bnx2x *bp, u16 vid, u8 vf_qid, bool add) {return 0; } |
631 | |
632 | #endif /* CONFIG_BNX2X_SRIOV */ |
633 | #endif /* bnx2x_sriov.h */ |
634 | |