Lines Matching +full:sr +full:- +full:iov

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2013 - 2019 Intel Corporation. */
12 struct fm10k_intfc *interface = hw->back; in fm10k_iov_msg_error()
13 struct pci_dev *pdev = interface->pdev; in fm10k_iov_msg_error()
15 dev_err(&pdev->dev, "Unknown message ID %u on VF %d\n", in fm10k_iov_msg_error()
16 **results & FM10K_TLV_ID_MASK, vf_info->vf_idx); in fm10k_iov_msg_error()
22 * fm10k_iov_msg_queue_mac_vlan - Message handler for MAC/VLAN request from VF
37 struct fm10k_intfc *interface = hw->back; in fm10k_iov_msg_queue_mac_vlan()
60 /* if the length field has been set, this is a multi-bit in fm10k_iov_msg_queue_mac_vlan()
61 * update request. For multi-bit requests, simply disallow in fm10k_iov_msg_queue_mac_vlan()
65 * on a VLAN it was not assigned. In the single-bit case, we in fm10k_iov_msg_queue_mac_vlan()
71 /* prevent multi-bit requests when PF has in fm10k_iov_msg_queue_mac_vlan()
74 if (vf_info->pf_vid) in fm10k_iov_msg_queue_mac_vlan()
85 err = hw->mac.ops.update_vlan(hw, vid, vf_info->vsi, set); in fm10k_iov_msg_queue_mac_vlan()
97 if (is_valid_ether_addr(vf_info->mac) && in fm10k_iov_msg_queue_mac_vlan()
98 !ether_addr_equal(mac, vf_info->mac)) in fm10k_iov_msg_queue_mac_vlan()
111 err = fm10k_queue_mac_request(interface, vf_info->glort, in fm10k_iov_msg_queue_mac_vlan()
124 if (!(vf_info->vf_flags & FM10K_VF_FLAG_MULTI_ENABLED)) in fm10k_iov_msg_queue_mac_vlan()
137 err = fm10k_queue_mac_request(interface, vf_info->glort, in fm10k_iov_msg_queue_mac_vlan()
154 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_event()
160 if (!READ_ONCE(interface->iov_data)) in fm10k_iov_event()
165 iov_data = interface->iov_data; in fm10k_iov_event()
179 i = iov_data->num_vfs; in fm10k_iov_event()
181 for (vflre <<= 64 - i; vflre && i--; vflre += vflre) { in fm10k_iov_event()
182 struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; in fm10k_iov_event()
187 hw->iov.ops.reset_resources(hw, vf_info); in fm10k_iov_event()
188 vf_info->mbx.ops.connect(hw, &vf_info->mbx); in fm10k_iov_event()
199 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_mbx()
204 if (!READ_ONCE(interface->iov_data)) in fm10k_iov_mbx()
209 iov_data = interface->iov_data; in fm10k_iov_mbx()
226 for (i = iov_data->next_vf_mbx ? : iov_data->num_vfs; i--;) { in fm10k_iov_mbx()
227 struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; in fm10k_iov_mbx()
228 struct fm10k_mbx_info *mbx = &vf_info->mbx; in fm10k_iov_mbx()
229 u16 glort = vf_info->glort; in fm10k_iov_mbx()
232 hw->mbx.ops.process(hw, &hw->mbx); in fm10k_iov_mbx()
235 if (vf_info->vf_flags && !fm10k_glort_valid_pf(hw, glort)) { in fm10k_iov_mbx()
236 hw->iov.ops.reset_lport(hw, vf_info); in fm10k_iov_mbx()
241 if (!mbx->timeout) { in fm10k_iov_mbx()
242 hw->iov.ops.reset_resources(hw, vf_info); in fm10k_iov_mbx()
243 mbx->ops.connect(hw, mbx); in fm10k_iov_mbx()
247 if (hw->mbx.state == FM10K_STATE_OPEN && in fm10k_iov_mbx()
248 !hw->mbx.ops.tx_ready(&hw->mbx, FM10K_VFMBX_MSG_MTU)) { in fm10k_iov_mbx()
250 interface->hw_sm_mbx_full++; in fm10k_iov_mbx()
259 mbx->ops.process(hw, mbx); in fm10k_iov_mbx()
267 iov_data->next_vf_mbx = i + 1; in fm10k_iov_mbx()
268 } else if (iov_data->next_vf_mbx) { in fm10k_iov_mbx()
269 iov_data->next_vf_mbx = 0; in fm10k_iov_mbx()
285 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_iov_suspend()
286 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_suspend()
290 num_vfs = iov_data ? iov_data->num_vfs : 0; in fm10k_iov_suspend()
298 struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; in fm10k_iov_suspend()
300 hw->iov.ops.reset_resources(hw, vf_info); in fm10k_iov_suspend()
301 hw->iov.ops.reset_lport(hw, vf_info); in fm10k_iov_suspend()
302 fm10k_clear_macvlan_queue(interface, vf_info->glort, false); in fm10k_iov_suspend()
318 * non-fatal completer aborts into machine check exceptions. Completer in fm10k_mask_aer_comp_abort()
329 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_iov_resume()
331 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_resume()
335 num_vfs = iov_data ? iov_data->num_vfs : 0; in fm10k_iov_resume()
339 return -ENOMEM; in fm10k_iov_resume()
348 hw->iov.ops.assign_resources(hw, num_vfs, num_vfs); in fm10k_iov_resume()
351 dglort.glort = hw->mac.dglort_map & FM10K_DGLORTMAP_NONE; in fm10k_iov_resume()
354 dglort.rss_l = fls(fm10k_queues_per_pool(hw) - 1); in fm10k_iov_resume()
356 dglort.vsi_l = fls(hw->iov.total_vfs - 1); in fm10k_iov_resume()
359 hw->mac.ops.configure_dglort_map(hw, &dglort); in fm10k_iov_resume()
363 struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; in fm10k_iov_resume()
366 if (i == (~hw->mac.dglort_map >> FM10K_DGLORTMAP_MASK_SHIFT)) in fm10k_iov_resume()
370 hw->iov.ops.set_lport(hw, vf_info, i, in fm10k_iov_resume()
374 hw->iov.ops.assign_default_mac_vlan(hw, vf_info); in fm10k_iov_resume()
377 vf_info->mbx.ops.connect(hw, &vf_info->mbx); in fm10k_iov_resume()
385 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_iov_update_pvid()
386 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_update_pvid()
388 u16 vf_idx = (glort - hw->mac.dglort_map) & FM10K_DGLORTMAP_NONE; in fm10k_iov_update_pvid()
390 /* no IOV support, not our message to process */ in fm10k_iov_update_pvid()
395 if (vf_idx >= iov_data->num_vfs) in fm10k_iov_update_pvid()
399 vf_info = &iov_data->vf_info[vf_idx]; in fm10k_iov_update_pvid()
400 if (vf_info->sw_vid != pvid) { in fm10k_iov_update_pvid()
401 vf_info->sw_vid = pvid; in fm10k_iov_update_pvid()
402 hw->iov.ops.assign_default_mac_vlan(hw, vf_info); in fm10k_iov_update_pvid()
412 if (!interface->iov_data) in fm10k_iov_free_data()
419 kfree_rcu(interface->iov_data, rcu); in fm10k_iov_free_data()
420 interface->iov_data = NULL; in fm10k_iov_free_data()
426 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_iov_alloc_data()
427 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_alloc_data()
433 return -EBUSY; in fm10k_iov_alloc_data()
436 if (!hw->iov.ops.assign_resources) in fm10k_iov_alloc_data()
437 return -ENODEV; in fm10k_iov_alloc_data()
447 return -ENOMEM; in fm10k_iov_alloc_data()
450 iov_data->num_vfs = num_vfs; in fm10k_iov_alloc_data()
454 struct fm10k_vf_info *vf_info = &iov_data->vf_info[i]; in fm10k_iov_alloc_data()
458 vf_info->vsi = i + 1; in fm10k_iov_alloc_data()
459 vf_info->vf_idx = i; in fm10k_iov_alloc_data()
462 err = fm10k_pfvf_mbx_init(hw, &vf_info->mbx, iov_mbx_data, i); in fm10k_iov_alloc_data()
464 dev_err(&pdev->dev, in fm10k_iov_alloc_data()
465 "Unable to initialize SR-IOV mailbox\n"); in fm10k_iov_alloc_data()
472 interface->iov_data = iov_data; in fm10k_iov_alloc_data()
483 dev_err(&pdev->dev, in fm10k_iov_disable()
484 "Cannot disable SR-IOV while VFs are assigned\n"); in fm10k_iov_disable()
497 dev_err(&pdev->dev, in fm10k_iov_configure()
498 "Cannot modify SR-IOV while VFs are assigned\n"); in fm10k_iov_configure()
514 dev_err(&pdev->dev, in fm10k_iov_configure()
515 "Enable PCI SR-IOV failed: %d\n", err); in fm10k_iov_configure()
524 * fm10k_iov_update_stats - Update stats for all VFs
533 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_iov_update_stats()
534 struct fm10k_hw *hw = &interface->hw; in fm10k_iov_update_stats()
540 for (i = 0; i < iov_data->num_vfs; i++) in fm10k_iov_update_stats()
541 hw->iov.ops.update_stats(hw, iov_data->vf_info[i].stats, i); in fm10k_iov_update_stats()
547 struct fm10k_hw *hw = &interface->hw; in fm10k_reset_vf_info()
553 hw->iov.ops.reset_lport(hw, vf_info); in fm10k_reset_vf_info()
555 fm10k_clear_macvlan_queue(interface, vf_info->glort, false); in fm10k_reset_vf_info()
558 hw->iov.ops.assign_default_mac_vlan(hw, vf_info); in fm10k_reset_vf_info()
560 /* re-enable the LPORT for this VF */ in fm10k_reset_vf_info()
561 hw->iov.ops.set_lport(hw, vf_info, vf_info->vf_idx, in fm10k_reset_vf_info()
570 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_ndo_set_vf_mac()
573 /* verify SR-IOV is active and that vf idx is valid */ in fm10k_ndo_set_vf_mac()
574 if (!iov_data || vf_idx >= iov_data->num_vfs) in fm10k_ndo_set_vf_mac()
575 return -EINVAL; in fm10k_ndo_set_vf_mac()
579 return -EINVAL; in fm10k_ndo_set_vf_mac()
582 vf_info = &iov_data->vf_info[vf_idx]; in fm10k_ndo_set_vf_mac()
583 ether_addr_copy(vf_info->mac, mac); in fm10k_ndo_set_vf_mac()
594 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_ndo_set_vf_vlan()
595 struct fm10k_hw *hw = &interface->hw; in fm10k_ndo_set_vf_vlan()
598 /* verify SR-IOV is active and that vf idx is valid */ in fm10k_ndo_set_vf_vlan()
599 if (!iov_data || vf_idx >= iov_data->num_vfs) in fm10k_ndo_set_vf_vlan()
600 return -EINVAL; in fm10k_ndo_set_vf_vlan()
602 /* QOS is unsupported and VLAN IDs accepted range 0-4094 */ in fm10k_ndo_set_vf_vlan()
603 if (qos || (vid > (VLAN_VID_MASK - 1))) in fm10k_ndo_set_vf_vlan()
604 return -EINVAL; in fm10k_ndo_set_vf_vlan()
608 return -EPROTONOSUPPORT; in fm10k_ndo_set_vf_vlan()
610 vf_info = &iov_data->vf_info[vf_idx]; in fm10k_ndo_set_vf_vlan()
613 if (vf_info->pf_vid == vid) in fm10k_ndo_set_vf_vlan()
617 vf_info->pf_vid = vid; in fm10k_ndo_set_vf_vlan()
620 hw->mac.ops.update_vlan(hw, FM10K_VLAN_ALL, vf_info->vsi, false); in fm10k_ndo_set_vf_vlan()
631 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_ndo_set_vf_bw()
632 struct fm10k_hw *hw = &interface->hw; in fm10k_ndo_set_vf_bw()
634 /* verify SR-IOV is active and that vf idx is valid */ in fm10k_ndo_set_vf_bw()
635 if (!iov_data || vf_idx >= iov_data->num_vfs) in fm10k_ndo_set_vf_bw()
636 return -EINVAL; in fm10k_ndo_set_vf_bw()
641 return -EINVAL; in fm10k_ndo_set_vf_bw()
644 iov_data->vf_info[vf_idx].rate = max_rate; in fm10k_ndo_set_vf_bw()
647 hw->iov.ops.configure_tc(hw, vf_idx, max_rate); in fm10k_ndo_set_vf_bw()
656 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_ndo_get_vf_config()
659 /* verify SR-IOV is active and that vf idx is valid */ in fm10k_ndo_get_vf_config()
660 if (!iov_data || vf_idx >= iov_data->num_vfs) in fm10k_ndo_get_vf_config()
661 return -EINVAL; in fm10k_ndo_get_vf_config()
663 vf_info = &iov_data->vf_info[vf_idx]; in fm10k_ndo_get_vf_config()
665 ivi->vf = vf_idx; in fm10k_ndo_get_vf_config()
666 ivi->max_tx_rate = vf_info->rate; in fm10k_ndo_get_vf_config()
667 ivi->min_tx_rate = 0; in fm10k_ndo_get_vf_config()
668 ether_addr_copy(ivi->mac, vf_info->mac); in fm10k_ndo_get_vf_config()
669 ivi->vlan = vf_info->pf_vid; in fm10k_ndo_get_vf_config()
670 ivi->qos = 0; in fm10k_ndo_get_vf_config()
679 struct fm10k_iov_data *iov_data = interface->iov_data; in fm10k_ndo_get_vf_stats()
680 struct fm10k_hw *hw = &interface->hw; in fm10k_ndo_get_vf_stats()
684 /* verify SR-IOV is active and that vf idx is valid */ in fm10k_ndo_get_vf_stats()
685 if (!iov_data || vf_idx >= iov_data->num_vfs) in fm10k_ndo_get_vf_stats()
686 return -EINVAL; in fm10k_ndo_get_vf_stats()
689 hw_stats = iov_data->vf_info[vf_idx].stats; in fm10k_ndo_get_vf_stats()
692 stats->rx_packets += hw_stats[idx].rx_packets.count; in fm10k_ndo_get_vf_stats()
693 stats->tx_packets += hw_stats[idx].tx_packets.count; in fm10k_ndo_get_vf_stats()
694 stats->rx_bytes += hw_stats[idx].rx_bytes.count; in fm10k_ndo_get_vf_stats()
695 stats->tx_bytes += hw_stats[idx].tx_bytes.count; in fm10k_ndo_get_vf_stats()
696 stats->rx_dropped += hw_stats[idx].rx_drops.count; in fm10k_ndo_get_vf_stats()