Merge tag 'for-linus-20160801' of git://git.infradead.org/linux-mtd
[cascardo/linux.git] / drivers / net / ethernet / qlogic / qed / qed_vf.c
1 /* QLogic qed NIC Driver
2  * Copyright (c) 2015 QLogic Corporation
3  *
4  * This software is available under the terms of the GNU General Public License
5  * (GPL) Version 2, available from the file COPYING in the main directory of
6  * this source tree.
7  */
8
9 #include <linux/crc32.h>
10 #include <linux/etherdevice.h>
11 #include "qed.h"
12 #include "qed_sriov.h"
13 #include "qed_vf.h"
14
15 static void *qed_vf_pf_prep(struct qed_hwfn *p_hwfn, u16 type, u16 length)
16 {
17         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
18         void *p_tlv;
19
20         /* This lock is released when we receive PF's response
21          * in qed_send_msg2pf().
22          * So, qed_vf_pf_prep() and qed_send_msg2pf()
23          * must come in sequence.
24          */
25         mutex_lock(&(p_iov->mutex));
26
27         DP_VERBOSE(p_hwfn,
28                    QED_MSG_IOV,
29                    "preparing to send 0x%04x tlv over vf pf channel\n",
30                    type);
31
32         /* Reset Requst offset */
33         p_iov->offset = (u8 *)p_iov->vf2pf_request;
34
35         /* Clear mailbox - both request and reply */
36         memset(p_iov->vf2pf_request, 0, sizeof(union vfpf_tlvs));
37         memset(p_iov->pf2vf_reply, 0, sizeof(union pfvf_tlvs));
38
39         /* Init type and length */
40         p_tlv = qed_add_tlv(p_hwfn, &p_iov->offset, type, length);
41
42         /* Init first tlv header */
43         ((struct vfpf_first_tlv *)p_tlv)->reply_address =
44             (u64)p_iov->pf2vf_reply_phys;
45
46         return p_tlv;
47 }
48
49 static int qed_send_msg2pf(struct qed_hwfn *p_hwfn, u8 *done, u32 resp_size)
50 {
51         union vfpf_tlvs *p_req = p_hwfn->vf_iov_info->vf2pf_request;
52         struct ustorm_trigger_vf_zone trigger;
53         struct ustorm_vf_zone *zone_data;
54         int rc = 0, time = 100;
55
56         zone_data = (struct ustorm_vf_zone *)PXP_VF_BAR0_START_USDM_ZONE_B;
57
58         /* output tlvs list */
59         qed_dp_tlv_list(p_hwfn, p_req);
60
61         /* need to add the END TLV to the message size */
62         resp_size += sizeof(struct channel_list_end_tlv);
63
64         /* Send TLVs over HW channel */
65         memset(&trigger, 0, sizeof(struct ustorm_trigger_vf_zone));
66         trigger.vf_pf_msg_valid = 1;
67
68         DP_VERBOSE(p_hwfn,
69                    QED_MSG_IOV,
70                    "VF -> PF [%02x] message: [%08x, %08x] --> %p, %08x --> %p\n",
71                    GET_FIELD(p_hwfn->hw_info.concrete_fid,
72                              PXP_CONCRETE_FID_PFID),
73                    upper_32_bits(p_hwfn->vf_iov_info->vf2pf_request_phys),
74                    lower_32_bits(p_hwfn->vf_iov_info->vf2pf_request_phys),
75                    &zone_data->non_trigger.vf_pf_msg_addr,
76                    *((u32 *)&trigger), &zone_data->trigger);
77
78         REG_WR(p_hwfn,
79                (uintptr_t)&zone_data->non_trigger.vf_pf_msg_addr.lo,
80                lower_32_bits(p_hwfn->vf_iov_info->vf2pf_request_phys));
81
82         REG_WR(p_hwfn,
83                (uintptr_t)&zone_data->non_trigger.vf_pf_msg_addr.hi,
84                upper_32_bits(p_hwfn->vf_iov_info->vf2pf_request_phys));
85
86         /* The message data must be written first, to prevent trigger before
87          * data is written.
88          */
89         wmb();
90
91         REG_WR(p_hwfn, (uintptr_t)&zone_data->trigger, *((u32 *)&trigger));
92
93         /* When PF would be done with the response, it would write back to the
94          * `done' address. Poll until then.
95          */
96         while ((!*done) && time) {
97                 msleep(25);
98                 time--;
99         }
100
101         if (!*done) {
102                 DP_VERBOSE(p_hwfn, QED_MSG_IOV,
103                            "VF <-- PF Timeout [Type %d]\n",
104                            p_req->first_tlv.tl.type);
105                 rc = -EBUSY;
106                 goto exit;
107         } else {
108                 DP_VERBOSE(p_hwfn, QED_MSG_IOV,
109                            "PF response: %d [Type %d]\n",
110                            *done, p_req->first_tlv.tl.type);
111         }
112
113 exit:
114         mutex_unlock(&(p_hwfn->vf_iov_info->mutex));
115
116         return rc;
117 }
118
119 #define VF_ACQUIRE_THRESH 3
120 static void qed_vf_pf_acquire_reduce_resc(struct qed_hwfn *p_hwfn,
121                                           struct vf_pf_resc_request *p_req,
122                                           struct pf_vf_resc *p_resp)
123 {
124         DP_VERBOSE(p_hwfn,
125                    QED_MSG_IOV,
126                    "PF unwilling to fullill resource request: rxq [%02x/%02x] txq [%02x/%02x] sbs [%02x/%02x] mac [%02x/%02x] vlan [%02x/%02x] mc [%02x/%02x]. Try PF recommended amount\n",
127                    p_req->num_rxqs,
128                    p_resp->num_rxqs,
129                    p_req->num_rxqs,
130                    p_resp->num_txqs,
131                    p_req->num_sbs,
132                    p_resp->num_sbs,
133                    p_req->num_mac_filters,
134                    p_resp->num_mac_filters,
135                    p_req->num_vlan_filters,
136                    p_resp->num_vlan_filters,
137                    p_req->num_mc_filters, p_resp->num_mc_filters);
138
139         /* humble our request */
140         p_req->num_txqs = p_resp->num_txqs;
141         p_req->num_rxqs = p_resp->num_rxqs;
142         p_req->num_sbs = p_resp->num_sbs;
143         p_req->num_mac_filters = p_resp->num_mac_filters;
144         p_req->num_vlan_filters = p_resp->num_vlan_filters;
145         p_req->num_mc_filters = p_resp->num_mc_filters;
146 }
147
148 static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
149 {
150         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
151         struct pfvf_acquire_resp_tlv *resp = &p_iov->pf2vf_reply->acquire_resp;
152         struct pf_vf_pfdev_info *pfdev_info = &resp->pfdev_info;
153         struct vf_pf_resc_request *p_resc;
154         bool resources_acquired = false;
155         struct vfpf_acquire_tlv *req;
156         int rc = 0, attempts = 0;
157
158         /* clear mailbox and prep first tlv */
159         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_ACQUIRE, sizeof(*req));
160         p_resc = &req->resc_request;
161
162         /* starting filling the request */
163         req->vfdev_info.opaque_fid = p_hwfn->hw_info.opaque_fid;
164
165         p_resc->num_rxqs = QED_MAX_VF_CHAINS_PER_PF;
166         p_resc->num_txqs = QED_MAX_VF_CHAINS_PER_PF;
167         p_resc->num_sbs = QED_MAX_VF_CHAINS_PER_PF;
168         p_resc->num_mac_filters = QED_ETH_VF_NUM_MAC_FILTERS;
169         p_resc->num_vlan_filters = QED_ETH_VF_NUM_VLAN_FILTERS;
170
171         req->vfdev_info.os_type = VFPF_ACQUIRE_OS_LINUX;
172         req->vfdev_info.fw_major = FW_MAJOR_VERSION;
173         req->vfdev_info.fw_minor = FW_MINOR_VERSION;
174         req->vfdev_info.fw_revision = FW_REVISION_VERSION;
175         req->vfdev_info.fw_engineering = FW_ENGINEERING_VERSION;
176         req->vfdev_info.eth_fp_hsi_major = ETH_HSI_VER_MAJOR;
177         req->vfdev_info.eth_fp_hsi_minor = ETH_HSI_VER_MINOR;
178
179         /* Fill capability field with any non-deprecated config we support */
180         req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_100G;
181
182         /* pf 2 vf bulletin board address */
183         req->bulletin_addr = p_iov->bulletin.phys;
184         req->bulletin_size = p_iov->bulletin.size;
185
186         /* add list termination tlv */
187         qed_add_tlv(p_hwfn, &p_iov->offset,
188                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
189
190         while (!resources_acquired) {
191                 DP_VERBOSE(p_hwfn,
192                            QED_MSG_IOV, "attempting to acquire resources\n");
193
194                 /* send acquire request */
195                 rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
196                 if (rc)
197                         return rc;
198
199                 /* copy acquire response from buffer to p_hwfn */
200                 memcpy(&p_iov->acquire_resp, resp, sizeof(p_iov->acquire_resp));
201
202                 attempts++;
203
204                 if (resp->hdr.status == PFVF_STATUS_SUCCESS) {
205                         /* PF agrees to allocate our resources */
206                         if (!(resp->pfdev_info.capabilities &
207                               PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE)) {
208                                 DP_INFO(p_hwfn,
209                                         "PF is using old incompatible driver; Either downgrade driver or request provider to update hypervisor version\n");
210                                 return -EINVAL;
211                         }
212                         DP_VERBOSE(p_hwfn, QED_MSG_IOV, "resources acquired\n");
213                         resources_acquired = true;
214                 } else if (resp->hdr.status == PFVF_STATUS_NO_RESOURCE &&
215                            attempts < VF_ACQUIRE_THRESH) {
216                         qed_vf_pf_acquire_reduce_resc(p_hwfn, p_resc,
217                                                       &resp->resc);
218
219                         /* Clear response buffer */
220                         memset(p_iov->pf2vf_reply, 0, sizeof(union pfvf_tlvs));
221                 } else if ((resp->hdr.status == PFVF_STATUS_NOT_SUPPORTED) &&
222                            pfdev_info->major_fp_hsi &&
223                            (pfdev_info->major_fp_hsi != ETH_HSI_VER_MAJOR)) {
224                         DP_NOTICE(p_hwfn,
225                                   "PF uses an incompatible fastpath HSI %02x.%02x [VF requires %02x.%02x]. Please change to a VF driver using %02x.xx.\n",
226                                   pfdev_info->major_fp_hsi,
227                                   pfdev_info->minor_fp_hsi,
228                                   ETH_HSI_VER_MAJOR,
229                                   ETH_HSI_VER_MINOR, pfdev_info->major_fp_hsi);
230                         return -EINVAL;
231                 } else {
232                         DP_ERR(p_hwfn,
233                                "PF returned error %d to VF acquisition request\n",
234                                resp->hdr.status);
235                         return -EAGAIN;
236                 }
237         }
238
239         /* Update bulletin board size with response from PF */
240         p_iov->bulletin.size = resp->bulletin_size;
241
242         /* get HW info */
243         p_hwfn->cdev->type = resp->pfdev_info.dev_type;
244         p_hwfn->cdev->chip_rev = resp->pfdev_info.chip_rev;
245
246         p_hwfn->cdev->chip_num = pfdev_info->chip_num & 0xffff;
247
248         /* Learn of the possibility of CMT */
249         if (IS_LEAD_HWFN(p_hwfn)) {
250                 if (resp->pfdev_info.capabilities & PFVF_ACQUIRE_CAP_100G) {
251                         DP_NOTICE(p_hwfn, "100g VF\n");
252                         p_hwfn->cdev->num_hwfns = 2;
253                 }
254         }
255
256         if (ETH_HSI_VER_MINOR &&
257             (resp->pfdev_info.minor_fp_hsi < ETH_HSI_VER_MINOR)) {
258                 DP_INFO(p_hwfn,
259                         "PF is using older fastpath HSI; %02x.%02x is configured\n",
260                         ETH_HSI_VER_MAJOR, resp->pfdev_info.minor_fp_hsi);
261         }
262
263         return 0;
264 }
265
266 int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn)
267 {
268         struct qed_vf_iov *p_iov;
269         u32 reg;
270
271         /* Set number of hwfns - might be overriden once leading hwfn learns
272          * actual configuration from PF.
273          */
274         if (IS_LEAD_HWFN(p_hwfn))
275                 p_hwfn->cdev->num_hwfns = 1;
276
277         /* Set the doorbell bar. Assumption: regview is set */
278         p_hwfn->doorbells = (u8 __iomem *)p_hwfn->regview +
279                                           PXP_VF_BAR0_START_DQ;
280
281         reg = PXP_VF_BAR0_ME_OPAQUE_ADDRESS;
282         p_hwfn->hw_info.opaque_fid = (u16)REG_RD(p_hwfn, reg);
283
284         reg = PXP_VF_BAR0_ME_CONCRETE_ADDRESS;
285         p_hwfn->hw_info.concrete_fid = REG_RD(p_hwfn, reg);
286
287         /* Allocate vf sriov info */
288         p_iov = kzalloc(sizeof(*p_iov), GFP_KERNEL);
289         if (!p_iov) {
290                 DP_NOTICE(p_hwfn, "Failed to allocate `struct qed_sriov'\n");
291                 return -ENOMEM;
292         }
293
294         /* Allocate vf2pf msg */
295         p_iov->vf2pf_request = dma_alloc_coherent(&p_hwfn->cdev->pdev->dev,
296                                                   sizeof(union vfpf_tlvs),
297                                                   &p_iov->vf2pf_request_phys,
298                                                   GFP_KERNEL);
299         if (!p_iov->vf2pf_request) {
300                 DP_NOTICE(p_hwfn,
301                           "Failed to allocate `vf2pf_request' DMA memory\n");
302                 goto free_p_iov;
303         }
304
305         p_iov->pf2vf_reply = dma_alloc_coherent(&p_hwfn->cdev->pdev->dev,
306                                                 sizeof(union pfvf_tlvs),
307                                                 &p_iov->pf2vf_reply_phys,
308                                                 GFP_KERNEL);
309         if (!p_iov->pf2vf_reply) {
310                 DP_NOTICE(p_hwfn,
311                           "Failed to allocate `pf2vf_reply' DMA memory\n");
312                 goto free_vf2pf_request;
313         }
314
315         DP_VERBOSE(p_hwfn,
316                    QED_MSG_IOV,
317                    "VF's Request mailbox [%p virt 0x%llx phys], Response mailbox [%p virt 0x%llx phys]\n",
318                    p_iov->vf2pf_request,
319                    (u64) p_iov->vf2pf_request_phys,
320                    p_iov->pf2vf_reply, (u64)p_iov->pf2vf_reply_phys);
321
322         /* Allocate Bulletin board */
323         p_iov->bulletin.size = sizeof(struct qed_bulletin_content);
324         p_iov->bulletin.p_virt = dma_alloc_coherent(&p_hwfn->cdev->pdev->dev,
325                                                     p_iov->bulletin.size,
326                                                     &p_iov->bulletin.phys,
327                                                     GFP_KERNEL);
328         DP_VERBOSE(p_hwfn, QED_MSG_IOV,
329                    "VF's bulletin Board [%p virt 0x%llx phys 0x%08x bytes]\n",
330                    p_iov->bulletin.p_virt,
331                    (u64)p_iov->bulletin.phys, p_iov->bulletin.size);
332
333         mutex_init(&p_iov->mutex);
334
335         p_hwfn->vf_iov_info = p_iov;
336
337         p_hwfn->hw_info.personality = QED_PCI_ETH;
338
339         return qed_vf_pf_acquire(p_hwfn);
340
341 free_vf2pf_request:
342         dma_free_coherent(&p_hwfn->cdev->pdev->dev,
343                           sizeof(union vfpf_tlvs),
344                           p_iov->vf2pf_request, p_iov->vf2pf_request_phys);
345 free_p_iov:
346         kfree(p_iov);
347
348         return -ENOMEM;
349 }
350
351 int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
352                         u8 rx_qid,
353                         u16 sb,
354                         u8 sb_index,
355                         u16 bd_max_bytes,
356                         dma_addr_t bd_chain_phys_addr,
357                         dma_addr_t cqe_pbl_addr,
358                         u16 cqe_pbl_size, void __iomem **pp_prod)
359 {
360         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
361         struct pfvf_start_queue_resp_tlv *resp;
362         struct vfpf_start_rxq_tlv *req;
363         int rc;
364
365         /* clear mailbox and prep first tlv */
366         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_START_RXQ, sizeof(*req));
367
368         req->rx_qid = rx_qid;
369         req->cqe_pbl_addr = cqe_pbl_addr;
370         req->cqe_pbl_size = cqe_pbl_size;
371         req->rxq_addr = bd_chain_phys_addr;
372         req->hw_sb = sb;
373         req->sb_index = sb_index;
374         req->bd_max_bytes = bd_max_bytes;
375         req->stat_id = -1;
376
377         /* add list termination tlv */
378         qed_add_tlv(p_hwfn, &p_iov->offset,
379                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
380
381         resp = &p_iov->pf2vf_reply->queue_start;
382         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
383         if (rc)
384                 return rc;
385
386         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
387                 return -EINVAL;
388
389         /* Learn the address of the producer from the response */
390         if (pp_prod) {
391                 u64 init_prod_val = 0;
392
393                 *pp_prod = (u8 __iomem *)p_hwfn->regview + resp->offset;
394                 DP_VERBOSE(p_hwfn, QED_MSG_IOV,
395                            "Rxq[0x%02x]: producer at %p [offset 0x%08x]\n",
396                            rx_qid, *pp_prod, resp->offset);
397
398                 /* Init the rcq, rx bd and rx sge (if valid) producers to 0 */
399                 __internal_ram_wr(p_hwfn, *pp_prod, sizeof(u64),
400                                   (u32 *)&init_prod_val);
401         }
402
403         return rc;
404 }
405
406 int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn, u16 rx_qid, bool cqe_completion)
407 {
408         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
409         struct vfpf_stop_rxqs_tlv *req;
410         struct pfvf_def_resp_tlv *resp;
411         int rc;
412
413         /* clear mailbox and prep first tlv */
414         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_STOP_RXQS, sizeof(*req));
415
416         req->rx_qid = rx_qid;
417         req->num_rxqs = 1;
418         req->cqe_completion = cqe_completion;
419
420         /* add list termination tlv */
421         qed_add_tlv(p_hwfn, &p_iov->offset,
422                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
423
424         resp = &p_iov->pf2vf_reply->default_resp;
425         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
426         if (rc)
427                 return rc;
428
429         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
430                 return -EINVAL;
431
432         return rc;
433 }
434
435 int qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
436                         u16 tx_queue_id,
437                         u16 sb,
438                         u8 sb_index,
439                         dma_addr_t pbl_addr,
440                         u16 pbl_size, void __iomem **pp_doorbell)
441 {
442         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
443         struct pfvf_start_queue_resp_tlv *resp;
444         struct vfpf_start_txq_tlv *req;
445         int rc;
446
447         /* clear mailbox and prep first tlv */
448         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_START_TXQ, sizeof(*req));
449
450         req->tx_qid = tx_queue_id;
451
452         /* Tx */
453         req->pbl_addr = pbl_addr;
454         req->pbl_size = pbl_size;
455         req->hw_sb = sb;
456         req->sb_index = sb_index;
457
458         /* add list termination tlv */
459         qed_add_tlv(p_hwfn, &p_iov->offset,
460                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
461
462         resp = &p_iov->pf2vf_reply->queue_start;
463         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
464         if (rc)
465                 goto exit;
466
467         if (resp->hdr.status != PFVF_STATUS_SUCCESS) {
468                 rc = -EINVAL;
469                 goto exit;
470         }
471
472         if (pp_doorbell) {
473                 *pp_doorbell = (u8 __iomem *)p_hwfn->doorbells + resp->offset;
474
475                 DP_VERBOSE(p_hwfn, QED_MSG_IOV,
476                            "Txq[0x%02x]: doorbell at %p [offset 0x%08x]\n",
477                            tx_queue_id, *pp_doorbell, resp->offset);
478         }
479 exit:
480
481         return rc;
482 }
483
484 int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn, u16 tx_qid)
485 {
486         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
487         struct vfpf_stop_txqs_tlv *req;
488         struct pfvf_def_resp_tlv *resp;
489         int rc;
490
491         /* clear mailbox and prep first tlv */
492         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_STOP_TXQS, sizeof(*req));
493
494         req->tx_qid = tx_qid;
495         req->num_txqs = 1;
496
497         /* add list termination tlv */
498         qed_add_tlv(p_hwfn, &p_iov->offset,
499                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
500
501         resp = &p_iov->pf2vf_reply->default_resp;
502         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
503         if (rc)
504                 return rc;
505
506         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
507                 return -EINVAL;
508
509         return rc;
510 }
511
512 int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn,
513                           u8 vport_id,
514                           u16 mtu,
515                           u8 inner_vlan_removal,
516                           enum qed_tpa_mode tpa_mode,
517                           u8 max_buffers_per_cqe, u8 only_untagged)
518 {
519         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
520         struct vfpf_vport_start_tlv *req;
521         struct pfvf_def_resp_tlv *resp;
522         int rc, i;
523
524         /* clear mailbox and prep first tlv */
525         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_VPORT_START, sizeof(*req));
526
527         req->mtu = mtu;
528         req->vport_id = vport_id;
529         req->inner_vlan_removal = inner_vlan_removal;
530         req->tpa_mode = tpa_mode;
531         req->max_buffers_per_cqe = max_buffers_per_cqe;
532         req->only_untagged = only_untagged;
533
534         /* status blocks */
535         for (i = 0; i < p_hwfn->vf_iov_info->acquire_resp.resc.num_sbs; i++)
536                 if (p_hwfn->sbs_info[i])
537                         req->sb_addr[i] = p_hwfn->sbs_info[i]->sb_phys;
538
539         /* add list termination tlv */
540         qed_add_tlv(p_hwfn, &p_iov->offset,
541                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
542
543         resp = &p_iov->pf2vf_reply->default_resp;
544         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
545         if (rc)
546                 return rc;
547
548         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
549                 return -EINVAL;
550
551         return rc;
552 }
553
554 int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn)
555 {
556         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
557         struct pfvf_def_resp_tlv *resp = &p_iov->pf2vf_reply->default_resp;
558         int rc;
559
560         /* clear mailbox and prep first tlv */
561         qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_VPORT_TEARDOWN,
562                        sizeof(struct vfpf_first_tlv));
563
564         /* add list termination tlv */
565         qed_add_tlv(p_hwfn, &p_iov->offset,
566                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
567
568         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
569         if (rc)
570                 return rc;
571
572         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
573                 return -EINVAL;
574
575         return rc;
576 }
577
578 static bool
579 qed_vf_handle_vp_update_is_needed(struct qed_hwfn *p_hwfn,
580                                   struct qed_sp_vport_update_params *p_data,
581                                   u16 tlv)
582 {
583         switch (tlv) {
584         case CHANNEL_TLV_VPORT_UPDATE_ACTIVATE:
585                 return !!(p_data->update_vport_active_rx_flg ||
586                           p_data->update_vport_active_tx_flg);
587         case CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH:
588                 return !!p_data->update_tx_switching_flg;
589         case CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP:
590                 return !!p_data->update_inner_vlan_removal_flg;
591         case CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN:
592                 return !!p_data->update_accept_any_vlan_flg;
593         case CHANNEL_TLV_VPORT_UPDATE_MCAST:
594                 return !!p_data->update_approx_mcast_flg;
595         case CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM:
596                 return !!(p_data->accept_flags.update_rx_mode_config ||
597                           p_data->accept_flags.update_tx_mode_config);
598         case CHANNEL_TLV_VPORT_UPDATE_RSS:
599                 return !!p_data->rss_params;
600         case CHANNEL_TLV_VPORT_UPDATE_SGE_TPA:
601                 return !!p_data->sge_tpa_params;
602         default:
603                 DP_INFO(p_hwfn, "Unexpected vport-update TLV[%d]\n",
604                         tlv);
605                 return false;
606         }
607 }
608
609 static void
610 qed_vf_handle_vp_update_tlvs_resp(struct qed_hwfn *p_hwfn,
611                                   struct qed_sp_vport_update_params *p_data)
612 {
613         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
614         struct pfvf_def_resp_tlv *p_resp;
615         u16 tlv;
616
617         for (tlv = CHANNEL_TLV_VPORT_UPDATE_ACTIVATE;
618              tlv < CHANNEL_TLV_VPORT_UPDATE_MAX; tlv++) {
619                 if (!qed_vf_handle_vp_update_is_needed(p_hwfn, p_data, tlv))
620                         continue;
621
622                 p_resp = (struct pfvf_def_resp_tlv *)
623                          qed_iov_search_list_tlvs(p_hwfn, p_iov->pf2vf_reply,
624                                                   tlv);
625                 if (p_resp && p_resp->hdr.status)
626                         DP_VERBOSE(p_hwfn, QED_MSG_IOV,
627                                    "TLV[%d] Configuration %s\n",
628                                    tlv,
629                                    (p_resp && p_resp->hdr.status) ? "succeeded"
630                                                                   : "failed");
631         }
632 }
633
634 int qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn,
635                            struct qed_sp_vport_update_params *p_params)
636 {
637         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
638         struct vfpf_vport_update_tlv *req;
639         struct pfvf_def_resp_tlv *resp;
640         u8 update_rx, update_tx;
641         u32 resp_size = 0;
642         u16 size, tlv;
643         int rc;
644
645         resp = &p_iov->pf2vf_reply->default_resp;
646         resp_size = sizeof(*resp);
647
648         update_rx = p_params->update_vport_active_rx_flg;
649         update_tx = p_params->update_vport_active_tx_flg;
650
651         /* clear mailbox and prep header tlv */
652         qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_VPORT_UPDATE, sizeof(*req));
653
654         /* Prepare extended tlvs */
655         if (update_rx || update_tx) {
656                 struct vfpf_vport_update_activate_tlv *p_act_tlv;
657
658                 size = sizeof(struct vfpf_vport_update_activate_tlv);
659                 p_act_tlv = qed_add_tlv(p_hwfn, &p_iov->offset,
660                                         CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
661                                         size);
662                 resp_size += sizeof(struct pfvf_def_resp_tlv);
663
664                 if (update_rx) {
665                         p_act_tlv->update_rx = update_rx;
666                         p_act_tlv->active_rx = p_params->vport_active_rx_flg;
667                 }
668
669                 if (update_tx) {
670                         p_act_tlv->update_tx = update_tx;
671                         p_act_tlv->active_tx = p_params->vport_active_tx_flg;
672                 }
673         }
674
675         if (p_params->update_tx_switching_flg) {
676                 struct vfpf_vport_update_tx_switch_tlv *p_tx_switch_tlv;
677
678                 size = sizeof(struct vfpf_vport_update_tx_switch_tlv);
679                 tlv = CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH;
680                 p_tx_switch_tlv = qed_add_tlv(p_hwfn, &p_iov->offset,
681                                               tlv, size);
682                 resp_size += sizeof(struct pfvf_def_resp_tlv);
683
684                 p_tx_switch_tlv->tx_switching = p_params->tx_switching_flg;
685         }
686
687         if (p_params->update_approx_mcast_flg) {
688                 struct vfpf_vport_update_mcast_bin_tlv *p_mcast_tlv;
689
690                 size = sizeof(struct vfpf_vport_update_mcast_bin_tlv);
691                 p_mcast_tlv = qed_add_tlv(p_hwfn, &p_iov->offset,
692                                           CHANNEL_TLV_VPORT_UPDATE_MCAST, size);
693                 resp_size += sizeof(struct pfvf_def_resp_tlv);
694
695                 memcpy(p_mcast_tlv->bins, p_params->bins,
696                        sizeof(unsigned long) * ETH_MULTICAST_MAC_BINS_IN_REGS);
697         }
698
699         update_rx = p_params->accept_flags.update_rx_mode_config;
700         update_tx = p_params->accept_flags.update_tx_mode_config;
701
702         if (update_rx || update_tx) {
703                 struct vfpf_vport_update_accept_param_tlv *p_accept_tlv;
704
705                 tlv = CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM;
706                 size = sizeof(struct vfpf_vport_update_accept_param_tlv);
707                 p_accept_tlv = qed_add_tlv(p_hwfn, &p_iov->offset, tlv, size);
708                 resp_size += sizeof(struct pfvf_def_resp_tlv);
709
710                 if (update_rx) {
711                         p_accept_tlv->update_rx_mode = update_rx;
712                         p_accept_tlv->rx_accept_filter =
713                             p_params->accept_flags.rx_accept_filter;
714                 }
715
716                 if (update_tx) {
717                         p_accept_tlv->update_tx_mode = update_tx;
718                         p_accept_tlv->tx_accept_filter =
719                             p_params->accept_flags.tx_accept_filter;
720                 }
721         }
722
723         if (p_params->rss_params) {
724                 struct qed_rss_params *rss_params = p_params->rss_params;
725                 struct vfpf_vport_update_rss_tlv *p_rss_tlv;
726
727                 size = sizeof(struct vfpf_vport_update_rss_tlv);
728                 p_rss_tlv = qed_add_tlv(p_hwfn,
729                                         &p_iov->offset,
730                                         CHANNEL_TLV_VPORT_UPDATE_RSS, size);
731                 resp_size += sizeof(struct pfvf_def_resp_tlv);
732
733                 if (rss_params->update_rss_config)
734                         p_rss_tlv->update_rss_flags |=
735                             VFPF_UPDATE_RSS_CONFIG_FLAG;
736                 if (rss_params->update_rss_capabilities)
737                         p_rss_tlv->update_rss_flags |=
738                             VFPF_UPDATE_RSS_CAPS_FLAG;
739                 if (rss_params->update_rss_ind_table)
740                         p_rss_tlv->update_rss_flags |=
741                             VFPF_UPDATE_RSS_IND_TABLE_FLAG;
742                 if (rss_params->update_rss_key)
743                         p_rss_tlv->update_rss_flags |= VFPF_UPDATE_RSS_KEY_FLAG;
744
745                 p_rss_tlv->rss_enable = rss_params->rss_enable;
746                 p_rss_tlv->rss_caps = rss_params->rss_caps;
747                 p_rss_tlv->rss_table_size_log = rss_params->rss_table_size_log;
748                 memcpy(p_rss_tlv->rss_ind_table, rss_params->rss_ind_table,
749                        sizeof(rss_params->rss_ind_table));
750                 memcpy(p_rss_tlv->rss_key, rss_params->rss_key,
751                        sizeof(rss_params->rss_key));
752         }
753
754         if (p_params->update_accept_any_vlan_flg) {
755                 struct vfpf_vport_update_accept_any_vlan_tlv *p_any_vlan_tlv;
756
757                 size = sizeof(struct vfpf_vport_update_accept_any_vlan_tlv);
758                 tlv = CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN;
759                 p_any_vlan_tlv = qed_add_tlv(p_hwfn, &p_iov->offset, tlv, size);
760
761                 resp_size += sizeof(struct pfvf_def_resp_tlv);
762                 p_any_vlan_tlv->accept_any_vlan = p_params->accept_any_vlan;
763                 p_any_vlan_tlv->update_accept_any_vlan_flg =
764                     p_params->update_accept_any_vlan_flg;
765         }
766
767         /* add list termination tlv */
768         qed_add_tlv(p_hwfn, &p_iov->offset,
769                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
770
771         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, resp_size);
772         if (rc)
773                 return rc;
774
775         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
776                 return -EINVAL;
777
778         qed_vf_handle_vp_update_tlvs_resp(p_hwfn, p_params);
779
780         return rc;
781 }
782
783 int qed_vf_pf_reset(struct qed_hwfn *p_hwfn)
784 {
785         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
786         struct pfvf_def_resp_tlv *resp;
787         struct vfpf_first_tlv *req;
788         int rc;
789
790         /* clear mailbox and prep first tlv */
791         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_CLOSE, sizeof(*req));
792
793         /* add list termination tlv */
794         qed_add_tlv(p_hwfn, &p_iov->offset,
795                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
796
797         resp = &p_iov->pf2vf_reply->default_resp;
798         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
799         if (rc)
800                 return rc;
801
802         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
803                 return -EAGAIN;
804
805         p_hwfn->b_int_enabled = 0;
806
807         return 0;
808 }
809
810 int qed_vf_pf_release(struct qed_hwfn *p_hwfn)
811 {
812         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
813         struct pfvf_def_resp_tlv *resp;
814         struct vfpf_first_tlv *req;
815         u32 size;
816         int rc;
817
818         /* clear mailbox and prep first tlv */
819         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_RELEASE, sizeof(*req));
820
821         /* add list termination tlv */
822         qed_add_tlv(p_hwfn, &p_iov->offset,
823                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
824
825         resp = &p_iov->pf2vf_reply->default_resp;
826         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
827
828         if (!rc && resp->hdr.status != PFVF_STATUS_SUCCESS)
829                 rc = -EAGAIN;
830
831         p_hwfn->b_int_enabled = 0;
832
833         if (p_iov->vf2pf_request)
834                 dma_free_coherent(&p_hwfn->cdev->pdev->dev,
835                                   sizeof(union vfpf_tlvs),
836                                   p_iov->vf2pf_request,
837                                   p_iov->vf2pf_request_phys);
838         if (p_iov->pf2vf_reply)
839                 dma_free_coherent(&p_hwfn->cdev->pdev->dev,
840                                   sizeof(union pfvf_tlvs),
841                                   p_iov->pf2vf_reply, p_iov->pf2vf_reply_phys);
842
843         if (p_iov->bulletin.p_virt) {
844                 size = sizeof(struct qed_bulletin_content);
845                 dma_free_coherent(&p_hwfn->cdev->pdev->dev,
846                                   size,
847                                   p_iov->bulletin.p_virt, p_iov->bulletin.phys);
848         }
849
850         kfree(p_hwfn->vf_iov_info);
851         p_hwfn->vf_iov_info = NULL;
852
853         return rc;
854 }
855
856 void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn,
857                             struct qed_filter_mcast *p_filter_cmd)
858 {
859         struct qed_sp_vport_update_params sp_params;
860         int i;
861
862         memset(&sp_params, 0, sizeof(sp_params));
863         sp_params.update_approx_mcast_flg = 1;
864
865         if (p_filter_cmd->opcode == QED_FILTER_ADD) {
866                 for (i = 0; i < p_filter_cmd->num_mc_addrs; i++) {
867                         u32 bit;
868
869                         bit = qed_mcast_bin_from_mac(p_filter_cmd->mac[i]);
870                         __set_bit(bit, sp_params.bins);
871                 }
872         }
873
874         qed_vf_pf_vport_update(p_hwfn, &sp_params);
875 }
876
877 int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn,
878                            struct qed_filter_ucast *p_ucast)
879 {
880         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
881         struct vfpf_ucast_filter_tlv *req;
882         struct pfvf_def_resp_tlv *resp;
883         int rc;
884
885         /* clear mailbox and prep first tlv */
886         req = qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_UCAST_FILTER, sizeof(*req));
887         req->opcode = (u8) p_ucast->opcode;
888         req->type = (u8) p_ucast->type;
889         memcpy(req->mac, p_ucast->mac, ETH_ALEN);
890         req->vlan = p_ucast->vlan;
891
892         /* add list termination tlv */
893         qed_add_tlv(p_hwfn, &p_iov->offset,
894                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
895
896         resp = &p_iov->pf2vf_reply->default_resp;
897         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
898         if (rc)
899                 return rc;
900
901         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
902                 return -EAGAIN;
903
904         return 0;
905 }
906
907 int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn)
908 {
909         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
910         struct pfvf_def_resp_tlv *resp = &p_iov->pf2vf_reply->default_resp;
911         int rc;
912
913         /* clear mailbox and prep first tlv */
914         qed_vf_pf_prep(p_hwfn, CHANNEL_TLV_INT_CLEANUP,
915                        sizeof(struct vfpf_first_tlv));
916
917         /* add list termination tlv */
918         qed_add_tlv(p_hwfn, &p_iov->offset,
919                     CHANNEL_TLV_LIST_END, sizeof(struct channel_list_end_tlv));
920
921         rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
922         if (rc)
923                 return rc;
924
925         if (resp->hdr.status != PFVF_STATUS_SUCCESS)
926                 return -EINVAL;
927
928         return 0;
929 }
930
931 u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id)
932 {
933         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
934
935         if (!p_iov) {
936                 DP_NOTICE(p_hwfn, "vf_sriov_info isn't initialized\n");
937                 return 0;
938         }
939
940         return p_iov->acquire_resp.resc.hw_sbs[sb_id].hw_sb_id;
941 }
942
943 int qed_vf_read_bulletin(struct qed_hwfn *p_hwfn, u8 *p_change)
944 {
945         struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
946         struct qed_bulletin_content shadow;
947         u32 crc, crc_size;
948
949         crc_size = sizeof(p_iov->bulletin.p_virt->crc);
950         *p_change = 0;
951
952         /* Need to guarantee PF is not in the middle of writing it */
953         memcpy(&shadow, p_iov->bulletin.p_virt, p_iov->bulletin.size);
954
955         /* If version did not update, no need to do anything */
956         if (shadow.version == p_iov->bulletin_shadow.version)
957                 return 0;
958
959         /* Verify the bulletin we see is valid */
960         crc = crc32(0, (u8 *)&shadow + crc_size,
961                     p_iov->bulletin.size - crc_size);
962         if (crc != shadow.crc)
963                 return -EAGAIN;
964
965         /* Set the shadow bulletin and process it */
966         memcpy(&p_iov->bulletin_shadow, &shadow, p_iov->bulletin.size);
967
968         DP_VERBOSE(p_hwfn, QED_MSG_IOV,
969                    "Read a bulletin update %08x\n", shadow.version);
970
971         *p_change = 1;
972
973         return 0;
974 }
975
976 void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
977                               struct qed_mcp_link_params *p_params,
978                               struct qed_bulletin_content *p_bulletin)
979 {
980         memset(p_params, 0, sizeof(*p_params));
981
982         p_params->speed.autoneg = p_bulletin->req_autoneg;
983         p_params->speed.advertised_speeds = p_bulletin->req_adv_speed;
984         p_params->speed.forced_speed = p_bulletin->req_forced_speed;
985         p_params->pause.autoneg = p_bulletin->req_autoneg_pause;
986         p_params->pause.forced_rx = p_bulletin->req_forced_rx;
987         p_params->pause.forced_tx = p_bulletin->req_forced_tx;
988         p_params->loopback_mode = p_bulletin->req_loopback;
989 }
990
991 void qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
992                             struct qed_mcp_link_params *params)
993 {
994         __qed_vf_get_link_params(p_hwfn, params,
995                                  &(p_hwfn->vf_iov_info->bulletin_shadow));
996 }
997
998 void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
999                              struct qed_mcp_link_state *p_link,
1000                              struct qed_bulletin_content *p_bulletin)
1001 {
1002         memset(p_link, 0, sizeof(*p_link));
1003
1004         p_link->link_up = p_bulletin->link_up;
1005         p_link->speed = p_bulletin->speed;
1006         p_link->full_duplex = p_bulletin->full_duplex;
1007         p_link->an = p_bulletin->autoneg;
1008         p_link->an_complete = p_bulletin->autoneg_complete;
1009         p_link->parallel_detection = p_bulletin->parallel_detection;
1010         p_link->pfc_enabled = p_bulletin->pfc_enabled;
1011         p_link->partner_adv_speed = p_bulletin->partner_adv_speed;
1012         p_link->partner_tx_flow_ctrl_en = p_bulletin->partner_tx_flow_ctrl_en;
1013         p_link->partner_rx_flow_ctrl_en = p_bulletin->partner_rx_flow_ctrl_en;
1014         p_link->partner_adv_pause = p_bulletin->partner_adv_pause;
1015         p_link->sfp_tx_fault = p_bulletin->sfp_tx_fault;
1016 }
1017
1018 void qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
1019                            struct qed_mcp_link_state *link)
1020 {
1021         __qed_vf_get_link_state(p_hwfn, link,
1022                                 &(p_hwfn->vf_iov_info->bulletin_shadow));
1023 }
1024
1025 void __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
1026                             struct qed_mcp_link_capabilities *p_link_caps,
1027                             struct qed_bulletin_content *p_bulletin)
1028 {
1029         memset(p_link_caps, 0, sizeof(*p_link_caps));
1030         p_link_caps->speed_capabilities = p_bulletin->capability_speed;
1031 }
1032
1033 void qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
1034                           struct qed_mcp_link_capabilities *p_link_caps)
1035 {
1036         __qed_vf_get_link_caps(p_hwfn, p_link_caps,
1037                                &(p_hwfn->vf_iov_info->bulletin_shadow));
1038 }
1039
1040 void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs)
1041 {
1042         *num_rxqs = p_hwfn->vf_iov_info->acquire_resp.resc.num_rxqs;
1043 }
1044
1045 void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
1046 {
1047         memcpy(port_mac,
1048                p_hwfn->vf_iov_info->acquire_resp.pfdev_info.port_mac, ETH_ALEN);
1049 }
1050
1051 void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn, u8 *num_vlan_filters)
1052 {
1053         struct qed_vf_iov *p_vf;
1054
1055         p_vf = p_hwfn->vf_iov_info;
1056         *num_vlan_filters = p_vf->acquire_resp.resc.num_vlan_filters;
1057 }
1058
1059 bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac)
1060 {
1061         struct qed_bulletin_content *bulletin;
1062
1063         bulletin = &p_hwfn->vf_iov_info->bulletin_shadow;
1064         if (!(bulletin->valid_bitmap & (1 << MAC_ADDR_FORCED)))
1065                 return true;
1066
1067         /* Forbid VF from changing a MAC enforced by PF */
1068         if (ether_addr_equal(bulletin->mac, mac))
1069                 return false;
1070
1071         return false;
1072 }
1073
1074 bool qed_vf_bulletin_get_forced_mac(struct qed_hwfn *hwfn,
1075                                     u8 *dst_mac, u8 *p_is_forced)
1076 {
1077         struct qed_bulletin_content *bulletin;
1078
1079         bulletin = &hwfn->vf_iov_info->bulletin_shadow;
1080
1081         if (bulletin->valid_bitmap & (1 << MAC_ADDR_FORCED)) {
1082                 if (p_is_forced)
1083                         *p_is_forced = 1;
1084         } else if (bulletin->valid_bitmap & (1 << VFPF_BULLETIN_MAC_ADDR)) {
1085                 if (p_is_forced)
1086                         *p_is_forced = 0;
1087         } else {
1088                 return false;
1089         }
1090
1091         ether_addr_copy(dst_mac, bulletin->mac);
1092
1093         return true;
1094 }
1095
1096 void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn,
1097                            u16 *fw_major, u16 *fw_minor,
1098                            u16 *fw_rev, u16 *fw_eng)
1099 {
1100         struct pf_vf_pfdev_info *info;
1101
1102         info = &p_hwfn->vf_iov_info->acquire_resp.pfdev_info;
1103
1104         *fw_major = info->fw_major;
1105         *fw_minor = info->fw_minor;
1106         *fw_rev = info->fw_rev;
1107         *fw_eng = info->fw_eng;
1108 }
1109
1110 static void qed_handle_bulletin_change(struct qed_hwfn *hwfn)
1111 {
1112         struct qed_eth_cb_ops *ops = hwfn->cdev->protocol_ops.eth;
1113         u8 mac[ETH_ALEN], is_mac_exist, is_mac_forced;
1114         void *cookie = hwfn->cdev->ops_cookie;
1115
1116         is_mac_exist = qed_vf_bulletin_get_forced_mac(hwfn, mac,
1117                                                       &is_mac_forced);
1118         if (is_mac_exist && is_mac_forced && cookie)
1119                 ops->force_mac(cookie, mac);
1120
1121         /* Always update link configuration according to bulletin */
1122         qed_link_update(hwfn);
1123 }
1124
1125 void qed_iov_vf_task(struct work_struct *work)
1126 {
1127         struct qed_hwfn *hwfn = container_of(work, struct qed_hwfn,
1128                                              iov_task.work);
1129         u8 change = 0;
1130
1131         if (test_and_clear_bit(QED_IOV_WQ_STOP_WQ_FLAG, &hwfn->iov_task_flags))
1132                 return;
1133
1134         /* Handle bulletin board changes */
1135         qed_vf_read_bulletin(hwfn, &change);
1136         if (change)
1137                 qed_handle_bulletin_change(hwfn);
1138
1139         /* As VF is polling bulletin board, need to constantly re-schedule */
1140         queue_delayed_work(hwfn->iov_wq, &hwfn->iov_task, HZ);
1141 }