Lines Matching +full:tcs +full:- +full:wait

1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2013 - 2021 Intel Corporation. */
32 static const char i40e_copyright[] = "Copyright (c) 2013 - 2019 Intel Corporation.";
58 /* i40e_pci_tbl - PCI Device ID Table
98 static int debug = -1;
118 if (is_unicast_ether_addr(f->macaddr) || is_link_local_ether_addr(f->macaddr)) in netdev_hw_addr_refcnt()
119 ha_list = &netdev->uc; in netdev_hw_addr_refcnt()
121 ha_list = &netdev->mc; in netdev_hw_addr_refcnt()
124 if (ether_addr_equal(ha->addr, f->macaddr)) { in netdev_hw_addr_refcnt()
125 ha->refcount += delta; in netdev_hw_addr_refcnt()
126 if (ha->refcount <= 0) in netdev_hw_addr_refcnt()
127 ha->refcount = 1; in netdev_hw_addr_refcnt()
134 * i40e_hw_to_dev - get device pointer from the hardware structure
141 return &pf->pdev->dev; in i40e_hw_to_dev()
145 * i40e_allocate_dma_mem - OS specific memory alloc for shared code
156 mem->size = ALIGN(size, alignment); in i40e_allocate_dma_mem()
157 mem->va = dma_alloc_coherent(&pf->pdev->dev, mem->size, &mem->pa, in i40e_allocate_dma_mem()
159 if (!mem->va) in i40e_allocate_dma_mem()
160 return -ENOMEM; in i40e_allocate_dma_mem()
166 * i40e_free_dma_mem - OS specific memory free for shared code
174 dma_free_coherent(&pf->pdev->dev, mem->size, mem->va, mem->pa); in i40e_free_dma_mem()
175 mem->va = NULL; in i40e_free_dma_mem()
176 mem->pa = 0; in i40e_free_dma_mem()
177 mem->size = 0; in i40e_free_dma_mem()
183 * i40e_allocate_virt_mem - OS specific memory alloc for shared code
191 mem->size = size; in i40e_allocate_virt_mem()
192 mem->va = kzalloc(size, GFP_KERNEL); in i40e_allocate_virt_mem()
194 if (!mem->va) in i40e_allocate_virt_mem()
195 return -ENOMEM; in i40e_allocate_virt_mem()
201 * i40e_free_virt_mem - OS specific memory free for shared code
208 kfree(mem->va); in i40e_free_virt_mem()
209 mem->va = NULL; in i40e_free_virt_mem()
210 mem->size = 0; in i40e_free_virt_mem()
216 * i40e_get_lump - find a lump of free generic resource
227 int ret = -ENOMEM; in i40e_get_lump()
231 dev_info(&pf->pdev->dev, in i40e_get_lump()
234 return -EINVAL; in i40e_get_lump()
240 if (pile == pf->qp_pile && pf->vsi[id]->type == I40E_VSI_FDIR) { in i40e_get_lump()
241 if (pile->list[pile->num_entries - 1] & I40E_PILE_VALID_BIT) { in i40e_get_lump()
242 dev_err(&pf->pdev->dev, in i40e_get_lump()
244 pile->num_entries - 1); in i40e_get_lump()
245 return -ENOMEM; in i40e_get_lump()
247 pile->list[pile->num_entries - 1] = id | I40E_PILE_VALID_BIT; in i40e_get_lump()
248 return pile->num_entries - 1; in i40e_get_lump()
252 while (i < pile->num_entries) { in i40e_get_lump()
254 if (pile->list[i] & I40E_PILE_VALID_BIT) { in i40e_get_lump()
260 for (j = 0; (j < needed) && ((i+j) < pile->num_entries); j++) { in i40e_get_lump()
261 if (pile->list[i+j] & I40E_PILE_VALID_BIT) in i40e_get_lump()
268 pile->list[i+j] = id | I40E_PILE_VALID_BIT; in i40e_get_lump()
281 * i40e_put_lump - return a lump of generic resource
294 if (!pile || index >= pile->num_entries) in i40e_put_lump()
295 return -EINVAL; in i40e_put_lump()
298 i < pile->num_entries && pile->list[i] == valid_id; in i40e_put_lump()
300 pile->list[i] = 0; in i40e_put_lump()
309 * i40e_find_vsi_from_id - searches for the vsi with the given id
319 if (vsi->id == id) in i40e_find_vsi_from_id()
326 * i40e_service_event_schedule - Schedule the service task to wake up
333 if ((!test_bit(__I40E_DOWN, pf->state) && in i40e_service_event_schedule()
334 !test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) || in i40e_service_event_schedule()
335 test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_service_event_schedule()
336 queue_work(i40e_wq, &pf->service_task); in i40e_service_event_schedule()
340 * i40e_tx_timeout - Respond to a Tx Hang
351 struct i40e_vsi *vsi = np->vsi; in i40e_tx_timeout()
352 struct i40e_pf *pf = vsi->back; in i40e_tx_timeout()
357 pf->tx_timeout_count++; in i40e_tx_timeout()
360 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_tx_timeout()
361 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) { in i40e_tx_timeout()
363 vsi->tx_rings[i]->queue_index) { in i40e_tx_timeout()
364 tx_ring = vsi->tx_rings[i]; in i40e_tx_timeout()
370 if (time_after(jiffies, (pf->tx_timeout_last_recovery + HZ*20))) in i40e_tx_timeout()
371 pf->tx_timeout_recovery_level = 1; /* reset after some time */ in i40e_tx_timeout()
373 (pf->tx_timeout_last_recovery + netdev->watchdog_timeo))) in i40e_tx_timeout()
377 if (test_and_set_bit(__I40E_TIMEOUT_RECOVERY_PENDING, pf->state)) in i40e_tx_timeout()
383 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_tx_timeout()
384 val = rd32(&pf->hw, in i40e_tx_timeout()
385 I40E_PFINT_DYN_CTLN(tx_ring->q_vector->v_idx + in i40e_tx_timeout()
386 tx_ring->vsi->base_vector - 1)); in i40e_tx_timeout()
388 val = rd32(&pf->hw, I40E_PFINT_DYN_CTL0); in i40e_tx_timeout()
391 vsi->seid, txqueue, tx_ring->next_to_clean, in i40e_tx_timeout()
392 head, tx_ring->next_to_use, in i40e_tx_timeout()
393 readl(tx_ring->tail), val); in i40e_tx_timeout()
396 pf->tx_timeout_last_recovery = jiffies; in i40e_tx_timeout()
398 pf->tx_timeout_recovery_level, txqueue); in i40e_tx_timeout()
400 switch (pf->tx_timeout_recovery_level) { in i40e_tx_timeout()
402 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_tx_timeout()
405 set_bit(__I40E_CORE_RESET_REQUESTED, pf->state); in i40e_tx_timeout()
408 set_bit(__I40E_GLOBAL_RESET_REQUESTED, pf->state); in i40e_tx_timeout()
411 netdev_err(netdev, "tx_timeout recovery unsuccessful, device is in non-recoverable state.\n"); in i40e_tx_timeout()
412 set_bit(__I40E_DOWN_REQUESTED, pf->state); in i40e_tx_timeout()
413 set_bit(__I40E_VSI_DOWN_REQUESTED, vsi->state); in i40e_tx_timeout()
418 pf->tx_timeout_recovery_level++; in i40e_tx_timeout()
422 * i40e_get_vsi_stats_struct - Get System Network Statistics
430 return &vsi->net_stats; in i40e_get_vsi_stats_struct()
434 * i40e_get_netdev_stats_struct_tx - populate stats from a Tx ring
445 start = u64_stats_fetch_begin(&ring->syncp); in i40e_get_netdev_stats_struct_tx()
446 packets = ring->stats.packets; in i40e_get_netdev_stats_struct_tx()
447 bytes = ring->stats.bytes; in i40e_get_netdev_stats_struct_tx()
448 } while (u64_stats_fetch_retry(&ring->syncp, start)); in i40e_get_netdev_stats_struct_tx()
450 stats->tx_packets += packets; in i40e_get_netdev_stats_struct_tx()
451 stats->tx_bytes += bytes; in i40e_get_netdev_stats_struct_tx()
455 * i40e_get_netdev_stats_struct - Get statistics for netdev interface
466 struct i40e_vsi *vsi = np->vsi; in i40e_get_netdev_stats_struct()
471 if (test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_get_netdev_stats_struct()
474 if (!vsi->tx_rings) in i40e_get_netdev_stats_struct()
478 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_get_netdev_stats_struct()
482 ring = READ_ONCE(vsi->tx_rings[i]); in i40e_get_netdev_stats_struct()
488 ring = READ_ONCE(vsi->xdp_rings[i]); in i40e_get_netdev_stats_struct()
494 ring = READ_ONCE(vsi->rx_rings[i]); in i40e_get_netdev_stats_struct()
498 start = u64_stats_fetch_begin(&ring->syncp); in i40e_get_netdev_stats_struct()
499 packets = ring->stats.packets; in i40e_get_netdev_stats_struct()
500 bytes = ring->stats.bytes; in i40e_get_netdev_stats_struct()
501 } while (u64_stats_fetch_retry(&ring->syncp, start)); in i40e_get_netdev_stats_struct()
503 stats->rx_packets += packets; in i40e_get_netdev_stats_struct()
504 stats->rx_bytes += bytes; in i40e_get_netdev_stats_struct()
510 stats->multicast = vsi_stats->multicast; in i40e_get_netdev_stats_struct()
511 stats->tx_errors = vsi_stats->tx_errors; in i40e_get_netdev_stats_struct()
512 stats->tx_dropped = vsi_stats->tx_dropped; in i40e_get_netdev_stats_struct()
513 stats->rx_errors = vsi_stats->rx_errors; in i40e_get_netdev_stats_struct()
514 stats->rx_dropped = vsi_stats->rx_dropped; in i40e_get_netdev_stats_struct()
515 stats->rx_missed_errors = vsi_stats->rx_missed_errors; in i40e_get_netdev_stats_struct()
516 stats->rx_crc_errors = vsi_stats->rx_crc_errors; in i40e_get_netdev_stats_struct()
517 stats->rx_length_errors = vsi_stats->rx_length_errors; in i40e_get_netdev_stats_struct()
521 * i40e_vsi_reset_stats - Resets all stats of the given vsi
534 memset(&vsi->net_stats_offsets, 0, sizeof(vsi->net_stats_offsets)); in i40e_vsi_reset_stats()
535 memset(&vsi->eth_stats, 0, sizeof(vsi->eth_stats)); in i40e_vsi_reset_stats()
536 memset(&vsi->eth_stats_offsets, 0, sizeof(vsi->eth_stats_offsets)); in i40e_vsi_reset_stats()
537 if (vsi->rx_rings && vsi->rx_rings[0]) { in i40e_vsi_reset_stats()
538 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_reset_stats()
539 memset(&vsi->rx_rings[i]->stats, 0, in i40e_vsi_reset_stats()
540 sizeof(vsi->rx_rings[i]->stats)); in i40e_vsi_reset_stats()
541 memset(&vsi->rx_rings[i]->rx_stats, 0, in i40e_vsi_reset_stats()
542 sizeof(vsi->rx_rings[i]->rx_stats)); in i40e_vsi_reset_stats()
543 memset(&vsi->tx_rings[i]->stats, 0, in i40e_vsi_reset_stats()
544 sizeof(vsi->tx_rings[i]->stats)); in i40e_vsi_reset_stats()
545 memset(&vsi->tx_rings[i]->tx_stats, 0, in i40e_vsi_reset_stats()
546 sizeof(vsi->tx_rings[i]->tx_stats)); in i40e_vsi_reset_stats()
549 vsi->stat_offsets_loaded = false; in i40e_vsi_reset_stats()
553 * i40e_pf_reset_stats - Reset all of the stats for the given PF
561 memset(&pf->stats, 0, sizeof(pf->stats)); in i40e_pf_reset_stats()
562 memset(&pf->stats_offsets, 0, sizeof(pf->stats_offsets)); in i40e_pf_reset_stats()
563 pf->stat_offsets_loaded = false; in i40e_pf_reset_stats()
566 memset(&veb->stats, 0, sizeof(veb->stats)); in i40e_pf_reset_stats()
567 memset(&veb->stats_offsets, 0, sizeof(veb->stats_offsets)); in i40e_pf_reset_stats()
568 memset(&veb->tc_stats, 0, sizeof(veb->tc_stats)); in i40e_pf_reset_stats()
569 memset(&veb->tc_stats_offsets, 0, sizeof(veb->tc_stats_offsets)); in i40e_pf_reset_stats()
570 veb->stat_offsets_loaded = false; in i40e_pf_reset_stats()
572 pf->hw_csum_rx_error = 0; in i40e_pf_reset_stats()
576 * i40e_compute_pci_to_hw_id - compute index form PCI function.
584 if (vsi->type == I40E_VSI_SRIOV) in i40e_compute_pci_to_hw_id()
585 return (hw->port * BIT(7)) / pf_count + vsi->vf_id; in i40e_compute_pci_to_hw_id()
587 return hw->port + BIT(7); in i40e_compute_pci_to_hw_id()
591 * i40e_stat_update64 - read and update a 64 bit stat from the chip.
613 *stat = new_data - *offset; in i40e_stat_update64()
617 * i40e_stat_update48 - read and update a 48 bit stat from the chip
629 * the potential roll-over.
636 if (hw->device_id == I40E_DEV_ID_QEMU) { in i40e_stat_update48()
645 *stat = new_data - *offset; in i40e_stat_update48()
647 *stat = (new_data + BIT_ULL(48)) - *offset; in i40e_stat_update48()
652 * i40e_stat_update32 - read and update a 32 bit stat from the chip
668 *stat = (u32)(new_data - *offset); in i40e_stat_update32()
670 *stat = (u32)((new_data + BIT_ULL(32)) - *offset); in i40e_stat_update32()
674 * i40e_stat_update_and_clear32 - read and clear hw reg, update a 32 bit stat
688 * i40e_stats_update_rx_discards - update rx_discards.
703 &stat_offset->rx_discards, &stat->rx_discards); in i40e_stats_update_rx_discards()
707 offset_loaded, &stat_offset->rx_discards_other, in i40e_stats_update_rx_discards()
708 &stat->rx_discards_other); in i40e_stats_update_rx_discards()
712 * i40e_update_eth_stats - Update VSI-specific ethernet statistics counters.
717 int stat_idx = le16_to_cpu(vsi->info.stat_counter_idx); in i40e_update_eth_stats()
718 struct i40e_pf *pf = vsi->back; in i40e_update_eth_stats()
719 struct i40e_hw *hw = &pf->hw; in i40e_update_eth_stats()
723 es = &vsi->eth_stats; in i40e_update_eth_stats()
724 oes = &vsi->eth_stats_offsets; in i40e_update_eth_stats()
728 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
729 &oes->tx_errors, &es->tx_errors); in i40e_update_eth_stats()
731 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
732 &oes->rx_unknown_protocol, &es->rx_unknown_protocol); in i40e_update_eth_stats()
736 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
737 &oes->rx_bytes, &es->rx_bytes); in i40e_update_eth_stats()
740 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
741 &oes->rx_unicast, &es->rx_unicast); in i40e_update_eth_stats()
744 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
745 &oes->rx_multicast, &es->rx_multicast); in i40e_update_eth_stats()
748 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
749 &oes->rx_broadcast, &es->rx_broadcast); in i40e_update_eth_stats()
753 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
754 &oes->tx_bytes, &es->tx_bytes); in i40e_update_eth_stats()
757 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
758 &oes->tx_unicast, &es->tx_unicast); in i40e_update_eth_stats()
761 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
762 &oes->tx_multicast, &es->tx_multicast); in i40e_update_eth_stats()
765 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
766 &oes->tx_broadcast, &es->tx_broadcast); in i40e_update_eth_stats()
769 vsi->stat_offsets_loaded, oes, es); in i40e_update_eth_stats()
771 vsi->stat_offsets_loaded = true; in i40e_update_eth_stats()
775 * i40e_update_veb_stats - Update Switch component statistics
780 struct i40e_pf *pf = veb->pf; in i40e_update_veb_stats()
781 struct i40e_hw *hw = &pf->hw; in i40e_update_veb_stats()
788 idx = veb->stats_idx; in i40e_update_veb_stats()
789 es = &veb->stats; in i40e_update_veb_stats()
790 oes = &veb->stats_offsets; in i40e_update_veb_stats()
791 veb_es = &veb->tc_stats; in i40e_update_veb_stats()
792 veb_oes = &veb->tc_stats_offsets; in i40e_update_veb_stats()
796 veb->stat_offsets_loaded, in i40e_update_veb_stats()
797 &oes->tx_discards, &es->tx_discards); in i40e_update_veb_stats()
798 if (hw->revision_id > 0) in i40e_update_veb_stats()
800 veb->stat_offsets_loaded, in i40e_update_veb_stats()
801 &oes->rx_unknown_protocol, in i40e_update_veb_stats()
802 &es->rx_unknown_protocol); in i40e_update_veb_stats()
804 veb->stat_offsets_loaded, in i40e_update_veb_stats()
805 &oes->rx_bytes, &es->rx_bytes); in i40e_update_veb_stats()
807 veb->stat_offsets_loaded, in i40e_update_veb_stats()
808 &oes->rx_unicast, &es->rx_unicast); in i40e_update_veb_stats()
810 veb->stat_offsets_loaded, in i40e_update_veb_stats()
811 &oes->rx_multicast, &es->rx_multicast); in i40e_update_veb_stats()
813 veb->stat_offsets_loaded, in i40e_update_veb_stats()
814 &oes->rx_broadcast, &es->rx_broadcast); in i40e_update_veb_stats()
817 veb->stat_offsets_loaded, in i40e_update_veb_stats()
818 &oes->tx_bytes, &es->tx_bytes); in i40e_update_veb_stats()
820 veb->stat_offsets_loaded, in i40e_update_veb_stats()
821 &oes->tx_unicast, &es->tx_unicast); in i40e_update_veb_stats()
823 veb->stat_offsets_loaded, in i40e_update_veb_stats()
824 &oes->tx_multicast, &es->tx_multicast); in i40e_update_veb_stats()
826 veb->stat_offsets_loaded, in i40e_update_veb_stats()
827 &oes->tx_broadcast, &es->tx_broadcast); in i40e_update_veb_stats()
831 veb->stat_offsets_loaded, in i40e_update_veb_stats()
832 &veb_oes->tc_rx_packets[i], in i40e_update_veb_stats()
833 &veb_es->tc_rx_packets[i]); in i40e_update_veb_stats()
836 veb->stat_offsets_loaded, in i40e_update_veb_stats()
837 &veb_oes->tc_rx_bytes[i], in i40e_update_veb_stats()
838 &veb_es->tc_rx_bytes[i]); in i40e_update_veb_stats()
841 veb->stat_offsets_loaded, in i40e_update_veb_stats()
842 &veb_oes->tc_tx_packets[i], in i40e_update_veb_stats()
843 &veb_es->tc_tx_packets[i]); in i40e_update_veb_stats()
846 veb->stat_offsets_loaded, in i40e_update_veb_stats()
847 &veb_oes->tc_tx_bytes[i], in i40e_update_veb_stats()
848 &veb_es->tc_tx_bytes[i]); in i40e_update_veb_stats()
850 veb->stat_offsets_loaded = true; in i40e_update_veb_stats()
854 * i40e_update_vsi_stats - Update the vsi statistics counters.
866 struct i40e_pf *pf = vsi->back; in i40e_update_vsi_stats()
882 if (test_bit(__I40E_VSI_DOWN, vsi->state) || in i40e_update_vsi_stats()
883 test_bit(__I40E_CONFIG_BUSY, pf->state)) in i40e_update_vsi_stats()
887 ons = &vsi->net_stats_offsets; in i40e_update_vsi_stats()
888 es = &vsi->eth_stats; in i40e_update_vsi_stats()
889 oes = &vsi->eth_stats_offsets; in i40e_update_vsi_stats()
905 for (q = 0; q < vsi->num_queue_pairs; q++) { in i40e_update_vsi_stats()
907 p = READ_ONCE(vsi->tx_rings[q]); in i40e_update_vsi_stats()
912 start = u64_stats_fetch_begin(&p->syncp); in i40e_update_vsi_stats()
913 packets = p->stats.packets; in i40e_update_vsi_stats()
914 bytes = p->stats.bytes; in i40e_update_vsi_stats()
915 } while (u64_stats_fetch_retry(&p->syncp, start)); in i40e_update_vsi_stats()
918 tx_restart += p->tx_stats.restart_queue; in i40e_update_vsi_stats()
919 tx_busy += p->tx_stats.tx_busy; in i40e_update_vsi_stats()
920 tx_linearize += p->tx_stats.tx_linearize; in i40e_update_vsi_stats()
921 tx_force_wb += p->tx_stats.tx_force_wb; in i40e_update_vsi_stats()
922 tx_stopped += p->tx_stats.tx_stopped; in i40e_update_vsi_stats()
925 p = READ_ONCE(vsi->rx_rings[q]); in i40e_update_vsi_stats()
930 start = u64_stats_fetch_begin(&p->syncp); in i40e_update_vsi_stats()
931 packets = p->stats.packets; in i40e_update_vsi_stats()
932 bytes = p->stats.bytes; in i40e_update_vsi_stats()
933 } while (u64_stats_fetch_retry(&p->syncp, start)); in i40e_update_vsi_stats()
936 rx_buf += p->rx_stats.alloc_buff_failed; in i40e_update_vsi_stats()
937 rx_page += p->rx_stats.alloc_page_failed; in i40e_update_vsi_stats()
938 rx_reuse += p->rx_stats.page_reuse_count; in i40e_update_vsi_stats()
939 rx_alloc += p->rx_stats.page_alloc_count; in i40e_update_vsi_stats()
940 rx_waive += p->rx_stats.page_waive_count; in i40e_update_vsi_stats()
941 rx_busy += p->rx_stats.page_busy_count; in i40e_update_vsi_stats()
945 p = READ_ONCE(vsi->xdp_rings[q]); in i40e_update_vsi_stats()
950 start = u64_stats_fetch_begin(&p->syncp); in i40e_update_vsi_stats()
951 packets = p->stats.packets; in i40e_update_vsi_stats()
952 bytes = p->stats.bytes; in i40e_update_vsi_stats()
953 } while (u64_stats_fetch_retry(&p->syncp, start)); in i40e_update_vsi_stats()
956 tx_restart += p->tx_stats.restart_queue; in i40e_update_vsi_stats()
957 tx_busy += p->tx_stats.tx_busy; in i40e_update_vsi_stats()
958 tx_linearize += p->tx_stats.tx_linearize; in i40e_update_vsi_stats()
959 tx_force_wb += p->tx_stats.tx_force_wb; in i40e_update_vsi_stats()
963 vsi->tx_restart = tx_restart; in i40e_update_vsi_stats()
964 vsi->tx_busy = tx_busy; in i40e_update_vsi_stats()
965 vsi->tx_linearize = tx_linearize; in i40e_update_vsi_stats()
966 vsi->tx_force_wb = tx_force_wb; in i40e_update_vsi_stats()
967 vsi->tx_stopped = tx_stopped; in i40e_update_vsi_stats()
968 vsi->rx_page_failed = rx_page; in i40e_update_vsi_stats()
969 vsi->rx_buf_failed = rx_buf; in i40e_update_vsi_stats()
970 vsi->rx_page_reuse = rx_reuse; in i40e_update_vsi_stats()
971 vsi->rx_page_alloc = rx_alloc; in i40e_update_vsi_stats()
972 vsi->rx_page_waive = rx_waive; in i40e_update_vsi_stats()
973 vsi->rx_page_busy = rx_busy; in i40e_update_vsi_stats()
975 ns->rx_packets = rx_p; in i40e_update_vsi_stats()
976 ns->rx_bytes = rx_b; in i40e_update_vsi_stats()
977 ns->tx_packets = tx_p; in i40e_update_vsi_stats()
978 ns->tx_bytes = tx_b; in i40e_update_vsi_stats()
982 ons->tx_errors = oes->tx_errors; in i40e_update_vsi_stats()
983 ns->tx_errors = es->tx_errors; in i40e_update_vsi_stats()
984 ons->multicast = oes->rx_multicast; in i40e_update_vsi_stats()
985 ns->multicast = es->rx_multicast; in i40e_update_vsi_stats()
986 ons->rx_dropped = oes->rx_discards_other; in i40e_update_vsi_stats()
987 ns->rx_dropped = es->rx_discards_other; in i40e_update_vsi_stats()
988 ons->rx_missed_errors = oes->rx_discards; in i40e_update_vsi_stats()
989 ns->rx_missed_errors = es->rx_discards; in i40e_update_vsi_stats()
990 ons->tx_dropped = oes->tx_discards; in i40e_update_vsi_stats()
991 ns->tx_dropped = es->tx_discards; in i40e_update_vsi_stats()
994 if (vsi->type == I40E_VSI_MAIN) { in i40e_update_vsi_stats()
995 ns->rx_crc_errors = pf->stats.crc_errors; in i40e_update_vsi_stats()
996 ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes; in i40e_update_vsi_stats()
997 ns->rx_length_errors = pf->stats.rx_length_errors; in i40e_update_vsi_stats()
1002 * i40e_update_pf_stats - Update the PF statistics counters.
1007 struct i40e_hw_port_stats *osd = &pf->stats_offsets; in i40e_update_pf_stats()
1008 struct i40e_hw_port_stats *nsd = &pf->stats; in i40e_update_pf_stats()
1009 struct i40e_hw *hw = &pf->hw; in i40e_update_pf_stats()
1013 i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port), in i40e_update_pf_stats()
1014 I40E_GLPRT_GORCL(hw->port), in i40e_update_pf_stats()
1015 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1016 &osd->eth.rx_bytes, &nsd->eth.rx_bytes); in i40e_update_pf_stats()
1017 i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port), in i40e_update_pf_stats()
1018 I40E_GLPRT_GOTCL(hw->port), in i40e_update_pf_stats()
1019 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1020 &osd->eth.tx_bytes, &nsd->eth.tx_bytes); in i40e_update_pf_stats()
1021 i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port), in i40e_update_pf_stats()
1022 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1023 &osd->eth.rx_discards, in i40e_update_pf_stats()
1024 &nsd->eth.rx_discards); in i40e_update_pf_stats()
1025 i40e_stat_update48(hw, I40E_GLPRT_UPRCH(hw->port), in i40e_update_pf_stats()
1026 I40E_GLPRT_UPRCL(hw->port), in i40e_update_pf_stats()
1027 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1028 &osd->eth.rx_unicast, in i40e_update_pf_stats()
1029 &nsd->eth.rx_unicast); in i40e_update_pf_stats()
1030 i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port), in i40e_update_pf_stats()
1031 I40E_GLPRT_MPRCL(hw->port), in i40e_update_pf_stats()
1032 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1033 &osd->eth.rx_multicast, in i40e_update_pf_stats()
1034 &nsd->eth.rx_multicast); in i40e_update_pf_stats()
1035 i40e_stat_update48(hw, I40E_GLPRT_BPRCH(hw->port), in i40e_update_pf_stats()
1036 I40E_GLPRT_BPRCL(hw->port), in i40e_update_pf_stats()
1037 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1038 &osd->eth.rx_broadcast, in i40e_update_pf_stats()
1039 &nsd->eth.rx_broadcast); in i40e_update_pf_stats()
1040 i40e_stat_update48(hw, I40E_GLPRT_UPTCH(hw->port), in i40e_update_pf_stats()
1041 I40E_GLPRT_UPTCL(hw->port), in i40e_update_pf_stats()
1042 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1043 &osd->eth.tx_unicast, in i40e_update_pf_stats()
1044 &nsd->eth.tx_unicast); in i40e_update_pf_stats()
1045 i40e_stat_update48(hw, I40E_GLPRT_MPTCH(hw->port), in i40e_update_pf_stats()
1046 I40E_GLPRT_MPTCL(hw->port), in i40e_update_pf_stats()
1047 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1048 &osd->eth.tx_multicast, in i40e_update_pf_stats()
1049 &nsd->eth.tx_multicast); in i40e_update_pf_stats()
1050 i40e_stat_update48(hw, I40E_GLPRT_BPTCH(hw->port), in i40e_update_pf_stats()
1051 I40E_GLPRT_BPTCL(hw->port), in i40e_update_pf_stats()
1052 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1053 &osd->eth.tx_broadcast, in i40e_update_pf_stats()
1054 &nsd->eth.tx_broadcast); in i40e_update_pf_stats()
1056 i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port), in i40e_update_pf_stats()
1057 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1058 &osd->tx_dropped_link_down, in i40e_update_pf_stats()
1059 &nsd->tx_dropped_link_down); in i40e_update_pf_stats()
1061 i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port), in i40e_update_pf_stats()
1062 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1063 &osd->crc_errors, &nsd->crc_errors); in i40e_update_pf_stats()
1065 i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port), in i40e_update_pf_stats()
1066 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1067 &osd->illegal_bytes, &nsd->illegal_bytes); in i40e_update_pf_stats()
1069 i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port), in i40e_update_pf_stats()
1070 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1071 &osd->mac_local_faults, in i40e_update_pf_stats()
1072 &nsd->mac_local_faults); in i40e_update_pf_stats()
1073 i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port), in i40e_update_pf_stats()
1074 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1075 &osd->mac_remote_faults, in i40e_update_pf_stats()
1076 &nsd->mac_remote_faults); in i40e_update_pf_stats()
1078 i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port), in i40e_update_pf_stats()
1079 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1080 &osd->rx_length_errors, in i40e_update_pf_stats()
1081 &nsd->rx_length_errors); in i40e_update_pf_stats()
1083 i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port), in i40e_update_pf_stats()
1084 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1085 &osd->link_xon_rx, &nsd->link_xon_rx); in i40e_update_pf_stats()
1086 i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port), in i40e_update_pf_stats()
1087 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1088 &osd->link_xon_tx, &nsd->link_xon_tx); in i40e_update_pf_stats()
1089 i40e_stat_update32(hw, I40E_GLPRT_LXOFFRXC(hw->port), in i40e_update_pf_stats()
1090 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1091 &osd->link_xoff_rx, &nsd->link_xoff_rx); in i40e_update_pf_stats()
1092 i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port), in i40e_update_pf_stats()
1093 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1094 &osd->link_xoff_tx, &nsd->link_xoff_tx); in i40e_update_pf_stats()
1097 i40e_stat_update32(hw, I40E_GLPRT_PXOFFRXC(hw->port, i), in i40e_update_pf_stats()
1098 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1099 &osd->priority_xoff_rx[i], in i40e_update_pf_stats()
1100 &nsd->priority_xoff_rx[i]); in i40e_update_pf_stats()
1101 i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i), in i40e_update_pf_stats()
1102 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1103 &osd->priority_xon_rx[i], in i40e_update_pf_stats()
1104 &nsd->priority_xon_rx[i]); in i40e_update_pf_stats()
1105 i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i), in i40e_update_pf_stats()
1106 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1107 &osd->priority_xon_tx[i], in i40e_update_pf_stats()
1108 &nsd->priority_xon_tx[i]); in i40e_update_pf_stats()
1109 i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i), in i40e_update_pf_stats()
1110 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1111 &osd->priority_xoff_tx[i], in i40e_update_pf_stats()
1112 &nsd->priority_xoff_tx[i]); in i40e_update_pf_stats()
1114 I40E_GLPRT_RXON2OFFCNT(hw->port, i), in i40e_update_pf_stats()
1115 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1116 &osd->priority_xon_2_xoff[i], in i40e_update_pf_stats()
1117 &nsd->priority_xon_2_xoff[i]); in i40e_update_pf_stats()
1120 i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port), in i40e_update_pf_stats()
1121 I40E_GLPRT_PRC64L(hw->port), in i40e_update_pf_stats()
1122 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1123 &osd->rx_size_64, &nsd->rx_size_64); in i40e_update_pf_stats()
1124 i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port), in i40e_update_pf_stats()
1125 I40E_GLPRT_PRC127L(hw->port), in i40e_update_pf_stats()
1126 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1127 &osd->rx_size_127, &nsd->rx_size_127); in i40e_update_pf_stats()
1128 i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port), in i40e_update_pf_stats()
1129 I40E_GLPRT_PRC255L(hw->port), in i40e_update_pf_stats()
1130 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1131 &osd->rx_size_255, &nsd->rx_size_255); in i40e_update_pf_stats()
1132 i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port), in i40e_update_pf_stats()
1133 I40E_GLPRT_PRC511L(hw->port), in i40e_update_pf_stats()
1134 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1135 &osd->rx_size_511, &nsd->rx_size_511); in i40e_update_pf_stats()
1136 i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port), in i40e_update_pf_stats()
1137 I40E_GLPRT_PRC1023L(hw->port), in i40e_update_pf_stats()
1138 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1139 &osd->rx_size_1023, &nsd->rx_size_1023); in i40e_update_pf_stats()
1140 i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port), in i40e_update_pf_stats()
1141 I40E_GLPRT_PRC1522L(hw->port), in i40e_update_pf_stats()
1142 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1143 &osd->rx_size_1522, &nsd->rx_size_1522); in i40e_update_pf_stats()
1144 i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port), in i40e_update_pf_stats()
1145 I40E_GLPRT_PRC9522L(hw->port), in i40e_update_pf_stats()
1146 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1147 &osd->rx_size_big, &nsd->rx_size_big); in i40e_update_pf_stats()
1149 i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port), in i40e_update_pf_stats()
1150 I40E_GLPRT_PTC64L(hw->port), in i40e_update_pf_stats()
1151 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1152 &osd->tx_size_64, &nsd->tx_size_64); in i40e_update_pf_stats()
1153 i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port), in i40e_update_pf_stats()
1154 I40E_GLPRT_PTC127L(hw->port), in i40e_update_pf_stats()
1155 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1156 &osd->tx_size_127, &nsd->tx_size_127); in i40e_update_pf_stats()
1157 i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port), in i40e_update_pf_stats()
1158 I40E_GLPRT_PTC255L(hw->port), in i40e_update_pf_stats()
1159 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1160 &osd->tx_size_255, &nsd->tx_size_255); in i40e_update_pf_stats()
1161 i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port), in i40e_update_pf_stats()
1162 I40E_GLPRT_PTC511L(hw->port), in i40e_update_pf_stats()
1163 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1164 &osd->tx_size_511, &nsd->tx_size_511); in i40e_update_pf_stats()
1165 i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port), in i40e_update_pf_stats()
1166 I40E_GLPRT_PTC1023L(hw->port), in i40e_update_pf_stats()
1167 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1168 &osd->tx_size_1023, &nsd->tx_size_1023); in i40e_update_pf_stats()
1169 i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port), in i40e_update_pf_stats()
1170 I40E_GLPRT_PTC1522L(hw->port), in i40e_update_pf_stats()
1171 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1172 &osd->tx_size_1522, &nsd->tx_size_1522); in i40e_update_pf_stats()
1173 i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port), in i40e_update_pf_stats()
1174 I40E_GLPRT_PTC9522L(hw->port), in i40e_update_pf_stats()
1175 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1176 &osd->tx_size_big, &nsd->tx_size_big); in i40e_update_pf_stats()
1178 i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port), in i40e_update_pf_stats()
1179 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1180 &osd->rx_undersize, &nsd->rx_undersize); in i40e_update_pf_stats()
1181 i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port), in i40e_update_pf_stats()
1182 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1183 &osd->rx_fragments, &nsd->rx_fragments); in i40e_update_pf_stats()
1184 i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port), in i40e_update_pf_stats()
1185 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1186 &osd->rx_oversize, &nsd->rx_oversize); in i40e_update_pf_stats()
1187 i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port), in i40e_update_pf_stats()
1188 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1189 &osd->rx_jabber, &nsd->rx_jabber); in i40e_update_pf_stats()
1193 I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(hw->pf_id)), in i40e_update_pf_stats()
1194 &nsd->fd_atr_match); in i40e_update_pf_stats()
1196 I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(hw->pf_id)), in i40e_update_pf_stats()
1197 &nsd->fd_sb_match); in i40e_update_pf_stats()
1199 I40E_GLQF_PCNT(I40E_FD_ATR_TUNNEL_STAT_IDX(hw->pf_id)), in i40e_update_pf_stats()
1200 &nsd->fd_atr_tunnel_match); in i40e_update_pf_stats()
1203 nsd->tx_lpi_status = in i40e_update_pf_stats()
1205 nsd->rx_lpi_status = in i40e_update_pf_stats()
1208 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1209 &osd->tx_lpi_count, &nsd->tx_lpi_count); in i40e_update_pf_stats()
1211 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1212 &osd->rx_lpi_count, &nsd->rx_lpi_count); in i40e_update_pf_stats()
1214 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags) && in i40e_update_pf_stats()
1215 !test_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state)) in i40e_update_pf_stats()
1216 nsd->fd_sb_status = true; in i40e_update_pf_stats()
1218 nsd->fd_sb_status = false; in i40e_update_pf_stats()
1220 if (test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags) && in i40e_update_pf_stats()
1221 !test_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) in i40e_update_pf_stats()
1222 nsd->fd_atr_status = true; in i40e_update_pf_stats()
1224 nsd->fd_atr_status = false; in i40e_update_pf_stats()
1226 pf->stat_offsets_loaded = true; in i40e_update_pf_stats()
1230 * i40e_update_stats - Update the various statistics counters.
1237 struct i40e_pf *pf = vsi->back; in i40e_update_stats()
1239 if (vsi->type == I40E_VSI_MAIN) in i40e_update_stats()
1246 * i40e_count_filters - counts VSI mac filters
1258 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_count_filters()
1259 if (f->state == I40E_FILTER_NEW || in i40e_count_filters()
1260 f->state == I40E_FILTER_NEW_SYNC || in i40e_count_filters()
1261 f->state == I40E_FILTER_ACTIVE) in i40e_count_filters()
1269 * i40e_find_filter - Search VSI filter list for specific mac/vlan filter
1286 hash_for_each_possible(vsi->mac_filter_hash, f, hlist, key) { in i40e_find_filter()
1287 if ((ether_addr_equal(macaddr, f->macaddr)) && in i40e_find_filter()
1288 (vlan == f->vlan)) in i40e_find_filter()
1295 * i40e_find_mac - Find a mac addr in the macvlan filters list
1311 hash_for_each_possible(vsi->mac_filter_hash, f, hlist, key) { in i40e_find_mac()
1312 if ((ether_addr_equal(macaddr, f->macaddr))) in i40e_find_mac()
1319 * i40e_is_vsi_in_vlan - Check if VSI is in vlan mode
1327 if (vsi->info.pvid) in i40e_is_vsi_in_vlan()
1350 return vsi->has_vlan_filter; in i40e_is_vsi_in_vlan()
1354 * i40e_correct_mac_vlan_filters - Correct non-VLAN filters if necessary
1360 * Update VLAN=0 and VLAN=-1 (I40E_VLAN_ANY) filters properly so that they
1362 * to be added then we need to update non-VLAN filters to be marked as VLAN=0
1364 * active VLAN filters, we need to make all non-VLAN filters marked as VLAN=-1
1369 * operate in non-VLAN mode and receive all traffic, tagged or untagged.
1374 * In case of memory allocation failure return -ENOMEM. Otherwise, return 0.
1387 s16 pvid = le16_to_cpu(vsi->info.pvid); in i40e_correct_mac_vlan_filters()
1400 * which are marked as VLAN=-1 must be replaced with in i40e_correct_mac_vlan_filters()
1404 * marked as VLAN=-1 in i40e_correct_mac_vlan_filters()
1409 if (pvid && new->f->vlan != pvid) in i40e_correct_mac_vlan_filters()
1410 new->f->vlan = pvid; in i40e_correct_mac_vlan_filters()
1411 else if (vlan_filters && new->f->vlan == I40E_VLAN_ANY) in i40e_correct_mac_vlan_filters()
1412 new->f->vlan = 0; in i40e_correct_mac_vlan_filters()
1413 else if (!vlan_filters && new->f->vlan == 0) in i40e_correct_mac_vlan_filters()
1414 new->f->vlan = I40E_VLAN_ANY; in i40e_correct_mac_vlan_filters()
1418 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_correct_mac_vlan_filters()
1424 if ((pvid && f->vlan != pvid) || in i40e_correct_mac_vlan_filters()
1425 (vlan_filters && f->vlan == I40E_VLAN_ANY) || in i40e_correct_mac_vlan_filters()
1426 (!vlan_filters && f->vlan == 0)) { in i40e_correct_mac_vlan_filters()
1436 add_head = i40e_add_filter(vsi, f->macaddr, new_vlan); in i40e_correct_mac_vlan_filters()
1438 return -ENOMEM; in i40e_correct_mac_vlan_filters()
1443 return -ENOMEM; in i40e_correct_mac_vlan_filters()
1445 new->f = add_head; in i40e_correct_mac_vlan_filters()
1446 new->state = add_head->state; in i40e_correct_mac_vlan_filters()
1447 if (add_head->state == I40E_FILTER_NEW) in i40e_correct_mac_vlan_filters()
1448 add_head->state = I40E_FILTER_NEW_SYNC; in i40e_correct_mac_vlan_filters()
1451 hlist_add_head(&new->hlist, tmp_add_list); in i40e_correct_mac_vlan_filters()
1454 f->state = I40E_FILTER_REMOVE; in i40e_correct_mac_vlan_filters()
1455 hash_del(&f->hlist); in i40e_correct_mac_vlan_filters()
1456 hlist_add_head(&f->hlist, tmp_del_list); in i40e_correct_mac_vlan_filters()
1460 vsi->has_vlan_filter = !!vlan_filters; in i40e_correct_mac_vlan_filters()
1466 * i40e_get_vf_new_vlan - Get new vlan id on a vf
1469 * @f: existing mac filter, replaced with new_mac->f if new_mac is not NULL
1474 * and vf-vlan-prune-disable flag.
1485 s16 pvid = le16_to_cpu(vsi->info.pvid); in i40e_get_vf_new_vlan()
1486 struct i40e_pf *pf = vsi->back; in i40e_get_vf_new_vlan()
1490 f = new_mac->f; in i40e_get_vf_new_vlan()
1492 if (pvid && f->vlan != pvid) in i40e_get_vf_new_vlan()
1496 !test_bit(I40E_FLAG_VF_VLAN_PRUNING_ENA, pf->flags)); in i40e_get_vf_new_vlan()
1498 if ((vlan_filters && f->vlan == I40E_VLAN_ANY) || in i40e_get_vf_new_vlan()
1499 (!is_any && !vlan_filters && f->vlan == I40E_VLAN_ANY) || in i40e_get_vf_new_vlan()
1500 (is_any && !vlan_filters && f->vlan == 0)) { in i40e_get_vf_new_vlan()
1507 return f->vlan; in i40e_get_vf_new_vlan()
1511 * i40e_correct_vf_mac_vlan_filters - Correct non-VLAN VF filters if necessary
1519 * and vf-vlan-prune-disable flag.
1521 * In case of memory allocation failure return -ENOMEM. Otherwise, return 0.
1541 new_mac->f->vlan = i40e_get_vf_new_vlan(vsi, new_mac, NULL, in i40e_correct_vf_mac_vlan_filters()
1545 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_correct_vf_mac_vlan_filters()
1548 if (new_vlan != f->vlan) { in i40e_correct_vf_mac_vlan_filters()
1549 add_head = i40e_add_filter(vsi, f->macaddr, new_vlan); in i40e_correct_vf_mac_vlan_filters()
1551 return -ENOMEM; in i40e_correct_vf_mac_vlan_filters()
1555 return -ENOMEM; in i40e_correct_vf_mac_vlan_filters()
1556 new_mac->f = add_head; in i40e_correct_vf_mac_vlan_filters()
1557 new_mac->state = add_head->state; in i40e_correct_vf_mac_vlan_filters()
1558 if (add_head->state == I40E_FILTER_NEW) in i40e_correct_vf_mac_vlan_filters()
1559 add_head->state = I40E_FILTER_NEW_SYNC; in i40e_correct_vf_mac_vlan_filters()
1562 hlist_add_head(&new_mac->hlist, tmp_add_list); in i40e_correct_vf_mac_vlan_filters()
1565 f->state = I40E_FILTER_REMOVE; in i40e_correct_vf_mac_vlan_filters()
1566 hash_del(&f->hlist); in i40e_correct_vf_mac_vlan_filters()
1567 hlist_add_head(&f->hlist, tmp_del_list); in i40e_correct_vf_mac_vlan_filters()
1571 vsi->has_vlan_filter = !!vlan_filters; in i40e_correct_vf_mac_vlan_filters()
1576 * i40e_rm_default_mac_filter - Remove the default MAC filter set by NVM
1577 * @vsi: the PF Main VSI - inappropriate for any other VSI
1586 struct i40e_pf *pf = vsi->back; in i40e_rm_default_mac_filter()
1589 if (vsi->type != I40E_VSI_MAIN) in i40e_rm_default_mac_filter()
1597 i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_rm_default_mac_filter()
1605 i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_rm_default_mac_filter()
1609 * i40e_add_filter - Add a mac/vlan filter to the VSI
1638 vsi->has_vlan_filter = true; in i40e_add_filter()
1640 ether_addr_copy(f->macaddr, macaddr); in i40e_add_filter()
1641 f->vlan = vlan; in i40e_add_filter()
1642 f->state = I40E_FILTER_NEW; in i40e_add_filter()
1643 INIT_HLIST_NODE(&f->hlist); in i40e_add_filter()
1646 hash_add(vsi->mac_filter_hash, &f->hlist, key); in i40e_add_filter()
1648 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_add_filter()
1649 set_bit(__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); in i40e_add_filter()
1660 if (f->state == I40E_FILTER_REMOVE) in i40e_add_filter()
1661 f->state = I40E_FILTER_ACTIVE; in i40e_add_filter()
1667 * __i40e_del_filter - Remove a specific filter from the VSI
1689 if ((f->state == I40E_FILTER_FAILED) || in __i40e_del_filter()
1690 (f->state == I40E_FILTER_NEW)) { in __i40e_del_filter()
1691 hash_del(&f->hlist); in __i40e_del_filter()
1694 f->state = I40E_FILTER_REMOVE; in __i40e_del_filter()
1697 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in __i40e_del_filter()
1698 set_bit(__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); in __i40e_del_filter()
1702 * i40e_add_mac_filter - Add a MAC filter for all active VLANs
1720 lockdep_assert_held(&vsi->mac_filter_hash_lock); in i40e_add_mac_filter()
1721 if (vsi->info.pvid) in i40e_add_mac_filter()
1723 le16_to_cpu(vsi->info.pvid)); in i40e_add_mac_filter()
1728 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_add_mac_filter()
1729 if (f->state == I40E_FILTER_REMOVE) in i40e_add_mac_filter()
1731 add = i40e_add_filter(vsi, macaddr, f->vlan); in i40e_add_mac_filter()
1740 * i40e_del_mac_filter - Remove a MAC filter from all VLANs
1756 lockdep_assert_held(&vsi->mac_filter_hash_lock); in i40e_del_mac_filter()
1757 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_del_mac_filter()
1758 if (ether_addr_equal(macaddr, f->macaddr)) { in i40e_del_mac_filter()
1767 return -ENOENT; in i40e_del_mac_filter()
1771 * i40e_set_mac - NDO callback to set mac address
1780 struct i40e_vsi *vsi = np->vsi; in i40e_set_mac()
1781 struct i40e_pf *pf = vsi->back; in i40e_set_mac()
1782 struct i40e_hw *hw = &pf->hw; in i40e_set_mac()
1785 if (!is_valid_ether_addr(addr->sa_data)) in i40e_set_mac()
1786 return -EADDRNOTAVAIL; in i40e_set_mac()
1788 if (test_bit(__I40E_DOWN, pf->state) || in i40e_set_mac()
1789 test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_set_mac()
1790 return -EADDRNOTAVAIL; in i40e_set_mac()
1792 if (ether_addr_equal(hw->mac.addr, addr->sa_data)) in i40e_set_mac()
1794 hw->mac.addr); in i40e_set_mac()
1796 netdev_info(netdev, "set new mac address %pM\n", addr->sa_data); in i40e_set_mac()
1800 * - Remove old address from MAC filter in i40e_set_mac()
1801 * - Copy new address in i40e_set_mac()
1802 * - Add new address to MAC filter in i40e_set_mac()
1804 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_set_mac()
1805 i40e_del_mac_filter(vsi, netdev->dev_addr); in i40e_set_mac()
1806 eth_hw_addr_set(netdev, addr->sa_data); in i40e_set_mac()
1807 i40e_add_mac_filter(vsi, netdev->dev_addr); in i40e_set_mac()
1808 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_set_mac()
1810 if (vsi->type == I40E_VSI_MAIN) { in i40e_set_mac()
1814 addr->sa_data, NULL); in i40e_set_mac()
1818 libie_aq_str(hw->aq.asq_last_status)); in i40e_set_mac()
1829 * i40e_config_rss_aq - Prepare for RSS using AQ commands
1838 struct i40e_pf *pf = vsi->back; in i40e_config_rss_aq()
1839 struct i40e_hw *hw = &pf->hw; in i40e_config_rss_aq()
1845 ret = i40e_aq_set_rss_key(hw, vsi->id, seed_dw); in i40e_config_rss_aq()
1847 dev_info(&pf->pdev->dev, in i40e_config_rss_aq()
1850 libie_aq_str(hw->aq.asq_last_status)); in i40e_config_rss_aq()
1855 bool pf_lut = vsi->type == I40E_VSI_MAIN; in i40e_config_rss_aq()
1857 ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, lut, lut_size); in i40e_config_rss_aq()
1859 dev_info(&pf->pdev->dev, in i40e_config_rss_aq()
1862 libie_aq_str(hw->aq.asq_last_status)); in i40e_config_rss_aq()
1870 * i40e_vsi_config_rss - Prepare for VSI(VMDq) RSS if used
1875 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_rss()
1880 if (!test_bit(I40E_HW_CAP_RSS_AQ, pf->hw.caps)) in i40e_vsi_config_rss()
1882 if (!vsi->rss_size) in i40e_vsi_config_rss()
1883 vsi->rss_size = min_t(int, pf->alloc_rss_size, in i40e_vsi_config_rss()
1884 vsi->num_queue_pairs); in i40e_vsi_config_rss()
1885 if (!vsi->rss_size) in i40e_vsi_config_rss()
1886 return -EINVAL; in i40e_vsi_config_rss()
1887 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in i40e_vsi_config_rss()
1889 return -ENOMEM; in i40e_vsi_config_rss()
1894 if (vsi->rss_lut_user) in i40e_vsi_config_rss()
1895 memcpy(lut, vsi->rss_lut_user, vsi->rss_table_size); in i40e_vsi_config_rss()
1897 i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, vsi->rss_size); in i40e_vsi_config_rss()
1898 if (vsi->rss_hkey_user) in i40e_vsi_config_rss()
1899 memcpy(seed, vsi->rss_hkey_user, I40E_HKEY_ARRAY_SIZE); in i40e_vsi_config_rss()
1902 ret = i40e_config_rss_aq(vsi, seed, lut, vsi->rss_table_size); in i40e_vsi_config_rss()
1908 * i40e_vsi_setup_queue_map_mqprio - Prepares mqprio based tc_config
1923 if (vsi->type != I40E_VSI_MAIN) in i40e_vsi_setup_queue_map_mqprio()
1924 return -EINVAL; in i40e_vsi_setup_queue_map_mqprio()
1927 vsi->tc_config.numtc = vsi->mqprio_qopt.qopt.num_tc; in i40e_vsi_setup_queue_map_mqprio()
1928 vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; in i40e_vsi_setup_queue_map_mqprio()
1929 num_qps = vsi->mqprio_qopt.qopt.count[0]; in i40e_vsi_setup_queue_map_mqprio()
1931 /* find the next higher power-of-2 of num queue pairs */ in i40e_vsi_setup_queue_map_mqprio()
1938 /* Setup queue offset/count for all TCs for given VSI */ in i40e_vsi_setup_queue_map_mqprio()
1939 max_qcount = vsi->mqprio_qopt.qopt.count[0]; in i40e_vsi_setup_queue_map_mqprio()
1942 if (vsi->tc_config.enabled_tc & BIT(i)) { in i40e_vsi_setup_queue_map_mqprio()
1943 offset = vsi->mqprio_qopt.qopt.offset[i]; in i40e_vsi_setup_queue_map_mqprio()
1944 qcount = vsi->mqprio_qopt.qopt.count[i]; in i40e_vsi_setup_queue_map_mqprio()
1947 vsi->tc_config.tc_info[i].qoffset = offset; in i40e_vsi_setup_queue_map_mqprio()
1948 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_setup_queue_map_mqprio()
1949 vsi->tc_config.tc_info[i].netdev_tc = netdev_tc++; in i40e_vsi_setup_queue_map_mqprio()
1955 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_setup_queue_map_mqprio()
1956 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_setup_queue_map_mqprio()
1957 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_setup_queue_map_mqprio()
1962 vsi->num_queue_pairs = offset + qcount; in i40e_vsi_setup_queue_map_mqprio()
1965 ctxt->info.tc_mapping[0] = cpu_to_le16(qmap); in i40e_vsi_setup_queue_map_mqprio()
1966 ctxt->info.mapping_flags |= cpu_to_le16(I40E_AQ_VSI_QUE_MAP_CONTIG); in i40e_vsi_setup_queue_map_mqprio()
1967 ctxt->info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_vsi_setup_queue_map_mqprio()
1968 ctxt->info.valid_sections |= cpu_to_le16(sections); in i40e_vsi_setup_queue_map_mqprio()
1971 vsi->rss_size = max_qcount; in i40e_vsi_setup_queue_map_mqprio()
1974 dev_info(&vsi->back->pdev->dev, in i40e_vsi_setup_queue_map_mqprio()
1979 vsi->reconfig_rss = true; in i40e_vsi_setup_queue_map_mqprio()
1980 dev_dbg(&vsi->back->pdev->dev, in i40e_vsi_setup_queue_map_mqprio()
1986 override_q = vsi->mqprio_qopt.qopt.count[0]; in i40e_vsi_setup_queue_map_mqprio()
1987 if (override_q && override_q < vsi->num_queue_pairs) { in i40e_vsi_setup_queue_map_mqprio()
1988 vsi->cnt_q_avail = vsi->num_queue_pairs - override_q; in i40e_vsi_setup_queue_map_mqprio()
1989 vsi->next_base_queue = override_q; in i40e_vsi_setup_queue_map_mqprio()
1995 * i40e_vsi_setup_queue_map - Setup a VSI queue map based on enabled_tc
1998 * @enabled_tc: Enabled TCs bitmap
2008 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_queue_map()
2021 memset(ctxt->info.queue_mapping, 0, sizeof(ctxt->info.queue_mapping)); in i40e_vsi_setup_queue_map()
2023 if (vsi->type == I40E_VSI_MAIN) { in i40e_vsi_setup_queue_map()
2027 * non-zero req_queue_pairs says that user requested a new in i40e_vsi_setup_queue_map()
2033 if (vsi->req_queue_pairs > 0) in i40e_vsi_setup_queue_map()
2034 vsi->num_queue_pairs = vsi->req_queue_pairs; in i40e_vsi_setup_queue_map()
2035 else if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_vsi_setup_queue_map()
2036 vsi->num_queue_pairs = pf->num_lan_msix; in i40e_vsi_setup_queue_map()
2038 vsi->num_queue_pairs = 1; in i40e_vsi_setup_queue_map()
2042 if (vsi->type == I40E_VSI_MAIN || in i40e_vsi_setup_queue_map()
2043 (vsi->type == I40E_VSI_SRIOV && vsi->num_queue_pairs != 0)) in i40e_vsi_setup_queue_map()
2044 num_tc_qps = vsi->num_queue_pairs; in i40e_vsi_setup_queue_map()
2046 num_tc_qps = vsi->alloc_queue_pairs; in i40e_vsi_setup_queue_map()
2048 if (enabled_tc && test_bit(I40E_FLAG_DCB_ENA, vsi->back->flags)) { in i40e_vsi_setup_queue_map()
2055 dev_warn(&pf->pdev->dev, "DCB is enabled but no TC enabled, forcing TC0\n"); in i40e_vsi_setup_queue_map()
2063 vsi->tc_config.numtc = numtc; in i40e_vsi_setup_queue_map()
2064 vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; in i40e_vsi_setup_queue_map()
2066 /* Do not allow use more TC queue pairs than MSI-X vectors exist */ in i40e_vsi_setup_queue_map()
2067 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_vsi_setup_queue_map()
2068 num_tc_qps = min_t(int, num_tc_qps, pf->num_lan_msix); in i40e_vsi_setup_queue_map()
2070 /* Setup queue offset/count for all TCs for given VSI */ in i40e_vsi_setup_queue_map()
2073 if (vsi->tc_config.enabled_tc & BIT(i)) { in i40e_vsi_setup_queue_map()
2077 switch (vsi->type) { in i40e_vsi_setup_queue_map()
2080 pf->flags) && in i40e_vsi_setup_queue_map()
2082 pf->flags)) || in i40e_vsi_setup_queue_map()
2083 vsi->tc_config.enabled_tc != 1) { in i40e_vsi_setup_queue_map()
2084 qcount = min_t(int, pf->alloc_rss_size, in i40e_vsi_setup_queue_map()
2097 vsi->tc_config.tc_info[i].qoffset = offset; in i40e_vsi_setup_queue_map()
2098 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_setup_queue_map()
2100 /* find the next higher power-of-2 of num queue pairs */ in i40e_vsi_setup_queue_map()
2108 vsi->tc_config.tc_info[i].netdev_tc = netdev_tc++; in i40e_vsi_setup_queue_map()
2119 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_setup_queue_map()
2120 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_setup_queue_map()
2121 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_setup_queue_map()
2125 ctxt->info.tc_mapping[i] = cpu_to_le16(qmap); in i40e_vsi_setup_queue_map()
2128 if ((vsi->type == I40E_VSI_MAIN && numtc != 1) || in i40e_vsi_setup_queue_map()
2129 (vsi->type == I40E_VSI_SRIOV && vsi->num_queue_pairs == 0) || in i40e_vsi_setup_queue_map()
2130 (vsi->type != I40E_VSI_MAIN && vsi->type != I40E_VSI_SRIOV)) in i40e_vsi_setup_queue_map()
2131 vsi->num_queue_pairs = offset; in i40e_vsi_setup_queue_map()
2137 ctxt->info.up_enable_bits = enabled_tc; in i40e_vsi_setup_queue_map()
2139 if (vsi->type == I40E_VSI_SRIOV) { in i40e_vsi_setup_queue_map()
2140 ctxt->info.mapping_flags |= in i40e_vsi_setup_queue_map()
2142 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_setup_queue_map()
2143 ctxt->info.queue_mapping[i] = in i40e_vsi_setup_queue_map()
2144 cpu_to_le16(vsi->base_queue + i); in i40e_vsi_setup_queue_map()
2146 ctxt->info.mapping_flags |= in i40e_vsi_setup_queue_map()
2148 ctxt->info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_vsi_setup_queue_map()
2150 ctxt->info.valid_sections |= cpu_to_le16(sections); in i40e_vsi_setup_queue_map()
2154 * i40e_addr_sync - Callback for dev_(mc|uc)_sync to add address
2164 struct i40e_vsi *vsi = np->vsi; in i40e_addr_sync()
2169 return -ENOMEM; in i40e_addr_sync()
2173 * i40e_addr_unsync - Callback for dev_(mc|uc)_sync to remove address
2183 struct i40e_vsi *vsi = np->vsi; in i40e_addr_unsync()
2190 if (ether_addr_equal(addr, netdev->dev_addr)) in i40e_addr_unsync()
2199 * i40e_set_rx_mode - NDO callback to set the netdev filters
2205 struct i40e_vsi *vsi = np->vsi; in i40e_set_rx_mode()
2207 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_set_rx_mode()
2212 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_set_rx_mode()
2215 if (vsi->current_netdev_flags != vsi->netdev->flags) { in i40e_set_rx_mode()
2216 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_set_rx_mode()
2217 set_bit(__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); in i40e_set_rx_mode()
2222 * i40e_undo_del_filter_entries - Undo the changes made to MAC filter entries
2224 * @from: Pointer to list which contains MAC filter entries - changes to
2236 u64 key = i40e_addr_to_hkey(f->macaddr); in i40e_undo_del_filter_entries()
2239 hlist_del(&f->hlist); in i40e_undo_del_filter_entries()
2240 hash_add(vsi->mac_filter_hash, &f->hlist, key); in i40e_undo_del_filter_entries()
2245 * i40e_undo_add_filter_entries - Undo the changes made to MAC filter entries
2247 * @from: Pointer to list which contains MAC filter entries - changes to
2260 hlist_del(&new->hlist); in i40e_undo_add_filter_entries()
2261 netdev_hw_addr_refcnt(new->f, vsi->netdev, -1); in i40e_undo_add_filter_entries()
2267 * i40e_next_filter - Get the next non-broadcast filter from a list
2270 * Returns the next non-broadcast filter in the list. Required so that we
2278 if (!is_broadcast_ether_addr(next->f->macaddr)) in i40e_next_filter()
2286 * i40e_update_filter_state - Update filter state based on return data
2305 * the firmware return status because we pre-set the filter in i40e_update_filter_state()
2311 add_head->state = I40E_FILTER_FAILED; in i40e_update_filter_state()
2313 add_head->state = I40E_FILTER_ACTIVE; in i40e_update_filter_state()
2326 * i40e_aqc_del_filters - Request firmware to delete a set of filters
2331 * @retval: Set to -EIO on failure to delete
2343 struct i40e_hw *hw = &vsi->back->hw; in i40e_aqc_del_filters()
2347 aq_ret = i40e_aq_remove_macvlan_v2(hw, vsi->seid, list, num_del, NULL, in i40e_aqc_del_filters()
2352 *retval = -EIO; in i40e_aqc_del_filters()
2353 dev_info(&vsi->back->pdev->dev, in i40e_aqc_del_filters()
2360 * i40e_aqc_add_filters - Request firmware to add a set of filters
2368 * __I40E_VSI_OVERFLOW_PROMISC bit in vsi->state if the firmware has run out of
2377 struct i40e_hw *hw = &vsi->back->hw; in i40e_aqc_add_filters()
2381 i40e_aq_add_macvlan_v2(hw, vsi->seid, list, num_add, NULL, &aq_status); in i40e_aqc_add_filters()
2385 if (vsi->type == I40E_VSI_MAIN) { in i40e_aqc_add_filters()
2386 set_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_aqc_add_filters()
2387 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_add_filters()
2390 } else if (vsi->type == I40E_VSI_SRIOV || in i40e_aqc_add_filters()
2391 vsi->type == I40E_VSI_VMDQ1 || in i40e_aqc_add_filters()
2392 vsi->type == I40E_VSI_VMDQ2) { in i40e_aqc_add_filters()
2393 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_add_filters()
2397 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_add_filters()
2399 libie_aq_str(aq_status), vsi_name, vsi->type); in i40e_aqc_add_filters()
2405 * i40e_aqc_broadcast_filter - Set promiscuous broadcast flags
2420 bool enable = f->state == I40E_FILTER_NEW || in i40e_aqc_broadcast_filter()
2421 f->state == I40E_FILTER_NEW_SYNC; in i40e_aqc_broadcast_filter()
2422 struct i40e_hw *hw = &vsi->back->hw; in i40e_aqc_broadcast_filter()
2425 if (f->vlan == I40E_VLAN_ANY) { in i40e_aqc_broadcast_filter()
2427 vsi->seid, in i40e_aqc_broadcast_filter()
2432 vsi->seid, in i40e_aqc_broadcast_filter()
2434 f->vlan, in i40e_aqc_broadcast_filter()
2439 set_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_aqc_broadcast_filter()
2440 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_broadcast_filter()
2442 libie_aq_str(hw->aq.asq_last_status), vsi_name); in i40e_aqc_broadcast_filter()
2449 * i40e_set_promiscuous - set promiscuous mode
2460 struct i40e_hw *hw = &pf->hw; in i40e_set_promiscuous()
2463 if (vsi->type == I40E_VSI_MAIN && in i40e_set_promiscuous()
2465 !test_bit(I40E_FLAG_MFP_ENA, pf->flags)) { in i40e_set_promiscuous()
2473 vsi->seid, in i40e_set_promiscuous()
2477 vsi->seid, in i40e_set_promiscuous()
2480 dev_info(&pf->pdev->dev, in i40e_set_promiscuous()
2483 libie_aq_str(hw->aq.asq_last_status)); in i40e_set_promiscuous()
2488 vsi->seid, in i40e_set_promiscuous()
2492 dev_info(&pf->pdev->dev, in i40e_set_promiscuous()
2495 libie_aq_str(hw->aq.asq_last_status)); in i40e_set_promiscuous()
2499 vsi->seid, in i40e_set_promiscuous()
2502 dev_info(&pf->pdev->dev, in i40e_set_promiscuous()
2505 libie_aq_str(hw->aq.asq_last_status)); in i40e_set_promiscuous()
2510 pf->cur_promisc = promisc; in i40e_set_promiscuous()
2516 * i40e_sync_vsi_filters - Update the VSI filter list to the HW
2528 struct i40e_hw *hw = &vsi->back->hw; in i40e_sync_vsi_filters()
2549 while (test_and_set_bit(__I40E_VSI_SYNCING_FILTERS, vsi->state)) in i40e_sync_vsi_filters()
2551 pf = vsi->back; in i40e_sync_vsi_filters()
2553 old_overflow = test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2555 if (vsi->netdev) { in i40e_sync_vsi_filters()
2556 changed_flags = vsi->current_netdev_flags ^ vsi->netdev->flags; in i40e_sync_vsi_filters()
2557 vsi->current_netdev_flags = vsi->netdev->flags; in i40e_sync_vsi_filters()
2563 if (vsi->type == I40E_VSI_SRIOV) in i40e_sync_vsi_filters()
2564 snprintf(vsi_name, sizeof(vsi_name) - 1, "VF %d", vsi->vf_id); in i40e_sync_vsi_filters()
2565 else if (vsi->type != I40E_VSI_MAIN) in i40e_sync_vsi_filters()
2566 snprintf(vsi_name, sizeof(vsi_name) - 1, "vsi %d", vsi->seid); in i40e_sync_vsi_filters()
2568 if (vsi->flags & I40E_VSI_FLAG_FILTER_CHANGED) { in i40e_sync_vsi_filters()
2569 vsi->flags &= ~I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
2571 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2573 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_sync_vsi_filters()
2574 if (f->state == I40E_FILTER_REMOVE) { in i40e_sync_vsi_filters()
2576 hash_del(&f->hlist); in i40e_sync_vsi_filters()
2577 hlist_add_head(&f->hlist, &tmp_del_list); in i40e_sync_vsi_filters()
2582 if (f->state == I40E_FILTER_NEW) { in i40e_sync_vsi_filters()
2589 new->f = f; in i40e_sync_vsi_filters()
2590 new->state = f->state; in i40e_sync_vsi_filters()
2593 hlist_add_head(&new->hlist, &tmp_add_list); in i40e_sync_vsi_filters()
2594 f->state = I40E_FILTER_NEW_SYNC; in i40e_sync_vsi_filters()
2601 if (f->vlan > 0) in i40e_sync_vsi_filters()
2605 if (vsi->type != I40E_VSI_SRIOV) in i40e_sync_vsi_filters()
2609 else if (pf->vf) in i40e_sync_vsi_filters()
2612 vlan_filters, pf->vf[vsi->vf_id].trusted); in i40e_sync_vsi_filters()
2615 netdev_hw_addr_refcnt(new->f, vsi->netdev, 1); in i40e_sync_vsi_filters()
2620 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2625 filter_list_len = hw->aq.asq_buf_size / in i40e_sync_vsi_filters()
2639 if (is_broadcast_ether_addr(f->macaddr)) { in i40e_sync_vsi_filters()
2642 hlist_del(&f->hlist); in i40e_sync_vsi_filters()
2648 ether_addr_copy(del_list[num_del].mac_addr, f->macaddr); in i40e_sync_vsi_filters()
2649 if (f->vlan == I40E_VLAN_ANY) { in i40e_sync_vsi_filters()
2654 cpu_to_le16((u16)(f->vlan)); in i40e_sync_vsi_filters()
2671 hlist_del(&f->hlist); in i40e_sync_vsi_filters()
2686 filter_list_len = hw->aq.asq_buf_size / in i40e_sync_vsi_filters()
2699 if (is_broadcast_ether_addr(new->f->macaddr)) { in i40e_sync_vsi_filters()
2701 new->f)) in i40e_sync_vsi_filters()
2702 new->state = I40E_FILTER_FAILED; in i40e_sync_vsi_filters()
2704 new->state = I40E_FILTER_ACTIVE; in i40e_sync_vsi_filters()
2713 new->f->macaddr); in i40e_sync_vsi_filters()
2714 if (new->f->vlan == I40E_VLAN_ANY) { in i40e_sync_vsi_filters()
2719 cpu_to_le16((u16)(new->f->vlan)); in i40e_sync_vsi_filters()
2743 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2746 if (new->f->state == I40E_FILTER_NEW || in i40e_sync_vsi_filters()
2747 new->f->state == I40E_FILTER_NEW_SYNC) in i40e_sync_vsi_filters()
2748 new->f->state = new->state; in i40e_sync_vsi_filters()
2749 hlist_del(&new->hlist); in i40e_sync_vsi_filters()
2750 netdev_hw_addr_refcnt(new->f, vsi->netdev, -1); in i40e_sync_vsi_filters()
2753 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2759 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2760 vsi->active_filters = 0; in i40e_sync_vsi_filters()
2761 hash_for_each(vsi->mac_filter_hash, bkt, f, hlist) { in i40e_sync_vsi_filters()
2762 if (f->state == I40E_FILTER_ACTIVE) in i40e_sync_vsi_filters()
2763 vsi->active_filters++; in i40e_sync_vsi_filters()
2764 else if (f->state == I40E_FILTER_FAILED) in i40e_sync_vsi_filters()
2767 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2774 vsi->active_filters < vsi->promisc_threshold) { in i40e_sync_vsi_filters()
2775 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2778 clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2779 vsi->promisc_threshold = 0; in i40e_sync_vsi_filters()
2783 if (vsi->type == I40E_VSI_SRIOV && pf->vf && in i40e_sync_vsi_filters()
2784 !pf->vf[vsi->vf_id].trusted) { in i40e_sync_vsi_filters()
2785 clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2789 new_overflow = test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2795 vsi->promisc_threshold = (vsi->active_filters * 3) / 4; in i40e_sync_vsi_filters()
2801 cur_multipromisc = !!(vsi->current_netdev_flags & IFF_ALLMULTI); in i40e_sync_vsi_filters()
2802 aq_ret = i40e_aq_set_vsi_multicast_promiscuous(&vsi->back->hw, in i40e_sync_vsi_filters()
2803 vsi->seid, in i40e_sync_vsi_filters()
2808 hw->aq.asq_last_status); in i40e_sync_vsi_filters()
2809 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2813 libie_aq_str(hw->aq.asq_last_status)); in i40e_sync_vsi_filters()
2815 dev_info(&pf->pdev->dev, "%s allmulti mode.\n", in i40e_sync_vsi_filters()
2823 cur_promisc = (!!(vsi->current_netdev_flags & IFF_PROMISC) || in i40e_sync_vsi_filters()
2828 hw->aq.asq_last_status); in i40e_sync_vsi_filters()
2829 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2834 libie_aq_str(hw->aq.asq_last_status)); in i40e_sync_vsi_filters()
2840 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
2842 clear_bit(__I40E_VSI_SYNCING_FILTERS, vsi->state); in i40e_sync_vsi_filters()
2847 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2851 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2853 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
2854 clear_bit(__I40E_VSI_SYNCING_FILTERS, vsi->state); in i40e_sync_vsi_filters()
2855 return -ENOMEM; in i40e_sync_vsi_filters()
2859 * i40e_sync_filters_subtask - Sync the VSI filter list with HW
2869 if (!test_and_clear_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state)) in i40e_sync_filters_subtask()
2871 if (test_bit(__I40E_VF_DISABLE, pf->state)) { in i40e_sync_filters_subtask()
2872 set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state); in i40e_sync_filters_subtask()
2877 if ((vsi->flags & I40E_VSI_FLAG_FILTER_CHANGED) && in i40e_sync_filters_subtask()
2878 !test_bit(__I40E_VSI_RELEASING, vsi->state)) { in i40e_sync_filters_subtask()
2884 pf->state); in i40e_sync_filters_subtask()
2892 * i40e_calculate_vsi_rx_buf_len - Calculates buffer length
2898 if (!vsi->netdev || test_bit(I40E_FLAG_LEGACY_RX_ENA, vsi->back->flags)) in i40e_calculate_vsi_rx_buf_len()
2905 * i40e_max_vsi_frame_size - returns the maximum allowed frame size for VSI
2915 if (xdp_prog && !xdp_prog->aux->xdp_has_frags) in i40e_max_vsi_frame_size()
2924 * i40e_change_mtu - NDO callback to change the Maximum Transfer Unit
2933 struct i40e_vsi *vsi = np->vsi; in i40e_change_mtu()
2934 struct i40e_pf *pf = vsi->back; in i40e_change_mtu()
2937 frame_size = i40e_max_vsi_frame_size(vsi, vsi->xdp_prog); in i40e_change_mtu()
2938 if (new_mtu > frame_size - I40E_PACKET_HDR_PAD) { in i40e_change_mtu()
2940 new_mtu, frame_size - I40E_PACKET_HDR_PAD); in i40e_change_mtu()
2941 return -EINVAL; in i40e_change_mtu()
2945 netdev->mtu, new_mtu); in i40e_change_mtu()
2946 WRITE_ONCE(netdev->mtu, new_mtu); in i40e_change_mtu()
2949 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_change_mtu()
2950 set_bit(__I40E_CLIENT_L2_CHANGE, pf->state); in i40e_change_mtu()
2955 * i40e_vlan_stripping_enable - Turn on vlan stripping for the VSI
2964 if (vsi->info.pvid) in i40e_vlan_stripping_enable()
2967 if ((vsi->info.valid_sections & in i40e_vlan_stripping_enable()
2969 ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_MODE_MASK) == 0)) in i40e_vlan_stripping_enable()
2972 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vlan_stripping_enable()
2973 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL | in i40e_vlan_stripping_enable()
2976 ctxt.seid = vsi->seid; in i40e_vlan_stripping_enable()
2977 ctxt.info = vsi->info; in i40e_vlan_stripping_enable()
2978 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vlan_stripping_enable()
2980 dev_info(&vsi->back->pdev->dev, in i40e_vlan_stripping_enable()
2983 libie_aq_str(vsi->back->hw.aq.asq_last_status)); in i40e_vlan_stripping_enable()
2988 * i40e_vlan_stripping_disable - Turn off vlan stripping for the VSI
2997 if (vsi->info.pvid) in i40e_vlan_stripping_disable()
3000 if ((vsi->info.valid_sections & in i40e_vlan_stripping_disable()
3002 ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_EMOD_MASK) == in i40e_vlan_stripping_disable()
3006 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vlan_stripping_disable()
3007 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL | in i40e_vlan_stripping_disable()
3010 ctxt.seid = vsi->seid; in i40e_vlan_stripping_disable()
3011 ctxt.info = vsi->info; in i40e_vlan_stripping_disable()
3012 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vlan_stripping_disable()
3014 dev_info(&vsi->back->pdev->dev, in i40e_vlan_stripping_disable()
3017 libie_aq_str(vsi->back->hw.aq.asq_last_status)); in i40e_vlan_stripping_disable()
3022 * i40e_add_vlan_all_mac - Add a MAC/VLAN filter for each existing MAC address
3024 * @vid: vlan id to be added (0 = untagged only , -1 = any)
3040 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_add_vlan_all_mac()
3050 if (f->state == I40E_FILTER_REMOVE && f->vlan == vid) { in i40e_add_vlan_all_mac()
3051 f->state = I40E_FILTER_ACTIVE; in i40e_add_vlan_all_mac()
3053 } else if (f->state == I40E_FILTER_REMOVE) { in i40e_add_vlan_all_mac()
3056 add_f = i40e_add_filter(vsi, f->macaddr, vid); in i40e_add_vlan_all_mac()
3058 dev_info(&vsi->back->pdev->dev, in i40e_add_vlan_all_mac()
3060 vid, f->macaddr); in i40e_add_vlan_all_mac()
3061 return -ENOMEM; in i40e_add_vlan_all_mac()
3069 * i40e_vsi_add_vlan - Add VSI membership for given VLAN
3077 if (vsi->info.pvid) in i40e_vsi_add_vlan()
3078 return -EINVAL; in i40e_vsi_add_vlan()
3092 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_add_vlan()
3094 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_add_vlan()
3101 i40e_service_event_schedule(vsi->back); in i40e_vsi_add_vlan()
3106 * i40e_rm_vlan_all_mac - Remove MAC/VLAN pair for all MAC with the given VLAN
3108 * @vid: vlan id to be removed (0 = untagged only , -1 = any)
3124 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_rm_vlan_all_mac()
3125 if (f->vlan == vid) in i40e_rm_vlan_all_mac()
3131 * i40e_vsi_kill_vlan - Remove VSI membership for given VLAN
3137 if (!vid || vsi->info.pvid) in i40e_vsi_kill_vlan()
3140 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_kill_vlan()
3142 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_kill_vlan()
3147 i40e_service_event_schedule(vsi->back); in i40e_vsi_kill_vlan()
3151 * i40e_vlan_rx_add_vid - Add a vlan id filter to HW offload
3162 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_add_vid()
3166 return -EINVAL; in i40e_vlan_rx_add_vid()
3170 set_bit(vid, vsi->active_vlans); in i40e_vlan_rx_add_vid()
3176 * i40e_vlan_rx_add_vid_up - Add a vlan id filter to HW offload in UP path
3185 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_add_vid_up()
3189 set_bit(vid, vsi->active_vlans); in i40e_vlan_rx_add_vid_up()
3193 * i40e_vlan_rx_kill_vid - Remove a vlan id filter from HW offload
3204 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_kill_vid()
3212 clear_bit(vid, vsi->active_vlans); in i40e_vlan_rx_kill_vid()
3218 * i40e_restore_vlan - Reinstate vlans when vsi/netdev comes back up
3225 if (!vsi->netdev) in i40e_restore_vlan()
3228 if (vsi->netdev->features & NETIF_F_HW_VLAN_CTAG_RX) in i40e_restore_vlan()
3233 for_each_set_bit(vid, vsi->active_vlans, VLAN_N_VID) in i40e_restore_vlan()
3234 i40e_vlan_rx_add_vid_up(vsi->netdev, htons(ETH_P_8021Q), in i40e_restore_vlan()
3239 * i40e_vsi_add_pvid - Add pvid for the VSI
3248 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vsi_add_pvid()
3249 vsi->info.pvid = cpu_to_le16(vid); in i40e_vsi_add_pvid()
3250 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_TAGGED | in i40e_vsi_add_pvid()
3254 ctxt.seid = vsi->seid; in i40e_vsi_add_pvid()
3255 ctxt.info = vsi->info; in i40e_vsi_add_pvid()
3256 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vsi_add_pvid()
3258 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_pvid()
3261 libie_aq_str(vsi->back->hw.aq.asq_last_status)); in i40e_vsi_add_pvid()
3262 return -ENOENT; in i40e_vsi_add_pvid()
3269 * i40e_vsi_remove_pvid - Remove the pvid from the VSI
3276 vsi->info.pvid = 0; in i40e_vsi_remove_pvid()
3282 * i40e_vsi_setup_tx_resources - Allocate VSI Tx queue resources
3295 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_tx_resources()
3296 err = i40e_setup_tx_descriptors(vsi->tx_rings[i]); in i40e_vsi_setup_tx_resources()
3301 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_tx_resources()
3302 err = i40e_setup_tx_descriptors(vsi->xdp_rings[i]); in i40e_vsi_setup_tx_resources()
3308 * i40e_vsi_free_tx_resources - Free Tx resources for VSI queues
3317 if (vsi->tx_rings) { in i40e_vsi_free_tx_resources()
3318 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_tx_resources()
3319 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) in i40e_vsi_free_tx_resources()
3320 i40e_free_tx_resources(vsi->tx_rings[i]); in i40e_vsi_free_tx_resources()
3323 if (vsi->xdp_rings) { in i40e_vsi_free_tx_resources()
3324 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_tx_resources()
3325 if (vsi->xdp_rings[i] && vsi->xdp_rings[i]->desc) in i40e_vsi_free_tx_resources()
3326 i40e_free_tx_resources(vsi->xdp_rings[i]); in i40e_vsi_free_tx_resources()
3331 * i40e_vsi_setup_rx_resources - Allocate VSI queues Rx resources
3344 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_rx_resources()
3345 err = i40e_setup_rx_descriptors(vsi->rx_rings[i]); in i40e_vsi_setup_rx_resources()
3350 * i40e_vsi_free_rx_resources - Free Rx Resources for VSI queues
3359 if (!vsi->rx_rings) in i40e_vsi_free_rx_resources()
3362 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_rx_resources()
3363 if (vsi->rx_rings[i] && vsi->rx_rings[i]->desc) in i40e_vsi_free_rx_resources()
3364 i40e_free_rx_resources(vsi->rx_rings[i]); in i40e_vsi_free_rx_resources()
3368 * i40e_config_xps_tx_ring - Configure XPS for a Tx ring
3372 * based on the TCs enabled for the VSI that ring belongs to.
3378 if (!ring->q_vector || !ring->netdev || ring->ch) in i40e_config_xps_tx_ring()
3382 if (test_and_set_bit(__I40E_TX_XPS_INIT_DONE, ring->state)) in i40e_config_xps_tx_ring()
3385 cpu = cpumask_local_spread(ring->q_vector->v_idx, -1); in i40e_config_xps_tx_ring()
3386 netif_set_xps_queue(ring->netdev, get_cpu_mask(cpu), in i40e_config_xps_tx_ring()
3387 ring->queue_index); in i40e_config_xps_tx_ring()
3391 * i40e_xsk_pool - Retrieve the AF_XDP buffer pool if XDP and ZC is enabled
3398 bool xdp_on = i40e_enabled_xdp_vsi(ring->vsi); in i40e_xsk_pool()
3399 int qid = ring->queue_index; in i40e_xsk_pool()
3402 qid -= ring->vsi->alloc_queue_pairs; in i40e_xsk_pool()
3404 if (!xdp_on || !test_bit(qid, ring->vsi->af_xdp_zc_qps)) in i40e_xsk_pool()
3407 return xsk_get_pool_from_qid(ring->vsi->netdev, qid); in i40e_xsk_pool()
3411 * i40e_configure_tx_ring - Configure a transmit ring context and rest
3418 struct i40e_vsi *vsi = ring->vsi; in i40e_configure_tx_ring()
3419 u16 pf_q = vsi->base_queue + ring->queue_index; in i40e_configure_tx_ring()
3420 struct i40e_hw *hw = &vsi->back->hw; in i40e_configure_tx_ring()
3426 ring->xsk_pool = i40e_xsk_pool(ring); in i40e_configure_tx_ring()
3429 if (test_bit(I40E_FLAG_FD_ATR_ENA, vsi->back->flags)) { in i40e_configure_tx_ring()
3430 ring->atr_sample_rate = I40E_DEFAULT_ATR_SAMPLE_RATE; in i40e_configure_tx_ring()
3431 ring->atr_count = 0; in i40e_configure_tx_ring()
3433 ring->atr_sample_rate = 0; in i40e_configure_tx_ring()
3443 tx_ctx.base = (ring->dma / 128); in i40e_configure_tx_ring()
3444 tx_ctx.qlen = ring->count; in i40e_configure_tx_ring()
3445 if (test_bit(I40E_FLAG_FD_SB_ENA, vsi->back->flags) || in i40e_configure_tx_ring()
3446 test_bit(I40E_FLAG_FD_ATR_ENA, vsi->back->flags)) in i40e_configure_tx_ring()
3448 if (test_bit(I40E_FLAG_PTP_ENA, vsi->back->flags)) in i40e_configure_tx_ring()
3451 if (vsi->type != I40E_VSI_FDIR) in i40e_configure_tx_ring()
3453 tx_ctx.head_wb_addr = ring->dma + in i40e_configure_tx_ring()
3454 (ring->count * sizeof(struct i40e_tx_desc)); in i40e_configure_tx_ring()
3467 if (ring->ch) in i40e_configure_tx_ring()
3469 le16_to_cpu(ring->ch->info.qs_handle[ring->dcb_tc]); in i40e_configure_tx_ring()
3472 tx_ctx.rdylist = le16_to_cpu(vsi->info.qs_handle[ring->dcb_tc]); in i40e_configure_tx_ring()
3479 dev_info(&vsi->back->pdev->dev, in i40e_configure_tx_ring()
3481 ring->queue_index, pf_q, err); in i40e_configure_tx_ring()
3482 return -ENOMEM; in i40e_configure_tx_ring()
3488 dev_info(&vsi->back->pdev->dev, in i40e_configure_tx_ring()
3490 ring->queue_index, pf_q, err); in i40e_configure_tx_ring()
3491 return -ENOMEM; in i40e_configure_tx_ring()
3495 if (ring->ch) { in i40e_configure_tx_ring()
3496 if (ring->ch->type == I40E_VSI_VMDQ2) in i40e_configure_tx_ring()
3499 return -EINVAL; in i40e_configure_tx_ring()
3502 ring->ch->vsi_number); in i40e_configure_tx_ring()
3504 if (vsi->type == I40E_VSI_VMDQ2) { in i40e_configure_tx_ring()
3507 vsi->id); in i40e_configure_tx_ring()
3513 qtx_ctl |= FIELD_PREP(I40E_QTX_CTL_PF_INDX_MASK, hw->pf_id); in i40e_configure_tx_ring()
3518 ring->tail = hw->hw_addr + I40E_QTX_TAIL(pf_q); in i40e_configure_tx_ring()
3524 * i40e_rx_offset - Return expected offset into page to access data
3535 * i40e_configure_rx_ring - Configure a receive ring context
3542 struct i40e_vsi *vsi = ring->vsi; in i40e_configure_rx_ring()
3543 u32 chain_len = vsi->back->hw.func_caps.rx_buf_chain_len; in i40e_configure_rx_ring()
3544 u16 pf_q = vsi->base_queue + ring->queue_index; in i40e_configure_rx_ring()
3545 struct i40e_hw *hw = &vsi->back->hw; in i40e_configure_rx_ring()
3550 bitmap_zero(ring->state, __I40E_RING_STATE_NBITS); in i40e_configure_rx_ring()
3555 ring->rx_buf_len = vsi->rx_buf_len; in i40e_configure_rx_ring()
3557 /* XDP RX-queue info only needed for RX rings exposed to XDP */ in i40e_configure_rx_ring()
3558 if (ring->vsi->type != I40E_VSI_MAIN) in i40e_configure_rx_ring()
3561 if (!xdp_rxq_info_is_reg(&ring->xdp_rxq)) { in i40e_configure_rx_ring()
3562 err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev, in i40e_configure_rx_ring()
3563 ring->queue_index, in i40e_configure_rx_ring()
3564 ring->q_vector->napi.napi_id, in i40e_configure_rx_ring()
3565 ring->rx_buf_len); in i40e_configure_rx_ring()
3570 ring->xsk_pool = i40e_xsk_pool(ring); in i40e_configure_rx_ring()
3571 if (ring->xsk_pool) { in i40e_configure_rx_ring()
3572 xdp_rxq_info_unreg(&ring->xdp_rxq); in i40e_configure_rx_ring()
3573 ring->rx_buf_len = xsk_pool_get_rx_frame_size(ring->xsk_pool); in i40e_configure_rx_ring()
3574 err = __xdp_rxq_info_reg(&ring->xdp_rxq, ring->netdev, in i40e_configure_rx_ring()
3575 ring->queue_index, in i40e_configure_rx_ring()
3576 ring->q_vector->napi.napi_id, in i40e_configure_rx_ring()
3577 ring->rx_buf_len); in i40e_configure_rx_ring()
3580 err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, in i40e_configure_rx_ring()
3585 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3587 ring->queue_index); in i40e_configure_rx_ring()
3590 err = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, in i40e_configure_rx_ring()
3598 xdp_init_buff(&ring->xdp, i40e_rx_pg_size(ring) / 2, &ring->xdp_rxq); in i40e_configure_rx_ring()
3600 rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len, in i40e_configure_rx_ring()
3603 rx_ctx.base = (ring->dma / 128); in i40e_configure_rx_ring()
3604 rx_ctx.qlen = ring->count; in i40e_configure_rx_ring()
3614 rx_ctx.rxmax = min_t(u16, vsi->max_frame, chain_len * ring->rx_buf_len); in i40e_configure_rx_ring()
3615 if (hw->revision_id == 0) in i40e_configure_rx_ring()
3629 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3631 ring->queue_index, pf_q, err); in i40e_configure_rx_ring()
3632 return -ENOMEM; in i40e_configure_rx_ring()
3638 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3640 ring->queue_index, pf_q, err); in i40e_configure_rx_ring()
3641 return -ENOMEM; in i40e_configure_rx_ring()
3645 if (!vsi->netdev || test_bit(I40E_FLAG_LEGACY_RX_ENA, vsi->back->flags)) { in i40e_configure_rx_ring()
3647 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3649 return -EOPNOTSUPP; in i40e_configure_rx_ring()
3656 ring->rx_offset = i40e_rx_offset(ring); in i40e_configure_rx_ring()
3659 ring->tail = hw->hw_addr + I40E_QRX_TAIL(pf_q); in i40e_configure_rx_ring()
3660 writel(0, ring->tail); in i40e_configure_rx_ring()
3662 if (ring->xsk_pool) { in i40e_configure_rx_ring()
3663 xsk_pool_set_rxq_info(ring->xsk_pool, &ring->xdp_rxq); in i40e_configure_rx_ring()
3672 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3674 ring->xsk_pool ? "AF_XDP ZC enabled " : "", in i40e_configure_rx_ring()
3675 ring->queue_index, pf_q); in i40e_configure_rx_ring()
3682 * i40e_vsi_configure_tx - Configure the VSI for Tx
3692 for (i = 0; (i < vsi->num_queue_pairs) && !err; i++) in i40e_vsi_configure_tx()
3693 err = i40e_configure_tx_ring(vsi->tx_rings[i]); in i40e_vsi_configure_tx()
3698 for (i = 0; (i < vsi->num_queue_pairs) && !err; i++) in i40e_vsi_configure_tx()
3699 err = i40e_configure_tx_ring(vsi->xdp_rings[i]); in i40e_vsi_configure_tx()
3705 * i40e_vsi_configure_rx - Configure the VSI for Rx
3715 vsi->max_frame = i40e_max_vsi_frame_size(vsi, vsi->xdp_prog); in i40e_vsi_configure_rx()
3716 vsi->rx_buf_len = i40e_calculate_vsi_rx_buf_len(vsi); in i40e_vsi_configure_rx()
3719 if (vsi->netdev && !I40E_2K_TOO_SMALL_WITH_PADDING && in i40e_vsi_configure_rx()
3720 vsi->netdev->mtu <= ETH_DATA_LEN) { in i40e_vsi_configure_rx()
3721 vsi->rx_buf_len = I40E_RXBUFFER_1536 - NET_IP_ALIGN; in i40e_vsi_configure_rx()
3722 vsi->max_frame = vsi->rx_buf_len; in i40e_vsi_configure_rx()
3727 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_configure_rx()
3728 err = i40e_configure_rx_ring(vsi->rx_rings[i]); in i40e_vsi_configure_rx()
3734 * i40e_vsi_config_dcb_rings - Update rings to reflect DCB TC
3743 if (!test_bit(I40E_FLAG_DCB_ENA, vsi->back->flags)) { in i40e_vsi_config_dcb_rings()
3745 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_config_dcb_rings()
3746 rx_ring = vsi->rx_rings[i]; in i40e_vsi_config_dcb_rings()
3747 tx_ring = vsi->tx_rings[i]; in i40e_vsi_config_dcb_rings()
3748 rx_ring->dcb_tc = 0; in i40e_vsi_config_dcb_rings()
3749 tx_ring->dcb_tc = 0; in i40e_vsi_config_dcb_rings()
3755 if (!(vsi->tc_config.enabled_tc & BIT_ULL(n))) in i40e_vsi_config_dcb_rings()
3758 qoffset = vsi->tc_config.tc_info[n].qoffset; in i40e_vsi_config_dcb_rings()
3759 qcount = vsi->tc_config.tc_info[n].qcount; in i40e_vsi_config_dcb_rings()
3761 rx_ring = vsi->rx_rings[i]; in i40e_vsi_config_dcb_rings()
3762 tx_ring = vsi->tx_rings[i]; in i40e_vsi_config_dcb_rings()
3763 rx_ring->dcb_tc = n; in i40e_vsi_config_dcb_rings()
3764 tx_ring->dcb_tc = n; in i40e_vsi_config_dcb_rings()
3770 * i40e_set_vsi_rx_mode - Call set_rx_mode on a VSI
3775 if (vsi->netdev) in i40e_set_vsi_rx_mode()
3776 i40e_set_rx_mode(vsi->netdev); in i40e_set_vsi_rx_mode()
3780 * i40e_reset_fdir_filter_cnt - Reset flow director filter counters
3787 pf->fd_tcp4_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3788 pf->fd_udp4_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3789 pf->fd_sctp4_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3790 pf->fd_ip4_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3791 pf->fd_tcp6_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3792 pf->fd_udp6_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3793 pf->fd_sctp6_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3794 pf->fd_ip6_filter_cnt = 0; in i40e_reset_fdir_filter_cnt()
3798 * i40e_fdir_filter_restore - Restore the Sideband Flow Director filters
3807 struct i40e_pf *pf = vsi->back; in i40e_fdir_filter_restore()
3810 if (!test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) in i40e_fdir_filter_restore()
3817 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_filter_restore()
3823 * i40e_vsi_configure - Set up the VSI for action
3841 * i40e_vsi_configure_msix - MSIX mode Interrupt Config in the HW
3847 struct i40e_pf *pf = vsi->back; in i40e_vsi_configure_msix()
3848 struct i40e_hw *hw = &pf->hw; in i40e_vsi_configure_msix()
3855 * PFINT_ITRn[0..n-1] gets msix-1..msix-n (qpair interrupts) in i40e_vsi_configure_msix()
3857 qp = vsi->base_queue; in i40e_vsi_configure_msix()
3858 vector = vsi->base_vector; in i40e_vsi_configure_msix()
3859 for (i = 0; i < vsi->num_q_vectors; i++, vector++) { in i40e_vsi_configure_msix()
3860 struct i40e_q_vector *q_vector = vsi->q_vectors[i]; in i40e_vsi_configure_msix()
3862 q_vector->rx.next_update = jiffies + 1; in i40e_vsi_configure_msix()
3863 q_vector->rx.target_itr = in i40e_vsi_configure_msix()
3864 ITR_TO_REG(vsi->rx_rings[i]->itr_setting); in i40e_vsi_configure_msix()
3865 wr32(hw, I40E_PFINT_ITRN(I40E_RX_ITR, vector - 1), in i40e_vsi_configure_msix()
3866 q_vector->rx.target_itr >> 1); in i40e_vsi_configure_msix()
3867 q_vector->rx.current_itr = q_vector->rx.target_itr; in i40e_vsi_configure_msix()
3869 q_vector->tx.next_update = jiffies + 1; in i40e_vsi_configure_msix()
3870 q_vector->tx.target_itr = in i40e_vsi_configure_msix()
3871 ITR_TO_REG(vsi->tx_rings[i]->itr_setting); in i40e_vsi_configure_msix()
3872 wr32(hw, I40E_PFINT_ITRN(I40E_TX_ITR, vector - 1), in i40e_vsi_configure_msix()
3873 q_vector->tx.target_itr >> 1); in i40e_vsi_configure_msix()
3874 q_vector->tx.current_itr = q_vector->tx.target_itr; in i40e_vsi_configure_msix()
3877 * busy-loop polling. in i40e_vsi_configure_msix()
3879 wr32(hw, I40E_PFINT_ITRN(I40E_SW_ITR, vector - 1), in i40e_vsi_configure_msix()
3882 wr32(hw, I40E_PFINT_RATEN(vector - 1), in i40e_vsi_configure_msix()
3883 i40e_intrl_usec_to_reg(vsi->int_rate_limit)); in i40e_vsi_configure_msix()
3886 wr32(hw, I40E_PFINT_LNKLSTN(vector - 1), qp); in i40e_vsi_configure_msix()
3887 for (q = 0; q < q_vector->num_ringpairs; q++) { in i40e_vsi_configure_msix()
3888 u32 nextqp = has_xdp ? qp + vsi->alloc_queue_pairs : qp; in i40e_vsi_configure_msix()
3920 if (q == (q_vector->num_ringpairs - 1)) in i40e_vsi_configure_msix()
3933 * i40e_enable_misc_int_causes - enable the non-queue interrupts
3938 struct i40e_hw *hw = &pf->hw; in i40e_enable_misc_int_causes()
3954 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) in i40e_enable_misc_int_causes()
3957 if (test_bit(I40E_FLAG_PTP_ENA, pf->flags)) in i40e_enable_misc_int_causes()
3971 * i40e_configure_msi_and_legacy - Legacy mode interrupt config in the HW
3976 u32 nextqp = i40e_enabled_xdp_vsi(vsi) ? vsi->alloc_queue_pairs : 0; in i40e_configure_msi_and_legacy()
3977 struct i40e_q_vector *q_vector = vsi->q_vectors[0]; in i40e_configure_msi_and_legacy()
3978 struct i40e_pf *pf = vsi->back; in i40e_configure_msi_and_legacy()
3979 struct i40e_hw *hw = &pf->hw; in i40e_configure_msi_and_legacy()
3982 q_vector->rx.next_update = jiffies + 1; in i40e_configure_msi_and_legacy()
3983 q_vector->rx.target_itr = ITR_TO_REG(vsi->rx_rings[0]->itr_setting); in i40e_configure_msi_and_legacy()
3984 wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), q_vector->rx.target_itr >> 1); in i40e_configure_msi_and_legacy()
3985 q_vector->rx.current_itr = q_vector->rx.target_itr; in i40e_configure_msi_and_legacy()
3986 q_vector->tx.next_update = jiffies + 1; in i40e_configure_msi_and_legacy()
3987 q_vector->tx.target_itr = ITR_TO_REG(vsi->tx_rings[0]->itr_setting); in i40e_configure_msi_and_legacy()
3988 wr32(hw, I40E_PFINT_ITR0(I40E_TX_ITR), q_vector->tx.target_itr >> 1); in i40e_configure_msi_and_legacy()
3989 q_vector->tx.current_itr = q_vector->tx.target_itr; in i40e_configure_msi_and_legacy()
4014 * i40e_irq_dynamic_disable_icr0 - Disable default interrupt generation for icr0
4019 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_disable_icr0()
4027 * i40e_irq_dynamic_enable_icr0 - Enable default interrupt generation for icr0
4032 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_enable_icr0()
4044 * i40e_msix_clean_rings - MSIX mode Interrupt Handler
4052 if (!q_vector->tx.ring && !q_vector->rx.ring) in i40e_msix_clean_rings()
4055 napi_schedule_irqoff(&q_vector->napi); in i40e_msix_clean_rings()
4061 * i40e_irq_affinity_notify - Callback for affinity changes
4074 cpumask_copy(&q_vector->affinity_mask, mask); in i40e_irq_affinity_notify()
4078 * i40e_irq_affinity_release - Callback for affinity notifier release
4088 * i40e_vsi_request_irq_msix - Initialize MSI-X interrupts
4092 * Allocates MSI-X vectors and requests interrupts from the kernel.
4096 int q_vectors = vsi->num_q_vectors; in i40e_vsi_request_irq_msix()
4097 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq_msix()
4098 int base = vsi->base_vector; in i40e_vsi_request_irq_msix()
4106 struct i40e_q_vector *q_vector = vsi->q_vectors[vector]; in i40e_vsi_request_irq_msix()
4108 irq_num = pf->msix_entries[base + vector].vector; in i40e_vsi_request_irq_msix()
4110 if (q_vector->tx.ring && q_vector->rx.ring) { in i40e_vsi_request_irq_msix()
4111 snprintf(q_vector->name, sizeof(q_vector->name) - 1, in i40e_vsi_request_irq_msix()
4112 "%s-%s-%d", basename, "TxRx", rx_int_idx++); in i40e_vsi_request_irq_msix()
4114 } else if (q_vector->rx.ring) { in i40e_vsi_request_irq_msix()
4115 snprintf(q_vector->name, sizeof(q_vector->name) - 1, in i40e_vsi_request_irq_msix()
4116 "%s-%s-%d", basename, "rx", rx_int_idx++); in i40e_vsi_request_irq_msix()
4117 } else if (q_vector->tx.ring) { in i40e_vsi_request_irq_msix()
4118 snprintf(q_vector->name, sizeof(q_vector->name) - 1, in i40e_vsi_request_irq_msix()
4119 "%s-%s-%d", basename, "tx", tx_int_idx++); in i40e_vsi_request_irq_msix()
4125 vsi->irq_handler, in i40e_vsi_request_irq_msix()
4127 q_vector->name, in i40e_vsi_request_irq_msix()
4130 dev_info(&pf->pdev->dev, in i40e_vsi_request_irq_msix()
4136 q_vector->irq_num = irq_num; in i40e_vsi_request_irq_msix()
4137 q_vector->affinity_notify.notify = i40e_irq_affinity_notify; in i40e_vsi_request_irq_msix()
4138 q_vector->affinity_notify.release = i40e_irq_affinity_release; in i40e_vsi_request_irq_msix()
4139 irq_set_affinity_notifier(irq_num, &q_vector->affinity_notify); in i40e_vsi_request_irq_msix()
4146 cpu = cpumask_local_spread(q_vector->v_idx, -1); in i40e_vsi_request_irq_msix()
4150 vsi->irqs_ready = true; in i40e_vsi_request_irq_msix()
4155 vector--; in i40e_vsi_request_irq_msix()
4156 irq_num = pf->msix_entries[base + vector].vector; in i40e_vsi_request_irq_msix()
4159 free_irq(irq_num, &vsi->q_vectors[vector]); in i40e_vsi_request_irq_msix()
4165 * i40e_vsi_disable_irq - Mask off queue interrupt generation on the VSI
4166 * @vsi: the VSI being un-configured
4170 struct i40e_pf *pf = vsi->back; in i40e_vsi_disable_irq()
4171 struct i40e_hw *hw = &pf->hw; in i40e_vsi_disable_irq()
4172 int base = vsi->base_vector; in i40e_vsi_disable_irq()
4176 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_disable_irq()
4179 val = rd32(hw, I40E_QINT_TQCTL(vsi->tx_rings[i]->reg_idx)); in i40e_vsi_disable_irq()
4181 wr32(hw, I40E_QINT_TQCTL(vsi->tx_rings[i]->reg_idx), val); in i40e_vsi_disable_irq()
4183 val = rd32(hw, I40E_QINT_RQCTL(vsi->rx_rings[i]->reg_idx)); in i40e_vsi_disable_irq()
4185 wr32(hw, I40E_QINT_RQCTL(vsi->rx_rings[i]->reg_idx), val); in i40e_vsi_disable_irq()
4189 wr32(hw, I40E_QINT_TQCTL(vsi->xdp_rings[i]->reg_idx), 0); in i40e_vsi_disable_irq()
4193 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_vsi_disable_irq()
4194 for (i = vsi->base_vector; in i40e_vsi_disable_irq()
4195 i < (vsi->num_q_vectors + vsi->base_vector); i++) in i40e_vsi_disable_irq()
4196 wr32(hw, I40E_PFINT_DYN_CTLN(i - 1), 0); in i40e_vsi_disable_irq()
4199 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_vsi_disable_irq()
4200 synchronize_irq(pf->msix_entries[i + base].vector); in i40e_vsi_disable_irq()
4202 /* Legacy and MSI mode - this stops all interrupt handling */ in i40e_vsi_disable_irq()
4206 synchronize_irq(pf->pdev->irq); in i40e_vsi_disable_irq()
4211 * i40e_vsi_enable_irq - Enable IRQ for the given VSI
4216 struct i40e_pf *pf = vsi->back; in i40e_vsi_enable_irq()
4219 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_vsi_enable_irq()
4220 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_vsi_enable_irq()
4226 i40e_flush(&pf->hw); in i40e_vsi_enable_irq()
4231 * i40e_free_misc_vector - Free the vector that handles non-queue events
4237 wr32(&pf->hw, I40E_PFINT_ICR0_ENA, 0); in i40e_free_misc_vector()
4238 i40e_flush(&pf->hw); in i40e_free_misc_vector()
4240 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags) && pf->msix_entries) { in i40e_free_misc_vector()
4241 free_irq(pf->msix_entries[0].vector, pf); in i40e_free_misc_vector()
4242 clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state); in i40e_free_misc_vector()
4247 * i40e_intr - MSI/Legacy and non-queue interrupt handler
4252 * with both queue and non-queue interrupts. This is also used in
4253 * MSIX mode to handle the non-queue interrupts.
4258 struct i40e_hw *hw = &pf->hw; in i40e_intr()
4273 pf->sw_int_count++; in i40e_intr()
4275 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags) && in i40e_intr()
4278 dev_dbg(&pf->pdev->dev, "cleared PE_CRITERR\n"); in i40e_intr()
4279 set_bit(__I40E_CORE_RESET_REQUESTED, pf->state); in i40e_intr()
4285 struct i40e_q_vector *q_vector = vsi->q_vectors[0]; in i40e_intr()
4293 if (!test_bit(__I40E_DOWN, pf->state)) in i40e_intr()
4294 napi_schedule_irqoff(&q_vector->napi); in i40e_intr()
4299 set_bit(__I40E_ADMINQ_EVENT_PENDING, pf->state); in i40e_intr()
4300 i40e_debug(&pf->hw, I40E_DEBUG_NVM, "AdminQ event\n"); in i40e_intr()
4305 set_bit(__I40E_MDD_EVENT_PENDING, pf->state); in i40e_intr()
4310 if (test_bit(__I40E_VF_RESETS_DISABLED, pf->state)) { in i40e_intr()
4317 set_bit(__I40E_VFLR_EVENT_PENDING, pf->state); in i40e_intr()
4322 if (!test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_intr()
4323 set_bit(__I40E_RESET_INTR_RECEIVED, pf->state); in i40e_intr()
4328 pf->corer_count++; in i40e_intr()
4330 pf->globr_count++; in i40e_intr()
4332 pf->empr_count++; in i40e_intr()
4333 set_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state); in i40e_intr()
4339 dev_info(&pf->pdev->dev, "HMC error interrupt\n"); in i40e_intr()
4340 dev_info(&pf->pdev->dev, "HMC error info 0x%x, HMC error data 0x%x\n", in i40e_intr()
4349 schedule_work(&pf->ptp_extts0_work); in i40e_intr()
4363 dev_info(&pf->pdev->dev, "unhandled interrupt icr0=0x%08x\n", in i40e_intr()
4368 dev_info(&pf->pdev->dev, "device will be reset\n"); in i40e_intr()
4369 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_intr()
4377 /* re-enable interrupt causes */ in i40e_intr()
4379 if (!test_bit(__I40E_DOWN, pf->state) || in i40e_intr()
4380 test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_intr()
4389 * i40e_clean_fdir_tx_irq - Reclaim resources after transmit completes
4397 struct i40e_vsi *vsi = tx_ring->vsi; in i40e_clean_fdir_tx_irq()
4398 u16 i = tx_ring->next_to_clean; in i40e_clean_fdir_tx_irq()
4402 tx_buf = &tx_ring->tx_bi[i]; in i40e_clean_fdir_tx_irq()
4404 i -= tx_ring->count; in i40e_clean_fdir_tx_irq()
4407 struct i40e_tx_desc *eop_desc = tx_buf->next_to_watch; in i40e_clean_fdir_tx_irq()
4417 if (!(eop_desc->cmd_type_offset_bsz & in i40e_clean_fdir_tx_irq()
4422 tx_buf->next_to_watch = NULL; in i40e_clean_fdir_tx_irq()
4424 tx_desc->buffer_addr = 0; in i40e_clean_fdir_tx_irq()
4425 tx_desc->cmd_type_offset_bsz = 0; in i40e_clean_fdir_tx_irq()
4431 i -= tx_ring->count; in i40e_clean_fdir_tx_irq()
4432 tx_buf = tx_ring->tx_bi; in i40e_clean_fdir_tx_irq()
4436 dma_unmap_single(tx_ring->dev, in i40e_clean_fdir_tx_irq()
4440 if (tx_buf->tx_flags & I40E_TX_FLAGS_FD_SB) in i40e_clean_fdir_tx_irq()
4441 kfree(tx_buf->raw_buf); in i40e_clean_fdir_tx_irq()
4443 tx_buf->raw_buf = NULL; in i40e_clean_fdir_tx_irq()
4444 tx_buf->tx_flags = 0; in i40e_clean_fdir_tx_irq()
4445 tx_buf->next_to_watch = NULL; in i40e_clean_fdir_tx_irq()
4447 tx_desc->buffer_addr = 0; in i40e_clean_fdir_tx_irq()
4448 tx_desc->cmd_type_offset_bsz = 0; in i40e_clean_fdir_tx_irq()
4455 i -= tx_ring->count; in i40e_clean_fdir_tx_irq()
4456 tx_buf = tx_ring->tx_bi; in i40e_clean_fdir_tx_irq()
4461 budget--; in i40e_clean_fdir_tx_irq()
4464 i += tx_ring->count; in i40e_clean_fdir_tx_irq()
4465 tx_ring->next_to_clean = i; in i40e_clean_fdir_tx_irq()
4467 if (test_bit(I40E_FLAG_MSIX_ENA, vsi->back->flags)) in i40e_clean_fdir_tx_irq()
4468 i40e_irq_dynamic_enable(vsi, tx_ring->q_vector->v_idx); in i40e_clean_fdir_tx_irq()
4474 * i40e_fdir_clean_ring - Interrupt Handler for FDIR SB ring
4483 if (!q_vector->tx.ring) in i40e_fdir_clean_ring()
4486 vsi = q_vector->tx.ring->vsi; in i40e_fdir_clean_ring()
4487 i40e_clean_fdir_tx_irq(q_vector->tx.ring, vsi->work_limit); in i40e_fdir_clean_ring()
4493 * i40e_map_vector_to_qp - Assigns the queue pair to the vector
4500 struct i40e_q_vector *q_vector = vsi->q_vectors[v_idx]; in i40e_map_vector_to_qp()
4501 struct i40e_ring *tx_ring = vsi->tx_rings[qp_idx]; in i40e_map_vector_to_qp()
4502 struct i40e_ring *rx_ring = vsi->rx_rings[qp_idx]; in i40e_map_vector_to_qp()
4504 tx_ring->q_vector = q_vector; in i40e_map_vector_to_qp()
4505 tx_ring->next = q_vector->tx.ring; in i40e_map_vector_to_qp()
4506 q_vector->tx.ring = tx_ring; in i40e_map_vector_to_qp()
4507 q_vector->tx.count++; in i40e_map_vector_to_qp()
4511 struct i40e_ring *xdp_ring = vsi->xdp_rings[qp_idx]; in i40e_map_vector_to_qp()
4513 xdp_ring->q_vector = q_vector; in i40e_map_vector_to_qp()
4514 xdp_ring->next = q_vector->tx.ring; in i40e_map_vector_to_qp()
4515 q_vector->tx.ring = xdp_ring; in i40e_map_vector_to_qp()
4516 q_vector->tx.count++; in i40e_map_vector_to_qp()
4519 rx_ring->q_vector = q_vector; in i40e_map_vector_to_qp()
4520 rx_ring->next = q_vector->rx.ring; in i40e_map_vector_to_qp()
4521 q_vector->rx.ring = rx_ring; in i40e_map_vector_to_qp()
4522 q_vector->rx.count++; in i40e_map_vector_to_qp()
4526 * i40e_vsi_map_rings_to_vectors - Maps descriptor rings to vectors
4529 * This function maps descriptor rings to the queue-specific vectors
4530 * we were allotted through the MSI-X enabling code. Ideally, we'd have
4536 int qp_remaining = vsi->num_queue_pairs; in i40e_vsi_map_rings_to_vectors()
4537 int q_vectors = vsi->num_q_vectors; in i40e_vsi_map_rings_to_vectors()
4542 /* If we don't have enough vectors for a 1-to-1 mapping, we'll have to in i40e_vsi_map_rings_to_vectors()
4550 struct i40e_q_vector *q_vector = vsi->q_vectors[v_start]; in i40e_vsi_map_rings_to_vectors()
4552 num_ringpairs = DIV_ROUND_UP(qp_remaining, q_vectors - v_start); in i40e_vsi_map_rings_to_vectors()
4554 q_vector->num_ringpairs = num_ringpairs; in i40e_vsi_map_rings_to_vectors()
4555 q_vector->reg_idx = q_vector->v_idx + vsi->base_vector - 1; in i40e_vsi_map_rings_to_vectors()
4557 q_vector->rx.count = 0; in i40e_vsi_map_rings_to_vectors()
4558 q_vector->tx.count = 0; in i40e_vsi_map_rings_to_vectors()
4559 q_vector->rx.ring = NULL; in i40e_vsi_map_rings_to_vectors()
4560 q_vector->tx.ring = NULL; in i40e_vsi_map_rings_to_vectors()
4562 while (num_ringpairs--) { in i40e_vsi_map_rings_to_vectors()
4565 qp_remaining--; in i40e_vsi_map_rings_to_vectors()
4571 * i40e_vsi_request_irq - Request IRQ from the OS
4577 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq()
4580 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_vsi_request_irq()
4582 else if (test_bit(I40E_FLAG_MSI_ENA, pf->flags)) in i40e_vsi_request_irq()
4583 err = request_irq(pf->pdev->irq, i40e_intr, 0, in i40e_vsi_request_irq()
4584 pf->int_name, pf); in i40e_vsi_request_irq()
4586 err = request_irq(pf->pdev->irq, i40e_intr, IRQF_SHARED, in i40e_vsi_request_irq()
4587 pf->int_name, pf); in i40e_vsi_request_irq()
4590 dev_info(&pf->pdev->dev, "request_irq failed, Error %d\n", err); in i40e_vsi_request_irq()
4597 * i40e_netpoll - A Polling 'interrupt' handler
4600 * This is used by netconsole to send skbs without having to re-enable
4606 struct i40e_vsi *vsi = np->vsi; in i40e_netpoll()
4607 struct i40e_pf *pf = vsi->back; in i40e_netpoll()
4611 if (test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_netpoll()
4614 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_netpoll()
4615 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_netpoll()
4616 i40e_msix_clean_rings(0, vsi->q_vectors[i]); in i40e_netpoll()
4618 i40e_intr(pf->pdev->irq, netdev); in i40e_netpoll()
4626 * i40e_pf_txq_wait - Wait for a PF's Tx queue to be enabled or disabled
4631 * This routine will wait for the given Tx queue of the PF to reach the
4633 * Returns -ETIMEDOUT in case of failing to reach the requested state after
4642 tx_reg = rd32(&pf->hw, I40E_QTX_ENA(pf_q)); in i40e_pf_txq_wait()
4649 return -ETIMEDOUT; in i40e_pf_txq_wait()
4655 * i40e_control_tx_q - Start or stop a particular Tx queue
4666 struct i40e_hw *hw = &pf->hw; in i40e_control_tx_q()
4671 i40e_pre_tx_queue_cfg(&pf->hw, pf_q, enable); in i40e_control_tx_q()
4699 * i40e_control_wait_tx_q - Start/stop Tx queue and wait for completion
4713 /* wait for the change to finish */ in i40e_control_wait_tx_q()
4716 dev_info(&pf->pdev->dev, in i40e_control_wait_tx_q()
4726 * i40e_vsi_enable_tx - Start a VSI's rings
4731 struct i40e_pf *pf = vsi->back; in i40e_vsi_enable_tx()
4734 pf_q = vsi->base_queue; in i40e_vsi_enable_tx()
4735 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_enable_tx()
4736 ret = i40e_control_wait_tx_q(vsi->seid, pf, in i40e_vsi_enable_tx()
4745 ret = i40e_control_wait_tx_q(vsi->seid, pf, in i40e_vsi_enable_tx()
4746 pf_q + vsi->alloc_queue_pairs, in i40e_vsi_enable_tx()
4755 * i40e_pf_rxq_wait - Wait for a PF's Rx queue to be enabled or disabled
4760 * This routine will wait for the given Rx queue of the PF to reach the
4762 * Returns -ETIMEDOUT in case of failing to reach the requested state after
4771 rx_reg = rd32(&pf->hw, I40E_QRX_ENA(pf_q)); in i40e_pf_rxq_wait()
4778 return -ETIMEDOUT; in i40e_pf_rxq_wait()
4784 * i40e_control_rx_q - Start or stop a particular Rx queue
4795 struct i40e_hw *hw = &pf->hw; in i40e_control_rx_q()
4836 /* wait for the change to finish */ in i40e_control_wait_rx_q()
4845 * i40e_vsi_enable_rx - Start a VSI's rings
4850 struct i40e_pf *pf = vsi->back; in i40e_vsi_enable_rx()
4853 pf_q = vsi->base_queue; in i40e_vsi_enable_rx()
4854 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_enable_rx()
4857 dev_info(&pf->pdev->dev, in i40e_vsi_enable_rx()
4859 vsi->seid, pf_q); in i40e_vsi_enable_rx()
4868 * i40e_vsi_start_rings - Start a VSI's rings
4887 * i40e_vsi_stop_rings - Stop a VSI's rings
4892 struct i40e_pf *pf = vsi->back; in i40e_vsi_stop_rings()
4895 /* When port TX is suspended, don't wait */ in i40e_vsi_stop_rings()
4896 if (test_bit(__I40E_PORT_SUSPENDED, vsi->back->state)) in i40e_vsi_stop_rings()
4899 tx_q_end = vsi->base_queue + in i40e_vsi_stop_rings()
4900 vsi->alloc_queue_pairs * (i40e_enabled_xdp_vsi(vsi) ? 2 : 1); in i40e_vsi_stop_rings()
4901 for (pf_q = vsi->base_queue; pf_q < tx_q_end; pf_q++) in i40e_vsi_stop_rings()
4902 i40e_pre_tx_queue_cfg(&pf->hw, pf_q, false); in i40e_vsi_stop_rings()
4904 rx_q_end = vsi->base_queue + vsi->num_queue_pairs; in i40e_vsi_stop_rings()
4905 for (pf_q = vsi->base_queue; pf_q < rx_q_end; pf_q++) in i40e_vsi_stop_rings()
4909 for (pf_q = vsi->base_queue; pf_q < tx_q_end; pf_q++) in i40e_vsi_stop_rings()
4910 wr32(&pf->hw, I40E_QTX_ENA(pf_q), 0); in i40e_vsi_stop_rings()
4916 * i40e_vsi_stop_rings_no_wait - Stop a VSI's rings and do not delay
4928 struct i40e_pf *pf = vsi->back; in i40e_vsi_stop_rings_no_wait()
4931 pf_q = vsi->base_queue; in i40e_vsi_stop_rings_no_wait()
4932 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_stop_rings_no_wait()
4939 * i40e_vsi_free_irq - Free the irq association with the OS
4944 struct i40e_pf *pf = vsi->back; in i40e_vsi_free_irq()
4945 struct i40e_hw *hw = &pf->hw; in i40e_vsi_free_irq()
4946 int base = vsi->base_vector; in i40e_vsi_free_irq()
4950 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_vsi_free_irq()
4951 if (!vsi->q_vectors) in i40e_vsi_free_irq()
4954 if (!vsi->irqs_ready) in i40e_vsi_free_irq()
4957 vsi->irqs_ready = false; in i40e_vsi_free_irq()
4958 for (i = 0; i < vsi->num_q_vectors; i++) { in i40e_vsi_free_irq()
4963 irq_num = pf->msix_entries[vector].vector; in i40e_vsi_free_irq()
4966 if (!vsi->q_vectors[i] || in i40e_vsi_free_irq()
4967 !vsi->q_vectors[i]->num_ringpairs) in i40e_vsi_free_irq()
4974 free_irq(irq_num, vsi->q_vectors[i]); in i40e_vsi_free_irq()
4983 val = rd32(hw, I40E_PFINT_LNKLSTN(vector - 1)); in i40e_vsi_free_irq()
4988 wr32(hw, I40E_PFINT_LNKLSTN(vector - 1), val); in i40e_vsi_free_irq()
5023 free_irq(pf->pdev->irq, pf); in i40e_vsi_free_irq()
5057 * i40e_free_q_vector - Free memory allocated for specific interrupt vector
5067 struct i40e_q_vector *q_vector = vsi->q_vectors[v_idx]; in i40e_free_q_vector()
5074 i40e_for_each_ring(ring, q_vector->tx) in i40e_free_q_vector()
5075 ring->q_vector = NULL; in i40e_free_q_vector()
5077 i40e_for_each_ring(ring, q_vector->rx) in i40e_free_q_vector()
5078 ring->q_vector = NULL; in i40e_free_q_vector()
5081 if (vsi->netdev) in i40e_free_q_vector()
5082 netif_napi_del(&q_vector->napi); in i40e_free_q_vector()
5084 vsi->q_vectors[v_idx] = NULL; in i40e_free_q_vector()
5090 * i40e_vsi_free_q_vectors - Free memory allocated for interrupt vectors
5091 * @vsi: the VSI being un-configured
5100 for (v_idx = 0; v_idx < vsi->num_q_vectors; v_idx++) in i40e_vsi_free_q_vectors()
5105 * i40e_reset_interrupt_capability - Disable interrupt setup in OS
5111 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_reset_interrupt_capability()
5112 pci_disable_msix(pf->pdev); in i40e_reset_interrupt_capability()
5113 kfree(pf->msix_entries); in i40e_reset_interrupt_capability()
5114 pf->msix_entries = NULL; in i40e_reset_interrupt_capability()
5115 kfree(pf->irq_pile); in i40e_reset_interrupt_capability()
5116 pf->irq_pile = NULL; in i40e_reset_interrupt_capability()
5117 } else if (test_bit(I40E_FLAG_MSI_ENA, pf->flags)) { in i40e_reset_interrupt_capability()
5118 pci_disable_msi(pf->pdev); in i40e_reset_interrupt_capability()
5120 clear_bit(I40E_FLAG_MSI_ENA, pf->flags); in i40e_reset_interrupt_capability()
5121 clear_bit(I40E_FLAG_MSIX_ENA, pf->flags); in i40e_reset_interrupt_capability()
5125 * i40e_clear_interrupt_scheme - Clear the current interrupt scheme settings
5129 * to pre-load conditions
5136 if (test_bit(__I40E_MISC_IRQ_REQUESTED, pf->state)) in i40e_clear_interrupt_scheme()
5139 i40e_put_lump(pf->irq_pile, pf->iwarp_base_vector, in i40e_clear_interrupt_scheme()
5142 i40e_put_lump(pf->irq_pile, 0, I40E_PILE_VALID_BIT-1); in i40e_clear_interrupt_scheme()
5151 * i40e_napi_enable_all - Enable NAPI for all q_vectors in the VSI
5158 if (!vsi->netdev) in i40e_napi_enable_all()
5161 for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) { in i40e_napi_enable_all()
5162 struct i40e_q_vector *q_vector = vsi->q_vectors[q_idx]; in i40e_napi_enable_all()
5164 if (q_vector->rx.ring || q_vector->tx.ring) in i40e_napi_enable_all()
5165 napi_enable(&q_vector->napi); in i40e_napi_enable_all()
5170 * i40e_napi_disable_all - Disable NAPI for all q_vectors in the VSI
5177 if (!vsi->netdev) in i40e_napi_disable_all()
5180 for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) { in i40e_napi_disable_all()
5181 struct i40e_q_vector *q_vector = vsi->q_vectors[q_idx]; in i40e_napi_disable_all()
5183 if (q_vector->rx.ring || q_vector->tx.ring) in i40e_napi_disable_all()
5184 napi_disable(&q_vector->napi); in i40e_napi_disable_all()
5189 * i40e_vsi_close - Shut down a VSI
5194 struct i40e_pf *pf = vsi->back; in i40e_vsi_close()
5195 if (!test_and_set_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_vsi_close()
5200 vsi->current_netdev_flags = 0; in i40e_vsi_close()
5201 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_vsi_close()
5202 if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_vsi_close()
5203 set_bit(__I40E_CLIENT_RESET, pf->state); in i40e_vsi_close()
5207 * i40e_quiesce_vsi - Pause a given VSI
5212 if (test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_quiesce_vsi()
5215 set_bit(__I40E_VSI_NEEDS_RESTART, vsi->state); in i40e_quiesce_vsi()
5216 if (vsi->netdev && netif_running(vsi->netdev)) in i40e_quiesce_vsi()
5217 vsi->netdev->netdev_ops->ndo_stop(vsi->netdev); in i40e_quiesce_vsi()
5223 * i40e_unquiesce_vsi - Resume a given VSI
5228 if (!test_and_clear_bit(__I40E_VSI_NEEDS_RESTART, vsi->state)) in i40e_unquiesce_vsi()
5231 if (vsi->netdev && netif_running(vsi->netdev)) in i40e_unquiesce_vsi()
5232 vsi->netdev->netdev_ops->ndo_open(vsi->netdev); in i40e_unquiesce_vsi()
5238 * i40e_pf_quiesce_all_vsi - Pause all VSIs on a PF
5251 * i40e_pf_unquiesce_all_vsi - Resume all VSIs on a PF
5264 * i40e_vsi_wait_queues_disabled - Wait for VSI's queues to be disabled
5267 * Wait until all queues on a given VSI have been disabled.
5271 struct i40e_pf *pf = vsi->back; in i40e_vsi_wait_queues_disabled()
5274 pf_q = vsi->base_queue; in i40e_vsi_wait_queues_disabled()
5275 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_wait_queues_disabled()
5276 /* Check and wait for the Tx queue */ in i40e_vsi_wait_queues_disabled()
5279 dev_info(&pf->pdev->dev, in i40e_vsi_wait_queues_disabled()
5281 vsi->seid, pf_q); in i40e_vsi_wait_queues_disabled()
5288 /* Check and wait for the XDP Tx queue */ in i40e_vsi_wait_queues_disabled()
5289 ret = i40e_pf_txq_wait(pf, pf_q + vsi->alloc_queue_pairs, in i40e_vsi_wait_queues_disabled()
5292 dev_info(&pf->pdev->dev, in i40e_vsi_wait_queues_disabled()
5294 vsi->seid, pf_q); in i40e_vsi_wait_queues_disabled()
5298 /* Check and wait for the Rx queue */ in i40e_vsi_wait_queues_disabled()
5301 dev_info(&pf->pdev->dev, in i40e_vsi_wait_queues_disabled()
5303 vsi->seid, pf_q); in i40e_vsi_wait_queues_disabled()
5313 * i40e_pf_wait_queues_disabled - Wait for all queues of PF VSIs to be disabled
5336 * i40e_get_iscsi_tc_map - Return TC map for iSCSI APP
5345 struct i40e_hw *hw = &pf->hw; in i40e_get_iscsi_tc_map()
5349 struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config; in i40e_get_iscsi_tc_map()
5351 for (i = 0; i < dcbcfg->numapps; i++) { in i40e_get_iscsi_tc_map()
5352 app = dcbcfg->app[i]; in i40e_get_iscsi_tc_map()
5355 tc = dcbcfg->etscfg.prioritytable[app.priority]; in i40e_get_iscsi_tc_map()
5365 * i40e_dcb_get_num_tc - Get the number of TCs from DCBx config
5368 * Return the number of TCs from given DCBx configuration
5378 * and create a bitmask of enabled TCs in i40e_dcb_get_num_tc()
5381 num_tc |= BIT(dcbcfg->etscfg.prioritytable[i]); in i40e_dcb_get_num_tc()
5384 * contiguous TCs starting with TC0 in i40e_dcb_get_num_tc()
5391 pr_err("Non-contiguous TC - Disabling DCB\n"); in i40e_dcb_get_num_tc()
5407 * i40e_dcb_get_enabled_tc - Get enabled traffic classes
5426 * i40e_mqprio_get_enabled_tc - Get enabled traffic classes
5435 u8 num_tc = vsi->mqprio_qopt.qopt.num_tc; in i40e_mqprio_get_enabled_tc()
5444 * i40e_pf_get_num_tc - Get enabled traffic classes for PF
5457 return vsi->mqprio_qopt.qopt.num_tc; in i40e_pf_get_num_tc()
5461 if (!test_bit(I40E_FLAG_DCB_ENA, pf->flags)) in i40e_pf_get_num_tc()
5464 /* SFP mode will be enabled for all TCs on port */ in i40e_pf_get_num_tc()
5465 if (!test_bit(I40E_FLAG_MFP_ENA, pf->flags)) in i40e_pf_get_num_tc()
5466 return i40e_dcb_get_num_tc(&pf->hw.local_dcbx_config); in i40e_pf_get_num_tc()
5468 /* MFP mode return count of enabled TCs for this PF */ in i40e_pf_get_num_tc()
5469 if (pf->hw.func_caps.iscsi) in i40e_pf_get_num_tc()
5482 * i40e_pf_get_tc_map - Get bitmap for enabled traffic classes
5495 if (!test_bit(I40E_FLAG_DCB_ENA, pf->flags)) in i40e_pf_get_tc_map()
5498 /* SFP mode we want PF to be enabled for all TCs */ in i40e_pf_get_tc_map()
5499 if (!test_bit(I40E_FLAG_MFP_ENA, pf->flags)) in i40e_pf_get_tc_map()
5500 return i40e_dcb_get_enabled_tc(&pf->hw.local_dcbx_config); in i40e_pf_get_tc_map()
5503 if (pf->hw.func_caps.iscsi) in i40e_pf_get_tc_map()
5510 * i40e_vsi_get_bw_info - Query VSI BW Information
5519 struct i40e_pf *pf = vsi->back; in i40e_vsi_get_bw_info()
5520 struct i40e_hw *hw = &pf->hw; in i40e_vsi_get_bw_info()
5526 ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid, &bw_config, NULL); in i40e_vsi_get_bw_info()
5528 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
5531 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_vsi_get_bw_info()
5532 return -EINVAL; in i40e_vsi_get_bw_info()
5536 ret = i40e_aq_query_vsi_ets_sla_config(hw, vsi->seid, &bw_ets_config, in i40e_vsi_get_bw_info()
5539 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
5542 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_vsi_get_bw_info()
5543 return -EINVAL; in i40e_vsi_get_bw_info()
5547 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
5548 "Enabled TCs mismatch from querying VSI BW info 0x%08x 0x%08x\n", in i40e_vsi_get_bw_info()
5554 vsi->bw_limit = le16_to_cpu(bw_config.port_bw_limit); in i40e_vsi_get_bw_info()
5555 vsi->bw_max_quanta = bw_config.max_bw; in i40e_vsi_get_bw_info()
5559 vsi->bw_ets_share_credits[i] = bw_ets_config.share_credits[i]; in i40e_vsi_get_bw_info()
5560 vsi->bw_ets_limit_credits[i] = in i40e_vsi_get_bw_info()
5563 vsi->bw_ets_max_quanta[i] = (u8)((tc_bw_max >> (i*4)) & 0x7); in i40e_vsi_get_bw_info()
5570 * i40e_vsi_configure_bw_alloc - Configure VSI BW allocation per TC
5581 struct i40e_pf *pf = vsi->back; in i40e_vsi_configure_bw_alloc()
5588 if (!vsi->mqprio_qopt.qopt.hw && !test_bit(I40E_FLAG_DCB_ENA, pf->flags)) { in i40e_vsi_configure_bw_alloc()
5589 ret = i40e_set_bw_limit(vsi, vsi->seid, 0); in i40e_vsi_configure_bw_alloc()
5591 dev_info(&pf->pdev->dev, in i40e_vsi_configure_bw_alloc()
5592 "Failed to reset tx rate for vsi->seid %u\n", in i40e_vsi_configure_bw_alloc()
5593 vsi->seid); in i40e_vsi_configure_bw_alloc()
5601 ret = i40e_aq_config_vsi_tc_bw(&pf->hw, vsi->seid, &bw_data, NULL); in i40e_vsi_configure_bw_alloc()
5603 dev_info(&pf->pdev->dev, in i40e_vsi_configure_bw_alloc()
5605 pf->hw.aq.asq_last_status); in i40e_vsi_configure_bw_alloc()
5606 return -EINVAL; in i40e_vsi_configure_bw_alloc()
5610 vsi->info.qs_handle[i] = bw_data.qs_handles[i]; in i40e_vsi_configure_bw_alloc()
5616 * i40e_vsi_config_netdev_tc - Setup the netdev TC configuration
5623 struct net_device *netdev = vsi->netdev; in i40e_vsi_config_netdev_tc()
5624 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_netdev_tc()
5625 struct i40e_hw *hw = &pf->hw; in i40e_vsi_config_netdev_tc()
5628 struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config; in i40e_vsi_config_netdev_tc()
5638 /* Set up actual enabled TCs on the VSI */ in i40e_vsi_config_netdev_tc()
5639 if (netdev_set_num_tc(netdev, vsi->tc_config.numtc)) in i40e_vsi_config_netdev_tc()
5644 /* Only set TC queues for enabled tcs in i40e_vsi_config_netdev_tc()
5651 if (vsi->tc_config.enabled_tc & BIT(i)) in i40e_vsi_config_netdev_tc()
5653 vsi->tc_config.tc_info[i].netdev_tc, in i40e_vsi_config_netdev_tc()
5654 vsi->tc_config.tc_info[i].qcount, in i40e_vsi_config_netdev_tc()
5655 vsi->tc_config.tc_info[i].qoffset); in i40e_vsi_config_netdev_tc()
5664 u8 ets_tc = dcbcfg->etscfg.prioritytable[i]; in i40e_vsi_config_netdev_tc()
5666 netdev_tc = vsi->tc_config.tc_info[ets_tc].netdev_tc; in i40e_vsi_config_netdev_tc()
5672 * i40e_vsi_update_queue_map - Update our copy of VSi info with new queue map
5683 vsi->info.mapping_flags = ctxt->info.mapping_flags; in i40e_vsi_update_queue_map()
5684 memcpy(&vsi->info.queue_mapping, in i40e_vsi_update_queue_map()
5685 &ctxt->info.queue_mapping, sizeof(vsi->info.queue_mapping)); in i40e_vsi_update_queue_map()
5686 memcpy(&vsi->info.tc_mapping, ctxt->info.tc_mapping, in i40e_vsi_update_queue_map()
5687 sizeof(vsi->info.tc_mapping)); in i40e_vsi_update_queue_map()
5691 * i40e_update_adq_vsi_queues - update queue mapping for ADq VSI
5703 return -EINVAL; in i40e_update_adq_vsi_queues()
5704 pf = vsi->back; in i40e_update_adq_vsi_queues()
5705 hw = &pf->hw; in i40e_update_adq_vsi_queues()
5707 ctxt.seid = vsi->seid; in i40e_update_adq_vsi_queues()
5708 ctxt.pf_num = hw->pf_id; in i40e_update_adq_vsi_queues()
5709 ctxt.vf_num = vsi->vf_id + hw->func_caps.vf_base_id + vsi_offset; in i40e_update_adq_vsi_queues()
5710 ctxt.uplink_seid = vsi->uplink_seid; in i40e_update_adq_vsi_queues()
5713 ctxt.info = vsi->info; in i40e_update_adq_vsi_queues()
5715 i40e_vsi_setup_queue_map(vsi, &ctxt, vsi->tc_config.enabled_tc, in i40e_update_adq_vsi_queues()
5717 if (vsi->reconfig_rss) { in i40e_update_adq_vsi_queues()
5718 vsi->rss_size = min_t(int, pf->alloc_rss_size, in i40e_update_adq_vsi_queues()
5719 vsi->num_queue_pairs); in i40e_update_adq_vsi_queues()
5722 dev_info(&pf->pdev->dev, "Failed to reconfig rss for num_queues\n"); in i40e_update_adq_vsi_queues()
5725 vsi->reconfig_rss = false; in i40e_update_adq_vsi_queues()
5730 dev_info(&pf->pdev->dev, "Update vsi config failed, err %pe aq_err %s\n", in i40e_update_adq_vsi_queues()
5732 libie_aq_str(hw->aq.asq_last_status)); in i40e_update_adq_vsi_queues()
5737 vsi->info.valid_sections = 0; in i40e_update_adq_vsi_queues()
5743 * i40e_vsi_config_tc - Configure VSI Tx Scheduler for given TC map
5747 * This configures a particular VSI for TCs that are mapped to the
5748 * given TC bitmap. It uses default bandwidth share for TCs across
5758 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_tc()
5759 struct i40e_hw *hw = &pf->hw; in i40e_vsi_config_tc()
5764 /* Check if enabled_tc is same as existing or new TCs */ in i40e_vsi_config_tc()
5765 if (vsi->tc_config.enabled_tc == enabled_tc && in i40e_vsi_config_tc()
5766 vsi->mqprio_qopt.mode != TC_MQPRIO_MODE_CHANNEL) in i40e_vsi_config_tc()
5769 /* Enable ETS TCs with equal BW Share for now across all VSIs */ in i40e_vsi_config_tc()
5779 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5781 enabled_tc, vsi->seid); in i40e_vsi_config_tc()
5782 ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid, in i40e_vsi_config_tc()
5785 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5788 libie_aq_str(hw->aq.asq_last_status)); in i40e_vsi_config_tc()
5798 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5806 dev_err(&pf->pdev->dev, in i40e_vsi_config_tc()
5808 enabled_tc, vsi->seid); in i40e_vsi_config_tc()
5814 ctxt.seid = vsi->seid; in i40e_vsi_config_tc()
5815 ctxt.pf_num = vsi->back->hw.pf_id; in i40e_vsi_config_tc()
5817 ctxt.uplink_seid = vsi->uplink_seid; in i40e_vsi_config_tc()
5818 ctxt.info = vsi->info; in i40e_vsi_config_tc()
5827 /* On destroying the qdisc, reset vsi->rss_size, as number of enabled in i40e_vsi_config_tc()
5830 if (!vsi->mqprio_qopt.qopt.hw && vsi->reconfig_rss) { in i40e_vsi_config_tc()
5831 vsi->rss_size = min_t(int, vsi->back->alloc_rss_size, in i40e_vsi_config_tc()
5832 vsi->num_queue_pairs); in i40e_vsi_config_tc()
5835 dev_info(&vsi->back->pdev->dev, in i40e_vsi_config_tc()
5839 vsi->reconfig_rss = false; in i40e_vsi_config_tc()
5841 if (test_bit(I40E_FLAG_IWARP_ENA, vsi->back->flags)) { in i40e_vsi_config_tc()
5847 /* Update the VSI after updating the VSI queue-mapping in i40e_vsi_config_tc()
5852 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5855 libie_aq_str(hw->aq.asq_last_status)); in i40e_vsi_config_tc()
5860 vsi->info.valid_sections = 0; in i40e_vsi_config_tc()
5865 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5868 libie_aq_str(hw->aq.asq_last_status)); in i40e_vsi_config_tc()
5879 * i40e_vsi_reconfig_tc - Reconfigure VSI Tx Scheduler for stored TC map
5882 * This reconfigures a particular VSI for TCs that are mapped to the
5894 enabled_tc = vsi->tc_config.enabled_tc; in i40e_vsi_reconfig_tc()
5895 vsi->tc_config.enabled_tc = 0; in i40e_vsi_reconfig_tc()
5901 * i40e_get_link_speed - Returns link speed for the interface
5907 struct i40e_pf *pf = vsi->back; in i40e_get_link_speed()
5909 switch (pf->hw.phy.link_info.link_speed) { in i40e_get_link_speed()
5921 return -EINVAL; in i40e_get_link_speed()
5926 * i40e_bw_bytes_to_mbits - Convert max_tx_rate from bytes to mbits
5935 dev_warn(&vsi->back->pdev->dev, in i40e_bw_bytes_to_mbits()
5946 * i40e_set_bw_limit - setup BW limit for Tx traffic based on max_tx_rate
5955 struct i40e_pf *pf = vsi->back; in i40e_set_bw_limit()
5962 dev_err(&pf->pdev->dev, in i40e_set_bw_limit()
5965 return -EINVAL; in i40e_set_bw_limit()
5968 dev_warn(&pf->pdev->dev, in i40e_set_bw_limit()
5976 ret = i40e_aq_config_vsi_bw_limit(&pf->hw, seid, credits, in i40e_set_bw_limit()
5979 dev_err(&pf->pdev->dev, in i40e_set_bw_limit()
5980 "Failed set tx rate (%llu Mbps) for vsi->seid %u, err %pe aq_err %s\n", in i40e_set_bw_limit()
5982 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_set_bw_limit()
5987 * i40e_remove_queue_channels - Remove queue channels for the TCs
5990 * Remove queue channels for the TCs
5997 struct i40e_pf *pf = vsi->back; in i40e_remove_queue_channels()
6002 * channel VSIs with non-power-of-2 queue count. in i40e_remove_queue_channels()
6004 vsi->current_rss_size = 0; in i40e_remove_queue_channels()
6007 if (list_empty(&vsi->ch_list)) in i40e_remove_queue_channels()
6010 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_remove_queue_channels()
6013 list_del(&ch->list); in i40e_remove_queue_channels()
6014 p_vsi = ch->parent_vsi; in i40e_remove_queue_channels()
6015 if (!p_vsi || !ch->initialized) { in i40e_remove_queue_channels()
6020 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_remove_queue_channels()
6024 pf_q = ch->base_queue + i; in i40e_remove_queue_channels()
6025 tx_ring = vsi->tx_rings[pf_q]; in i40e_remove_queue_channels()
6026 tx_ring->ch = NULL; in i40e_remove_queue_channels()
6028 rx_ring = vsi->rx_rings[pf_q]; in i40e_remove_queue_channels()
6029 rx_ring->ch = NULL; in i40e_remove_queue_channels()
6033 ret = i40e_set_bw_limit(vsi, ch->seid, 0); in i40e_remove_queue_channels()
6035 dev_info(&vsi->back->pdev->dev, in i40e_remove_queue_channels()
6036 "Failed to reset tx rate for ch->seid %u\n", in i40e_remove_queue_channels()
6037 ch->seid); in i40e_remove_queue_channels()
6041 &pf->cloud_filter_list, cloud_node) { in i40e_remove_queue_channels()
6042 if (cfilter->seid != ch->seid) in i40e_remove_queue_channels()
6045 hash_del(&cfilter->cloud_node); in i40e_remove_queue_channels()
6046 if (cfilter->dst_port) in i40e_remove_queue_channels()
6053 last_aq_status = pf->hw.aq.asq_last_status; in i40e_remove_queue_channels()
6055 dev_info(&pf->pdev->dev, in i40e_remove_queue_channels()
6063 ret = i40e_aq_delete_element(&vsi->back->hw, ch->seid, in i40e_remove_queue_channels()
6066 dev_err(&vsi->back->pdev->dev, in i40e_remove_queue_channels()
6068 ch->seid, p_vsi->seid); in i40e_remove_queue_channels()
6071 INIT_LIST_HEAD(&vsi->ch_list); in i40e_remove_queue_channels()
6079 * channels/TCs created.
6086 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_get_max_queues_for_channel()
6087 if (!ch->initialized) in i40e_get_max_queues_for_channel()
6089 if (ch->num_queue_pairs > max) in i40e_get_max_queues_for_channel()
6090 max = ch->num_queue_pairs; in i40e_get_max_queues_for_channel()
6097 * i40e_validate_num_queues - validate num_queues w.r.t channel
6113 return -EINVAL; in i40e_validate_num_queues()
6116 if (vsi->current_rss_size) { in i40e_validate_num_queues()
6117 if (num_queues > vsi->current_rss_size) { in i40e_validate_num_queues()
6118 dev_dbg(&pf->pdev->dev, in i40e_validate_num_queues()
6120 num_queues, vsi->current_rss_size); in i40e_validate_num_queues()
6121 return -EINVAL; in i40e_validate_num_queues()
6122 } else if ((num_queues < vsi->current_rss_size) && in i40e_validate_num_queues()
6124 dev_dbg(&pf->pdev->dev, in i40e_validate_num_queues()
6126 num_queues, vsi->current_rss_size); in i40e_validate_num_queues()
6127 return -EINVAL; in i40e_validate_num_queues()
6139 dev_dbg(&pf->pdev->dev, in i40e_validate_num_queues()
6142 return -EINVAL; in i40e_validate_num_queues()
6151 * i40e_vsi_reconfig_rss - reconfig RSS based on specified rss_size
6159 struct i40e_pf *pf = vsi->back; in i40e_vsi_reconfig_rss()
6161 struct i40e_hw *hw = &pf->hw; in i40e_vsi_reconfig_rss()
6166 if (!vsi->rss_size) in i40e_vsi_reconfig_rss()
6167 return -EINVAL; in i40e_vsi_reconfig_rss()
6169 if (rss_size > vsi->rss_size) in i40e_vsi_reconfig_rss()
6170 return -EINVAL; in i40e_vsi_reconfig_rss()
6172 local_rss_size = min_t(int, vsi->rss_size, rss_size); in i40e_vsi_reconfig_rss()
6173 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in i40e_vsi_reconfig_rss()
6175 return -ENOMEM; in i40e_vsi_reconfig_rss()
6178 i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, local_rss_size); in i40e_vsi_reconfig_rss()
6183 if (vsi->rss_hkey_user) in i40e_vsi_reconfig_rss()
6184 memcpy(seed, vsi->rss_hkey_user, I40E_HKEY_ARRAY_SIZE); in i40e_vsi_reconfig_rss()
6188 ret = i40e_config_rss(vsi, seed, lut, vsi->rss_table_size); in i40e_vsi_reconfig_rss()
6190 dev_info(&pf->pdev->dev, in i40e_vsi_reconfig_rss()
6193 libie_aq_str(hw->aq.asq_last_status)); in i40e_vsi_reconfig_rss()
6200 if (!vsi->orig_rss_size) in i40e_vsi_reconfig_rss()
6201 vsi->orig_rss_size = vsi->rss_size; in i40e_vsi_reconfig_rss()
6202 vsi->current_rss_size = local_rss_size; in i40e_vsi_reconfig_rss()
6208 * i40e_channel_setup_queue_map - Setup a channel queue map
6226 qcount = min_t(int, ch->num_queue_pairs, pf->num_lan_msix); in i40e_channel_setup_queue_map()
6227 ch->num_queue_pairs = qcount; in i40e_channel_setup_queue_map()
6229 /* find the next higher power-of-2 of num queue pairs */ in i40e_channel_setup_queue_map()
6238 ctxt->info.tc_mapping[0] = cpu_to_le16(qmap); in i40e_channel_setup_queue_map()
6240 ctxt->info.up_enable_bits = 0x1; /* TC0 enabled */ in i40e_channel_setup_queue_map()
6241 ctxt->info.mapping_flags |= cpu_to_le16(I40E_AQ_VSI_QUE_MAP_CONTIG); in i40e_channel_setup_queue_map()
6242 ctxt->info.queue_mapping[0] = cpu_to_le16(ch->base_queue); in i40e_channel_setup_queue_map()
6243 ctxt->info.valid_sections |= cpu_to_le16(sections); in i40e_channel_setup_queue_map()
6247 * i40e_add_channel - add a channel by adding VSI
6257 struct i40e_hw *hw = &pf->hw; in i40e_add_channel()
6262 if (ch->type != I40E_VSI_VMDQ2) { in i40e_add_channel()
6263 dev_info(&pf->pdev->dev, in i40e_add_channel()
6264 "add new vsi failed, ch->type %d\n", ch->type); in i40e_add_channel()
6265 return -EINVAL; in i40e_add_channel()
6269 ctxt.pf_num = hw->pf_id; in i40e_add_channel()
6273 if (ch->type == I40E_VSI_VMDQ2) in i40e_add_channel()
6276 if (test_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags)) { in i40e_add_channel()
6289 dev_info(&pf->pdev->dev, in i40e_add_channel()
6292 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_channel()
6293 return -ENOENT; in i40e_add_channel()
6299 ch->enabled_tc = !i40e_is_channel_macvlan(ch) && enabled_tc; in i40e_add_channel()
6300 ch->seid = ctxt.seid; in i40e_add_channel()
6301 ch->vsi_number = ctxt.vsi_number; in i40e_add_channel()
6302 ch->stat_counter_idx = le16_to_cpu(ctxt.info.stat_counter_idx); in i40e_add_channel()
6308 ch->info.mapping_flags = ctxt.info.mapping_flags; in i40e_add_channel()
6309 memcpy(&ch->info.queue_mapping, in i40e_add_channel()
6311 memcpy(&ch->info.tc_mapping, ctxt.info.tc_mapping, in i40e_add_channel()
6325 bw_data.tc_valid_bits = ch->enabled_tc; in i40e_channel_config_bw()
6329 ret = i40e_aq_config_vsi_tc_bw(&vsi->back->hw, ch->seid, in i40e_channel_config_bw()
6332 dev_info(&vsi->back->pdev->dev, in i40e_channel_config_bw()
6333 "Config VSI BW allocation per TC failed, aq_err: %d for new_vsi->seid %u\n", in i40e_channel_config_bw()
6334 vsi->back->hw.aq.asq_last_status, ch->seid); in i40e_channel_config_bw()
6335 return -EINVAL; in i40e_channel_config_bw()
6339 ch->info.qs_handle[i] = bw_data.qs_handles[i]; in i40e_channel_config_bw()
6345 * i40e_channel_config_tx_ring - config TX ring associated with new channel
6361 /* Enable ETS TCs with equal BW Share for now across all VSIs */ in i40e_channel_config_tx_ring()
6363 if (ch->enabled_tc & BIT(i)) in i40e_channel_config_tx_ring()
6370 dev_info(&vsi->back->pdev->dev, in i40e_channel_config_tx_ring()
6372 ch->enabled_tc, ch->seid); in i40e_channel_config_tx_ring()
6376 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_channel_config_tx_ring()
6380 pf_q = ch->base_queue + i; in i40e_channel_config_tx_ring()
6382 /* Get to TX ring ptr of main VSI, for re-setup TX queue in i40e_channel_config_tx_ring()
6385 tx_ring = vsi->tx_rings[pf_q]; in i40e_channel_config_tx_ring()
6386 tx_ring->ch = ch; in i40e_channel_config_tx_ring()
6389 rx_ring = vsi->rx_rings[pf_q]; in i40e_channel_config_tx_ring()
6390 rx_ring->ch = ch; in i40e_channel_config_tx_ring()
6397 * i40e_setup_hw_channel - setup new channel
6414 ch->initialized = false; in i40e_setup_hw_channel()
6415 ch->base_queue = vsi->next_base_queue; in i40e_setup_hw_channel()
6416 ch->type = type; in i40e_setup_hw_channel()
6421 dev_info(&pf->pdev->dev, in i40e_setup_hw_channel()
6428 ch->initialized = true; in i40e_setup_hw_channel()
6433 dev_info(&pf->pdev->dev, in i40e_setup_hw_channel()
6435 ch->seid); in i40e_setup_hw_channel()
6440 vsi->next_base_queue = vsi->next_base_queue + ch->num_queue_pairs; in i40e_setup_hw_channel()
6441 dev_dbg(&pf->pdev->dev, in i40e_setup_hw_channel()
6442 …"Added channel: vsi_seid %u, vsi_number %u, stat_counter_idx %u, num_queue_pairs %u, pf->next_base… in i40e_setup_hw_channel()
6443 ch->seid, ch->vsi_number, ch->stat_counter_idx, in i40e_setup_hw_channel()
6444 ch->num_queue_pairs, in i40e_setup_hw_channel()
6445 vsi->next_base_queue); in i40e_setup_hw_channel()
6450 * i40e_setup_channel - setup new channel using uplink element
6466 if (vsi->type == I40E_VSI_MAIN) { in i40e_setup_channel()
6469 dev_err(&pf->pdev->dev, "unsupported parent vsi type(%d)\n", in i40e_setup_channel()
6470 vsi->type); in i40e_setup_channel()
6476 seid = main_vsi->uplink_seid; in i40e_setup_channel()
6481 dev_err(&pf->pdev->dev, "failed to setup hw_channel\n"); in i40e_setup_channel()
6485 return ch->initialized ? true : false; in i40e_setup_channel()
6489 * i40e_validate_and_set_switch_mode - sets up switch mode correctly
6498 struct i40e_pf *pf = vsi->back; in i40e_validate_and_set_switch_mode()
6499 struct i40e_hw *hw = &pf->hw; in i40e_validate_and_set_switch_mode()
6504 return -EINVAL; in i40e_validate_and_set_switch_mode()
6506 if (hw->dev_caps.switch_mode) { in i40e_validate_and_set_switch_mode()
6507 /* if switch mode is set, support mode2 (non-tunneled for in i40e_validate_and_set_switch_mode()
6510 u32 switch_mode = hw->dev_caps.switch_mode & in i40e_validate_and_set_switch_mode()
6515 dev_err(&pf->pdev->dev, in i40e_validate_and_set_switch_mode()
6516 "Invalid switch_mode (%d), only non-tunneled mode for cloud filter is supported\n", in i40e_validate_and_set_switch_mode()
6517 hw->dev_caps.switch_mode); in i40e_validate_and_set_switch_mode()
6518 return -EINVAL; in i40e_validate_and_set_switch_mode()
6532 ret = i40e_aq_set_switch_config(hw, pf->last_sw_conf_flags, in i40e_validate_and_set_switch_mode()
6533 pf->last_sw_conf_valid_flags, in i40e_validate_and_set_switch_mode()
6535 if (ret && hw->aq.asq_last_status != LIBIE_AQ_RC_ESRCH) in i40e_validate_and_set_switch_mode()
6536 dev_err(&pf->pdev->dev, in i40e_validate_and_set_switch_mode()
6538 ERR_PTR(ret), libie_aq_str(hw->aq.asq_last_status)); in i40e_validate_and_set_switch_mode()
6544 * i40e_create_queue_channel - function to create channel
6554 struct i40e_pf *pf = vsi->back; in i40e_create_queue_channel()
6559 return -EINVAL; in i40e_create_queue_channel()
6561 if (!ch->num_queue_pairs) { in i40e_create_queue_channel()
6562 dev_err(&pf->pdev->dev, "Invalid num_queues requested: %d\n", in i40e_create_queue_channel()
6563 ch->num_queue_pairs); in i40e_create_queue_channel()
6564 return -EINVAL; in i40e_create_queue_channel()
6568 err = i40e_validate_num_queues(pf, ch->num_queue_pairs, vsi, in i40e_create_queue_channel()
6571 dev_info(&pf->pdev->dev, "Failed to validate num_queues (%d)\n", in i40e_create_queue_channel()
6572 ch->num_queue_pairs); in i40e_create_queue_channel()
6573 return -EINVAL; in i40e_create_queue_channel()
6580 if (!test_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags)) { in i40e_create_queue_channel()
6581 set_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags); in i40e_create_queue_channel()
6583 if (vsi->type == I40E_VSI_MAIN) { in i40e_create_queue_channel()
6594 /* By this time, vsi->cnt_q_avail shall be set to non-zero and in i40e_create_queue_channel()
6597 if (!vsi->cnt_q_avail || vsi->cnt_q_avail < ch->num_queue_pairs) { in i40e_create_queue_channel()
6598 dev_dbg(&pf->pdev->dev, in i40e_create_queue_channel()
6600 vsi->cnt_q_avail, ch->num_queue_pairs); in i40e_create_queue_channel()
6601 return -EINVAL; in i40e_create_queue_channel()
6605 if (reconfig_rss && (vsi->type == I40E_VSI_MAIN)) { in i40e_create_queue_channel()
6606 err = i40e_vsi_reconfig_rss(vsi, ch->num_queue_pairs); in i40e_create_queue_channel()
6608 dev_info(&pf->pdev->dev, in i40e_create_queue_channel()
6610 ch->num_queue_pairs); in i40e_create_queue_channel()
6611 return -EINVAL; in i40e_create_queue_channel()
6616 dev_info(&pf->pdev->dev, "Failed to setup channel\n"); in i40e_create_queue_channel()
6617 return -EINVAL; in i40e_create_queue_channel()
6620 dev_info(&pf->pdev->dev, in i40e_create_queue_channel()
6622 ch->seid, ch->num_queue_pairs); in i40e_create_queue_channel()
6625 if (ch->max_tx_rate) { in i40e_create_queue_channel()
6626 u64 credits = ch->max_tx_rate; in i40e_create_queue_channel()
6628 if (i40e_set_bw_limit(vsi, ch->seid, ch->max_tx_rate)) in i40e_create_queue_channel()
6629 return -EINVAL; in i40e_create_queue_channel()
6632 dev_dbg(&pf->pdev->dev, in i40e_create_queue_channel()
6633 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_create_queue_channel()
6634 ch->max_tx_rate, in i40e_create_queue_channel()
6636 ch->seid); in i40e_create_queue_channel()
6640 ch->parent_vsi = vsi; in i40e_create_queue_channel()
6643 vsi->cnt_q_avail -= ch->num_queue_pairs; in i40e_create_queue_channel()
6649 * i40e_configure_queue_channels - Add queue channel for the given TCs
6652 * Configures queue channel mapping to the given TCs
6660 /* Create app vsi with the TCs. Main VSI with TC0 is already set up */ in i40e_configure_queue_channels()
6661 vsi->tc_seid_map[0] = vsi->seid; in i40e_configure_queue_channels()
6663 if (vsi->tc_config.enabled_tc & BIT(i)) { in i40e_configure_queue_channels()
6666 ret = -ENOMEM; in i40e_configure_queue_channels()
6670 INIT_LIST_HEAD(&ch->list); in i40e_configure_queue_channels()
6671 ch->num_queue_pairs = in i40e_configure_queue_channels()
6672 vsi->tc_config.tc_info[i].qcount; in i40e_configure_queue_channels()
6673 ch->base_queue = in i40e_configure_queue_channels()
6674 vsi->tc_config.tc_info[i].qoffset; in i40e_configure_queue_channels()
6679 max_rate = vsi->mqprio_qopt.max_rate[i]; in i40e_configure_queue_channels()
6681 ch->max_tx_rate = max_rate; in i40e_configure_queue_channels()
6683 list_add_tail(&ch->list, &vsi->ch_list); in i40e_configure_queue_channels()
6687 dev_err(&vsi->back->pdev->dev, in i40e_configure_queue_channels()
6689 i, ch->num_queue_pairs); in i40e_configure_queue_channels()
6692 vsi->tc_seid_map[i] = ch->seid; in i40e_configure_queue_channels()
6697 i40e_do_reset(vsi->back, I40E_PF_RESET_FLAG, true); in i40e_configure_queue_channels()
6706 * i40e_veb_config_tc - Configure TCs for given VEB
6715 struct i40e_pf *pf = veb->pf; in i40e_veb_config_tc()
6719 /* No TCs or already enabled TCs just return */ in i40e_veb_config_tc()
6720 if (!enabled_tc || veb->enabled_tc == enabled_tc) in i40e_veb_config_tc()
6726 /* Enable ETS TCs with equal BW Share for now */ in i40e_veb_config_tc()
6732 ret = i40e_aq_config_switch_comp_bw_config(&pf->hw, veb->seid, in i40e_veb_config_tc()
6735 dev_info(&pf->pdev->dev, in i40e_veb_config_tc()
6737 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_veb_config_tc()
6744 dev_info(&pf->pdev->dev, in i40e_veb_config_tc()
6746 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_veb_config_tc()
6755 * i40e_dcb_reconfigure - Reconfigure all VEBs and VSIs
6770 /* Enable the TCs available on PF to all VEBs */ in i40e_dcb_reconfigure()
6778 dev_info(&pf->pdev->dev, in i40e_dcb_reconfigure()
6780 veb->seid); in i40e_dcb_reconfigure()
6787 /* - Enable all TCs for the LAN VSI in i40e_dcb_reconfigure()
6788 * - For all others keep them at TC0 for now in i40e_dcb_reconfigure()
6790 if (vsi->type == I40E_VSI_MAIN) in i40e_dcb_reconfigure()
6797 dev_info(&pf->pdev->dev, in i40e_dcb_reconfigure()
6799 vsi->seid); in i40e_dcb_reconfigure()
6802 /* Re-configure VSI vectors based on updated TC map */ in i40e_dcb_reconfigure()
6804 if (vsi->netdev) in i40e_dcb_reconfigure()
6811 * i40e_resume_port_tx - Resume port Tx
6819 struct i40e_hw *hw = &pf->hw; in i40e_resume_port_tx()
6824 dev_info(&pf->pdev->dev, in i40e_resume_port_tx()
6827 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_resume_port_tx()
6829 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_resume_port_tx()
6837 * i40e_suspend_port_tx - Suspend port Tx
6844 struct i40e_hw *hw = &pf->hw; in i40e_suspend_port_tx()
6847 ret = i40e_aq_suspend_port_tx(hw, pf->mac_seid, NULL); in i40e_suspend_port_tx()
6849 dev_info(&pf->pdev->dev, in i40e_suspend_port_tx()
6851 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_suspend_port_tx()
6853 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_suspend_port_tx()
6861 * i40e_hw_set_dcb_config - Program new DCBX settings into HW
6871 struct i40e_dcbx_config *old_cfg = &pf->hw.local_dcbx_config; in i40e_hw_set_dcb_config()
6876 dev_dbg(&pf->pdev->dev, "No Change in DCB Config required.\n"); in i40e_hw_set_dcb_config()
6885 old_cfg->etsrec = old_cfg->etscfg; in i40e_hw_set_dcb_config()
6886 ret = i40e_set_dcb_config(&pf->hw); in i40e_hw_set_dcb_config()
6888 dev_info(&pf->pdev->dev, in i40e_hw_set_dcb_config()
6890 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_hw_set_dcb_config()
6898 if (!test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) { in i40e_hw_set_dcb_config()
6899 /* Re-start the VSIs if disabled */ in i40e_hw_set_dcb_config()
6911 * i40e_hw_dcb_config - Program new DCBX settings into HW
6926 struct i40e_hw *hw = &pf->hw; in i40e_hw_dcb_config()
6927 u8 num_ports = hw->num_ports; in i40e_hw_dcb_config()
6929 int ret = -EINVAL; in i40e_hw_dcb_config()
6935 dev_dbg(&pf->pdev->dev, "Configuring DCB registers directly\n"); in i40e_hw_dcb_config()
6936 /* Un-pack information to Program ETS HW via shared API in i40e_hw_dcb_config()
6939 * ETS/NON-ETS arbiter mode in i40e_hw_dcb_config()
6942 * PFC priority bit-map in i40e_hw_dcb_config()
6946 * TSA table (ETS or non-ETS) in i40e_hw_dcb_config()
6956 switch (new_cfg->etscfg.tsatable[i]) { in i40e_hw_dcb_config()
6960 new_cfg->etscfg.tcbwtable[i]; in i40e_hw_dcb_config()
6975 old_cfg = &hw->local_dcbx_config; in i40e_hw_dcb_config()
6985 set_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_hw_dcb_config()
6987 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_hw_dcb_config()
6989 set_bit(__I40E_PORT_SUSPENDED, pf->state); in i40e_hw_dcb_config()
7001 (hw, pf->mac_seid, &ets_data, in i40e_hw_dcb_config()
7004 dev_info(&pf->pdev->dev, in i40e_hw_dcb_config()
7006 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_hw_dcb_config()
7018 i40e_dcb_hw_rx_ets_bw_config(hw, new_cfg->etscfg.tcbwtable, mode, in i40e_hw_dcb_config()
7020 i40e_dcb_hw_pfc_config(hw, new_cfg->pfc.pfcenable, in i40e_hw_dcb_config()
7021 new_cfg->etscfg.prioritytable); in i40e_hw_dcb_config()
7022 i40e_dcb_hw_rx_up2tc_config(hw, new_cfg->etscfg.prioritytable); in i40e_hw_dcb_config()
7028 mfs_tc[i] = main_vsi->netdev->mtu; in i40e_hw_dcb_config()
7033 false, new_cfg->pfc.pfcenable, in i40e_hw_dcb_config()
7035 i40e_dcb_hw_rx_pb_config(hw, &pf->pb_cfg, &pb_cfg); in i40e_hw_dcb_config()
7038 pf->pb_cfg = pb_cfg; in i40e_hw_dcb_config()
7041 ret = i40e_aq_dcb_updated(&pf->hw, NULL); in i40e_hw_dcb_config()
7043 dev_info(&pf->pdev->dev, in i40e_hw_dcb_config()
7045 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_hw_dcb_config()
7055 /* Re-start the VSIs if disabled */ in i40e_hw_dcb_config()
7059 clear_bit(__I40E_PORT_SUSPENDED, pf->state); in i40e_hw_dcb_config()
7064 /* Wait for the PF's queues to be disabled */ in i40e_hw_dcb_config()
7068 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_hw_dcb_config()
7073 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_hw_dcb_config()
7074 set_bit(__I40E_CLIENT_L2_CHANGE, pf->state); in i40e_hw_dcb_config()
7077 if (test_bit(I40E_HW_CAP_USE_SET_LLDP_MIB, pf->hw.caps)) in i40e_hw_dcb_config()
7086 * i40e_dcb_sw_default_config - Set default DCB configuration when DCB in SW
7093 struct i40e_dcbx_config *dcb_cfg = &pf->hw.local_dcbx_config; in i40e_dcb_sw_default_config()
7095 struct i40e_hw *hw = &pf->hw; in i40e_dcb_sw_default_config()
7098 if (test_bit(I40E_HW_CAP_USE_SET_LLDP_MIB, pf->hw.caps)) { in i40e_dcb_sw_default_config()
7100 memset(&pf->tmp_cfg, 0, sizeof(struct i40e_dcbx_config)); in i40e_dcb_sw_default_config()
7101 pf->tmp_cfg.etscfg.willing = I40E_IEEE_DEFAULT_ETS_WILLING; in i40e_dcb_sw_default_config()
7102 pf->tmp_cfg.etscfg.maxtcs = 0; in i40e_dcb_sw_default_config()
7103 pf->tmp_cfg.etscfg.tcbwtable[0] = I40E_IEEE_DEFAULT_ETS_TCBW; in i40e_dcb_sw_default_config()
7104 pf->tmp_cfg.etscfg.tsatable[0] = I40E_IEEE_TSA_ETS; in i40e_dcb_sw_default_config()
7105 pf->tmp_cfg.pfc.willing = I40E_IEEE_DEFAULT_PFC_WILLING; in i40e_dcb_sw_default_config()
7106 pf->tmp_cfg.pfc.pfccap = I40E_MAX_TRAFFIC_CLASS; in i40e_dcb_sw_default_config()
7108 pf->tmp_cfg.numapps = I40E_IEEE_DEFAULT_NUM_APPS; in i40e_dcb_sw_default_config()
7109 pf->tmp_cfg.app[0].selector = I40E_APP_SEL_ETHTYPE; in i40e_dcb_sw_default_config()
7110 pf->tmp_cfg.app[0].priority = I40E_IEEE_DEFAULT_APP_PRIO; in i40e_dcb_sw_default_config()
7111 pf->tmp_cfg.app[0].protocolid = I40E_APP_PROTOID_FCOE; in i40e_dcb_sw_default_config()
7113 return i40e_hw_set_dcb_config(pf, &pf->tmp_cfg); in i40e_dcb_sw_default_config()
7123 (hw, pf->mac_seid, &ets_data, in i40e_dcb_sw_default_config()
7126 dev_info(&pf->pdev->dev, in i40e_dcb_sw_default_config()
7128 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_dcb_sw_default_config()
7129 err = -ENOENT; in i40e_dcb_sw_default_config()
7134 dcb_cfg->etscfg.willing = I40E_IEEE_DEFAULT_ETS_WILLING; in i40e_dcb_sw_default_config()
7135 dcb_cfg->etscfg.cbs = 0; in i40e_dcb_sw_default_config()
7136 dcb_cfg->etscfg.maxtcs = I40E_MAX_TRAFFIC_CLASS; in i40e_dcb_sw_default_config()
7137 dcb_cfg->etscfg.tcbwtable[0] = I40E_IEEE_DEFAULT_ETS_TCBW; in i40e_dcb_sw_default_config()
7144 * i40e_init_pf_dcb - Initialize DCB configuration
7152 struct i40e_hw *hw = &pf->hw; in i40e_init_pf_dcb()
7158 if (test_bit(I40E_HW_CAP_NO_DCB_SUPPORT, pf->hw.caps)) { in i40e_init_pf_dcb()
7159 dev_info(&pf->pdev->dev, "DCB is not supported.\n"); in i40e_init_pf_dcb()
7160 err = -EOPNOTSUPP; in i40e_init_pf_dcb()
7163 if (test_bit(I40E_FLAG_FW_LLDP_DIS, pf->flags)) { in i40e_init_pf_dcb()
7164 dev_info(&pf->pdev->dev, "FW LLDP is disabled, attempting SW DCB\n"); in i40e_init_pf_dcb()
7167 dev_info(&pf->pdev->dev, "Could not initialize SW DCB\n"); in i40e_init_pf_dcb()
7170 dev_info(&pf->pdev->dev, "SW DCB initialization succeeded.\n"); in i40e_init_pf_dcb()
7171 pf->dcbx_cap = DCB_CAP_DCBX_HOST | in i40e_init_pf_dcb()
7174 set_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_init_pf_dcb()
7175 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_init_pf_dcb()
7181 if ((!hw->func_caps.dcb) || in i40e_init_pf_dcb()
7182 (hw->dcbx_status == I40E_DCBX_STATUS_DISABLED)) { in i40e_init_pf_dcb()
7183 dev_info(&pf->pdev->dev, in i40e_init_pf_dcb()
7187 pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED | in i40e_init_pf_dcb()
7190 set_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_init_pf_dcb()
7194 if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1) in i40e_init_pf_dcb()
7195 set_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_init_pf_dcb()
7197 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_init_pf_dcb()
7198 dev_dbg(&pf->pdev->dev, in i40e_init_pf_dcb()
7201 } else if (pf->hw.aq.asq_last_status == LIBIE_AQ_RC_EPERM) { in i40e_init_pf_dcb()
7202 dev_info(&pf->pdev->dev, "FW LLDP disabled for this PF.\n"); in i40e_init_pf_dcb()
7203 set_bit(I40E_FLAG_FW_LLDP_DIS, pf->flags); in i40e_init_pf_dcb()
7205 dev_info(&pf->pdev->dev, in i40e_init_pf_dcb()
7207 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_init_pf_dcb()
7221 if (vsi->netdev->ethtool_ops->get_eee) in i40e_print_link_message_eee()
7222 vsi->netdev->ethtool_ops->get_eee(vsi->netdev, &kedata); in i40e_print_link_message_eee()
7225 netdev_info(vsi->netdev, in i40e_print_link_message_eee()
7230 netdev_info(vsi->netdev, in i40e_print_link_message_eee()
7236 * i40e_print_link_message - print link up or down
7243 struct i40e_pf *pf = vsi->back; in i40e_print_link_message()
7251 new_speed = pf->hw.phy.link_info.link_speed; in i40e_print_link_message()
7255 if ((vsi->current_isup == isup) && (vsi->current_speed == new_speed)) in i40e_print_link_message()
7257 vsi->current_isup = isup; in i40e_print_link_message()
7258 vsi->current_speed = new_speed; in i40e_print_link_message()
7260 netdev_info(vsi->netdev, "NIC Link is Down\n"); in i40e_print_link_message()
7267 if (pf->hw.func_caps.npar_enable && in i40e_print_link_message()
7268 (pf->hw.phy.link_info.link_speed == I40E_LINK_SPEED_1GB || in i40e_print_link_message()
7269 pf->hw.phy.link_info.link_speed == I40E_LINK_SPEED_100MB)) in i40e_print_link_message()
7270 netdev_warn(vsi->netdev, in i40e_print_link_message()
7273 switch (pf->hw.phy.link_info.link_speed) { in i40e_print_link_message()
7302 switch (pf->hw.fc.current_mode) { in i40e_print_link_message()
7317 if (pf->hw.phy.link_info.link_speed == I40E_LINK_SPEED_25GB) { in i40e_print_link_message()
7322 if (pf->hw.phy.link_info.an_info & I40E_AQ_AN_COMPLETED) in i40e_print_link_message()
7325 if (pf->hw.phy.link_info.fec_info & in i40e_print_link_message()
7327 fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
7328 else if (pf->hw.phy.link_info.fec_info & in i40e_print_link_message()
7330 fec = "CL108 RS-FEC"; in i40e_print_link_message()
7332 /* 'CL108 RS-FEC' should be displayed when RS is requested, or in i40e_print_link_message()
7335 if (vsi->back->hw.phy.link_info.req_fec_info & in i40e_print_link_message()
7337 if (vsi->back->hw.phy.link_info.req_fec_info & in i40e_print_link_message()
7339 req_fec = "CL108 RS-FEC"; in i40e_print_link_message()
7341 req_fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
7343 netdev_info(vsi->netdev, in i40e_print_link_message()
7346 } else if (pf->hw.device_id == I40E_DEV_ID_KX_X722) { in i40e_print_link_message()
7351 if (pf->hw.phy.link_info.an_info & I40E_AQ_AN_COMPLETED) in i40e_print_link_message()
7354 if (pf->hw.phy.link_info.fec_info & in i40e_print_link_message()
7356 fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
7358 if (pf->hw.phy.link_info.req_fec_info & in i40e_print_link_message()
7360 req_fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
7362 netdev_info(vsi->netdev, in i40e_print_link_message()
7372 * i40e_up_complete - Finish the last steps of bringing up a connection
7377 struct i40e_pf *pf = vsi->back; in i40e_up_complete()
7380 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_up_complete()
7390 clear_bit(__I40E_VSI_DOWN, vsi->state); in i40e_up_complete()
7394 if ((pf->hw.phy.link_info.link_info & I40E_AQ_LINK_UP) && in i40e_up_complete()
7395 (vsi->netdev)) { in i40e_up_complete()
7397 netif_tx_start_all_queues(vsi->netdev); in i40e_up_complete()
7398 netif_carrier_on(vsi->netdev); in i40e_up_complete()
7402 if (vsi->type == I40E_VSI_FDIR) { in i40e_up_complete()
7404 pf->fd_add_err = 0; in i40e_up_complete()
7405 pf->fd_atr_cnt = 0; in i40e_up_complete()
7412 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_up_complete()
7419 * i40e_vsi_reinit_locked - Reset the VSI
7427 struct i40e_pf *pf = vsi->back; in i40e_vsi_reinit_locked()
7429 while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) in i40e_vsi_reinit_locked()
7434 clear_bit(__I40E_CONFIG_BUSY, pf->state); in i40e_vsi_reinit_locked()
7438 * i40e_force_link_state - Force the link status
7447 struct i40e_hw *hw = &pf->hw; in i40e_force_link_state()
7461 dev_err(&pf->pdev->dev, in i40e_force_link_state()
7463 ERR_PTR(err), libie_aq_str(hw->aq.asq_last_status)); in i40e_force_link_state()
7472 dev_err(&pf->pdev->dev, in i40e_force_link_state()
7474 ERR_PTR(err), libie_aq_str(hw->aq.asq_last_status)); in i40e_force_link_state()
7482 if (test_bit(I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENA, pf->flags)) in i40e_force_link_state()
7498 if (test_bit(I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENA, pf->flags)) { in i40e_force_link_state()
7516 dev_err(&pf->pdev->dev, in i40e_force_link_state()
7518 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_force_link_state()
7525 /* Wait a little bit (on 40G cards it sometimes takes a really in i40e_force_link_state()
7539 * i40e_up - Bring the connection back up after being down
7546 if (vsi->type == I40E_VSI_MAIN && in i40e_up()
7547 (test_bit(I40E_FLAG_LINK_DOWN_ON_CLOSE_ENA, vsi->back->flags) || in i40e_up()
7548 test_bit(I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENA, vsi->back->flags))) in i40e_up()
7549 i40e_force_link_state(vsi->back, true); in i40e_up()
7559 * i40e_down - Shutdown the connection processing
7567 * sets the vsi->state __I40E_VSI_DOWN bit. in i40e_down()
7569 if (vsi->netdev) { in i40e_down()
7570 netif_carrier_off(vsi->netdev); in i40e_down()
7571 netif_tx_disable(vsi->netdev); in i40e_down()
7575 if (vsi->type == I40E_VSI_MAIN && in i40e_down()
7576 (test_bit(I40E_FLAG_LINK_DOWN_ON_CLOSE_ENA, vsi->back->flags) || in i40e_down()
7577 test_bit(I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENA, vsi->back->flags))) in i40e_down()
7578 i40e_force_link_state(vsi->back, false); in i40e_down()
7581 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_down()
7582 i40e_clean_tx_ring(vsi->tx_rings[i]); in i40e_down()
7584 /* Make sure that in-progress ndo_xdp_xmit and in i40e_down()
7588 i40e_clean_tx_ring(vsi->xdp_rings[i]); in i40e_down()
7590 i40e_clean_rx_ring(vsi->rx_rings[i]); in i40e_down()
7596 * i40e_validate_mqprio_qopt- validate queue mapping info
7607 if (mqprio_qopt->qopt.offset[0] != 0 || in i40e_validate_mqprio_qopt()
7608 mqprio_qopt->qopt.num_tc < 1 || in i40e_validate_mqprio_qopt()
7609 mqprio_qopt->qopt.num_tc > I40E_MAX_TRAFFIC_CLASS) in i40e_validate_mqprio_qopt()
7610 return -EINVAL; in i40e_validate_mqprio_qopt()
7612 if (!mqprio_qopt->qopt.count[i]) in i40e_validate_mqprio_qopt()
7613 return -EINVAL; in i40e_validate_mqprio_qopt()
7614 if (mqprio_qopt->min_rate[i]) { in i40e_validate_mqprio_qopt()
7615 dev_err(&vsi->back->pdev->dev, in i40e_validate_mqprio_qopt()
7617 return -EINVAL; in i40e_validate_mqprio_qopt()
7619 max_rate = mqprio_qopt->max_rate[i]; in i40e_validate_mqprio_qopt()
7623 if (i >= mqprio_qopt->qopt.num_tc - 1) in i40e_validate_mqprio_qopt()
7625 if (mqprio_qopt->qopt.offset[i + 1] != in i40e_validate_mqprio_qopt()
7626 (mqprio_qopt->qopt.offset[i] + mqprio_qopt->qopt.count[i])) in i40e_validate_mqprio_qopt()
7627 return -EINVAL; in i40e_validate_mqprio_qopt()
7629 if (vsi->num_queue_pairs < in i40e_validate_mqprio_qopt()
7630 (mqprio_qopt->qopt.offset[i] + mqprio_qopt->qopt.count[i])) { in i40e_validate_mqprio_qopt()
7631 dev_err(&vsi->back->pdev->dev, in i40e_validate_mqprio_qopt()
7633 return -EINVAL; in i40e_validate_mqprio_qopt()
7636 dev_err(&vsi->back->pdev->dev, in i40e_validate_mqprio_qopt()
7638 return -EINVAL; in i40e_validate_mqprio_qopt()
7644 * i40e_vsi_set_default_tc_config - set default values for tc configuration
7653 vsi->tc_config.numtc = 1; in i40e_vsi_set_default_tc_config()
7654 vsi->tc_config.enabled_tc = 1; in i40e_vsi_set_default_tc_config()
7655 qcount = min_t(int, vsi->alloc_queue_pairs, in i40e_vsi_set_default_tc_config()
7656 i40e_pf_get_max_q_per_tc(vsi->back)); in i40e_vsi_set_default_tc_config()
7661 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_set_default_tc_config()
7663 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_set_default_tc_config()
7665 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_set_default_tc_config()
7666 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_set_default_tc_config()
7691 *aq_err = hw->aq.asq_last_status; in i40e_del_macvlan_filter()
7720 *aq_err = hw->aq.asq_last_status; in i40e_add_macvlan_filter()
7726 * i40e_reset_ch_rings - Reset the queue contexts in a channel
7736 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_reset_ch_rings()
7737 pf_q = ch->base_queue + i; in i40e_reset_ch_rings()
7738 tx_ring = vsi->tx_rings[pf_q]; in i40e_reset_ch_rings()
7739 tx_ring->ch = NULL; in i40e_reset_ch_rings()
7740 rx_ring = vsi->rx_rings[pf_q]; in i40e_reset_ch_rings()
7741 rx_ring->ch = NULL; in i40e_reset_ch_rings()
7758 if (list_empty(&vsi->macvlan_list)) in i40e_free_macvlan_channels()
7761 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_free_macvlan_channels()
7766 clear_bit(ch->fwd->bit_no, vsi->fwd_bitmask); in i40e_free_macvlan_channels()
7767 netdev_unbind_sb_channel(vsi->netdev, ch->fwd->netdev); in i40e_free_macvlan_channels()
7768 netdev_set_sb_channel(ch->fwd->netdev, 0); in i40e_free_macvlan_channels()
7769 kfree(ch->fwd); in i40e_free_macvlan_channels()
7770 ch->fwd = NULL; in i40e_free_macvlan_channels()
7773 list_del(&ch->list); in i40e_free_macvlan_channels()
7774 parent_vsi = ch->parent_vsi; in i40e_free_macvlan_channels()
7775 if (!parent_vsi || !ch->initialized) { in i40e_free_macvlan_channels()
7781 ret = i40e_aq_delete_element(&vsi->back->hw, ch->seid, in i40e_free_macvlan_channels()
7784 dev_err(&vsi->back->pdev->dev, in i40e_free_macvlan_channels()
7786 ch->seid, parent_vsi->seid); in i40e_free_macvlan_channels()
7789 vsi->macvlan_cnt = 0; in i40e_free_macvlan_channels()
7793 * i40e_fwd_ring_up - bring the macvlan device up
7803 struct i40e_pf *pf = vsi->back; in i40e_fwd_ring_up()
7804 struct i40e_hw *hw = &pf->hw; in i40e_fwd_ring_up()
7807 list_for_each_entry_safe(iter, ch_tmp, &vsi->macvlan_list, list) { in i40e_fwd_ring_up()
7809 iter->fwd = fwd; in i40e_fwd_ring_up()
7812 netdev_bind_sb_channel_queue(vsi->netdev, vdev, in i40e_fwd_ring_up()
7814 iter->num_queue_pairs, in i40e_fwd_ring_up()
7815 iter->base_queue); in i40e_fwd_ring_up()
7816 for (i = 0; i < iter->num_queue_pairs; i++) { in i40e_fwd_ring_up()
7820 pf_q = iter->base_queue + i; in i40e_fwd_ring_up()
7823 tx_ring = vsi->tx_rings[pf_q]; in i40e_fwd_ring_up()
7824 tx_ring->ch = iter; in i40e_fwd_ring_up()
7827 rx_ring = vsi->rx_rings[pf_q]; in i40e_fwd_ring_up()
7828 rx_ring->ch = iter; in i40e_fwd_ring_up()
7836 return -EINVAL; in i40e_fwd_ring_up()
7844 ret = i40e_add_macvlan_filter(hw, ch->seid, vdev->dev_addr, &aq_err); in i40e_fwd_ring_up()
7848 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_fwd_ring_up()
7852 pf_q = ch->base_queue + i; in i40e_fwd_ring_up()
7853 rx_ring = vsi->rx_rings[pf_q]; in i40e_fwd_ring_up()
7854 rx_ring->netdev = NULL; in i40e_fwd_ring_up()
7856 dev_info(&pf->pdev->dev, in i40e_fwd_ring_up()
7866 * i40e_setup_macvlans - create the channels which will be macvlans
7875 struct i40e_pf *pf = vsi->back; in i40e_setup_macvlans()
7876 struct i40e_hw *hw = &pf->hw; in i40e_setup_macvlans()
7883 if (vsi->type != I40E_VSI_MAIN || !macvlan_cnt) in i40e_setup_macvlans()
7884 return -EINVAL; in i40e_setup_macvlans()
7886 num_qps = vsi->num_queue_pairs - (macvlan_cnt * qcnt); in i40e_setup_macvlans()
7888 /* find the next higher power-of-2 of num queue pairs */ in i40e_setup_macvlans()
7889 pow = fls(roundup_pow_of_two(num_qps) - 1); in i40e_setup_macvlans()
7898 ctxt.seid = vsi->seid; in i40e_setup_macvlans()
7899 ctxt.pf_num = vsi->back->hw.pf_id; in i40e_setup_macvlans()
7901 ctxt.uplink_seid = vsi->uplink_seid; in i40e_setup_macvlans()
7902 ctxt.info = vsi->info; in i40e_setup_macvlans()
7905 ctxt.info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_setup_macvlans()
7909 vsi->rss_size = max_t(u16, num_qps, qcnt); in i40e_setup_macvlans()
7912 dev_info(&pf->pdev->dev, in i40e_setup_macvlans()
7914 vsi->rss_size); in i40e_setup_macvlans()
7917 vsi->reconfig_rss = true; in i40e_setup_macvlans()
7918 dev_dbg(&vsi->back->pdev->dev, in i40e_setup_macvlans()
7919 "Reconfigured RSS with num_queues (%u)\n", vsi->rss_size); in i40e_setup_macvlans()
7920 vsi->next_base_queue = num_qps; in i40e_setup_macvlans()
7921 vsi->cnt_q_avail = vsi->num_queue_pairs - num_qps; in i40e_setup_macvlans()
7923 /* Update the VSI after updating the VSI queue-mapping in i40e_setup_macvlans()
7928 dev_info(&pf->pdev->dev, in i40e_setup_macvlans()
7930 ERR_PTR(ret), libie_aq_str(hw->aq.asq_last_status)); in i40e_setup_macvlans()
7935 vsi->info.valid_sections = 0; in i40e_setup_macvlans()
7938 INIT_LIST_HEAD(&vsi->macvlan_list); in i40e_setup_macvlans()
7942 ret = -ENOMEM; in i40e_setup_macvlans()
7945 INIT_LIST_HEAD(&ch->list); in i40e_setup_macvlans()
7946 ch->num_queue_pairs = qcnt; in i40e_setup_macvlans()
7948 ret = -EINVAL; in i40e_setup_macvlans()
7952 ch->parent_vsi = vsi; in i40e_setup_macvlans()
7953 vsi->cnt_q_avail -= ch->num_queue_pairs; in i40e_setup_macvlans()
7954 vsi->macvlan_cnt++; in i40e_setup_macvlans()
7955 list_add_tail(&ch->list, &vsi->macvlan_list); in i40e_setup_macvlans()
7961 dev_info(&pf->pdev->dev, "Failed to setup macvlans\n"); in i40e_setup_macvlans()
7968 * i40e_fwd_add - configure macvlans
7976 struct i40e_vsi *vsi = np->vsi; in i40e_fwd_add()
7977 struct i40e_pf *pf = vsi->back; in i40e_fwd_add()
7981 if (test_bit(I40E_FLAG_DCB_ENA, pf->flags)) { in i40e_fwd_add()
7983 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7987 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7989 if (pf->num_lan_msix < I40E_MIN_MACVLAN_VECTORS) { in i40e_fwd_add()
7991 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7998 return ERR_PTR(-ERANGE); in i40e_fwd_add()
8000 if (!vsi->macvlan_cnt) { in i40e_fwd_add()
8002 set_bit(0, vsi->fwd_bitmask); in i40e_fwd_add()
8008 vectors = pf->num_lan_msix; in i40e_fwd_add()
8012 macvlan_cnt = (vectors - 32) / 4; in i40e_fwd_add()
8016 macvlan_cnt = (vectors - 16) / 2; in i40e_fwd_add()
8020 macvlan_cnt = vectors - 16; in i40e_fwd_add()
8024 macvlan_cnt = vectors - 8; in i40e_fwd_add()
8028 macvlan_cnt = vectors - 1; in i40e_fwd_add()
8032 return ERR_PTR(-EBUSY); in i40e_fwd_add()
8046 avail_macvlan = find_first_zero_bit(vsi->fwd_bitmask, in i40e_fwd_add()
8047 vsi->macvlan_cnt); in i40e_fwd_add()
8049 return ERR_PTR(-EBUSY); in i40e_fwd_add()
8054 return ERR_PTR(-ENOMEM); in i40e_fwd_add()
8056 set_bit(avail_macvlan, vsi->fwd_bitmask); in i40e_fwd_add()
8057 fwd->bit_no = avail_macvlan; in i40e_fwd_add()
8059 fwd->netdev = vdev; in i40e_fwd_add()
8072 return ERR_PTR(-EINVAL); in i40e_fwd_add()
8079 * i40e_del_all_macvlans - Delete all the mac filters on the channels
8085 struct i40e_pf *pf = vsi->back; in i40e_del_all_macvlans()
8086 struct i40e_hw *hw = &pf->hw; in i40e_del_all_macvlans()
8089 if (list_empty(&vsi->macvlan_list)) in i40e_del_all_macvlans()
8092 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_del_all_macvlans()
8094 ret = i40e_del_macvlan_filter(hw, ch->seid, in i40e_del_all_macvlans()
8100 clear_bit(ch->fwd->bit_no, vsi->fwd_bitmask); in i40e_del_all_macvlans()
8101 netdev_unbind_sb_channel(vsi->netdev, in i40e_del_all_macvlans()
8102 ch->fwd->netdev); in i40e_del_all_macvlans()
8103 netdev_set_sb_channel(ch->fwd->netdev, 0); in i40e_del_all_macvlans()
8104 kfree(ch->fwd); in i40e_del_all_macvlans()
8105 ch->fwd = NULL; in i40e_del_all_macvlans()
8112 * i40e_fwd_del - delete macvlan interfaces
8121 struct i40e_vsi *vsi = np->vsi; in i40e_fwd_del()
8122 struct i40e_pf *pf = vsi->back; in i40e_fwd_del()
8123 struct i40e_hw *hw = &pf->hw; in i40e_fwd_del()
8127 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_fwd_del()
8130 fwd->netdev->dev_addr)) { in i40e_fwd_del()
8131 ret = i40e_del_macvlan_filter(hw, ch->seid, in i40e_fwd_del()
8137 clear_bit(ch->fwd->bit_no, vsi->fwd_bitmask); in i40e_fwd_del()
8138 netdev_unbind_sb_channel(netdev, fwd->netdev); in i40e_fwd_del()
8139 netdev_set_sb_channel(fwd->netdev, 0); in i40e_fwd_del()
8140 kfree(ch->fwd); in i40e_fwd_del()
8141 ch->fwd = NULL; in i40e_fwd_del()
8143 dev_info(&pf->pdev->dev, in i40e_fwd_del()
8153 * i40e_setup_tc - configure multiple traffic classes
8161 struct i40e_vsi *vsi = np->vsi; in i40e_setup_tc()
8162 struct i40e_pf *pf = vsi->back; in i40e_setup_tc()
8166 int ret = -EINVAL; in i40e_setup_tc()
8170 old_queue_pairs = vsi->num_queue_pairs; in i40e_setup_tc()
8171 num_tc = mqprio_qopt->qopt.num_tc; in i40e_setup_tc()
8172 hw = mqprio_qopt->qopt.hw; in i40e_setup_tc()
8173 mode = mqprio_qopt->mode; in i40e_setup_tc()
8175 clear_bit(I40E_FLAG_TC_MQPRIO_ENA, pf->flags); in i40e_setup_tc()
8176 memcpy(&vsi->mqprio_qopt, mqprio_qopt, sizeof(*mqprio_qopt)); in i40e_setup_tc()
8181 if (test_bit(I40E_FLAG_MFP_ENA, pf->flags)) { in i40e_setup_tc()
8188 clear_bit(I40E_FLAG_TC_MQPRIO_ENA, pf->flags); in i40e_setup_tc()
8191 if (!test_bit(I40E_FLAG_DCB_ENA, pf->flags)) { in i40e_setup_tc()
8205 if (test_bit(I40E_FLAG_DCB_ENA, pf->flags)) { in i40e_setup_tc()
8210 if (!test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_setup_tc()
8215 memcpy(&vsi->mqprio_qopt, mqprio_qopt, in i40e_setup_tc()
8217 set_bit(I40E_FLAG_TC_MQPRIO_ENA, pf->flags); in i40e_setup_tc()
8218 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_setup_tc()
8221 return -EINVAL; in i40e_setup_tc()
8230 if (enabled_tc == vsi->tc_config.enabled_tc && in i40e_setup_tc()
8240 /* Configure VSI for enabled TCs */ in i40e_setup_tc()
8244 vsi->seid); in i40e_setup_tc()
8248 (!is_power_of_2(vsi->tc_config.tc_info[0].qcount))) { in i40e_setup_tc()
8251 vsi->tc_config.tc_info[0].qcount); in i40e_setup_tc()
8252 ret = -EINVAL; in i40e_setup_tc()
8257 dev_info(&vsi->back->pdev->dev, in i40e_setup_tc()
8259 vsi->seid, vsi->tc_config.tc_info[0].qcount); in i40e_setup_tc()
8262 if (vsi->mqprio_qopt.max_rate[0]) { in i40e_setup_tc()
8264 vsi->mqprio_qopt.max_rate[0]); in i40e_setup_tc()
8266 ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate); in i40e_setup_tc()
8271 dev_dbg(&vsi->back->pdev->dev, in i40e_setup_tc()
8272 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_setup_tc()
8275 vsi->seid); in i40e_setup_tc()
8283 vsi->num_queue_pairs = old_queue_pairs; in i40e_setup_tc()
8304 * i40e_set_cld_element - sets cloud filter element data
8318 ether_addr_copy(cld->outer_mac, filter->dst_mac); in i40e_set_cld_element()
8319 ether_addr_copy(cld->inner_mac, filter->src_mac); in i40e_set_cld_element()
8321 if (filter->n_proto != ETH_P_IP && filter->n_proto != ETH_P_IPV6) in i40e_set_cld_element()
8324 if (filter->n_proto == ETH_P_IPV6) { in i40e_set_cld_element()
8325 #define IPV6_MAX_INDEX (ARRAY_SIZE(filter->dst_ipv6) - 1) in i40e_set_cld_element()
8326 for (i = 0; i < ARRAY_SIZE(filter->dst_ipv6); i++) { in i40e_set_cld_element()
8327 ipa = be32_to_cpu(filter->dst_ipv6[IPV6_MAX_INDEX - i]); in i40e_set_cld_element()
8329 *(__le32 *)&cld->ipaddr.raw_v6.data[i * 2] = cpu_to_le32(ipa); in i40e_set_cld_element()
8332 ipa = be32_to_cpu(filter->dst_ipv4); in i40e_set_cld_element()
8334 memcpy(&cld->ipaddr.v4.data, &ipa, sizeof(ipa)); in i40e_set_cld_element()
8337 cld->inner_vlan = cpu_to_le16(ntohs(filter->vlan_id)); in i40e_set_cld_element()
8340 * fill the cld->tenant_id with cpu_to_le32(filter->tenant_id) in i40e_set_cld_element()
8342 if (filter->tenant_id) in i40e_set_cld_element()
8347 * i40e_add_del_cloud_filter - Add/del cloud filter
8359 struct i40e_pf *pf = vsi->back; in i40e_add_del_cloud_filter()
8378 if (filter->flags >= ARRAY_SIZE(flag_table)) in i40e_add_del_cloud_filter()
8379 return -EIO; in i40e_add_del_cloud_filter()
8386 if (filter->tunnel_type != I40E_CLOUD_TNL_TYPE_NONE) in i40e_add_del_cloud_filter()
8387 cld_filter.flags = cpu_to_le16(filter->tunnel_type << in i40e_add_del_cloud_filter()
8390 if (filter->n_proto == ETH_P_IPV6) in i40e_add_del_cloud_filter()
8391 cld_filter.flags |= cpu_to_le16(flag_table[filter->flags] | in i40e_add_del_cloud_filter()
8394 cld_filter.flags |= cpu_to_le16(flag_table[filter->flags] | in i40e_add_del_cloud_filter()
8398 ret = i40e_aq_add_cloud_filters(&pf->hw, filter->seid, in i40e_add_del_cloud_filter()
8401 ret = i40e_aq_rem_cloud_filters(&pf->hw, filter->seid, in i40e_add_del_cloud_filter()
8404 dev_dbg(&pf->pdev->dev, in i40e_add_del_cloud_filter()
8406 add ? "add" : "delete", filter->dst_port, ret, in i40e_add_del_cloud_filter()
8407 pf->hw.aq.asq_last_status); in i40e_add_del_cloud_filter()
8409 dev_info(&pf->pdev->dev, in i40e_add_del_cloud_filter()
8411 add ? "Added" : "Deleted", filter->seid); in i40e_add_del_cloud_filter()
8416 * i40e_add_del_cloud_filter_big_buf - Add/del cloud filter using big_buf
8429 struct i40e_pf *pf = vsi->back; in i40e_add_del_cloud_filter_big_buf()
8433 if ((is_valid_ether_addr(filter->dst_mac) && in i40e_add_del_cloud_filter_big_buf()
8434 is_valid_ether_addr(filter->src_mac)) || in i40e_add_del_cloud_filter_big_buf()
8435 (is_multicast_ether_addr(filter->dst_mac) && in i40e_add_del_cloud_filter_big_buf()
8436 is_multicast_ether_addr(filter->src_mac))) in i40e_add_del_cloud_filter_big_buf()
8437 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
8439 /* Big buffer cloud filter needs 'L4 port' to be non-zero. Also, UDP in i40e_add_del_cloud_filter_big_buf()
8442 if (!filter->dst_port || filter->ip_proto == IPPROTO_UDP) in i40e_add_del_cloud_filter_big_buf()
8443 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
8446 if (filter->src_port || in i40e_add_del_cloud_filter_big_buf()
8447 (filter->src_ipv4 && filter->n_proto != ETH_P_IPV6) || in i40e_add_del_cloud_filter_big_buf()
8448 !ipv6_addr_any(&filter->ip.v6.src_ip6)) in i40e_add_del_cloud_filter_big_buf()
8449 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
8456 if (is_valid_ether_addr(filter->dst_mac) || in i40e_add_del_cloud_filter_big_buf()
8457 is_valid_ether_addr(filter->src_mac) || in i40e_add_del_cloud_filter_big_buf()
8458 is_multicast_ether_addr(filter->dst_mac) || in i40e_add_del_cloud_filter_big_buf()
8459 is_multicast_ether_addr(filter->src_mac)) { in i40e_add_del_cloud_filter_big_buf()
8461 if (filter->dst_ipv4) in i40e_add_del_cloud_filter_big_buf()
8462 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
8471 if (filter->vlan_id) { in i40e_add_del_cloud_filter_big_buf()
8476 } else if ((filter->dst_ipv4 && filter->n_proto != ETH_P_IPV6) || in i40e_add_del_cloud_filter_big_buf()
8477 !ipv6_addr_any(&filter->ip.v6.dst_ip6)) { in i40e_add_del_cloud_filter_big_buf()
8480 if (filter->n_proto == ETH_P_IPV6) in i40e_add_del_cloud_filter_big_buf()
8487 dev_err(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
8489 return -EINVAL; in i40e_add_del_cloud_filter_big_buf()
8494 be16_to_cpu(filter->dst_port); in i40e_add_del_cloud_filter_big_buf()
8500 dev_err(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
8506 ret = i40e_aq_add_cloud_filters_bb(&pf->hw, filter->seid, in i40e_add_del_cloud_filter_big_buf()
8509 ret = i40e_aq_rem_cloud_filters_bb(&pf->hw, filter->seid, in i40e_add_del_cloud_filter_big_buf()
8514 dev_dbg(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
8516 add ? "add" : "delete", ret, pf->hw.aq.asq_last_status); in i40e_add_del_cloud_filter_big_buf()
8518 dev_info(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
8520 add ? "add" : "delete", filter->seid, in i40e_add_del_cloud_filter_big_buf()
8521 ntohs(filter->dst_port)); in i40e_add_del_cloud_filter_big_buf()
8526 * i40e_parse_cls_flower - Parse tc flower filters provided by kernel
8537 struct flow_dissector *dissector = rule->match.dissector; in i40e_parse_cls_flower()
8539 struct i40e_pf *pf = vsi->back; in i40e_parse_cls_flower()
8542 if (dissector->used_keys & in i40e_parse_cls_flower()
8551 dev_err(&pf->pdev->dev, "Unsupported key used: 0x%llx\n", in i40e_parse_cls_flower()
8552 dissector->used_keys); in i40e_parse_cls_flower()
8553 return -EOPNOTSUPP; in i40e_parse_cls_flower()
8560 if (match.mask->keyid != 0) in i40e_parse_cls_flower()
8563 filter->tenant_id = be32_to_cpu(match.key->keyid); in i40e_parse_cls_flower()
8570 n_proto_key = ntohs(match.key->n_proto); in i40e_parse_cls_flower()
8571 n_proto_mask = ntohs(match.mask->n_proto); in i40e_parse_cls_flower()
8577 filter->n_proto = n_proto_key & n_proto_mask; in i40e_parse_cls_flower()
8578 filter->ip_proto = match.key->ip_proto; in i40e_parse_cls_flower()
8587 if (!is_zero_ether_addr(match.mask->dst)) { in i40e_parse_cls_flower()
8588 if (is_broadcast_ether_addr(match.mask->dst)) { in i40e_parse_cls_flower()
8591 dev_err(&pf->pdev->dev, "Bad ether dest mask %pM\n", in i40e_parse_cls_flower()
8592 match.mask->dst); in i40e_parse_cls_flower()
8593 return -EIO; in i40e_parse_cls_flower()
8597 if (!is_zero_ether_addr(match.mask->src)) { in i40e_parse_cls_flower()
8598 if (is_broadcast_ether_addr(match.mask->src)) { in i40e_parse_cls_flower()
8601 dev_err(&pf->pdev->dev, "Bad ether src mask %pM\n", in i40e_parse_cls_flower()
8602 match.mask->src); in i40e_parse_cls_flower()
8603 return -EIO; in i40e_parse_cls_flower()
8606 ether_addr_copy(filter->dst_mac, match.key->dst); in i40e_parse_cls_flower()
8607 ether_addr_copy(filter->src_mac, match.key->src); in i40e_parse_cls_flower()
8614 if (match.mask->vlan_id) { in i40e_parse_cls_flower()
8615 if (match.mask->vlan_id == VLAN_VID_MASK) { in i40e_parse_cls_flower()
8619 dev_err(&pf->pdev->dev, "Bad vlan mask 0x%04x\n", in i40e_parse_cls_flower()
8620 match.mask->vlan_id); in i40e_parse_cls_flower()
8621 return -EIO; in i40e_parse_cls_flower()
8625 filter->vlan_id = cpu_to_be16(match.key->vlan_id); in i40e_parse_cls_flower()
8632 addr_type = match.key->addr_type; in i40e_parse_cls_flower()
8634 if (flow_rule_has_control_flags(match.mask->flags, in i40e_parse_cls_flower()
8635 f->common.extack)) in i40e_parse_cls_flower()
8636 return -EOPNOTSUPP; in i40e_parse_cls_flower()
8643 if (match.mask->dst) { in i40e_parse_cls_flower()
8644 if (match.mask->dst == cpu_to_be32(0xffffffff)) { in i40e_parse_cls_flower()
8647 dev_err(&pf->pdev->dev, "Bad ip dst mask %pI4b\n", in i40e_parse_cls_flower()
8648 &match.mask->dst); in i40e_parse_cls_flower()
8649 return -EIO; in i40e_parse_cls_flower()
8653 if (match.mask->src) { in i40e_parse_cls_flower()
8654 if (match.mask->src == cpu_to_be32(0xffffffff)) { in i40e_parse_cls_flower()
8657 dev_err(&pf->pdev->dev, "Bad ip src mask %pI4b\n", in i40e_parse_cls_flower()
8658 &match.mask->src); in i40e_parse_cls_flower()
8659 return -EIO; in i40e_parse_cls_flower()
8664 dev_err(&pf->pdev->dev, "Tenant id not allowed for ip filter\n"); in i40e_parse_cls_flower()
8665 return -EIO; in i40e_parse_cls_flower()
8667 filter->dst_ipv4 = match.key->dst; in i40e_parse_cls_flower()
8668 filter->src_ipv4 = match.key->src; in i40e_parse_cls_flower()
8679 if (ipv6_addr_loopback(&match.key->dst) || in i40e_parse_cls_flower()
8680 ipv6_addr_loopback(&match.key->src)) { in i40e_parse_cls_flower()
8681 dev_err(&pf->pdev->dev, in i40e_parse_cls_flower()
8683 return -EIO; in i40e_parse_cls_flower()
8685 if (!ipv6_addr_any(&match.mask->dst) || in i40e_parse_cls_flower()
8686 !ipv6_addr_any(&match.mask->src)) in i40e_parse_cls_flower()
8689 memcpy(&filter->src_ipv6, &match.key->src.s6_addr32, in i40e_parse_cls_flower()
8690 sizeof(filter->src_ipv6)); in i40e_parse_cls_flower()
8691 memcpy(&filter->dst_ipv6, &match.key->dst.s6_addr32, in i40e_parse_cls_flower()
8692 sizeof(filter->dst_ipv6)); in i40e_parse_cls_flower()
8699 if (match.mask->src) { in i40e_parse_cls_flower()
8700 if (match.mask->src == cpu_to_be16(0xffff)) { in i40e_parse_cls_flower()
8703 dev_err(&pf->pdev->dev, "Bad src port mask 0x%04x\n", in i40e_parse_cls_flower()
8704 be16_to_cpu(match.mask->src)); in i40e_parse_cls_flower()
8705 return -EIO; in i40e_parse_cls_flower()
8709 if (match.mask->dst) { in i40e_parse_cls_flower()
8710 if (match.mask->dst == cpu_to_be16(0xffff)) { in i40e_parse_cls_flower()
8713 dev_err(&pf->pdev->dev, "Bad dst port mask 0x%04x\n", in i40e_parse_cls_flower()
8714 be16_to_cpu(match.mask->dst)); in i40e_parse_cls_flower()
8715 return -EIO; in i40e_parse_cls_flower()
8719 filter->dst_port = match.key->dst; in i40e_parse_cls_flower()
8720 filter->src_port = match.key->src; in i40e_parse_cls_flower()
8722 switch (filter->ip_proto) { in i40e_parse_cls_flower()
8727 dev_err(&pf->pdev->dev, in i40e_parse_cls_flower()
8729 return -EINVAL; in i40e_parse_cls_flower()
8732 filter->flags = field_flags; in i40e_parse_cls_flower()
8750 filter->seid = vsi->seid; in i40e_handle_tclass()
8752 } else if (vsi->tc_config.enabled_tc & BIT(tc)) { in i40e_handle_tclass()
8753 if (!filter->dst_port) { in i40e_handle_tclass()
8754 dev_err(&vsi->back->pdev->dev, in i40e_handle_tclass()
8756 return -EINVAL; in i40e_handle_tclass()
8758 if (list_empty(&vsi->ch_list)) in i40e_handle_tclass()
8759 return -EINVAL; in i40e_handle_tclass()
8760 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, in i40e_handle_tclass()
8762 if (ch->seid == vsi->tc_seid_map[tc]) in i40e_handle_tclass()
8763 filter->seid = ch->seid; in i40e_handle_tclass()
8767 dev_err(&vsi->back->pdev->dev, "TC is not enabled\n"); in i40e_handle_tclass()
8768 return -EINVAL; in i40e_handle_tclass()
8772 * i40e_configure_clsflower - Configure tc flower filters
8780 int tc = tc_classid_to_hwtc(vsi->netdev, cls_flower->classid); in i40e_configure_clsflower()
8782 struct i40e_pf *pf = vsi->back; in i40e_configure_clsflower()
8786 dev_err(&vsi->back->pdev->dev, "Invalid traffic class\n"); in i40e_configure_clsflower()
8787 return -EOPNOTSUPP; in i40e_configure_clsflower()
8791 dev_err(&pf->pdev->dev, "Unable to add filter because of invalid destination"); in i40e_configure_clsflower()
8792 return -EINVAL; in i40e_configure_clsflower()
8795 if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) || in i40e_configure_clsflower()
8796 test_bit(__I40E_RESET_INTR_RECEIVED, pf->state)) in i40e_configure_clsflower()
8797 return -EBUSY; in i40e_configure_clsflower()
8799 if (pf->fdir_pf_active_filters || in i40e_configure_clsflower()
8800 (!hlist_empty(&pf->fdir_filter_list))) { in i40e_configure_clsflower()
8801 dev_err(&vsi->back->pdev->dev, in i40e_configure_clsflower()
8803 return -EINVAL; in i40e_configure_clsflower()
8806 if (test_bit(I40E_FLAG_FD_SB_ENA, vsi->back->flags)) { in i40e_configure_clsflower()
8807 dev_err(&vsi->back->pdev->dev, in i40e_configure_clsflower()
8808 "Disable Flow Director Sideband, configuring Cloud filters via tc-flower\n"); in i40e_configure_clsflower()
8809 clear_bit(I40E_FLAG_FD_SB_ENA, vsi->back->flags); in i40e_configure_clsflower()
8810 clear_bit(I40E_FLAG_FD_SB_TO_CLOUD_FILTER, vsi->back->flags); in i40e_configure_clsflower()
8815 return -ENOMEM; in i40e_configure_clsflower()
8817 filter->cookie = cls_flower->cookie; in i40e_configure_clsflower()
8828 if (filter->dst_port) in i40e_configure_clsflower()
8834 dev_err(&pf->pdev->dev, "Failed to add cloud filter, err %d\n", in i40e_configure_clsflower()
8840 INIT_HLIST_NODE(&filter->cloud_node); in i40e_configure_clsflower()
8842 hlist_add_head(&filter->cloud_node, &pf->cloud_filter_list); in i40e_configure_clsflower()
8844 pf->num_cloud_filters++; in i40e_configure_clsflower()
8853 * i40e_find_cloud_filter - Find the could filter in the list
8865 &vsi->back->cloud_filter_list, cloud_node) in i40e_find_cloud_filter()
8866 if (!memcmp(cookie, &filter->cookie, sizeof(filter->cookie))) in i40e_find_cloud_filter()
8872 * i40e_delete_clsflower - Remove tc flower filters
8881 struct i40e_pf *pf = vsi->back; in i40e_delete_clsflower()
8884 filter = i40e_find_cloud_filter(vsi, &cls_flower->cookie); in i40e_delete_clsflower()
8887 return -EINVAL; in i40e_delete_clsflower()
8889 hash_del(&filter->cloud_node); in i40e_delete_clsflower()
8891 if (filter->dst_port) in i40e_delete_clsflower()
8898 dev_err(&pf->pdev->dev, in i40e_delete_clsflower()
8901 return i40e_aq_rc_to_posix(err, pf->hw.aq.asq_last_status); in i40e_delete_clsflower()
8904 pf->num_cloud_filters--; in i40e_delete_clsflower()
8905 if (!pf->num_cloud_filters) in i40e_delete_clsflower()
8906 if (test_bit(I40E_FLAG_FD_SB_TO_CLOUD_FILTER, pf->flags) && in i40e_delete_clsflower()
8907 !test_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags)) { in i40e_delete_clsflower()
8908 set_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_delete_clsflower()
8909 clear_bit(I40E_FLAG_FD_SB_TO_CLOUD_FILTER, pf->flags); in i40e_delete_clsflower()
8910 clear_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_delete_clsflower()
8916 * i40e_setup_tc_cls_flower - flower classifier offloads
8923 struct i40e_vsi *vsi = np->vsi; in i40e_setup_tc_cls_flower()
8925 switch (cls_flower->command) { in i40e_setup_tc_cls_flower()
8931 return -EOPNOTSUPP; in i40e_setup_tc_cls_flower()
8933 return -EOPNOTSUPP; in i40e_setup_tc_cls_flower()
8942 if (!tc_cls_can_offload_and_chain0(np->vsi->netdev, type_data)) in i40e_setup_tc_block_cb()
8943 return -EOPNOTSUPP; in i40e_setup_tc_block_cb()
8950 return -EOPNOTSUPP; in i40e_setup_tc_block_cb()
8970 return -EOPNOTSUPP; in __i40e_setup_tc()
8975 * i40e_open - Called when a network interface is made active
8989 struct i40e_vsi *vsi = np->vsi; in i40e_open()
8990 struct i40e_pf *pf = vsi->back; in i40e_open()
8994 if (test_bit(__I40E_TESTING, pf->state) || in i40e_open()
8995 test_bit(__I40E_BAD_EEPROM, pf->state)) in i40e_open()
8996 return -EBUSY; in i40e_open()
9001 return -EAGAIN; in i40e_open()
9008 wr32(&pf->hw, I40E_GLLAN_TSOMSK_F, be32_to_cpu(TCP_FLAG_PSH | in i40e_open()
9010 wr32(&pf->hw, I40E_GLLAN_TSOMSK_M, be32_to_cpu(TCP_FLAG_PSH | in i40e_open()
9013 wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); in i40e_open()
9020 * i40e_netif_set_realnum_tx_rx_queues - Update number of tx/rx queues
9031 ret = netif_set_real_num_rx_queues(vsi->netdev, in i40e_netif_set_realnum_tx_rx_queues()
9032 vsi->num_queue_pairs); in i40e_netif_set_realnum_tx_rx_queues()
9036 return netif_set_real_num_tx_queues(vsi->netdev, in i40e_netif_set_realnum_tx_rx_queues()
9037 vsi->num_queue_pairs); in i40e_netif_set_realnum_tx_rx_queues()
9041 * i40e_vsi_open -
9052 struct i40e_pf *pf = vsi->back; in i40e_vsi_open()
9068 if (vsi->netdev) { in i40e_vsi_open()
9069 snprintf(int_name, sizeof(int_name) - 1, "%s-%s", in i40e_vsi_open()
9070 dev_driver_string(&pf->pdev->dev), vsi->netdev->name); in i40e_vsi_open()
9080 } else if (vsi->type == I40E_VSI_FDIR) { in i40e_vsi_open()
9081 snprintf(int_name, sizeof(int_name) - 1, "%s-%s:fdir", in i40e_vsi_open()
9082 dev_driver_string(&pf->pdev->dev), in i40e_vsi_open()
9083 dev_name(&pf->pdev->dev)); in i40e_vsi_open()
9089 err = -EINVAL; in i40e_vsi_open()
9107 if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_open()
9114 * i40e_fdir_filter_exit - Cleans up the Flow Director accounting
9127 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_filter_exit()
9128 hlist_del(&filter->fdir_node); in i40e_fdir_filter_exit()
9132 list_for_each_entry_safe(pit_entry, tmp, &pf->l3_flex_pit_list, list) { in i40e_fdir_filter_exit()
9133 list_del(&pit_entry->list); in i40e_fdir_filter_exit()
9136 INIT_LIST_HEAD(&pf->l3_flex_pit_list); in i40e_fdir_filter_exit()
9138 list_for_each_entry_safe(pit_entry, tmp, &pf->l4_flex_pit_list, list) { in i40e_fdir_filter_exit()
9139 list_del(&pit_entry->list); in i40e_fdir_filter_exit()
9142 INIT_LIST_HEAD(&pf->l4_flex_pit_list); in i40e_fdir_filter_exit()
9144 pf->fdir_pf_active_filters = 0; in i40e_fdir_filter_exit()
9193 * i40e_cloud_filter_exit - Cleans up the cloud filters
9205 &pf->cloud_filter_list, cloud_node) { in i40e_cloud_filter_exit()
9206 hlist_del(&cfilter->cloud_node); in i40e_cloud_filter_exit()
9209 pf->num_cloud_filters = 0; in i40e_cloud_filter_exit()
9211 if (test_bit(I40E_FLAG_FD_SB_TO_CLOUD_FILTER, pf->flags) && in i40e_cloud_filter_exit()
9212 !test_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags)) { in i40e_cloud_filter_exit()
9213 set_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_cloud_filter_exit()
9214 clear_bit(I40E_FLAG_FD_SB_TO_CLOUD_FILTER, pf->flags); in i40e_cloud_filter_exit()
9215 clear_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_cloud_filter_exit()
9220 * i40e_close - Disables a network interface
9223 * The close entry point is called when an interface is de-activated
9232 struct i40e_vsi *vsi = np->vsi; in i40e_close()
9240 * i40e_do_reset - Start a PF or Core Reset sequence
9267 dev_dbg(&pf->pdev->dev, "GlobalR requested\n"); in i40e_do_reset()
9268 val = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_do_reset()
9270 wr32(&pf->hw, I40E_GLGEN_RTRIG, val); in i40e_do_reset()
9278 dev_dbg(&pf->pdev->dev, "CoreR requested\n"); in i40e_do_reset()
9279 val = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_do_reset()
9281 wr32(&pf->hw, I40E_GLGEN_RTRIG, val); in i40e_do_reset()
9282 i40e_flush(&pf->hw); in i40e_do_reset()
9288 * Resets only the PF-specific registers in i40e_do_reset()
9290 * This goes directly to the tear-down and rebuild of in i40e_do_reset()
9294 dev_dbg(&pf->pdev->dev, "PFR requested\n"); in i40e_do_reset()
9304 dev_info(&pf->pdev->dev, in i40e_do_reset()
9305 test_bit(I40E_FLAG_FW_LLDP_DIS, pf->flags) ? in i40e_do_reset()
9310 /* Find the VSI(s) that requested a re-init */ in i40e_do_reset()
9311 dev_info(&pf->pdev->dev, "VSI reinit requested\n"); in i40e_do_reset()
9315 vsi->state)) in i40e_do_reset()
9320 dev_info(&pf->pdev->dev, "VSI down requested\n"); in i40e_do_reset()
9324 vsi->state)) { in i40e_do_reset()
9325 set_bit(__I40E_VSI_DOWN, vsi->state); in i40e_do_reset()
9330 dev_info(&pf->pdev->dev, in i40e_do_reset()
9337 * i40e_dcb_need_reconfig - Check if DCB needs reconfig
9349 if (memcmp(&new_cfg->etscfg, in i40e_dcb_need_reconfig()
9350 &old_cfg->etscfg, in i40e_dcb_need_reconfig()
9351 sizeof(new_cfg->etscfg))) { in i40e_dcb_need_reconfig()
9353 if (memcmp(&new_cfg->etscfg.prioritytable, in i40e_dcb_need_reconfig()
9354 &old_cfg->etscfg.prioritytable, in i40e_dcb_need_reconfig()
9355 sizeof(new_cfg->etscfg.prioritytable))) { in i40e_dcb_need_reconfig()
9357 dev_dbg(&pf->pdev->dev, "ETS UP2TC changed.\n"); in i40e_dcb_need_reconfig()
9360 if (memcmp(&new_cfg->etscfg.tcbwtable, in i40e_dcb_need_reconfig()
9361 &old_cfg->etscfg.tcbwtable, in i40e_dcb_need_reconfig()
9362 sizeof(new_cfg->etscfg.tcbwtable))) in i40e_dcb_need_reconfig()
9363 dev_dbg(&pf->pdev->dev, "ETS TC BW Table changed.\n"); in i40e_dcb_need_reconfig()
9365 if (memcmp(&new_cfg->etscfg.tsatable, in i40e_dcb_need_reconfig()
9366 &old_cfg->etscfg.tsatable, in i40e_dcb_need_reconfig()
9367 sizeof(new_cfg->etscfg.tsatable))) in i40e_dcb_need_reconfig()
9368 dev_dbg(&pf->pdev->dev, "ETS TSA Table changed.\n"); in i40e_dcb_need_reconfig()
9372 if (memcmp(&new_cfg->pfc, in i40e_dcb_need_reconfig()
9373 &old_cfg->pfc, in i40e_dcb_need_reconfig()
9374 sizeof(new_cfg->pfc))) { in i40e_dcb_need_reconfig()
9376 dev_dbg(&pf->pdev->dev, "PFC config change detected.\n"); in i40e_dcb_need_reconfig()
9380 if (memcmp(&new_cfg->app, in i40e_dcb_need_reconfig()
9381 &old_cfg->app, in i40e_dcb_need_reconfig()
9382 sizeof(new_cfg->app))) { in i40e_dcb_need_reconfig()
9384 dev_dbg(&pf->pdev->dev, "APP Table change detected.\n"); in i40e_dcb_need_reconfig()
9387 dev_dbg(&pf->pdev->dev, "dcb need_reconfig=%d\n", need_reconfig); in i40e_dcb_need_reconfig()
9392 * i40e_handle_lldp_event - Handle LLDP Change MIB event
9399 struct i40e_aqc_lldp_get_mib *mib = libie_aq_raw(&e->desc); in i40e_handle_lldp_event()
9400 struct i40e_hw *hw = &pf->hw; in i40e_handle_lldp_event()
9406 /* X710-T*L 2.5G and 5G speeds don't support DCB */ in i40e_handle_lldp_event()
9407 if (I40E_IS_X710TL_DEVICE(hw->device_id) && in i40e_handle_lldp_event()
9408 (hw->phy.link_info.link_speed & in i40e_handle_lldp_event()
9410 !test_bit(I40E_FLAG_DCB_CAPABLE, pf->flags)) in i40e_handle_lldp_event()
9412 set_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_handle_lldp_event()
9415 if (!test_bit(I40E_FLAG_DCB_CAPABLE, pf->flags)) in i40e_handle_lldp_event()
9419 type = ((mib->type >> I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) in i40e_handle_lldp_event()
9421 dev_dbg(&pf->pdev->dev, "LLDP event mib bridge type 0x%x\n", type); in i40e_handle_lldp_event()
9426 type = mib->type & I40E_AQ_LLDP_MIB_TYPE_MASK; in i40e_handle_lldp_event()
9427 dev_dbg(&pf->pdev->dev, in i40e_handle_lldp_event()
9433 &hw->remote_dcbx_config); in i40e_handle_lldp_event()
9438 tmp_dcbx_cfg = hw->local_dcbx_config; in i40e_handle_lldp_event()
9441 memset(&hw->local_dcbx_config, 0, sizeof(hw->local_dcbx_config)); in i40e_handle_lldp_event()
9443 ret = i40e_get_dcb_config(&pf->hw); in i40e_handle_lldp_event()
9445 /* X710-T*L 2.5G and 5G speeds don't support DCB */ in i40e_handle_lldp_event()
9446 if (I40E_IS_X710TL_DEVICE(hw->device_id) && in i40e_handle_lldp_event()
9447 (hw->phy.link_info.link_speed & in i40e_handle_lldp_event()
9449 dev_warn(&pf->pdev->dev, in i40e_handle_lldp_event()
9450 "DCB is not supported for X710-T*L 2.5/5G speeds\n"); in i40e_handle_lldp_event()
9451 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_handle_lldp_event()
9453 dev_info(&pf->pdev->dev, in i40e_handle_lldp_event()
9456 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_handle_lldp_event()
9462 if (!memcmp(&tmp_dcbx_cfg, &hw->local_dcbx_config, in i40e_handle_lldp_event()
9464 dev_dbg(&pf->pdev->dev, "No change detected in DCBX configuration.\n"); in i40e_handle_lldp_event()
9469 &hw->local_dcbx_config); in i40e_handle_lldp_event()
9471 i40e_dcbnl_flush_apps(pf, &tmp_dcbx_cfg, &hw->local_dcbx_config); in i40e_handle_lldp_event()
9477 if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1) in i40e_handle_lldp_event()
9478 set_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_handle_lldp_event()
9480 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_handle_lldp_event()
9482 set_bit(__I40E_PORT_SUSPENDED, pf->state); in i40e_handle_lldp_event()
9491 clear_bit(__I40E_PORT_SUSPENDED, pf->state); in i40e_handle_lldp_event()
9496 /* Wait for the PF's queues to be disabled */ in i40e_handle_lldp_event()
9500 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_handle_lldp_event()
9504 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_handle_lldp_event()
9505 set_bit(__I40E_CLIENT_L2_CHANGE, pf->state); in i40e_handle_lldp_event()
9514 * i40e_do_reset_safe - Protected reset path for userland calls.
9527 * i40e_handle_lan_overflow_event - Handler for LAN queue overflow event
9537 struct i40e_aqc_lan_overflow *data = libie_aq_raw(&e->desc); in i40e_handle_lan_overflow_event()
9538 u32 queue = le32_to_cpu(data->prtdcb_rupto); in i40e_handle_lan_overflow_event()
9539 u32 qtx_ctl = le32_to_cpu(data->otx_ctl); in i40e_handle_lan_overflow_event()
9540 struct i40e_hw *hw = &pf->hw; in i40e_handle_lan_overflow_event()
9544 dev_dbg(&pf->pdev->dev, "overflow Rx Queue Number = %d QTX_CTL=0x%08x\n", in i40e_handle_lan_overflow_event()
9553 vf_id -= hw->func_caps.vf_base_id; in i40e_handle_lan_overflow_event()
9554 vf = &pf->vf[vf_id]; in i40e_handle_lan_overflow_event()
9562 * i40e_get_current_fd_count - Get total FD filters programmed for this PF
9569 val = rd32(&pf->hw, I40E_PFQF_FDSTAT); in i40e_get_current_fd_count()
9576 * i40e_get_global_fd_count - Get total FD filters programmed on device
9583 val = rd32(&pf->hw, I40E_GLQF_FDCNT_0); in i40e_get_global_fd_count()
9590 * i40e_reenable_fdir_sb - Restore FDir SB capability
9595 if (test_and_clear_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state)) in i40e_reenable_fdir_sb()
9596 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags) && in i40e_reenable_fdir_sb()
9597 (I40E_DEBUG_FD & pf->hw.debug_mask)) in i40e_reenable_fdir_sb()
9598 …dev_info(&pf->pdev->dev, "FD Sideband/ntuple is being enabled since we have space in the table now… in i40e_reenable_fdir_sb()
9602 * i40e_reenable_fdir_atr - Restore FDir ATR capability
9607 if (test_and_clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) { in i40e_reenable_fdir_atr()
9617 if (test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags) && in i40e_reenable_fdir_atr()
9618 (I40E_DEBUG_FD & pf->hw.debug_mask)) in i40e_reenable_fdir_atr()
9619 …dev_info(&pf->pdev->dev, "ATR is being enabled since we have space in the table and there are no c… in i40e_reenable_fdir_atr()
9624 * i40e_delete_invalid_filter - Delete an invalid FDIR filter
9632 pf->fdir_pf_active_filters--; in i40e_delete_invalid_filter()
9633 pf->fd_inv = 0; in i40e_delete_invalid_filter()
9635 switch (filter->flow_type) { in i40e_delete_invalid_filter()
9637 pf->fd_tcp4_filter_cnt--; in i40e_delete_invalid_filter()
9640 pf->fd_udp4_filter_cnt--; in i40e_delete_invalid_filter()
9643 pf->fd_sctp4_filter_cnt--; in i40e_delete_invalid_filter()
9646 pf->fd_tcp6_filter_cnt--; in i40e_delete_invalid_filter()
9649 pf->fd_udp6_filter_cnt--; in i40e_delete_invalid_filter()
9652 pf->fd_udp6_filter_cnt--; in i40e_delete_invalid_filter()
9655 switch (filter->ipl4_proto) { in i40e_delete_invalid_filter()
9657 pf->fd_tcp4_filter_cnt--; in i40e_delete_invalid_filter()
9660 pf->fd_udp4_filter_cnt--; in i40e_delete_invalid_filter()
9663 pf->fd_sctp4_filter_cnt--; in i40e_delete_invalid_filter()
9666 pf->fd_ip4_filter_cnt--; in i40e_delete_invalid_filter()
9671 switch (filter->ipl4_proto) { in i40e_delete_invalid_filter()
9673 pf->fd_tcp6_filter_cnt--; in i40e_delete_invalid_filter()
9676 pf->fd_udp6_filter_cnt--; in i40e_delete_invalid_filter()
9679 pf->fd_sctp6_filter_cnt--; in i40e_delete_invalid_filter()
9682 pf->fd_ip6_filter_cnt--; in i40e_delete_invalid_filter()
9689 hlist_del(&filter->fdir_node); in i40e_delete_invalid_filter()
9694 * i40e_fdir_check_and_reenable - Function to reenabe FD ATR or SB if disabled
9703 if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state)) in i40e_fdir_check_and_reenable()
9706 /* Check if we have enough room to re-enable FDir SB capability. */ in i40e_fdir_check_and_reenable()
9708 fcnt_avail = pf->fdir_pf_filter_count; in i40e_fdir_check_and_reenable()
9709 if ((fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM)) || in i40e_fdir_check_and_reenable()
9710 (pf->fd_add_err == 0) || in i40e_fdir_check_and_reenable()
9711 (i40e_get_current_atr_cnt(pf) < pf->fd_atr_cnt)) in i40e_fdir_check_and_reenable()
9714 /* We should wait for even more space before re-enabling ATR. in i40e_fdir_check_and_reenable()
9718 if ((fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM_FOR_ATR)) && in i40e_fdir_check_and_reenable()
9719 pf->fd_tcp4_filter_cnt == 0 && pf->fd_tcp6_filter_cnt == 0) in i40e_fdir_check_and_reenable()
9723 if (pf->fd_inv > 0) { in i40e_fdir_check_and_reenable()
9725 &pf->fdir_filter_list, fdir_node) in i40e_fdir_check_and_reenable()
9726 if (filter->fd_id == pf->fd_inv) in i40e_fdir_check_and_reenable()
9734 * i40e_fdir_flush_and_replay - Function to flush all FD filters and replay SB
9745 if (!time_after(jiffies, pf->fd_flush_timestamp + in i40e_fdir_flush_and_replay()
9750 * should not re-enable ATR for some time. in i40e_fdir_flush_and_replay()
9752 min_flush_time = pf->fd_flush_timestamp + in i40e_fdir_flush_and_replay()
9754 fd_room = pf->fdir_pf_filter_count - pf->fdir_pf_active_filters; in i40e_fdir_flush_and_replay()
9758 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_flush_and_replay()
9759 dev_info(&pf->pdev->dev, "ATR disabled, not enough FD filter space.\n"); in i40e_fdir_flush_and_replay()
9763 pf->fd_flush_timestamp = jiffies; in i40e_fdir_flush_and_replay()
9764 set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state); in i40e_fdir_flush_and_replay()
9766 wr32(&pf->hw, I40E_PFQF_CTL_1, in i40e_fdir_flush_and_replay()
9768 i40e_flush(&pf->hw); in i40e_fdir_flush_and_replay()
9769 pf->fd_flush_cnt++; in i40e_fdir_flush_and_replay()
9770 pf->fd_add_err = 0; in i40e_fdir_flush_and_replay()
9772 /* Check FD flush status every 5-6msec */ in i40e_fdir_flush_and_replay()
9774 reg = rd32(&pf->hw, I40E_PFQF_CTL_1); in i40e_fdir_flush_and_replay()
9777 } while (flush_wait_retry--); in i40e_fdir_flush_and_replay()
9779 dev_warn(&pf->pdev->dev, "FD table did not flush, needs more time\n"); in i40e_fdir_flush_and_replay()
9783 if (!disable_atr && !pf->fd_tcp4_filter_cnt) in i40e_fdir_flush_and_replay()
9784 clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state); in i40e_fdir_flush_and_replay()
9785 clear_bit(__I40E_FD_FLUSH_REQUESTED, pf->state); in i40e_fdir_flush_and_replay()
9786 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_flush_and_replay()
9787 dev_info(&pf->pdev->dev, "FD Filter table flushed and FD-SB replayed.\n"); in i40e_fdir_flush_and_replay()
9792 * i40e_get_current_atr_cnt - Get the count of total FD ATR filters programmed
9797 return i40e_get_current_fd_count(pf) - pf->fdir_pf_active_filters; in i40e_get_current_atr_cnt()
9801 * i40e_fdir_reinit_subtask - Worker thread to reinit FDIR filter table
9808 if (test_bit(__I40E_DOWN, pf->state)) in i40e_fdir_reinit_subtask()
9811 if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state)) in i40e_fdir_reinit_subtask()
9819 * i40e_vsi_link_event - notify VSI of a link event
9825 if (!vsi || test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_vsi_link_event()
9828 switch (vsi->type) { in i40e_vsi_link_event()
9830 if (!vsi->netdev || !vsi->netdev_registered) in i40e_vsi_link_event()
9834 netif_carrier_on(vsi->netdev); in i40e_vsi_link_event()
9835 netif_tx_wake_all_queues(vsi->netdev); in i40e_vsi_link_event()
9837 netif_carrier_off(vsi->netdev); in i40e_vsi_link_event()
9838 netif_tx_stop_all_queues(vsi->netdev); in i40e_vsi_link_event()
9854 * i40e_veb_link_event - notify elements on the veb of a link event
9864 if (!veb || !veb->pf) in i40e_veb_link_event()
9866 pf = veb->pf; in i40e_veb_link_event()
9870 if (vsi->uplink_seid == veb->seid) in i40e_veb_link_event()
9875 * i40e_link_event - Update netif_carrier status
9890 pf->hw.phy.get_link_info = true; in i40e_link_event()
9891 old_link = (pf->hw.phy.link_info_old.link_info & I40E_AQ_LINK_UP); in i40e_link_event()
9892 status = i40e_get_link_status(&pf->hw, &new_link); in i40e_link_event()
9896 clear_bit(__I40E_TEMP_LINK_POLLING, pf->state); in i40e_link_event()
9901 set_bit(__I40E_TEMP_LINK_POLLING, pf->state); in i40e_link_event()
9902 dev_dbg(&pf->pdev->dev, "couldn't get link state, status: %d\n", in i40e_link_event()
9907 old_link_speed = pf->hw.phy.link_info_old.link_speed; in i40e_link_event()
9908 new_link_speed = pf->hw.phy.link_info.link_speed; in i40e_link_event()
9912 (test_bit(__I40E_VSI_DOWN, vsi->state) || in i40e_link_event()
9913 new_link == netif_carrier_ok(vsi->netdev))) in i40e_link_event()
9917 pf->link_down_events++; in i40e_link_event()
9929 if (pf->vf) in i40e_link_event()
9932 if (test_bit(I40E_FLAG_PTP_ENA, pf->flags)) in i40e_link_event()
9938 if (pf->dcbx_cap & DCB_CAP_DCBX_LLD_MANAGED) in i40e_link_event()
9945 dev_dbg(&pf->pdev->dev, "Reconfig DCB to single TC as result of Link Down\n"); in i40e_link_event()
9946 memset(&pf->tmp_cfg, 0, sizeof(pf->tmp_cfg)); in i40e_link_event()
9949 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_link_event()
9950 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_link_event()
9952 pf->dcbx_cap = DCB_CAP_DCBX_HOST | in i40e_link_event()
9954 set_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_link_event()
9955 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_link_event()
9962 * i40e_watchdog_subtask - periodic checks not using event driven response
9972 if (test_bit(__I40E_DOWN, pf->state) || in i40e_watchdog_subtask()
9973 test_bit(__I40E_CONFIG_BUSY, pf->state)) in i40e_watchdog_subtask()
9977 if (time_before(jiffies, (pf->service_timer_previous + in i40e_watchdog_subtask()
9978 pf->service_timer_period))) in i40e_watchdog_subtask()
9980 pf->service_timer_previous = jiffies; in i40e_watchdog_subtask()
9982 if (test_bit(I40E_FLAG_LINK_POLLING_ENA, pf->flags) || in i40e_watchdog_subtask()
9983 test_bit(__I40E_TEMP_LINK_POLLING, pf->state)) in i40e_watchdog_subtask()
9990 if (vsi->netdev) in i40e_watchdog_subtask()
9993 if (test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags)) { in i40e_watchdog_subtask()
10004 * i40e_reset_subtask - Set up for resetting the device and driver
10011 if (test_bit(__I40E_REINIT_REQUESTED, pf->state)) { in i40e_reset_subtask()
10013 clear_bit(__I40E_REINIT_REQUESTED, pf->state); in i40e_reset_subtask()
10015 if (test_bit(__I40E_PF_RESET_REQUESTED, pf->state)) { in i40e_reset_subtask()
10017 clear_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_reset_subtask()
10019 if (test_bit(__I40E_CORE_RESET_REQUESTED, pf->state)) { in i40e_reset_subtask()
10021 clear_bit(__I40E_CORE_RESET_REQUESTED, pf->state); in i40e_reset_subtask()
10023 if (test_bit(__I40E_GLOBAL_RESET_REQUESTED, pf->state)) { in i40e_reset_subtask()
10025 clear_bit(__I40E_GLOBAL_RESET_REQUESTED, pf->state); in i40e_reset_subtask()
10027 if (test_bit(__I40E_DOWN_REQUESTED, pf->state)) { in i40e_reset_subtask()
10029 clear_bit(__I40E_DOWN_REQUESTED, pf->state); in i40e_reset_subtask()
10035 if (test_bit(__I40E_RESET_INTR_RECEIVED, pf->state)) { in i40e_reset_subtask()
10043 !test_bit(__I40E_DOWN, pf->state) && in i40e_reset_subtask()
10044 !test_bit(__I40E_CONFIG_BUSY, pf->state)) { in i40e_reset_subtask()
10050 * i40e_handle_link_event - Handle link event
10057 struct i40e_aqc_get_link_status *status = libie_aq_raw(&e->desc); in i40e_handle_link_event()
10059 /* Do a new status request to re-enable LSE reporting in i40e_handle_link_event()
10068 if (status->phy_type == I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP) { in i40e_handle_link_event()
10069 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
10071 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
10077 if ((status->link_info & I40E_AQ_MEDIA_AVAILABLE) && in i40e_handle_link_event()
10078 (!(status->an_info & I40E_AQ_QUALIFIED_MODULE)) && in i40e_handle_link_event()
10079 (!(status->link_info & I40E_AQ_LINK_UP)) && in i40e_handle_link_event()
10080 (!test_bit(I40E_FLAG_LINK_DOWN_ON_CLOSE_ENA, pf->flags))) { in i40e_handle_link_event()
10081 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
10083 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
10090 * i40e_clean_adminq_subtask - Clean the AdminQ rings
10096 struct i40e_hw *hw = &pf->hw; in i40e_clean_adminq_subtask()
10104 if (test_bit(__I40E_RESET_FAILED, pf->state)) in i40e_clean_adminq_subtask()
10108 val = rd32(&pf->hw, I40E_PF_ARQLEN); in i40e_clean_adminq_subtask()
10111 if (hw->debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
10112 dev_info(&pf->pdev->dev, "ARQ VF Error detected\n"); in i40e_clean_adminq_subtask()
10116 if (hw->debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
10117 dev_info(&pf->pdev->dev, "ARQ Overflow Error detected\n"); in i40e_clean_adminq_subtask()
10119 pf->arq_overflows++; in i40e_clean_adminq_subtask()
10122 if (hw->debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
10123 dev_info(&pf->pdev->dev, "ARQ Critical Error detected\n"); in i40e_clean_adminq_subtask()
10127 wr32(&pf->hw, I40E_PF_ARQLEN, val); in i40e_clean_adminq_subtask()
10129 val = rd32(&pf->hw, I40E_PF_ATQLEN); in i40e_clean_adminq_subtask()
10132 if (pf->hw.debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
10133 dev_info(&pf->pdev->dev, "ASQ VF Error detected\n"); in i40e_clean_adminq_subtask()
10137 if (pf->hw.debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
10138 dev_info(&pf->pdev->dev, "ASQ Overflow Error detected\n"); in i40e_clean_adminq_subtask()
10142 if (pf->hw.debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
10143 dev_info(&pf->pdev->dev, "ASQ Critical Error detected\n"); in i40e_clean_adminq_subtask()
10147 wr32(&pf->hw, I40E_PF_ATQLEN, val); in i40e_clean_adminq_subtask()
10156 if (ret == -EALREADY) in i40e_clean_adminq_subtask()
10159 dev_info(&pf->pdev->dev, "ARQ event error %d\n", ret); in i40e_clean_adminq_subtask()
10180 dev_dbg(&pf->pdev->dev, "ARQ: Update LLDP MIB event received\n"); in i40e_clean_adminq_subtask()
10188 dev_dbg(&pf->pdev->dev, "ARQ LAN queue overflow event received\n"); in i40e_clean_adminq_subtask()
10192 dev_info(&pf->pdev->dev, "ARQ: Msg from other pf\n"); in i40e_clean_adminq_subtask()
10197 i40e_debug(&pf->hw, I40E_DEBUG_NVM, in i40e_clean_adminq_subtask()
10202 dev_info(&pf->pdev->dev, in i40e_clean_adminq_subtask()
10210 clear_bit(__I40E_ADMINQ_EVENT_PENDING, pf->state); in i40e_clean_adminq_subtask()
10212 /* re-enable Admin queue interrupt cause */ in i40e_clean_adminq_subtask()
10222 * i40e_verify_eeprom - make sure eeprom is good to use
10229 err = i40e_diag_eeprom_test(&pf->hw); in i40e_verify_eeprom()
10232 err = i40e_diag_eeprom_test(&pf->hw); in i40e_verify_eeprom()
10234 dev_info(&pf->pdev->dev, "eeprom check failed (%d), Tx/Rx traffic disabled\n", in i40e_verify_eeprom()
10236 set_bit(__I40E_BAD_EEPROM, pf->state); in i40e_verify_eeprom()
10240 if (!err && test_bit(__I40E_BAD_EEPROM, pf->state)) { in i40e_verify_eeprom()
10241 dev_info(&pf->pdev->dev, "eeprom check passed, Tx/Rx traffic enabled\n"); in i40e_verify_eeprom()
10242 clear_bit(__I40E_BAD_EEPROM, pf->state); in i40e_verify_eeprom()
10250 * enable switch loop back or die - no point in a return value
10258 ctxt.seid = pf->main_vsi_seid; in i40e_enable_pf_switch_lb()
10259 ctxt.pf_num = pf->hw.pf_id; in i40e_enable_pf_switch_lb()
10261 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_enable_pf_switch_lb()
10263 dev_info(&pf->pdev->dev, in i40e_enable_pf_switch_lb()
10265 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_enable_pf_switch_lb()
10272 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_enable_pf_switch_lb()
10274 dev_info(&pf->pdev->dev, in i40e_enable_pf_switch_lb()
10276 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_enable_pf_switch_lb()
10284 * disable switch loop back or die - no point in a return value
10292 ctxt.seid = pf->main_vsi_seid; in i40e_disable_pf_switch_lb()
10293 ctxt.pf_num = pf->hw.pf_id; in i40e_disable_pf_switch_lb()
10295 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_disable_pf_switch_lb()
10297 dev_info(&pf->pdev->dev, in i40e_disable_pf_switch_lb()
10299 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_disable_pf_switch_lb()
10306 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_disable_pf_switch_lb()
10308 dev_info(&pf->pdev->dev, in i40e_disable_pf_switch_lb()
10310 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_disable_pf_switch_lb()
10315 * i40e_config_bridge_mode - Configure the HW bridge mode
10324 struct i40e_pf *pf = veb->pf; in i40e_config_bridge_mode()
10326 if (pf->hw.debug_mask & I40E_DEBUG_LAN) in i40e_config_bridge_mode()
10327 dev_info(&pf->pdev->dev, "enabling bridge mode: %s\n", in i40e_config_bridge_mode()
10328 veb->bridge_mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB"); in i40e_config_bridge_mode()
10329 if (veb->bridge_mode & BRIDGE_MODE_VEPA) in i40e_config_bridge_mode()
10336 * i40e_reconstitute_veb - rebuild the VEB and VSIs connected to it
10346 struct i40e_pf *pf = veb->pf; in i40e_reconstitute_veb()
10351 * there can be only one non-floating VEB that have uplink to MAC SEID in i40e_reconstitute_veb()
10354 if (WARN_ON(veb->uplink_seid && veb->uplink_seid != pf->mac_seid)) { in i40e_reconstitute_veb()
10355 dev_err(&pf->pdev->dev, in i40e_reconstitute_veb()
10356 "Invalid uplink SEID for VEB %d\n", veb->idx); in i40e_reconstitute_veb()
10357 return -ENOENT; in i40e_reconstitute_veb()
10360 if (veb->uplink_seid == pf->mac_seid) { in i40e_reconstitute_veb()
10364 if (WARN_ON(ctl_vsi->veb_idx != veb->idx || in i40e_reconstitute_veb()
10365 !(ctl_vsi->flags & I40E_VSI_FLAG_VEB_OWNER))) { in i40e_reconstitute_veb()
10366 dev_err(&pf->pdev->dev, in i40e_reconstitute_veb()
10367 "Invalid control VSI for VEB %d\n", veb->idx); in i40e_reconstitute_veb()
10368 return -ENOENT; in i40e_reconstitute_veb()
10374 dev_err(&pf->pdev->dev, in i40e_reconstitute_veb()
10376 veb->idx, ret); in i40e_reconstitute_veb()
10388 if (veb->uplink_seid) { in i40e_reconstitute_veb()
10389 if (test_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags)) in i40e_reconstitute_veb()
10390 veb->bridge_mode = BRIDGE_MODE_VEB; in i40e_reconstitute_veb()
10392 veb->bridge_mode = BRIDGE_MODE_VEPA; in i40e_reconstitute_veb()
10401 if (vsi->veb_idx == veb->idx) { in i40e_reconstitute_veb()
10402 vsi->uplink_seid = veb->seid; in i40e_reconstitute_veb()
10405 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
10418 * i40e_get_capabilities - get info about the HW
10434 return -ENOMEM; in i40e_get_capabilities()
10437 err = i40e_aq_discover_capabilities(&pf->hw, cap_buf, buf_len, in i40e_get_capabilities()
10443 if (pf->hw.aq.asq_last_status == LIBIE_AQ_RC_ENOMEM) { in i40e_get_capabilities()
10446 } else if (pf->hw.aq.asq_last_status != LIBIE_AQ_RC_OK || err) { in i40e_get_capabilities()
10447 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
10450 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_get_capabilities()
10451 return -ENODEV; in i40e_get_capabilities()
10455 if (pf->hw.debug_mask & I40E_DEBUG_USER) { in i40e_get_capabilities()
10457 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
10459 pf->hw.pf_id, pf->hw.func_caps.num_vfs, in i40e_get_capabilities()
10460 pf->hw.func_caps.num_msix_vectors, in i40e_get_capabilities()
10461 pf->hw.func_caps.num_msix_vectors_vf, in i40e_get_capabilities()
10462 pf->hw.func_caps.fd_filters_guaranteed, in i40e_get_capabilities()
10463 pf->hw.func_caps.fd_filters_best_effort, in i40e_get_capabilities()
10464 pf->hw.func_caps.num_tx_qp, in i40e_get_capabilities()
10465 pf->hw.func_caps.num_vsis); in i40e_get_capabilities()
10467 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
10469 pf->hw.dev_caps.switch_mode, in i40e_get_capabilities()
10470 pf->hw.dev_caps.valid_functions); in i40e_get_capabilities()
10471 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
10472 "SR-IOV=%d, num_vfs for all function=%u\n", in i40e_get_capabilities()
10473 pf->hw.dev_caps.sr_iov_1_1, in i40e_get_capabilities()
10474 pf->hw.dev_caps.num_vfs); in i40e_get_capabilities()
10475 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
10477 pf->hw.dev_caps.num_vsis, in i40e_get_capabilities()
10478 pf->hw.dev_caps.num_rx_qp, in i40e_get_capabilities()
10479 pf->hw.dev_caps.num_tx_qp); in i40e_get_capabilities()
10483 #define DEF_NUM_VSI (1 + (pf->hw.func_caps.fcoe ? 1 : 0) \ in i40e_get_capabilities()
10484 + pf->hw.func_caps.num_vfs) in i40e_get_capabilities()
10485 if (pf->hw.revision_id == 0 && in i40e_get_capabilities()
10486 pf->hw.func_caps.num_vsis < DEF_NUM_VSI) { in i40e_get_capabilities()
10487 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
10489 pf->hw.func_caps.num_vsis, DEF_NUM_VSI); in i40e_get_capabilities()
10490 pf->hw.func_caps.num_vsis = DEF_NUM_VSI; in i40e_get_capabilities()
10499 * i40e_fdir_sb_setup - initialize the Flow Director resources for Sideband
10509 if (!rd32(&pf->hw, I40E_GLQF_HKEY(0))) { in i40e_fdir_sb_setup()
10518 wr32(&pf->hw, I40E_GLQF_HKEY(i), hkey[i]); in i40e_fdir_sb_setup()
10521 if (!test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) in i40e_fdir_sb_setup()
10530 vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, main_vsi->seid, 0); in i40e_fdir_sb_setup()
10532 dev_info(&pf->pdev->dev, "Couldn't create FDir VSI\n"); in i40e_fdir_sb_setup()
10533 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_fdir_sb_setup()
10534 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_fdir_sb_setup()
10543 * i40e_fdir_teardown - release the Flow Director resources
10557 * i40e_rebuild_cloud_filters - Rebuilds cloud filters for VSIs
10567 struct i40e_pf *pf = vsi->back; in i40e_rebuild_cloud_filters()
10572 hlist_for_each_entry_safe(cfilter, node, &pf->cloud_filter_list, in i40e_rebuild_cloud_filters()
10574 if (cfilter->seid != seid) in i40e_rebuild_cloud_filters()
10577 if (cfilter->dst_port) in i40e_rebuild_cloud_filters()
10584 dev_dbg(&pf->pdev->dev, in i40e_rebuild_cloud_filters()
10587 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_rebuild_cloud_filters()
10595 * i40e_rebuild_channels - Rebuilds channel VSIs if they existed before reset
10605 if (list_empty(&vsi->ch_list)) in i40e_rebuild_channels()
10608 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_rebuild_channels()
10609 if (!ch->initialized) in i40e_rebuild_channels()
10612 ret = i40e_add_channel(vsi->back, vsi->uplink_seid, ch); in i40e_rebuild_channels()
10614 dev_info(&vsi->back->pdev->dev, in i40e_rebuild_channels()
10616 vsi->uplink_seid); in i40e_rebuild_channels()
10620 ret = i40e_channel_config_tx_ring(vsi->back, vsi, ch); in i40e_rebuild_channels()
10622 dev_info(&vsi->back->pdev->dev, in i40e_rebuild_channels()
10624 ch->seid); in i40e_rebuild_channels()
10628 vsi->next_base_queue = vsi->next_base_queue + in i40e_rebuild_channels()
10629 ch->num_queue_pairs; in i40e_rebuild_channels()
10630 if (ch->max_tx_rate) { in i40e_rebuild_channels()
10631 u64 credits = ch->max_tx_rate; in i40e_rebuild_channels()
10633 if (i40e_set_bw_limit(vsi, ch->seid, in i40e_rebuild_channels()
10634 ch->max_tx_rate)) in i40e_rebuild_channels()
10635 return -EINVAL; in i40e_rebuild_channels()
10638 dev_dbg(&vsi->back->pdev->dev, in i40e_rebuild_channels()
10639 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_rebuild_channels()
10640 ch->max_tx_rate, in i40e_rebuild_channels()
10642 ch->seid); in i40e_rebuild_channels()
10644 ret = i40e_rebuild_cloud_filters(vsi, ch->seid); in i40e_rebuild_channels()
10646 dev_dbg(&vsi->back->pdev->dev, in i40e_rebuild_channels()
10648 ch->seid); in i40e_rebuild_channels()
10656 * i40e_clean_xps_state - clean xps state for every tx_ring
10663 if (vsi->tx_rings) in i40e_clean_xps_state()
10664 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_clean_xps_state()
10665 if (vsi->tx_rings[i]) in i40e_clean_xps_state()
10667 vsi->tx_rings[i]->state); in i40e_clean_xps_state()
10671 * i40e_prep_for_reset - prep for the core to reset
10678 struct i40e_hw *hw = &pf->hw; in i40e_prep_for_reset()
10683 clear_bit(__I40E_RESET_INTR_RECEIVED, pf->state); in i40e_prep_for_reset()
10684 if (test_and_set_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_prep_for_reset()
10686 if (i40e_check_asq_alive(&pf->hw)) in i40e_prep_for_reset()
10689 dev_dbg(&pf->pdev->dev, "Tearing down internal switch for reset\n"); in i40e_prep_for_reset()
10696 vsi->seid = 0; in i40e_prep_for_reset()
10699 i40e_shutdown_adminq(&pf->hw); in i40e_prep_for_reset()
10702 if (hw->hmc.hmc_obj) { in i40e_prep_for_reset()
10705 dev_warn(&pf->pdev->dev, in i40e_prep_for_reset()
10716 * i40e_send_version - update firmware with driver version
10728 i40e_aq_send_driver_version(&pf->hw, &dv, NULL); in i40e_send_version()
10732 * i40e_get_oem_version - get OEM specific version information
10772 hw->nvm.oem_ver = in i40e_get_oem_version()
10775 hw->nvm.eetrack = I40E_OEM_EETRACK_ID; in i40e_get_oem_version()
10779 * i40e_reset - wait for core reset to finish reset, reset pf if corer not seen
10784 struct i40e_hw *hw = &pf->hw; in i40e_reset()
10789 dev_info(&pf->pdev->dev, "PF reset failed, %d\n", ret); in i40e_reset()
10790 set_bit(__I40E_RESET_FAILED, pf->state); in i40e_reset()
10791 clear_bit(__I40E_RESET_RECOVERY_PENDING, pf->state); in i40e_reset()
10793 pf->pfr_count++; in i40e_reset()
10799 * i40e_rebuild - rebuild using a saved config
10801 * @reinit: if the Main VSI needs to re-initialized.
10809 struct i40e_hw *hw = &pf->hw; in i40e_rebuild()
10815 if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) && in i40e_rebuild()
10817 i40e_set_ethtool_ops(vsi->netdev); in i40e_rebuild()
10819 if (test_bit(__I40E_DOWN, pf->state) && in i40e_rebuild()
10820 !test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_rebuild()
10822 dev_dbg(&pf->pdev->dev, "Rebuilding internal switch\n"); in i40e_rebuild()
10825 ret = i40e_init_adminq(&pf->hw); in i40e_rebuild()
10827 dev_info(&pf->pdev->dev, "Rebuild AdminQ failed, err %pe aq_err %s\n", in i40e_rebuild()
10828 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_rebuild()
10831 i40e_get_oem_version(&pf->hw); in i40e_rebuild()
10833 if (test_and_clear_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state)) { in i40e_rebuild()
10838 /* re-verify the eeprom if we just had an EMP reset */ in i40e_rebuild()
10839 if (test_and_clear_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state)) in i40e_rebuild()
10846 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_rebuild()
10864 free_irq(pf->pdev->irq, pf); in i40e_rebuild()
10884 ret = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp, in i40e_rebuild()
10885 hw->func_caps.num_rx_qp, 0, 0); in i40e_rebuild()
10887 dev_info(&pf->pdev->dev, "init_lan_hmc failed: %d\n", ret); in i40e_rebuild()
10892 dev_info(&pf->pdev->dev, "configure_lan_hmc failed: %d\n", ret); in i40e_rebuild()
10897 /* Enable FW to write a default DCB config on link-up in i40e_rebuild()
10904 if (I40E_IS_X710TL_DEVICE(hw->device_id) && in i40e_rebuild()
10905 (hw->phy.link_info.link_speed & in i40e_rebuild()
10908 dev_warn(&pf->pdev->dev, in i40e_rebuild()
10909 "DCB is not supported for X710-T*L 2.5/5G speeds\n"); in i40e_rebuild()
10910 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_rebuild()
10915 dev_info(&pf->pdev->dev, "DCB init failed %d, disabled\n", in i40e_rebuild()
10917 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_rebuild()
10933 ret = i40e_aq_set_phy_int_mask(&pf->hw, in i40e_rebuild()
10938 dev_info(&pf->pdev->dev, "set phy mask fail, err %pe aq_err %s\n", in i40e_rebuild()
10939 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_rebuild()
10948 if (vsi->uplink_seid != pf->mac_seid) { in i40e_rebuild()
10949 dev_dbg(&pf->pdev->dev, "attempting to rebuild switch\n"); in i40e_rebuild()
10963 if (veb->uplink_seid == pf->mac_seid) { in i40e_rebuild()
10964 dev_info(&pf->pdev->dev, in i40e_rebuild()
10967 vsi->uplink_seid = pf->mac_seid; in i40e_rebuild()
10969 } else if (veb->uplink_seid == 0) { in i40e_rebuild()
10970 dev_info(&pf->pdev->dev, in i40e_rebuild()
10977 if (vsi->uplink_seid == pf->mac_seid) { in i40e_rebuild()
10978 dev_dbg(&pf->pdev->dev, "attempting to rebuild PF VSI\n"); in i40e_rebuild()
10982 dev_info(&pf->pdev->dev, in i40e_rebuild()
10988 if (vsi->mqprio_qopt.max_rate[0]) { in i40e_rebuild()
10990 vsi->mqprio_qopt.max_rate[0]); in i40e_rebuild()
10993 ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate); in i40e_rebuild()
10999 dev_dbg(&vsi->back->pdev->dev, in i40e_rebuild()
11000 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_rebuild()
11003 vsi->seid); in i40e_rebuild()
11006 ret = i40e_rebuild_cloud_filters(vsi, vsi->seid); in i40e_rebuild()
11031 if (test_bit(I40E_HW_CAP_RESTART_AUTONEG, pf->hw.caps)) { in i40e_rebuild()
11033 ret = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); in i40e_rebuild()
11035 dev_info(&pf->pdev->dev, "link restart failed, err %pe aq_err %s\n", in i40e_rebuild()
11037 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_rebuild()
11040 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_rebuild()
11052 i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw, in i40e_rebuild()
11053 pf->main_vsi_seid); in i40e_rebuild()
11063 ret = i40e_set_promiscuous(pf, pf->cur_promisc); in i40e_rebuild()
11065 dev_warn(&pf->pdev->dev, in i40e_rebuild()
11067 pf->cur_promisc ? "on" : "off", in i40e_rebuild()
11068 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_rebuild()
11082 clear_bit(__I40E_RESET_FAILED, pf->state); in i40e_rebuild()
11084 clear_bit(__I40E_RESET_RECOVERY_PENDING, pf->state); in i40e_rebuild()
11085 clear_bit(__I40E_TIMEOUT_RECOVERY_PENDING, pf->state); in i40e_rebuild()
11089 * i40e_reset_and_rebuild - reset and rebuild using a saved config
11091 * @reinit: if the Main VSI needs to re-initialized.
11100 if (test_bit(__I40E_IN_REMOVE, pf->state)) in i40e_reset_and_rebuild()
11102 /* Now we wait for GRST to settle out. in i40e_reset_and_rebuild()
11110 dev_err(&pf->pdev->dev, "%s: i40e_reset() FAILED", __func__); in i40e_reset_and_rebuild()
11114 * i40e_handle_reset_warning - prep for the PF to reset, reset and rebuild
11129 * i40e_print_vf_mdd_event - print VF Tx/Rx malicious driver detect event
11132 * @is_tx: true - for Tx event, false - for Rx
11137 dev_err(&pf->pdev->dev, is_tx ? in i40e_print_vf_mdd_event()
11138 …"%lld Tx Malicious Driver Detection events detected on PF %d VF %d MAC %pm. mdd-auto-reset-vfs=%s\… in i40e_print_vf_mdd_event()
11139 …"%lld Rx Malicious Driver Detection events detected on PF %d VF %d MAC %pm. mdd-auto-reset-vfs=%s\… in i40e_print_vf_mdd_event()
11140 is_tx ? vf->mdd_tx_events.count : vf->mdd_rx_events.count, in i40e_print_vf_mdd_event()
11141 pf->hw.pf_id, in i40e_print_vf_mdd_event()
11142 vf->vf_id, in i40e_print_vf_mdd_event()
11143 vf->default_lan_addr.addr, in i40e_print_vf_mdd_event()
11144 str_on_off(test_bit(I40E_FLAG_MDD_AUTO_RESET_VF, pf->flags))); in i40e_print_vf_mdd_event()
11148 * i40e_print_vfs_mdd_events - print VFs malicious driver detect event
11158 if (!test_and_clear_bit(__I40E_MDD_VF_PRINT_PENDING, pf->state)) in i40e_print_vfs_mdd_events()
11161 if (!__ratelimit(&pf->mdd_message_rate_limit)) in i40e_print_vfs_mdd_events()
11164 for (i = 0; i < pf->num_alloc_vfs; i++) { in i40e_print_vfs_mdd_events()
11165 struct i40e_vf *vf = &pf->vf[i]; in i40e_print_vfs_mdd_events()
11169 if (vf->mdd_rx_events.count != vf->mdd_rx_events.last_printed) { in i40e_print_vfs_mdd_events()
11170 vf->mdd_rx_events.last_printed = vf->mdd_rx_events.count; in i40e_print_vfs_mdd_events()
11176 if (vf->mdd_tx_events.count != vf->mdd_tx_events.last_printed) { in i40e_print_vfs_mdd_events()
11177 vf->mdd_tx_events.last_printed = vf->mdd_tx_events.count; in i40e_print_vfs_mdd_events()
11182 if (is_printed && !test_bit(I40E_FLAG_MDD_AUTO_RESET_VF, pf->flags)) in i40e_print_vfs_mdd_events()
11183 dev_info(&pf->pdev->dev, in i40e_print_vfs_mdd_events()
11184 "Use PF Control I/F to re-enable the VF #%d\n", in i40e_print_vfs_mdd_events()
11197 struct i40e_hw *hw = &pf->hw; in i40e_handle_mdd_event()
11203 if (!test_and_clear_bit(__I40E_MDD_EVENT_PENDING, pf->state)) { in i40e_handle_mdd_event()
11217 u16 queue = FIELD_GET(I40E_GL_MDET_TX_QUEUE_MASK, reg) - in i40e_handle_mdd_event()
11218 pf->hw.func_caps.base_queue; in i40e_handle_mdd_event()
11220 …dev_info(&pf->pdev->dev, "Malicious Driver Detection event 0x%02x on TX queue %d PF number 0x%02x … in i40e_handle_mdd_event()
11229 u16 queue = FIELD_GET(I40E_GL_MDET_RX_QUEUE_MASK, reg) - in i40e_handle_mdd_event()
11230 pf->hw.func_caps.base_queue; in i40e_handle_mdd_event()
11232 …dev_info(&pf->pdev->dev, "Malicious Driver Detection event 0x%02x on RX queue %d of function 0x%02… in i40e_handle_mdd_event()
11242 dev_dbg(&pf->pdev->dev, "TX driver issue detected on PF\n"); in i40e_handle_mdd_event()
11247 dev_dbg(&pf->pdev->dev, "RX driver issue detected on PF\n"); in i40e_handle_mdd_event()
11252 for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) { in i40e_handle_mdd_event()
11256 vf = &(pf->vf[i]); in i40e_handle_mdd_event()
11259 set_bit(__I40E_MDD_VF_PRINT_PENDING, pf->state); in i40e_handle_mdd_event()
11261 vf->mdd_tx_events.count++; in i40e_handle_mdd_event()
11262 set_bit(I40E_VF_STATE_DISABLED, &vf->vf_states); in i40e_handle_mdd_event()
11268 set_bit(__I40E_MDD_VF_PRINT_PENDING, pf->state); in i40e_handle_mdd_event()
11270 vf->mdd_rx_events.count++; in i40e_handle_mdd_event()
11271 set_bit(I40E_VF_STATE_DISABLED, &vf->vf_states); in i40e_handle_mdd_event()
11276 test_bit(I40E_FLAG_MDD_AUTO_RESET_VF, pf->flags)) { in i40e_handle_mdd_event()
11298 * i40e_service_task - Run the driver's async subtasks
11309 if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) || in i40e_service_task()
11310 test_bit(__I40E_SUSPENDED, pf->state)) in i40e_service_task()
11313 if (test_and_set_bit(__I40E_SERVICE_SCHED, pf->state)) in i40e_service_task()
11316 if (!test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_service_task()
11324 if (test_and_clear_bit(__I40E_CLIENT_RESET, pf->state)) { in i40e_service_task()
11330 pf->state)) in i40e_service_task()
11342 clear_bit(__I40E_SERVICE_SCHED, pf->state); in i40e_service_task()
11346 * rather than wait for the timer to tick again. in i40e_service_task()
11348 if (time_after(jiffies, (start_time + pf->service_timer_period)) || in i40e_service_task()
11349 test_bit(__I40E_ADMINQ_EVENT_PENDING, pf->state) || in i40e_service_task()
11350 test_bit(__I40E_MDD_EVENT_PENDING, pf->state) || in i40e_service_task()
11351 test_bit(__I40E_VFLR_EVENT_PENDING, pf->state)) in i40e_service_task()
11356 * i40e_service_timer - timer callback
11363 mod_timer(&pf->service_timer, in i40e_service_timer()
11364 round_jiffies(jiffies + pf->service_timer_period)); in i40e_service_timer()
11369 * i40e_set_num_rings_in_vsi - Determine number of rings in the VSI
11374 struct i40e_pf *pf = vsi->back; in i40e_set_num_rings_in_vsi()
11376 switch (vsi->type) { in i40e_set_num_rings_in_vsi()
11378 vsi->alloc_queue_pairs = pf->num_lan_qps; in i40e_set_num_rings_in_vsi()
11379 if (!vsi->num_tx_desc) in i40e_set_num_rings_in_vsi()
11380 vsi->num_tx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
11382 if (!vsi->num_rx_desc) in i40e_set_num_rings_in_vsi()
11383 vsi->num_rx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
11385 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_set_num_rings_in_vsi()
11386 vsi->num_q_vectors = pf->num_lan_msix; in i40e_set_num_rings_in_vsi()
11388 vsi->num_q_vectors = 1; in i40e_set_num_rings_in_vsi()
11393 vsi->alloc_queue_pairs = 1; in i40e_set_num_rings_in_vsi()
11394 vsi->num_tx_desc = ALIGN(I40E_FDIR_RING_COUNT, in i40e_set_num_rings_in_vsi()
11396 vsi->num_rx_desc = ALIGN(I40E_FDIR_RING_COUNT, in i40e_set_num_rings_in_vsi()
11398 vsi->num_q_vectors = pf->num_fdsb_msix; in i40e_set_num_rings_in_vsi()
11402 vsi->alloc_queue_pairs = pf->num_vmdq_qps; in i40e_set_num_rings_in_vsi()
11403 if (!vsi->num_tx_desc) in i40e_set_num_rings_in_vsi()
11404 vsi->num_tx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
11406 if (!vsi->num_rx_desc) in i40e_set_num_rings_in_vsi()
11407 vsi->num_rx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
11409 vsi->num_q_vectors = pf->num_vmdq_msix; in i40e_set_num_rings_in_vsi()
11413 vsi->alloc_queue_pairs = pf->num_vf_qps; in i40e_set_num_rings_in_vsi()
11414 if (!vsi->num_tx_desc) in i40e_set_num_rings_in_vsi()
11415 vsi->num_tx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
11417 if (!vsi->num_rx_desc) in i40e_set_num_rings_in_vsi()
11418 vsi->num_rx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
11424 return -ENODATA; in i40e_set_num_rings_in_vsi()
11428 vsi->num_tx_desc = I40E_MIN_NUM_DESCRIPTORS; in i40e_set_num_rings_in_vsi()
11429 vsi->num_rx_desc = I40E_MIN_NUM_DESCRIPTORS; in i40e_set_num_rings_in_vsi()
11436 * i40e_vsi_alloc_arrays - Allocate queue and vector pointer arrays for the vsi
11450 size = sizeof(struct i40e_ring *) * vsi->alloc_queue_pairs * in i40e_vsi_alloc_arrays()
11452 vsi->tx_rings = kzalloc(size, GFP_KERNEL); in i40e_vsi_alloc_arrays()
11453 if (!vsi->tx_rings) in i40e_vsi_alloc_arrays()
11454 return -ENOMEM; in i40e_vsi_alloc_arrays()
11455 next_rings = vsi->tx_rings + vsi->alloc_queue_pairs; in i40e_vsi_alloc_arrays()
11457 vsi->xdp_rings = next_rings; in i40e_vsi_alloc_arrays()
11458 next_rings += vsi->alloc_queue_pairs; in i40e_vsi_alloc_arrays()
11460 vsi->rx_rings = next_rings; in i40e_vsi_alloc_arrays()
11464 size = sizeof(struct i40e_q_vector *) * vsi->num_q_vectors; in i40e_vsi_alloc_arrays()
11465 vsi->q_vectors = kzalloc(size, GFP_KERNEL); in i40e_vsi_alloc_arrays()
11466 if (!vsi->q_vectors) { in i40e_vsi_alloc_arrays()
11467 ret = -ENOMEM; in i40e_vsi_alloc_arrays()
11474 kfree(vsi->tx_rings); in i40e_vsi_alloc_arrays()
11479 * i40e_vsi_mem_alloc - Allocates the next available struct vsi in the PF
11488 int ret = -ENODEV; in i40e_vsi_mem_alloc()
11494 mutex_lock(&pf->switch_mutex); in i40e_vsi_mem_alloc()
11502 i = pf->next_vsi; in i40e_vsi_mem_alloc()
11503 while (i < pf->num_alloc_vsi && pf->vsi[i]) in i40e_vsi_mem_alloc()
11505 if (i >= pf->num_alloc_vsi) { in i40e_vsi_mem_alloc()
11507 while (i < pf->next_vsi && pf->vsi[i]) in i40e_vsi_mem_alloc()
11511 if (i < pf->num_alloc_vsi && !pf->vsi[i]) { in i40e_vsi_mem_alloc()
11514 ret = -ENODEV; in i40e_vsi_mem_alloc()
11517 pf->next_vsi = ++i; in i40e_vsi_mem_alloc()
11521 ret = -ENOMEM; in i40e_vsi_mem_alloc()
11524 vsi->type = type; in i40e_vsi_mem_alloc()
11525 vsi->back = pf; in i40e_vsi_mem_alloc()
11526 set_bit(__I40E_VSI_DOWN, vsi->state); in i40e_vsi_mem_alloc()
11527 vsi->flags = 0; in i40e_vsi_mem_alloc()
11528 vsi->idx = vsi_idx; in i40e_vsi_mem_alloc()
11529 vsi->int_rate_limit = 0; in i40e_vsi_mem_alloc()
11530 vsi->rss_table_size = (vsi->type == I40E_VSI_MAIN) ? in i40e_vsi_mem_alloc()
11531 pf->rss_table_size : 64; in i40e_vsi_mem_alloc()
11532 vsi->netdev_registered = false; in i40e_vsi_mem_alloc()
11533 vsi->work_limit = I40E_DEFAULT_IRQ_WORK; in i40e_vsi_mem_alloc()
11534 hash_init(vsi->mac_filter_hash); in i40e_vsi_mem_alloc()
11535 vsi->irqs_ready = false; in i40e_vsi_mem_alloc()
11538 vsi->af_xdp_zc_qps = bitmap_zalloc(pf->num_lan_qps, GFP_KERNEL); in i40e_vsi_mem_alloc()
11539 if (!vsi->af_xdp_zc_qps) in i40e_vsi_mem_alloc()
11555 spin_lock_init(&vsi->mac_filter_hash_lock); in i40e_vsi_mem_alloc()
11556 pf->vsi[vsi_idx] = vsi; in i40e_vsi_mem_alloc()
11561 bitmap_free(vsi->af_xdp_zc_qps); in i40e_vsi_mem_alloc()
11562 pf->next_vsi = i - 1; in i40e_vsi_mem_alloc()
11565 mutex_unlock(&pf->switch_mutex); in i40e_vsi_mem_alloc()
11570 * i40e_vsi_free_arrays - Free queue and vector pointer arrays for the VSI
11581 kfree(vsi->q_vectors); in i40e_vsi_free_arrays()
11582 vsi->q_vectors = NULL; in i40e_vsi_free_arrays()
11584 kfree(vsi->tx_rings); in i40e_vsi_free_arrays()
11585 vsi->tx_rings = NULL; in i40e_vsi_free_arrays()
11586 vsi->rx_rings = NULL; in i40e_vsi_free_arrays()
11587 vsi->xdp_rings = NULL; in i40e_vsi_free_arrays()
11591 * i40e_clear_rss_config_user - clear the user configured RSS hash keys
11600 kfree(vsi->rss_hkey_user); in i40e_clear_rss_config_user()
11601 vsi->rss_hkey_user = NULL; in i40e_clear_rss_config_user()
11603 kfree(vsi->rss_lut_user); in i40e_clear_rss_config_user()
11604 vsi->rss_lut_user = NULL; in i40e_clear_rss_config_user()
11608 * i40e_vsi_clear - Deallocate the VSI provided
11609 * @vsi: the VSI being un-configured
11618 if (!vsi->back) in i40e_vsi_clear()
11620 pf = vsi->back; in i40e_vsi_clear()
11622 mutex_lock(&pf->switch_mutex); in i40e_vsi_clear()
11623 if (!pf->vsi[vsi->idx]) { in i40e_vsi_clear()
11624 dev_err(&pf->pdev->dev, "pf->vsi[%d] is NULL, just free vsi[%d](type %d)\n", in i40e_vsi_clear()
11625 vsi->idx, vsi->idx, vsi->type); in i40e_vsi_clear()
11629 if (pf->vsi[vsi->idx] != vsi) { in i40e_vsi_clear()
11630 dev_err(&pf->pdev->dev, in i40e_vsi_clear()
11631 "pf->vsi[%d](type %d) != vsi[%d](type %d): no free!\n", in i40e_vsi_clear()
11632 pf->vsi[vsi->idx]->idx, in i40e_vsi_clear()
11633 pf->vsi[vsi->idx]->type, in i40e_vsi_clear()
11634 vsi->idx, vsi->type); in i40e_vsi_clear()
11639 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_clear()
11640 i40e_put_lump(pf->irq_pile, vsi->base_vector, vsi->idx); in i40e_vsi_clear()
11642 bitmap_free(vsi->af_xdp_zc_qps); in i40e_vsi_clear()
11646 pf->vsi[vsi->idx] = NULL; in i40e_vsi_clear()
11647 if (vsi->idx < pf->next_vsi) in i40e_vsi_clear()
11648 pf->next_vsi = vsi->idx; in i40e_vsi_clear()
11651 mutex_unlock(&pf->switch_mutex); in i40e_vsi_clear()
11659 * i40e_vsi_clear_rings - Deallocates the Rx and Tx rings for the provided VSI
11666 if (vsi->tx_rings && vsi->tx_rings[0]) { in i40e_vsi_clear_rings()
11667 for (i = 0; i < vsi->alloc_queue_pairs; i++) { in i40e_vsi_clear_rings()
11668 kfree_rcu(vsi->tx_rings[i], rcu); in i40e_vsi_clear_rings()
11669 WRITE_ONCE(vsi->tx_rings[i], NULL); in i40e_vsi_clear_rings()
11670 WRITE_ONCE(vsi->rx_rings[i], NULL); in i40e_vsi_clear_rings()
11671 if (vsi->xdp_rings) in i40e_vsi_clear_rings()
11672 WRITE_ONCE(vsi->xdp_rings[i], NULL); in i40e_vsi_clear_rings()
11678 * i40e_alloc_rings - Allocates the Rx and Tx rings for the provided VSI
11684 struct i40e_pf *pf = vsi->back; in i40e_alloc_rings()
11688 for (i = 0; i < vsi->alloc_queue_pairs; i++) { in i40e_alloc_rings()
11694 ring->queue_index = i; in i40e_alloc_rings()
11695 ring->reg_idx = vsi->base_queue + i; in i40e_alloc_rings()
11696 ring->ring_active = false; in i40e_alloc_rings()
11697 ring->vsi = vsi; in i40e_alloc_rings()
11698 ring->netdev = vsi->netdev; in i40e_alloc_rings()
11699 ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
11700 ring->count = vsi->num_tx_desc; in i40e_alloc_rings()
11701 ring->size = 0; in i40e_alloc_rings()
11702 ring->dcb_tc = 0; in i40e_alloc_rings()
11703 if (test_bit(I40E_HW_CAP_WB_ON_ITR, vsi->back->hw.caps)) in i40e_alloc_rings()
11704 ring->flags = I40E_TXR_FLAGS_WB_ON_ITR; in i40e_alloc_rings()
11705 ring->itr_setting = pf->tx_itr_default; in i40e_alloc_rings()
11706 WRITE_ONCE(vsi->tx_rings[i], ring++); in i40e_alloc_rings()
11711 ring->queue_index = vsi->alloc_queue_pairs + i; in i40e_alloc_rings()
11712 ring->reg_idx = vsi->base_queue + ring->queue_index; in i40e_alloc_rings()
11713 ring->ring_active = false; in i40e_alloc_rings()
11714 ring->vsi = vsi; in i40e_alloc_rings()
11715 ring->netdev = NULL; in i40e_alloc_rings()
11716 ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
11717 ring->count = vsi->num_tx_desc; in i40e_alloc_rings()
11718 ring->size = 0; in i40e_alloc_rings()
11719 ring->dcb_tc = 0; in i40e_alloc_rings()
11720 if (test_bit(I40E_HW_CAP_WB_ON_ITR, vsi->back->hw.caps)) in i40e_alloc_rings()
11721 ring->flags = I40E_TXR_FLAGS_WB_ON_ITR; in i40e_alloc_rings()
11723 ring->itr_setting = pf->tx_itr_default; in i40e_alloc_rings()
11724 WRITE_ONCE(vsi->xdp_rings[i], ring++); in i40e_alloc_rings()
11727 ring->queue_index = i; in i40e_alloc_rings()
11728 ring->reg_idx = vsi->base_queue + i; in i40e_alloc_rings()
11729 ring->ring_active = false; in i40e_alloc_rings()
11730 ring->vsi = vsi; in i40e_alloc_rings()
11731 ring->netdev = vsi->netdev; in i40e_alloc_rings()
11732 ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
11733 ring->count = vsi->num_rx_desc; in i40e_alloc_rings()
11734 ring->size = 0; in i40e_alloc_rings()
11735 ring->dcb_tc = 0; in i40e_alloc_rings()
11736 ring->itr_setting = pf->rx_itr_default; in i40e_alloc_rings()
11737 WRITE_ONCE(vsi->rx_rings[i], ring); in i40e_alloc_rings()
11744 return -ENOMEM; in i40e_alloc_rings()
11748 * i40e_reserve_msix_vectors - Reserve MSI-X vectors in the kernel
11750 * @vectors: the number of MSI-X vectors to request
11756 vectors = pci_enable_msix_range(pf->pdev, pf->msix_entries, in i40e_reserve_msix_vectors()
11759 dev_info(&pf->pdev->dev, in i40e_reserve_msix_vectors()
11760 "MSI-X vector reservation failed: %d\n", vectors); in i40e_reserve_msix_vectors()
11768 * i40e_init_msix - Setup the MSIX capability
11777 struct i40e_hw *hw = &pf->hw; in i40e_init_msix()
11784 if (!test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_init_msix()
11785 return -ENODEV; in i40e_init_msix()
11788 * - Add 1 for "other" cause for Admin Queue events, etc. in i40e_init_msix()
11789 * - The number of LAN queue pairs in i40e_init_msix()
11790 * - Queues being used for RSS. in i40e_init_msix()
11794 * - assumes symmetric Tx/Rx pairing in i40e_init_msix()
11795 * - The number of VMDq pairs in i40e_init_msix()
11796 * - The CPU count within the NUMA node if iWARP is enabled in i40e_init_msix()
11802 vectors_left = hw->func_caps.num_msix_vectors; in i40e_init_msix()
11808 vectors_left--; in i40e_init_msix()
11819 pf->num_lan_msix = min_t(int, cpus, vectors_left / 2); in i40e_init_msix()
11820 vectors_left -= pf->num_lan_msix; in i40e_init_msix()
11823 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) { in i40e_init_msix()
11825 pf->num_fdsb_msix = 1; in i40e_init_msix()
11827 vectors_left--; in i40e_init_msix()
11829 pf->num_fdsb_msix = 0; in i40e_init_msix()
11834 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) { in i40e_init_msix()
11835 iwarp_requested = pf->num_iwarp_msix; in i40e_init_msix()
11838 pf->num_iwarp_msix = 0; in i40e_init_msix()
11839 else if (vectors_left < pf->num_iwarp_msix) in i40e_init_msix()
11840 pf->num_iwarp_msix = 1; in i40e_init_msix()
11841 v_budget += pf->num_iwarp_msix; in i40e_init_msix()
11842 vectors_left -= pf->num_iwarp_msix; in i40e_init_msix()
11846 if (test_bit(I40E_FLAG_VMDQ_ENA, pf->flags)) { in i40e_init_msix()
11848 pf->num_vmdq_msix = 0; in i40e_init_msix()
11849 pf->num_vmdq_qps = 0; in i40e_init_msix()
11852 pf->num_vmdq_vsis * pf->num_vmdq_qps; in i40e_init_msix()
11863 pf->num_vmdq_qps = 1; in i40e_init_msix()
11864 vmdq_vecs_wanted = pf->num_vmdq_vsis; in i40e_init_msix()
11869 pf->num_vmdq_msix = pf->num_vmdq_qps; in i40e_init_msix()
11872 vectors_left -= vmdq_vecs; in i40e_init_msix()
11885 extra_vectors = min_t(int, cpus - pf->num_lan_msix, vectors_left); in i40e_init_msix()
11886 pf->num_lan_msix += extra_vectors; in i40e_init_msix()
11887 vectors_left -= extra_vectors; in i40e_init_msix()
11890 …remaining vectors underflowed. This is an accounting bug when determining total MSI-X vectors.\n"); in i40e_init_msix()
11892 v_budget += pf->num_lan_msix; in i40e_init_msix()
11893 pf->msix_entries = kcalloc(v_budget, sizeof(struct msix_entry), in i40e_init_msix()
11895 if (!pf->msix_entries) in i40e_init_msix()
11896 return -ENOMEM; in i40e_init_msix()
11899 pf->msix_entries[i].entry = i; in i40e_init_msix()
11903 clear_bit(I40E_FLAG_MSIX_ENA, pf->flags); in i40e_init_msix()
11904 kfree(pf->msix_entries); in i40e_init_msix()
11905 pf->msix_entries = NULL; in i40e_init_msix()
11906 pci_disable_msix(pf->pdev); in i40e_init_msix()
11907 return -ENODEV; in i40e_init_msix()
11911 pf->num_vmdq_vsis = 0; in i40e_init_msix()
11912 pf->num_vmdq_qps = 0; in i40e_init_msix()
11913 pf->num_lan_qps = 1; in i40e_init_msix()
11914 pf->num_lan_msix = 1; in i40e_init_msix()
11924 dev_info(&pf->pdev->dev, in i40e_init_msix()
11925 "MSI-X vector limit reached with %d, wanted %d, attempting to redistribute vectors\n", in i40e_init_msix()
11928 vec = v_actual - 1; in i40e_init_msix()
11931 pf->num_vmdq_msix = 1; /* force VMDqs to only one vector */ in i40e_init_msix()
11932 pf->num_vmdq_vsis = 1; in i40e_init_msix()
11933 pf->num_vmdq_qps = 1; in i40e_init_msix()
11938 pf->num_lan_msix = 1; in i40e_init_msix()
11941 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) { in i40e_init_msix()
11942 pf->num_lan_msix = 1; in i40e_init_msix()
11943 pf->num_iwarp_msix = 1; in i40e_init_msix()
11945 pf->num_lan_msix = 2; in i40e_init_msix()
11949 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) { in i40e_init_msix()
11950 pf->num_iwarp_msix = min_t(int, (vec / 3), in i40e_init_msix()
11952 pf->num_vmdq_vsis = min_t(int, (vec / 3), in i40e_init_msix()
11955 pf->num_vmdq_vsis = min_t(int, (vec / 2), in i40e_init_msix()
11958 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) { in i40e_init_msix()
11959 pf->num_fdsb_msix = 1; in i40e_init_msix()
11960 vec--; in i40e_init_msix()
11962 pf->num_lan_msix = min_t(int, in i40e_init_msix()
11963 (vec - (pf->num_iwarp_msix + pf->num_vmdq_vsis)), in i40e_init_msix()
11964 pf->num_lan_msix); in i40e_init_msix()
11965 pf->num_lan_qps = pf->num_lan_msix; in i40e_init_msix()
11970 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags) && pf->num_fdsb_msix == 0) { in i40e_init_msix()
11971 dev_info(&pf->pdev->dev, "Sideband Flowdir disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
11972 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_init_msix()
11973 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_init_msix()
11975 if (test_bit(I40E_FLAG_VMDQ_ENA, pf->flags) && pf->num_vmdq_msix == 0) { in i40e_init_msix()
11976 dev_info(&pf->pdev->dev, "VMDq disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
11977 clear_bit(I40E_FLAG_VMDQ_ENA, pf->flags); in i40e_init_msix()
11980 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags) && in i40e_init_msix()
11981 pf->num_iwarp_msix == 0) { in i40e_init_msix()
11982 dev_info(&pf->pdev->dev, "IWARP disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
11983 clear_bit(I40E_FLAG_IWARP_ENA, pf->flags); in i40e_init_msix()
11985 i40e_debug(&pf->hw, I40E_DEBUG_INIT, in i40e_init_msix()
11986 "MSI-X vector distribution: PF %d, VMDq %d, FDSB %d, iWARP %d\n", in i40e_init_msix()
11987 pf->num_lan_msix, in i40e_init_msix()
11988 pf->num_vmdq_msix * pf->num_vmdq_vsis, in i40e_init_msix()
11989 pf->num_fdsb_msix, in i40e_init_msix()
11990 pf->num_iwarp_msix); in i40e_init_msix()
11996 * i40e_vsi_alloc_q_vector - Allocate memory for a single interrupt vector
12000 * We allocate one q_vector. If allocation fails we return -ENOMEM.
12009 return -ENOMEM; in i40e_vsi_alloc_q_vector()
12011 q_vector->vsi = vsi; in i40e_vsi_alloc_q_vector()
12012 q_vector->v_idx = v_idx; in i40e_vsi_alloc_q_vector()
12013 cpumask_copy(&q_vector->affinity_mask, cpu_possible_mask); in i40e_vsi_alloc_q_vector()
12015 if (vsi->netdev) in i40e_vsi_alloc_q_vector()
12016 netif_napi_add(vsi->netdev, &q_vector->napi, i40e_napi_poll); in i40e_vsi_alloc_q_vector()
12019 vsi->q_vectors[v_idx] = q_vector; in i40e_vsi_alloc_q_vector()
12025 * i40e_vsi_alloc_q_vectors - Allocate memory for interrupt vectors
12029 * return -ENOMEM.
12033 struct i40e_pf *pf = vsi->back; in i40e_vsi_alloc_q_vectors()
12037 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_vsi_alloc_q_vectors()
12038 num_q_vectors = vsi->num_q_vectors; in i40e_vsi_alloc_q_vectors()
12039 else if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_alloc_q_vectors()
12042 return -EINVAL; in i40e_vsi_alloc_q_vectors()
12053 while (v_idx--) in i40e_vsi_alloc_q_vectors()
12060 * i40e_init_interrupt_scheme - Determine proper interrupt scheme
12068 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_init_interrupt_scheme()
12071 clear_bit(I40E_FLAG_MSIX_ENA, pf->flags); in i40e_init_interrupt_scheme()
12072 clear_bit(I40E_FLAG_IWARP_ENA, pf->flags); in i40e_init_interrupt_scheme()
12073 clear_bit(I40E_FLAG_RSS_ENA, pf->flags); in i40e_init_interrupt_scheme()
12074 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_init_interrupt_scheme()
12075 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_init_interrupt_scheme()
12076 clear_bit(I40E_FLAG_SRIOV_ENA, pf->flags); in i40e_init_interrupt_scheme()
12077 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_init_interrupt_scheme()
12078 clear_bit(I40E_FLAG_FD_ATR_ENA, pf->flags); in i40e_init_interrupt_scheme()
12079 clear_bit(I40E_FLAG_VMDQ_ENA, pf->flags); in i40e_init_interrupt_scheme()
12080 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_init_interrupt_scheme()
12087 if (!test_bit(I40E_FLAG_MSIX_ENA, pf->flags) && in i40e_init_interrupt_scheme()
12088 test_bit(I40E_FLAG_MSI_ENA, pf->flags)) { in i40e_init_interrupt_scheme()
12089 dev_info(&pf->pdev->dev, "MSI-X not available, trying MSI\n"); in i40e_init_interrupt_scheme()
12090 vectors = pci_enable_msi(pf->pdev); in i40e_init_interrupt_scheme()
12092 dev_info(&pf->pdev->dev, "MSI init failed - %d\n", in i40e_init_interrupt_scheme()
12094 clear_bit(I40E_FLAG_MSI_ENA, pf->flags); in i40e_init_interrupt_scheme()
12099 if (!test_bit(I40E_FLAG_MSI_ENA, pf->flags) && in i40e_init_interrupt_scheme()
12100 !test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_init_interrupt_scheme()
12101 dev_info(&pf->pdev->dev, "MSI-X and MSI not available, falling back to Legacy IRQ\n"); in i40e_init_interrupt_scheme()
12105 pf->irq_pile = kzalloc(size, GFP_KERNEL); in i40e_init_interrupt_scheme()
12106 if (!pf->irq_pile) in i40e_init_interrupt_scheme()
12107 return -ENOMEM; in i40e_init_interrupt_scheme()
12109 pf->irq_pile->num_entries = vectors; in i40e_init_interrupt_scheme()
12112 (void)i40e_get_lump(pf, pf->irq_pile, 1, I40E_PILE_VALID_BIT - 1); in i40e_init_interrupt_scheme()
12118 * i40e_restore_interrupt_scheme - Restore the interrupt scheme
12122 * device. This should be called during resume to re-allocate the q_vectors
12130 /* We cleared the MSI and MSI-X flags when disabling the old interrupt in i40e_restore_interrupt_scheme()
12131 * scheme. We need to re-enabled them here in order to attempt to in i40e_restore_interrupt_scheme()
12132 * re-acquire the MSI or MSI-X vectors in i40e_restore_interrupt_scheme()
12134 set_bit(I40E_FLAG_MSI_ENA, pf->flags); in i40e_restore_interrupt_scheme()
12135 set_bit(I40E_FLAG_MSIX_ENA, pf->flags); in i40e_restore_interrupt_scheme()
12141 /* Now that we've re-acquired IRQs, we need to remap the vectors and in i40e_restore_interrupt_scheme()
12156 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) in i40e_restore_interrupt_scheme()
12162 while (i--) { in i40e_restore_interrupt_scheme()
12163 if (pf->vsi[i]) in i40e_restore_interrupt_scheme()
12164 i40e_vsi_free_q_vectors(pf->vsi[i]); in i40e_restore_interrupt_scheme()
12171 * i40e_setup_misc_vector_for_recovery_mode - Setup the misc vector to handle
12176 * the non-queue interrupts, e.g. AdminQ and errors in recovery mode.
12184 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_setup_misc_vector_for_recovery_mode()
12188 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector_for_recovery_mode()
12189 "MSI-X misc vector request failed, error %d\n", in i40e_setup_misc_vector_for_recovery_mode()
12194 u32 flags = test_bit(I40E_FLAG_MSI_ENA, pf->flags) ? 0 : IRQF_SHARED; in i40e_setup_misc_vector_for_recovery_mode()
12196 err = request_irq(pf->pdev->irq, i40e_intr, flags, in i40e_setup_misc_vector_for_recovery_mode()
12197 pf->int_name, pf); in i40e_setup_misc_vector_for_recovery_mode()
12200 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector_for_recovery_mode()
12213 * i40e_setup_misc_vector - Setup the misc vector to handle non queue events
12217 * non-queue interrupts, e.g. AdminQ and errors. This is not used
12222 struct i40e_hw *hw = &pf->hw; in i40e_setup_misc_vector()
12226 if (!test_and_set_bit(__I40E_MISC_IRQ_REQUESTED, pf->state)) { in i40e_setup_misc_vector()
12227 err = request_irq(pf->msix_entries[0].vector, in i40e_setup_misc_vector()
12228 i40e_intr, 0, pf->int_name, pf); in i40e_setup_misc_vector()
12230 clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state); in i40e_setup_misc_vector()
12231 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector()
12233 pf->int_name, err); in i40e_setup_misc_vector()
12234 return -EFAULT; in i40e_setup_misc_vector()
12252 * i40e_get_rss_aq - Get RSS keys and lut by using AQ commands
12263 struct i40e_pf *pf = vsi->back; in i40e_get_rss_aq()
12264 struct i40e_hw *hw = &pf->hw; in i40e_get_rss_aq()
12268 ret = i40e_aq_get_rss_key(hw, vsi->id, in i40e_get_rss_aq()
12271 dev_info(&pf->pdev->dev, in i40e_get_rss_aq()
12274 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_get_rss_aq()
12280 bool pf_lut = vsi->type == I40E_VSI_MAIN; in i40e_get_rss_aq()
12282 ret = i40e_aq_get_rss_lut(hw, vsi->id, pf_lut, lut, lut_size); in i40e_get_rss_aq()
12284 dev_info(&pf->pdev->dev, in i40e_get_rss_aq()
12287 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_get_rss_aq()
12296 * i40e_config_rss_reg - Configure RSS keys and lut by writing registers
12307 struct i40e_pf *pf = vsi->back; in i40e_config_rss_reg()
12308 struct i40e_hw *hw = &pf->hw; in i40e_config_rss_reg()
12309 u16 vf_id = vsi->vf_id; in i40e_config_rss_reg()
12316 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_rss_reg()
12319 } else if (vsi->type == I40E_VSI_SRIOV) { in i40e_config_rss_reg()
12323 dev_err(&pf->pdev->dev, "Cannot set RSS seed - invalid VSI type\n"); in i40e_config_rss_reg()
12330 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_rss_reg()
12332 return -EINVAL; in i40e_config_rss_reg()
12335 } else if (vsi->type == I40E_VSI_SRIOV) { in i40e_config_rss_reg()
12337 return -EINVAL; in i40e_config_rss_reg()
12341 dev_err(&pf->pdev->dev, "Cannot set RSS LUT - invalid VSI type\n"); in i40e_config_rss_reg()
12350 * i40e_get_rss_reg - Get the RSS keys and lut by reading registers
12361 struct i40e_pf *pf = vsi->back; in i40e_get_rss_reg()
12362 struct i40e_hw *hw = &pf->hw; in i40e_get_rss_reg()
12375 return -EINVAL; in i40e_get_rss_reg()
12384 * i40e_config_rss - Configure RSS keys and lut
12394 struct i40e_pf *pf = vsi->back; in i40e_config_rss()
12396 if (test_bit(I40E_HW_CAP_RSS_AQ, pf->hw.caps)) in i40e_config_rss()
12403 * i40e_get_rss - Get RSS keys and lut
12413 struct i40e_pf *pf = vsi->back; in i40e_get_rss()
12415 if (test_bit(I40E_HW_CAP_RSS_AQ, pf->hw.caps)) in i40e_get_rss()
12422 * i40e_fill_rss_lut - Fill the RSS lookup table with default values
12438 * i40e_pf_config_rss - Prepare for RSS if used
12446 struct i40e_hw *hw = &pf->hw; in i40e_pf_config_rss()
12461 reg_val = (pf->rss_table_size == 512) ? in i40e_pf_config_rss()
12467 if (!vsi->rss_size) { in i40e_pf_config_rss()
12470 * could end up with zero TCs. Check for that to avoid in i40e_pf_config_rss()
12471 * divide-by-zero. It probably won't pass traffic, but it also in i40e_pf_config_rss()
12474 qcount = vsi->num_queue_pairs / in i40e_pf_config_rss()
12475 (vsi->tc_config.numtc ? vsi->tc_config.numtc : 1); in i40e_pf_config_rss()
12476 vsi->rss_size = min_t(int, pf->alloc_rss_size, qcount); in i40e_pf_config_rss()
12478 if (!vsi->rss_size) in i40e_pf_config_rss()
12479 return -EINVAL; in i40e_pf_config_rss()
12481 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in i40e_pf_config_rss()
12483 return -ENOMEM; in i40e_pf_config_rss()
12486 if (vsi->rss_lut_user) in i40e_pf_config_rss()
12487 memcpy(lut, vsi->rss_lut_user, vsi->rss_table_size); in i40e_pf_config_rss()
12489 i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, vsi->rss_size); in i40e_pf_config_rss()
12494 if (vsi->rss_hkey_user) in i40e_pf_config_rss()
12495 memcpy(seed, vsi->rss_hkey_user, I40E_HKEY_ARRAY_SIZE); in i40e_pf_config_rss()
12498 ret = i40e_config_rss(vsi, seed, lut, vsi->rss_table_size); in i40e_pf_config_rss()
12505 * i40e_reconfig_rss_queues - change number of queues for rss and rebuild
12518 if (!test_bit(I40E_FLAG_RSS_ENA, pf->flags)) in i40e_reconfig_rss_queues()
12522 new_rss_size = min_t(int, queue_count, pf->rss_size_max); in i40e_reconfig_rss_queues()
12524 if (queue_count != vsi->num_queue_pairs) { in i40e_reconfig_rss_queues()
12527 vsi->req_queue_pairs = queue_count; in i40e_reconfig_rss_queues()
12529 if (test_bit(__I40E_IN_REMOVE, pf->state)) in i40e_reconfig_rss_queues()
12530 return pf->alloc_rss_size; in i40e_reconfig_rss_queues()
12532 pf->alloc_rss_size = new_rss_size; in i40e_reconfig_rss_queues()
12539 if (queue_count < vsi->rss_size) { in i40e_reconfig_rss_queues()
12541 dev_dbg(&pf->pdev->dev, in i40e_reconfig_rss_queues()
12545 /* Reset vsi->rss_size, as number of enabled queues changed */ in i40e_reconfig_rss_queues()
12546 qcount = vsi->num_queue_pairs / vsi->tc_config.numtc; in i40e_reconfig_rss_queues()
12547 vsi->rss_size = min_t(int, pf->alloc_rss_size, qcount); in i40e_reconfig_rss_queues()
12551 dev_info(&pf->pdev->dev, "User requested queue count/HW max RSS count: %d/%d\n", in i40e_reconfig_rss_queues()
12552 vsi->req_queue_pairs, pf->rss_size_max); in i40e_reconfig_rss_queues()
12553 return pf->alloc_rss_size; in i40e_reconfig_rss_queues()
12557 * i40e_get_partition_bw_setting - Retrieve BW settings for this PF partition
12566 status = i40e_read_bw_from_alt_ram(&pf->hw, &max_bw, &min_bw, in i40e_get_partition_bw_setting()
12571 pf->min_bw = min_bw; in i40e_get_partition_bw_setting()
12573 pf->max_bw = max_bw; in i40e_get_partition_bw_setting()
12580 * i40e_set_partition_bw_setting - Set BW settings for this PF partition
12591 bw_data.pf_valid_bits = cpu_to_le16(BIT(pf->hw.pf_id)); in i40e_set_partition_bw_setting()
12592 bw_data.max_bw[pf->hw.pf_id] = pf->max_bw & I40E_ALT_BW_VALUE_MASK; in i40e_set_partition_bw_setting()
12593 bw_data.min_bw[pf->hw.pf_id] = pf->min_bw & I40E_ALT_BW_VALUE_MASK; in i40e_set_partition_bw_setting()
12596 status = i40e_aq_configure_partition_bw(&pf->hw, &bw_data, NULL); in i40e_set_partition_bw_setting()
12602 * i40e_is_total_port_shutdown_enabled - read NVM and return value
12621 read_status = i40e_read_nvm_word(&pf->hw, in i40e_is_total_port_shutdown_enabled()
12626 read_status = i40e_read_nvm_word(&pf->hw, in i40e_is_total_port_shutdown_enabled()
12633 read_status = i40e_read_nvm_module_data(&pf->hw, in i40e_is_total_port_shutdown_enabled()
12641 link_behavior >>= (pf->hw.port * I40E_LINK_BEHAVIOR_PORT_BIT_LENGTH); in i40e_is_total_port_shutdown_enabled()
12647 dev_warn(&pf->pdev->dev, in i40e_is_total_port_shutdown_enabled()
12648 "total-port-shutdown feature is off due to read nvm error: %pe\n", in i40e_is_total_port_shutdown_enabled()
12654 * i40e_sw_init - Initialize general software structures (struct i40e_pf)
12668 bitmap_zero(pf->flags, I40E_PF_FLAGS_NBITS); in i40e_sw_init()
12669 set_bit(I40E_FLAG_MSI_ENA, pf->flags); in i40e_sw_init()
12670 set_bit(I40E_FLAG_MSIX_ENA, pf->flags); in i40e_sw_init()
12673 pf->rx_itr_default = I40E_ITR_RX_DEF; in i40e_sw_init()
12674 pf->tx_itr_default = I40E_ITR_TX_DEF; in i40e_sw_init()
12679 pf->rss_size_max = BIT(pf->hw.func_caps.rss_table_entry_width); in i40e_sw_init()
12680 pf->alloc_rss_size = 1; in i40e_sw_init()
12681 pf->rss_table_size = pf->hw.func_caps.rss_table_size; in i40e_sw_init()
12682 pf->rss_size_max = min_t(int, pf->rss_size_max, in i40e_sw_init()
12683 pf->hw.func_caps.num_tx_qp); in i40e_sw_init()
12685 /* find the next higher power-of-2 of num cpus */ in i40e_sw_init()
12687 pf->rss_size_max = min_t(int, pf->rss_size_max, pow); in i40e_sw_init()
12689 if (pf->hw.func_caps.rss) { in i40e_sw_init()
12690 set_bit(I40E_FLAG_RSS_ENA, pf->flags); in i40e_sw_init()
12691 pf->alloc_rss_size = min_t(int, pf->rss_size_max, in i40e_sw_init()
12696 if (pf->hw.func_caps.npar_enable || pf->hw.func_caps.flex10_enable) { in i40e_sw_init()
12697 set_bit(I40E_FLAG_MFP_ENA, pf->flags); in i40e_sw_init()
12698 dev_info(&pf->pdev->dev, "MFP mode Enabled\n"); in i40e_sw_init()
12700 dev_warn(&pf->pdev->dev, in i40e_sw_init()
12703 dev_info(&pf->pdev->dev, in i40e_sw_init()
12705 pf->min_bw, pf->max_bw); in i40e_sw_init()
12712 if ((pf->hw.func_caps.fd_filters_guaranteed > 0) || in i40e_sw_init()
12713 (pf->hw.func_caps.fd_filters_best_effort > 0)) { in i40e_sw_init()
12714 set_bit(I40E_FLAG_FD_ATR_ENA, pf->flags); in i40e_sw_init()
12715 if (test_bit(I40E_FLAG_MFP_ENA, pf->flags) && in i40e_sw_init()
12716 pf->hw.num_partitions > 1) in i40e_sw_init()
12717 dev_info(&pf->pdev->dev, in i40e_sw_init()
12720 set_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_sw_init()
12721 pf->fdir_pf_filter_count = in i40e_sw_init()
12722 pf->hw.func_caps.fd_filters_guaranteed; in i40e_sw_init()
12723 pf->hw.fdir_shared_filter_count = in i40e_sw_init()
12724 pf->hw.func_caps.fd_filters_best_effort; in i40e_sw_init()
12728 if (test_bit(I40E_HW_CAP_ATR_EVICT, pf->hw.caps)) in i40e_sw_init()
12729 set_bit(I40E_FLAG_HW_ATR_EVICT_ENA, pf->flags); in i40e_sw_init()
12731 if (pf->hw.func_caps.vmdq && num_online_cpus() != 1) { in i40e_sw_init()
12732 pf->num_vmdq_vsis = I40E_DEFAULT_NUM_VMDQ_VSI; in i40e_sw_init()
12733 set_bit(I40E_FLAG_VMDQ_ENA, pf->flags); in i40e_sw_init()
12734 pf->num_vmdq_qps = i40e_default_queues_per_vmdq(pf); in i40e_sw_init()
12737 if (pf->hw.func_caps.iwarp && num_online_cpus() != 1) { in i40e_sw_init()
12738 set_bit(I40E_FLAG_IWARP_ENA, pf->flags); in i40e_sw_init()
12740 pf->num_iwarp_msix = (int)num_online_cpus() + 1; in i40e_sw_init()
12747 if (pf->hw.mac.type == I40E_MAC_XL710 && in i40e_sw_init()
12748 pf->hw.func_caps.npar_enable) in i40e_sw_init()
12749 clear_bit(I40E_HW_CAP_FW_LLDP_STOPPABLE, pf->hw.caps); in i40e_sw_init()
12752 if (pf->hw.func_caps.num_vfs && pf->hw.partition_id == 1) { in i40e_sw_init()
12753 pf->num_vf_qps = I40E_DEFAULT_QUEUES_PER_VF; in i40e_sw_init()
12754 set_bit(I40E_FLAG_SRIOV_ENA, pf->flags); in i40e_sw_init()
12755 pf->num_req_vfs = min_t(int, in i40e_sw_init()
12756 pf->hw.func_caps.num_vfs, in i40e_sw_init()
12760 pf->lan_veb = I40E_NO_VEB; in i40e_sw_init()
12761 pf->lan_vsi = I40E_NO_VSI; in i40e_sw_init()
12764 clear_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags); in i40e_sw_init()
12768 + (sizeof(u16) * pf->hw.func_caps.num_tx_qp); in i40e_sw_init()
12769 pf->qp_pile = kzalloc(size, GFP_KERNEL); in i40e_sw_init()
12770 if (!pf->qp_pile) { in i40e_sw_init()
12771 err = -ENOMEM; in i40e_sw_init()
12774 pf->qp_pile->num_entries = pf->hw.func_caps.num_tx_qp; in i40e_sw_init()
12776 pf->tx_timeout_recovery_level = 1; in i40e_sw_init()
12778 if (pf->hw.mac.type != I40E_MAC_X722 && in i40e_sw_init()
12783 set_bit(I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENA, pf->flags); in i40e_sw_init()
12784 set_bit(I40E_FLAG_LINK_DOWN_ON_CLOSE_ENA, pf->flags); in i40e_sw_init()
12785 dev_info(&pf->pdev->dev, in i40e_sw_init()
12786 "total-port-shutdown was enabled, link-down-on-close is forced on\n"); in i40e_sw_init()
12788 mutex_init(&pf->switch_mutex); in i40e_sw_init()
12795 * i40e_set_ntuple - set the ntuple feature flag and take action
12805 /* Check if Flow Director n-tuple support was enabled or disabled. If in i40e_set_ntuple()
12810 if (!test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) in i40e_set_ntuple()
12812 /* enable FD_SB only if there is MSI-X vector and no cloud in i40e_set_ntuple()
12815 if (pf->num_fdsb_msix > 0 && !pf->num_cloud_filters) { in i40e_set_ntuple()
12816 set_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_set_ntuple()
12817 clear_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_set_ntuple()
12821 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) { in i40e_set_ntuple()
12825 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_set_ntuple()
12826 clear_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state); in i40e_set_ntuple()
12827 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_set_ntuple()
12830 pf->fd_add_err = 0; in i40e_set_ntuple()
12831 pf->fd_atr_cnt = 0; in i40e_set_ntuple()
12832 /* if ATR was auto disabled it can be re-enabled. */ in i40e_set_ntuple()
12833 if (test_and_clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) in i40e_set_ntuple()
12834 if (test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags) && in i40e_set_ntuple()
12835 (I40E_DEBUG_FD & pf->hw.debug_mask)) in i40e_set_ntuple()
12836 dev_info(&pf->pdev->dev, "ATR re-enabled.\n"); in i40e_set_ntuple()
12842 * i40e_clear_rss_lut - clear the rx hash lookup table
12847 struct i40e_pf *pf = vsi->back; in i40e_clear_rss_lut()
12848 struct i40e_hw *hw = &pf->hw; in i40e_clear_rss_lut()
12849 u16 vf_id = vsi->vf_id; in i40e_clear_rss_lut()
12852 if (vsi->type == I40E_VSI_MAIN) { in i40e_clear_rss_lut()
12855 } else if (vsi->type == I40E_VSI_SRIOV) { in i40e_clear_rss_lut()
12859 dev_err(&pf->pdev->dev, "Cannot set RSS LUT - invalid VSI type\n"); in i40e_clear_rss_lut()
12864 * i40e_set_loopback - turn on/off loopback mode on underlying PF
12870 bool if_running = netif_running(vsi->netdev) && in i40e_set_loopback()
12871 !test_and_set_bit(__I40E_VSI_DOWN, vsi->state); in i40e_set_loopback()
12877 ret = i40e_aq_set_mac_loopback(&vsi->back->hw, ena, NULL); in i40e_set_loopback()
12879 netdev_err(vsi->netdev, "Failed to toggle loopback state\n"); in i40e_set_loopback()
12887 * i40e_set_features - set the netdev feature flags
12896 struct i40e_vsi *vsi = np->vsi; in i40e_set_features()
12897 struct i40e_pf *pf = vsi->back; in i40e_set_features()
12900 if (features & NETIF_F_RXHASH && !(netdev->features & NETIF_F_RXHASH)) in i40e_set_features()
12903 netdev->features & NETIF_F_RXHASH) in i40e_set_features()
12912 (netdev->features & NETIF_F_HW_TC) && pf->num_cloud_filters) { in i40e_set_features()
12913 dev_err(&pf->pdev->dev, in i40e_set_features()
12915 return -EINVAL; in i40e_set_features()
12918 if (!(features & NETIF_F_HW_L2FW_DOFFLOAD) && vsi->macvlan_cnt) in i40e_set_features()
12926 if ((features ^ netdev->features) & NETIF_F_LOOPBACK) in i40e_set_features()
12937 struct i40e_hw *hw = &np->vsi->back->hw; in i40e_udp_tunnel_set_port()
12941 type = ti->type == UDP_TUNNEL_TYPE_VXLAN ? I40E_AQC_TUNNEL_TYPE_VXLAN : in i40e_udp_tunnel_set_port()
12944 ret = i40e_aq_add_udp_tunnel(hw, ntohs(ti->port), type, &filter_index, in i40e_udp_tunnel_set_port()
12948 ERR_PTR(ret), libie_aq_str(hw->aq.asq_last_status)); in i40e_udp_tunnel_set_port()
12949 return -EIO; in i40e_udp_tunnel_set_port()
12961 struct i40e_hw *hw = &np->vsi->back->hw; in i40e_udp_tunnel_unset_port()
12964 ret = i40e_aq_del_udp_tunnel(hw, ti->hw_priv, NULL); in i40e_udp_tunnel_unset_port()
12967 ERR_PTR(ret), libie_aq_str(hw->aq.asq_last_status)); in i40e_udp_tunnel_unset_port()
12968 return -EIO; in i40e_udp_tunnel_unset_port()
12978 struct i40e_pf *pf = np->vsi->back; in i40e_get_phys_port_id()
12979 struct i40e_hw *hw = &pf->hw; in i40e_get_phys_port_id()
12981 if (!test_bit(I40E_HW_CAP_PORT_ID_VALID, pf->hw.caps)) in i40e_get_phys_port_id()
12982 return -EOPNOTSUPP; in i40e_get_phys_port_id()
12984 ppid->id_len = min_t(int, sizeof(hw->mac.port_addr), sizeof(ppid->id)); in i40e_get_phys_port_id()
12985 memcpy(ppid->id, hw->mac.port_addr, ppid->id_len); in i40e_get_phys_port_id()
12991 * i40e_ndo_fdb_add - add an entry to the hardware database
13008 struct i40e_pf *pf = np->vsi->back; in i40e_ndo_fdb_add()
13011 if (!test_bit(I40E_FLAG_SRIOV_ENA, pf->flags)) in i40e_ndo_fdb_add()
13012 return -EOPNOTSUPP; in i40e_ndo_fdb_add()
13015 pr_info("%s: vlans aren't supported yet for dev_uc|mc_add()\n", dev->name); in i40e_ndo_fdb_add()
13016 return -EINVAL; in i40e_ndo_fdb_add()
13022 if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) { in i40e_ndo_fdb_add()
13024 return -EINVAL; in i40e_ndo_fdb_add()
13032 err = -EINVAL; in i40e_ndo_fdb_add()
13035 if (err == -EEXIST && !(flags & NLM_F_EXCL)) in i40e_ndo_fdb_add()
13042 * i40e_ndo_bridge_setlink - Set the hardware bridge mode
13063 struct i40e_vsi *vsi = np->vsi; in i40e_ndo_bridge_setlink()
13064 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_setlink()
13070 if (vsi->type != I40E_VSI_MAIN) in i40e_ndo_bridge_setlink()
13071 return -EOPNOTSUPP; in i40e_ndo_bridge_setlink()
13074 veb = i40e_pf_get_veb_by_seid(pf, vsi->uplink_seid); in i40e_ndo_bridge_setlink()
13078 return -EINVAL; in i40e_ndo_bridge_setlink()
13085 return -EINVAL; in i40e_ndo_bridge_setlink()
13089 veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid, in i40e_ndo_bridge_setlink()
13090 vsi->tc_config.enabled_tc); in i40e_ndo_bridge_setlink()
13092 veb->bridge_mode = mode; in i40e_ndo_bridge_setlink()
13096 return -ENOENT; in i40e_ndo_bridge_setlink()
13099 } else if (mode != veb->bridge_mode) { in i40e_ndo_bridge_setlink()
13101 veb->bridge_mode = mode; in i40e_ndo_bridge_setlink()
13104 set_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags); in i40e_ndo_bridge_setlink()
13106 clear_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags); in i40e_ndo_bridge_setlink()
13116 * i40e_ndo_bridge_getlink - Get the hardware bridge mode
13133 struct i40e_vsi *vsi = np->vsi; in i40e_ndo_bridge_getlink()
13134 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_getlink()
13138 if (vsi->type != I40E_VSI_MAIN) in i40e_ndo_bridge_getlink()
13139 return -EOPNOTSUPP; in i40e_ndo_bridge_getlink()
13142 veb = i40e_pf_get_veb_by_seid(pf, vsi->uplink_seid); in i40e_ndo_bridge_getlink()
13146 return ndo_dflt_bridge_getlink(skb, pid, seq, dev, veb->bridge_mode, in i40e_ndo_bridge_getlink()
13151 * i40e_features_check - Validate encapsulated packet conforms to limits
13166 if (skb->ip_summed != CHECKSUM_PARTIAL) in i40e_features_check()
13172 if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_size < 64)) in i40e_features_check()
13185 if (skb->encapsulation) { in i40e_features_check()
13187 len = skb_inner_network_header(skb) - skb_transport_header(skb); in i40e_features_check()
13192 len = skb_inner_transport_header(skb) - in i40e_features_check()
13209 * i40e_xdp_setup - add/remove an XDP program
13218 struct i40e_pf *pf = vsi->back; in i40e_xdp_setup()
13224 if (prog && test_bit(__I40E_IN_REMOVE, pf->state)) in i40e_xdp_setup()
13225 return -EINVAL; in i40e_xdp_setup()
13228 if (vsi->netdev->mtu > frame_size - I40E_PACKET_HDR_PAD) { in i40e_xdp_setup()
13230 return -EINVAL; in i40e_xdp_setup()
13233 /* When turning XDP on->off/off->on we reset and rebuild the rings. */ in i40e_xdp_setup()
13238 old_prog = xchg(&vsi->xdp_prog, prog); in i40e_xdp_setup()
13242 xdp_features_clear_redirect_target(vsi->netdev); in i40e_xdp_setup()
13243 /* Wait until ndo_xsk_wakeup completes. */ in i40e_xdp_setup()
13251 return -ENOMEM; in i40e_xdp_setup()
13254 return -ENOMEM; in i40e_xdp_setup()
13257 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_xdp_setup()
13258 WRITE_ONCE(vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog); in i40e_xdp_setup()
13267 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_xdp_setup()
13268 if (vsi->xdp_rings[i]->xsk_pool) in i40e_xdp_setup()
13269 (void)i40e_xsk_wakeup(vsi->netdev, i, in i40e_xdp_setup()
13271 xdp_features_set_redirect_target(vsi->netdev, true); in i40e_xdp_setup()
13278 * i40e_enter_busy_conf - Enters busy config state
13285 struct i40e_pf *pf = vsi->back; in i40e_enter_busy_conf()
13288 while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) { in i40e_enter_busy_conf()
13289 timeout--; in i40e_enter_busy_conf()
13291 return -EBUSY; in i40e_enter_busy_conf()
13299 * i40e_exit_busy_conf - Exits busy config state
13304 struct i40e_pf *pf = vsi->back; in i40e_exit_busy_conf()
13306 clear_bit(__I40E_CONFIG_BUSY, pf->state); in i40e_exit_busy_conf()
13310 * i40e_queue_pair_reset_stats - Resets all statistics for a queue pair
13316 memset(&vsi->rx_rings[queue_pair]->rx_stats, 0, in i40e_queue_pair_reset_stats()
13317 sizeof(vsi->rx_rings[queue_pair]->rx_stats)); in i40e_queue_pair_reset_stats()
13318 memset(&vsi->tx_rings[queue_pair]->stats, 0, in i40e_queue_pair_reset_stats()
13319 sizeof(vsi->tx_rings[queue_pair]->stats)); in i40e_queue_pair_reset_stats()
13321 memset(&vsi->xdp_rings[queue_pair]->stats, 0, in i40e_queue_pair_reset_stats()
13322 sizeof(vsi->xdp_rings[queue_pair]->stats)); in i40e_queue_pair_reset_stats()
13327 * i40e_queue_pair_clean_rings - Cleans all the rings of a queue pair
13333 i40e_clean_tx_ring(vsi->tx_rings[queue_pair]); in i40e_queue_pair_clean_rings()
13335 /* Make sure that in-progress ndo_xdp_xmit calls are in i40e_queue_pair_clean_rings()
13339 i40e_clean_tx_ring(vsi->xdp_rings[queue_pair]); in i40e_queue_pair_clean_rings()
13341 i40e_clean_rx_ring(vsi->rx_rings[queue_pair]); in i40e_queue_pair_clean_rings()
13345 * i40e_queue_pair_toggle_napi - Enables/disables NAPI for a queue pair
13353 struct i40e_ring *rxr = vsi->rx_rings[queue_pair]; in i40e_queue_pair_toggle_napi()
13354 struct i40e_q_vector *q_vector = rxr->q_vector; in i40e_queue_pair_toggle_napi()
13356 if (!vsi->netdev) in i40e_queue_pair_toggle_napi()
13360 if (q_vector->rx.ring || q_vector->tx.ring) { in i40e_queue_pair_toggle_napi()
13362 napi_enable(&q_vector->napi); in i40e_queue_pair_toggle_napi()
13364 napi_disable(&q_vector->napi); in i40e_queue_pair_toggle_napi()
13369 * i40e_queue_pair_toggle_rings - Enables/disables all rings for a queue pair
13379 struct i40e_pf *pf = vsi->back; in i40e_queue_pair_toggle_rings()
13382 pf_q = vsi->base_queue + queue_pair; in i40e_queue_pair_toggle_rings()
13383 ret = i40e_control_wait_tx_q(vsi->seid, pf, pf_q, in i40e_queue_pair_toggle_rings()
13386 dev_info(&pf->pdev->dev, in i40e_queue_pair_toggle_rings()
13388 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_queue_pair_toggle_rings()
13395 dev_info(&pf->pdev->dev, in i40e_queue_pair_toggle_rings()
13397 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_queue_pair_toggle_rings()
13410 ret = i40e_control_wait_tx_q(vsi->seid, pf, in i40e_queue_pair_toggle_rings()
13411 pf_q + vsi->alloc_queue_pairs, in i40e_queue_pair_toggle_rings()
13414 dev_info(&pf->pdev->dev, in i40e_queue_pair_toggle_rings()
13416 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_queue_pair_toggle_rings()
13423 * i40e_queue_pair_enable_irq - Enables interrupts for a queue pair
13429 struct i40e_ring *rxr = vsi->rx_rings[queue_pair]; in i40e_queue_pair_enable_irq()
13430 struct i40e_pf *pf = vsi->back; in i40e_queue_pair_enable_irq()
13431 struct i40e_hw *hw = &pf->hw; in i40e_queue_pair_enable_irq()
13434 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_queue_pair_enable_irq()
13435 i40e_irq_dynamic_enable(vsi, rxr->q_vector->v_idx); in i40e_queue_pair_enable_irq()
13443 * i40e_queue_pair_disable_irq - Disables interrupts for a queue pair
13449 struct i40e_ring *rxr = vsi->rx_rings[queue_pair]; in i40e_queue_pair_disable_irq()
13450 struct i40e_pf *pf = vsi->back; in i40e_queue_pair_disable_irq()
13451 struct i40e_hw *hw = &pf->hw; in i40e_queue_pair_disable_irq()
13459 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_queue_pair_disable_irq()
13460 u32 intpf = vsi->base_vector + rxr->q_vector->v_idx; in i40e_queue_pair_disable_irq()
13462 wr32(hw, I40E_PFINT_DYN_CTLN(intpf - 1), 0); in i40e_queue_pair_disable_irq()
13464 synchronize_irq(pf->msix_entries[intpf].vector); in i40e_queue_pair_disable_irq()
13466 /* Legacy and MSI mode - this stops all interrupt handling */ in i40e_queue_pair_disable_irq()
13470 synchronize_irq(pf->pdev->irq); in i40e_queue_pair_disable_irq()
13475 * i40e_queue_pair_disable - Disables a queue pair
13492 i40e_clean_rx_ring(vsi->rx_rings[queue_pair]); in i40e_queue_pair_disable()
13500 * i40e_queue_pair_enable - Enables a queue pair
13510 err = i40e_configure_tx_ring(vsi->tx_rings[queue_pair]); in i40e_queue_pair_enable()
13515 err = i40e_configure_tx_ring(vsi->xdp_rings[queue_pair]); in i40e_queue_pair_enable()
13520 err = i40e_configure_rx_ring(vsi->rx_rings[queue_pair]); in i40e_queue_pair_enable()
13534 * i40e_xdp - implements ndo_bpf for i40e
13542 struct i40e_vsi *vsi = np->vsi; in i40e_xdp()
13544 if (vsi->type != I40E_VSI_MAIN) in i40e_xdp()
13545 return -EINVAL; in i40e_xdp()
13547 switch (xdp->command) { in i40e_xdp()
13549 return i40e_xdp_setup(vsi, xdp->prog, xdp->extack); in i40e_xdp()
13551 return i40e_xsk_pool_setup(vsi, xdp->xsk.pool, in i40e_xdp()
13552 xdp->xsk.queue_id); in i40e_xdp()
13554 return -EINVAL; in i40e_xdp()
13599 * i40e_config_netdev - Setup the netdev flags
13606 struct i40e_pf *pf = vsi->back; in i40e_config_netdev()
13607 struct i40e_hw *hw = &pf->hw; in i40e_config_netdev()
13617 netdev = alloc_etherdev_mq(etherdev_size, vsi->alloc_queue_pairs); in i40e_config_netdev()
13619 return -ENOMEM; in i40e_config_netdev()
13621 vsi->netdev = netdev; in i40e_config_netdev()
13623 np->vsi = vsi; in i40e_config_netdev()
13645 if (!test_bit(I40E_HW_CAP_OUTER_UDP_CSUM, pf->hw.caps)) in i40e_config_netdev()
13646 netdev->gso_partial_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM; in i40e_config_netdev()
13648 netdev->udp_tunnel_nic_info = &pf->udp_tunnel_nic; in i40e_config_netdev()
13650 netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM; in i40e_config_netdev()
13652 netdev->hw_enc_features |= hw_enc_features; in i40e_config_netdev()
13655 netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID; in i40e_config_netdev()
13664 netdev->gso_partial_features = I40E_GSO_PARTIAL_FEATURES; in i40e_config_netdev()
13665 netdev->features |= NETIF_F_GSO_PARTIAL | in i40e_config_netdev()
13668 netdev->mpls_features |= NETIF_F_SG; in i40e_config_netdev()
13669 netdev->mpls_features |= NETIF_F_HW_CSUM; in i40e_config_netdev()
13670 netdev->mpls_features |= NETIF_F_TSO; in i40e_config_netdev()
13671 netdev->mpls_features |= NETIF_F_TSO6; in i40e_config_netdev()
13672 netdev->mpls_features |= I40E_GSO_PARTIAL_FEATURES; in i40e_config_netdev()
13675 netdev->hw_features |= NETIF_F_HW_L2FW_DOFFLOAD; in i40e_config_netdev()
13681 if (!test_bit(I40E_FLAG_MFP_ENA, pf->flags)) in i40e_config_netdev()
13684 netdev->hw_features |= hw_features | NETIF_F_LOOPBACK; in i40e_config_netdev()
13686 netdev->features |= hw_features | NETIF_F_HW_VLAN_CTAG_FILTER; in i40e_config_netdev()
13687 netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID; in i40e_config_netdev()
13689 netdev->features &= ~NETIF_F_HW_TC; in i40e_config_netdev()
13691 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_netdev()
13692 SET_NETDEV_DEV(netdev, &pf->pdev->dev); in i40e_config_netdev()
13693 ether_addr_copy(mac_addr, hw->mac.perm_addr); in i40e_config_netdev()
13695 * some older NVM configurations load a default MAC-VLAN in i40e_config_netdev()
13705 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
13707 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
13709 netdev->xdp_features = NETDEV_XDP_ACT_BASIC | in i40e_config_netdev()
13713 netdev->xdp_zc_max_segs = I40E_MAX_BUFFER_TXD; in i40e_config_netdev()
13718 * original name by IFNAMSIZ - 4 in i40e_config_netdev()
13722 snprintf(netdev->name, IFNAMSIZ, "%.*sv%%d", IFNAMSIZ - 4, in i40e_config_netdev()
13723 main_vsi->netdev->name); in i40e_config_netdev()
13726 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
13728 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
13745 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
13747 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
13750 ether_addr_copy(netdev->perm_addr, mac_addr); in i40e_config_netdev()
13752 /* i40iw_net_event() reads 16 bytes from neigh->primary_key */ in i40e_config_netdev()
13753 netdev->neigh_priv_len = sizeof(u32) * 4; in i40e_config_netdev()
13755 netdev->priv_flags |= IFF_UNICAST_FLT; in i40e_config_netdev()
13756 netdev->priv_flags |= IFF_SUPP_NOFCS; in i40e_config_netdev()
13758 i40e_vsi_config_netdev_tc(vsi, vsi->tc_config.enabled_tc); in i40e_config_netdev()
13760 netdev->netdev_ops = &i40e_netdev_ops; in i40e_config_netdev()
13761 netdev->watchdog_timeo = 5 * HZ; in i40e_config_netdev()
13764 /* MTU range: 68 - 9706 */ in i40e_config_netdev()
13765 netdev->min_mtu = ETH_MIN_MTU; in i40e_config_netdev()
13766 netdev->max_mtu = I40E_MAX_RXBUFFER - I40E_PACKET_HDR_PAD; in i40e_config_netdev()
13772 * i40e_vsi_delete - Delete a VSI from the switch
13780 if (vsi == vsi->back->vsi[vsi->back->lan_vsi]) in i40e_vsi_delete()
13783 i40e_aq_delete_element(&vsi->back->hw, vsi->seid, NULL); in i40e_vsi_delete()
13787 * i40e_is_vsi_uplink_mode_veb - Check if the VSI's uplink bridge mode is VEB
13795 struct i40e_pf *pf = vsi->back; in i40e_is_vsi_uplink_mode_veb()
13798 if (vsi->veb_idx >= I40E_MAX_VEB) in i40e_is_vsi_uplink_mode_veb()
13801 veb = pf->veb[vsi->veb_idx]; in i40e_is_vsi_uplink_mode_veb()
13803 dev_info(&pf->pdev->dev, in i40e_is_vsi_uplink_mode_veb()
13805 return -ENOENT; in i40e_is_vsi_uplink_mode_veb()
13809 if (veb->bridge_mode & BRIDGE_MODE_VEPA) { in i40e_is_vsi_uplink_mode_veb()
13821 * i40e_add_vsi - Add a VSI to the switch
13829 int ret = -ENODEV; in i40e_add_vsi()
13830 struct i40e_pf *pf = vsi->back; in i40e_add_vsi()
13831 struct i40e_hw *hw = &pf->hw; in i40e_add_vsi()
13841 switch (vsi->type) { in i40e_add_vsi()
13848 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
13849 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
13851 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_add_vsi()
13854 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13857 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13858 return -ENOENT; in i40e_add_vsi()
13860 vsi->info = ctxt.info; in i40e_add_vsi()
13861 vsi->info.valid_sections = 0; in i40e_add_vsi()
13863 vsi->seid = ctxt.seid; in i40e_add_vsi()
13864 vsi->id = ctxt.vsi_number; in i40e_add_vsi()
13869 * negative logic - if it's set, we need to fiddle with in i40e_add_vsi()
13872 if (test_bit(I40E_FLAG_SOURCE_PRUNING_DIS, pf->flags)) { in i40e_add_vsi()
13874 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
13875 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
13883 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13886 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13887 ret = -ENOENT; in i40e_add_vsi()
13893 if (test_bit(I40E_FLAG_MFP_ENA, pf->flags) && in i40e_add_vsi()
13894 !(pf->hw.func_caps.iscsi)) { /* NIC type PF */ in i40e_add_vsi()
13896 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
13897 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
13902 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13905 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13906 ret = -ENOENT; in i40e_add_vsi()
13911 vsi->info.valid_sections = 0; in i40e_add_vsi()
13914 * reconfigure it to enable all TCs that are in i40e_add_vsi()
13924 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13925 "failed to configure TCs for main VSI tc_map 0x%08x, err %pe aq_err %s\n", in i40e_add_vsi()
13928 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13934 ctxt.pf_num = hw->pf_id; in i40e_add_vsi()
13936 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
13939 if (test_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags) && in i40e_add_vsi()
13950 ctxt.pf_num = hw->pf_id; in i40e_add_vsi()
13952 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
13971 ctxt.pf_num = hw->pf_id; in i40e_add_vsi()
13972 ctxt.vf_num = vsi->vf_id + hw->func_caps.vf_base_id; in i40e_add_vsi()
13973 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
13987 if (test_bit(I40E_FLAG_IWARP_ENA, vsi->back->flags)) { in i40e_add_vsi()
13997 if (pf->vf[vsi->vf_id].spoofchk) { in i40e_add_vsi()
14013 return -ENODEV; in i40e_add_vsi()
14016 if (vsi->type != I40E_VSI_MAIN) { in i40e_add_vsi()
14019 dev_info(&vsi->back->pdev->dev, in i40e_add_vsi()
14022 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_vsi()
14023 ret = -ENOENT; in i40e_add_vsi()
14026 vsi->info = ctxt.info; in i40e_add_vsi()
14027 vsi->info.valid_sections = 0; in i40e_add_vsi()
14028 vsi->seid = ctxt.seid; in i40e_add_vsi()
14029 vsi->id = ctxt.vsi_number; in i40e_add_vsi()
14032 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_add_vsi()
14033 vsi->active_filters = 0; in i40e_add_vsi()
14035 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_add_vsi()
14036 f->state = I40E_FILTER_NEW; in i40e_add_vsi()
14039 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_add_vsi()
14040 clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_add_vsi()
14043 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_add_vsi()
14044 set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state); in i40e_add_vsi()
14050 dev_info(&pf->pdev->dev, in i40e_add_vsi()
14052 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_vsi()
14062 * i40e_vsi_release - Delete a VSI and free its resources
14076 pf = vsi->back; in i40e_vsi_release()
14078 /* release of a VEB-owner or last VSI is not allowed */ in i40e_vsi_release()
14079 if (vsi->flags & I40E_VSI_FLAG_VEB_OWNER) { in i40e_vsi_release()
14080 dev_info(&pf->pdev->dev, "VSI %d has existing VEB %d\n", in i40e_vsi_release()
14081 vsi->seid, vsi->uplink_seid); in i40e_vsi_release()
14082 return -ENODEV; in i40e_vsi_release()
14084 if (vsi->type == I40E_VSI_MAIN && !test_bit(__I40E_DOWN, pf->state)) { in i40e_vsi_release()
14085 dev_info(&pf->pdev->dev, "Can't remove PF VSI\n"); in i40e_vsi_release()
14086 return -ENODEV; in i40e_vsi_release()
14088 set_bit(__I40E_VSI_RELEASING, vsi->state); in i40e_vsi_release()
14089 uplink_seid = vsi->uplink_seid; in i40e_vsi_release()
14091 if (vsi->type != I40E_VSI_SRIOV) { in i40e_vsi_release()
14092 if (vsi->netdev_registered) { in i40e_vsi_release()
14093 vsi->netdev_registered = false; in i40e_vsi_release()
14094 if (vsi->netdev) { in i40e_vsi_release()
14096 unregister_netdev(vsi->netdev); in i40e_vsi_release()
14104 if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_release()
14107 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_release()
14110 if (vsi->netdev) { in i40e_vsi_release()
14111 __dev_uc_unsync(vsi->netdev, NULL); in i40e_vsi_release()
14112 __dev_mc_unsync(vsi->netdev, NULL); in i40e_vsi_release()
14116 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) in i40e_vsi_release()
14119 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_release()
14125 if (vsi->netdev) { in i40e_vsi_release()
14126 free_netdev(vsi->netdev); in i40e_vsi_release()
14127 vsi->netdev = NULL; in i40e_vsi_release()
14137 * the floating VEBs yet. We'll wait for an explicit remove request in i40e_vsi_release()
14141 if (veb && veb->uplink_seid) { in i40e_vsi_release()
14144 /* Count non-controlling VSIs present on the VEB */ in i40e_vsi_release()
14146 if (vsi->uplink_seid == uplink_seid && in i40e_vsi_release()
14147 (vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) in i40e_vsi_release()
14161 * i40e_vsi_setup_vectors - Set up the q_vectors for the given VSI
14172 int ret = -ENOENT; in i40e_vsi_setup_vectors()
14173 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_vectors()
14175 if (vsi->q_vectors[0]) { in i40e_vsi_setup_vectors()
14176 dev_info(&pf->pdev->dev, "VSI %d has existing q_vectors\n", in i40e_vsi_setup_vectors()
14177 vsi->seid); in i40e_vsi_setup_vectors()
14178 return -EEXIST; in i40e_vsi_setup_vectors()
14181 if (vsi->base_vector) { in i40e_vsi_setup_vectors()
14182 dev_info(&pf->pdev->dev, "VSI %d has non-zero base vector %d\n", in i40e_vsi_setup_vectors()
14183 vsi->seid, vsi->base_vector); in i40e_vsi_setup_vectors()
14184 return -EEXIST; in i40e_vsi_setup_vectors()
14189 dev_info(&pf->pdev->dev, in i40e_vsi_setup_vectors()
14191 vsi->num_q_vectors, vsi->seid, ret); in i40e_vsi_setup_vectors()
14192 vsi->num_q_vectors = 0; in i40e_vsi_setup_vectors()
14199 if (!test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_vsi_setup_vectors()
14201 if (vsi->num_q_vectors) in i40e_vsi_setup_vectors()
14202 vsi->base_vector = i40e_get_lump(pf, pf->irq_pile, in i40e_vsi_setup_vectors()
14203 vsi->num_q_vectors, vsi->idx); in i40e_vsi_setup_vectors()
14204 if (vsi->base_vector < 0) { in i40e_vsi_setup_vectors()
14205 dev_info(&pf->pdev->dev, in i40e_vsi_setup_vectors()
14207 vsi->num_q_vectors, vsi->seid, vsi->base_vector); in i40e_vsi_setup_vectors()
14209 ret = -ENOENT; in i40e_vsi_setup_vectors()
14218 * i40e_vsi_reinit_setup - return and reallocate resources for a VSI
14221 * This re-allocates a vsi's queue resources.
14236 pf = vsi->back; in i40e_vsi_reinit_setup()
14238 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_reinit_setup()
14247 alloc_queue_pairs = vsi->alloc_queue_pairs * in i40e_vsi_reinit_setup()
14250 ret = i40e_get_lump(pf, pf->qp_pile, alloc_queue_pairs, vsi->idx); in i40e_vsi_reinit_setup()
14252 dev_info(&pf->pdev->dev, in i40e_vsi_reinit_setup()
14254 alloc_queue_pairs, vsi->seid, ret); in i40e_vsi_reinit_setup()
14257 vsi->base_queue = ret; in i40e_vsi_reinit_setup()
14263 main_vsi->seid = pf->main_vsi_seid; in i40e_vsi_reinit_setup()
14266 if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_reinit_setup()
14267 i40e_rm_default_mac_filter(vsi, pf->hw.mac.perm_addr); in i40e_vsi_reinit_setup()
14280 if (vsi->netdev_registered) { in i40e_vsi_reinit_setup()
14281 vsi->netdev_registered = false; in i40e_vsi_reinit_setup()
14282 unregister_netdev(vsi->netdev); in i40e_vsi_reinit_setup()
14283 free_netdev(vsi->netdev); in i40e_vsi_reinit_setup()
14284 vsi->netdev = NULL; in i40e_vsi_reinit_setup()
14286 if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_reinit_setup()
14288 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_reinit_setup()
14295 * i40e_vsi_setup - Set up a VSI by a given type
14317 * - the PF's port seid in i40e_vsi_setup()
14320 * - seid of an existing VEB in i40e_vsi_setup()
14321 * - seid of a VSI that owns an existing VEB in i40e_vsi_setup()
14322 * - seid of a VSI that doesn't own a VEB in i40e_vsi_setup()
14324 * - seid of the PF VSI, which is what creates the first VEB in i40e_vsi_setup()
14330 if (!veb && uplink_seid != pf->mac_seid) { in i40e_vsi_setup()
14333 dev_info(&pf->pdev->dev, "no such uplink_seid %d\n", in i40e_vsi_setup()
14338 if (vsi->uplink_seid == pf->mac_seid) in i40e_vsi_setup()
14339 veb = i40e_veb_setup(pf, pf->mac_seid, vsi->seid, in i40e_vsi_setup()
14340 vsi->tc_config.enabled_tc); in i40e_vsi_setup()
14341 else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) in i40e_vsi_setup()
14342 veb = i40e_veb_setup(pf, vsi->uplink_seid, vsi->seid, in i40e_vsi_setup()
14343 vsi->tc_config.enabled_tc); in i40e_vsi_setup()
14345 if (vsi->type != I40E_VSI_MAIN) { in i40e_vsi_setup()
14346 dev_info(&vsi->back->pdev->dev, in i40e_vsi_setup()
14354 if (!test_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags)) { in i40e_vsi_setup()
14355 veb->bridge_mode = BRIDGE_MODE_VEPA; in i40e_vsi_setup()
14356 clear_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags); in i40e_vsi_setup()
14360 veb = i40e_pf_get_veb_by_seid(pf, vsi->uplink_seid); in i40e_vsi_setup()
14362 dev_info(&pf->pdev->dev, "couldn't add VEB\n"); in i40e_vsi_setup()
14366 vsi->flags |= I40E_VSI_FLAG_VEB_OWNER; in i40e_vsi_setup()
14367 uplink_seid = veb->seid; in i40e_vsi_setup()
14374 vsi = pf->vsi[v_idx]; in i40e_vsi_setup()
14377 vsi->type = type; in i40e_vsi_setup()
14378 vsi->veb_idx = (veb ? veb->idx : I40E_NO_VEB); in i40e_vsi_setup()
14381 pf->lan_vsi = v_idx; in i40e_vsi_setup()
14383 vsi->vf_id = param1; in i40e_vsi_setup()
14385 alloc_queue_pairs = vsi->alloc_queue_pairs * in i40e_vsi_setup()
14388 ret = i40e_get_lump(pf, pf->qp_pile, alloc_queue_pairs, vsi->idx); in i40e_vsi_setup()
14390 dev_info(&pf->pdev->dev, in i40e_vsi_setup()
14392 alloc_queue_pairs, vsi->seid, ret); in i40e_vsi_setup()
14395 vsi->base_queue = ret; in i40e_vsi_setup()
14398 vsi->uplink_seid = uplink_seid; in i40e_vsi_setup()
14403 switch (vsi->type) { in i40e_vsi_setup()
14413 if (vsi->type == I40E_VSI_MAIN) { in i40e_vsi_setup()
14417 SET_NETDEV_DEVLINK_PORT(vsi->netdev, &pf->devlink_port); in i40e_vsi_setup()
14419 ret = register_netdev(vsi->netdev); in i40e_vsi_setup()
14422 vsi->netdev_registered = true; in i40e_vsi_setup()
14423 netif_carrier_off(vsi->netdev); in i40e_vsi_setup()
14449 if (test_bit(I40E_HW_CAP_RSS_AQ, pf->hw.caps) && in i40e_vsi_setup()
14450 vsi->type == I40E_VSI_VMDQ2) { in i40e_vsi_setup()
14462 if (vsi->netdev_registered) { in i40e_vsi_setup()
14463 vsi->netdev_registered = false; in i40e_vsi_setup()
14464 unregister_netdev(vsi->netdev); in i40e_vsi_setup()
14465 free_netdev(vsi->netdev); in i40e_vsi_setup()
14466 vsi->netdev = NULL; in i40e_vsi_setup()
14469 if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_setup()
14472 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_setup()
14480 * i40e_veb_get_bw_info - Query VEB BW information
14489 struct i40e_pf *pf = veb->pf; in i40e_veb_get_bw_info()
14490 struct i40e_hw *hw = &pf->hw; in i40e_veb_get_bw_info()
14495 ret = i40e_aq_query_switch_comp_bw_config(hw, veb->seid, in i40e_veb_get_bw_info()
14498 dev_info(&pf->pdev->dev, in i40e_veb_get_bw_info()
14500 ERR_PTR(ret), libie_aq_str(hw->aq.asq_last_status)); in i40e_veb_get_bw_info()
14504 ret = i40e_aq_query_switch_comp_ets_config(hw, veb->seid, in i40e_veb_get_bw_info()
14507 dev_info(&pf->pdev->dev, in i40e_veb_get_bw_info()
14509 ERR_PTR(ret), libie_aq_str(hw->aq.asq_last_status)); in i40e_veb_get_bw_info()
14513 veb->bw_limit = le16_to_cpu(ets_data.port_bw_limit); in i40e_veb_get_bw_info()
14514 veb->bw_max_quanta = ets_data.tc_bw_max; in i40e_veb_get_bw_info()
14515 veb->is_abs_credits = bw_data.absolute_credits_enable; in i40e_veb_get_bw_info()
14516 veb->enabled_tc = ets_data.tc_valid_bits; in i40e_veb_get_bw_info()
14520 veb->bw_tc_share_credits[i] = bw_data.tc_bw_share_credits[i]; in i40e_veb_get_bw_info()
14521 veb->bw_tc_limit_credits[i] = in i40e_veb_get_bw_info()
14523 veb->bw_tc_max_quanta[i] = ((tc_bw_max >> (i*4)) & 0x7); in i40e_veb_get_bw_info()
14531 * i40e_veb_mem_alloc - Allocates the next available struct veb in the PF
14539 int ret = -ENOENT; in i40e_veb_mem_alloc()
14544 mutex_lock(&pf->switch_mutex); in i40e_veb_mem_alloc()
14553 while ((i < I40E_MAX_VEB) && (pf->veb[i] != NULL)) in i40e_veb_mem_alloc()
14556 ret = -ENOMEM; in i40e_veb_mem_alloc()
14562 ret = -ENOMEM; in i40e_veb_mem_alloc()
14565 veb->pf = pf; in i40e_veb_mem_alloc()
14566 veb->idx = i; in i40e_veb_mem_alloc()
14567 veb->enabled_tc = 1; in i40e_veb_mem_alloc()
14569 pf->veb[i] = veb; in i40e_veb_mem_alloc()
14572 mutex_unlock(&pf->switch_mutex); in i40e_veb_mem_alloc()
14577 * i40e_switch_branch_release - Delete a branch of the switch tree
14585 struct i40e_pf *pf = branch->pf; in i40e_switch_branch_release()
14586 u16 branch_seid = branch->seid; in i40e_switch_branch_release()
14587 u16 veb_idx = branch->idx; in i40e_switch_branch_release()
14592 /* release any VEBs on this VEB - RECURSION */ in i40e_switch_branch_release()
14594 if (veb->uplink_seid == branch->seid) in i40e_switch_branch_release()
14603 if (vsi->uplink_seid == branch_seid && in i40e_switch_branch_release()
14604 (vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) in i40e_switch_branch_release()
14612 if (pf->veb[veb_idx]) in i40e_switch_branch_release()
14613 i40e_veb_release(pf->veb[veb_idx]); in i40e_switch_branch_release()
14617 * i40e_veb_clear - remove veb struct
14625 if (veb->pf) { in i40e_veb_clear()
14626 struct i40e_pf *pf = veb->pf; in i40e_veb_clear()
14628 mutex_lock(&pf->switch_mutex); in i40e_veb_clear()
14629 if (pf->veb[veb->idx] == veb) in i40e_veb_clear()
14630 pf->veb[veb->idx] = NULL; in i40e_veb_clear()
14631 mutex_unlock(&pf->switch_mutex); in i40e_veb_clear()
14638 * i40e_veb_release - Delete a VEB and free its resources
14647 pf = veb->pf; in i40e_veb_release()
14651 if (vsi_it->uplink_seid == veb->seid) { in i40e_veb_release()
14652 if (vsi_it->flags & I40E_VSI_FLAG_VEB_OWNER) in i40e_veb_release()
14660 if ((veb->uplink_seid && n != 1) || (!veb->uplink_seid && n != 0)) { in i40e_veb_release()
14661 dev_info(&pf->pdev->dev, in i40e_veb_release()
14663 veb->seid, n); in i40e_veb_release()
14668 if (veb->uplink_seid) { in i40e_veb_release()
14669 vsi->flags &= ~I40E_VSI_FLAG_VEB_OWNER; in i40e_veb_release()
14670 vsi->uplink_seid = veb->uplink_seid; in i40e_veb_release()
14671 vsi->veb_idx = I40E_NO_VEB; in i40e_veb_release()
14674 i40e_aq_delete_element(&pf->hw, veb->seid, NULL); in i40e_veb_release()
14679 * i40e_add_veb - create the VEB in the switch
14685 struct i40e_pf *pf = veb->pf; in i40e_add_veb()
14686 bool enable_stats = !!test_bit(I40E_FLAG_VEB_STATS_ENA, pf->flags); in i40e_add_veb()
14689 ret = i40e_aq_add_veb(&pf->hw, veb->uplink_seid, vsi ? vsi->seid : 0, in i40e_add_veb()
14690 veb->enabled_tc, vsi ? false : true, in i40e_add_veb()
14691 &veb->seid, enable_stats, NULL); in i40e_add_veb()
14695 dev_info(&pf->pdev->dev, in i40e_add_veb()
14697 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_veb()
14698 return -EPERM; in i40e_add_veb()
14702 ret = i40e_aq_get_veb_parameters(&pf->hw, veb->seid, NULL, NULL, in i40e_add_veb()
14703 &veb->stats_idx, NULL, NULL, NULL); in i40e_add_veb()
14705 dev_info(&pf->pdev->dev, in i40e_add_veb()
14707 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_veb()
14708 return -EPERM; in i40e_add_veb()
14712 dev_info(&pf->pdev->dev, in i40e_add_veb()
14714 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_add_veb()
14715 i40e_aq_delete_element(&pf->hw, veb->seid, NULL); in i40e_add_veb()
14716 return -ENOENT; in i40e_add_veb()
14720 vsi->uplink_seid = veb->seid; in i40e_add_veb()
14721 vsi->veb_idx = veb->idx; in i40e_add_veb()
14722 vsi->flags |= I40E_VSI_FLAG_VEB_OWNER; in i40e_add_veb()
14729 * i40e_veb_setup - Set up a VEB
14733 * @enabled_tc: Enabled TC bit-map
14754 dev_info(&pf->pdev->dev, in i40e_veb_setup()
14764 dev_err(&pf->pdev->dev, "vsi seid %d not found\n", in i40e_veb_setup()
14774 veb = pf->veb[veb_idx]; in i40e_veb_setup()
14775 veb->uplink_seid = uplink_seid; in i40e_veb_setup()
14776 veb->enabled_tc = (enabled_tc ? enabled_tc : 0x1); in i40e_veb_setup()
14783 if (vsi && vsi->idx == pf->lan_vsi) in i40e_veb_setup()
14784 pf->lan_veb = veb->idx; in i40e_veb_setup()
14795 * i40e_setup_pf_switch_element - set PF vars based on switch type
14807 u16 downlink_seid = le16_to_cpu(ele->downlink_seid); in i40e_setup_pf_switch_element()
14808 u16 uplink_seid = le16_to_cpu(ele->uplink_seid); in i40e_setup_pf_switch_element()
14809 u8 element_type = ele->element_type; in i40e_setup_pf_switch_element()
14810 u16 seid = le16_to_cpu(ele->seid); in i40e_setup_pf_switch_element()
14814 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch_element()
14820 pf->mac_seid = seid; in i40e_setup_pf_switch_element()
14824 if (uplink_seid != pf->mac_seid) in i40e_setup_pf_switch_element()
14833 pf->lan_veb = veb->idx; in i40e_setup_pf_switch_element()
14838 pf->lan_veb = v; in i40e_setup_pf_switch_element()
14842 /* Try to get again main VEB as pf->lan_veb may have changed */ in i40e_setup_pf_switch_element()
14847 veb->seid = seid; in i40e_setup_pf_switch_element()
14848 veb->uplink_seid = pf->mac_seid; in i40e_setup_pf_switch_element()
14849 veb->pf = pf; in i40e_setup_pf_switch_element()
14857 pf->mac_seid = uplink_seid; in i40e_setup_pf_switch_element()
14858 pf->main_vsi_seid = seid; in i40e_setup_pf_switch_element()
14860 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch_element()
14862 downlink_seid, pf->main_vsi_seid); in i40e_setup_pf_switch_element()
14873 dev_info(&pf->pdev->dev, "unknown element type=%d seid=%d\n", in i40e_setup_pf_switch_element()
14880 * i40e_fetch_switch_configuration - Get switch config from firmware
14897 return -ENOMEM; in i40e_fetch_switch_configuration()
14903 ret = i40e_aq_get_switch_config(&pf->hw, sw_config, in i40e_fetch_switch_configuration()
14907 dev_info(&pf->pdev->dev, in i40e_fetch_switch_configuration()
14909 ret, libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_fetch_switch_configuration()
14911 return -ENOENT; in i40e_fetch_switch_configuration()
14914 num_reported = le16_to_cpu(sw_config->header.num_reported); in i40e_fetch_switch_configuration()
14915 num_total = le16_to_cpu(sw_config->header.num_total); in i40e_fetch_switch_configuration()
14918 dev_info(&pf->pdev->dev, in i40e_fetch_switch_configuration()
14924 &sw_config->element[i]; in i40e_fetch_switch_configuration()
14936 * i40e_setup_pf_switch - Setup the HW switch on startup or after reset
14938 * @reinit: if the Main VSI needs to re-initialized.
14952 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch()
14954 ERR_PTR(ret), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_setup_pf_switch()
14965 if ((pf->hw.pf_id == 0) && in i40e_setup_pf_switch()
14966 !test_bit(I40E_FLAG_TRUE_PROMISC_ENA, pf->flags)) { in i40e_setup_pf_switch()
14968 pf->last_sw_conf_flags = flags; in i40e_setup_pf_switch()
14971 if (pf->hw.pf_id == 0) { in i40e_setup_pf_switch()
14975 ret = i40e_aq_set_switch_config(&pf->hw, flags, valid_flags, 0, in i40e_setup_pf_switch()
14977 if (ret && pf->hw.aq.asq_last_status != LIBIE_AQ_RC_ESRCH) { in i40e_setup_pf_switch()
14978 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch()
14981 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_setup_pf_switch()
14984 pf->last_sw_conf_valid_flags = valid_flags; in i40e_setup_pf_switch()
14998 uplink_seid = veb->seid; in i40e_setup_pf_switch()
15000 uplink_seid = pf->mac_seid; in i40e_setup_pf_switch()
15007 dev_info(&pf->pdev->dev, "setup of MAIN VSI failed\n"); in i40e_setup_pf_switch()
15010 return -EAGAIN; in i40e_setup_pf_switch()
15014 main_vsi->seid = pf->main_vsi_seid; in i40e_setup_pf_switch()
15024 dev_info(&pf->pdev->dev, "setup_pf_filter_control failed: %d\n", in i40e_setup_pf_switch()
15032 if (test_bit(I40E_FLAG_RSS_ENA, pf->flags)) in i40e_setup_pf_switch()
15044 udp_tunnel_nic_reset_ntf(main_vsi->netdev); in i40e_setup_pf_switch()
15053 * i40e_determine_queue_usage - Work out queue distribution
15061 pf->num_lan_qps = 0; in i40e_determine_queue_usage()
15067 queues_left = pf->hw.func_caps.num_tx_qp; in i40e_determine_queue_usage()
15070 !test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_determine_queue_usage()
15073 pf->alloc_rss_size = pf->num_lan_qps = 1; in i40e_determine_queue_usage()
15076 clear_bit(I40E_FLAG_RSS_ENA, pf->flags); in i40e_determine_queue_usage()
15077 clear_bit(I40E_FLAG_IWARP_ENA, pf->flags); in i40e_determine_queue_usage()
15078 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_determine_queue_usage()
15079 clear_bit(I40E_FLAG_FD_ATR_ENA, pf->flags); in i40e_determine_queue_usage()
15080 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_determine_queue_usage()
15081 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_determine_queue_usage()
15082 clear_bit(I40E_FLAG_SRIOV_ENA, pf->flags); in i40e_determine_queue_usage()
15083 clear_bit(I40E_FLAG_VMDQ_ENA, pf->flags); in i40e_determine_queue_usage()
15084 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_determine_queue_usage()
15085 } else if (!test_bit(I40E_FLAG_RSS_ENA, pf->flags) && in i40e_determine_queue_usage()
15086 !test_bit(I40E_FLAG_FD_SB_ENA, pf->flags) && in i40e_determine_queue_usage()
15087 !test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags) && in i40e_determine_queue_usage()
15088 !test_bit(I40E_FLAG_DCB_CAPABLE, pf->flags)) { in i40e_determine_queue_usage()
15090 pf->alloc_rss_size = pf->num_lan_qps = 1; in i40e_determine_queue_usage()
15091 queues_left -= pf->num_lan_qps; in i40e_determine_queue_usage()
15093 clear_bit(I40E_FLAG_RSS_ENA, pf->flags); in i40e_determine_queue_usage()
15094 clear_bit(I40E_FLAG_IWARP_ENA, pf->flags); in i40e_determine_queue_usage()
15095 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_determine_queue_usage()
15096 clear_bit(I40E_FLAG_FD_ATR_ENA, pf->flags); in i40e_determine_queue_usage()
15097 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_determine_queue_usage()
15098 clear_bit(I40E_FLAG_VMDQ_ENA, pf->flags); in i40e_determine_queue_usage()
15099 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_determine_queue_usage()
15101 /* Not enough queues for all TCs */ in i40e_determine_queue_usage()
15102 if (test_bit(I40E_FLAG_DCB_CAPABLE, pf->flags) && in i40e_determine_queue_usage()
15104 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_determine_queue_usage()
15105 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_determine_queue_usage()
15106 dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n"); in i40e_determine_queue_usage()
15110 q_max = max_t(int, pf->rss_size_max, num_online_cpus()); in i40e_determine_queue_usage()
15111 q_max = min_t(int, q_max, pf->hw.func_caps.num_tx_qp); in i40e_determine_queue_usage()
15112 q_max = min_t(int, q_max, pf->hw.func_caps.num_msix_vectors); in i40e_determine_queue_usage()
15113 pf->num_lan_qps = q_max; in i40e_determine_queue_usage()
15115 queues_left -= pf->num_lan_qps; in i40e_determine_queue_usage()
15118 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) { in i40e_determine_queue_usage()
15120 queues_left -= 1; /* save 1 queue for FD */ in i40e_determine_queue_usage()
15122 clear_bit(I40E_FLAG_FD_SB_ENA, pf->flags); in i40e_determine_queue_usage()
15123 set_bit(I40E_FLAG_FD_SB_INACTIVE, pf->flags); in i40e_determine_queue_usage()
15124 …dev_info(&pf->pdev->dev, "not enough queues for Flow Director. Flow Director feature is disabled\n… in i40e_determine_queue_usage()
15128 if (test_bit(I40E_FLAG_SRIOV_ENA, pf->flags) && in i40e_determine_queue_usage()
15129 pf->num_vf_qps && pf->num_req_vfs && queues_left) { in i40e_determine_queue_usage()
15130 pf->num_req_vfs = min_t(int, pf->num_req_vfs, in i40e_determine_queue_usage()
15131 (queues_left / pf->num_vf_qps)); in i40e_determine_queue_usage()
15132 queues_left -= (pf->num_req_vfs * pf->num_vf_qps); in i40e_determine_queue_usage()
15135 if (test_bit(I40E_FLAG_VMDQ_ENA, pf->flags) && in i40e_determine_queue_usage()
15136 pf->num_vmdq_vsis && pf->num_vmdq_qps && queues_left) { in i40e_determine_queue_usage()
15137 pf->num_vmdq_vsis = min_t(int, pf->num_vmdq_vsis, in i40e_determine_queue_usage()
15138 (queues_left / pf->num_vmdq_qps)); in i40e_determine_queue_usage()
15139 queues_left -= (pf->num_vmdq_vsis * pf->num_vmdq_qps); in i40e_determine_queue_usage()
15142 pf->queues_left = queues_left; in i40e_determine_queue_usage()
15143 dev_dbg(&pf->pdev->dev, in i40e_determine_queue_usage()
15145 pf->hw.func_caps.num_tx_qp, in i40e_determine_queue_usage()
15146 !!test_bit(I40E_FLAG_FD_SB_ENA, pf->flags), in i40e_determine_queue_usage()
15147 pf->num_lan_qps, pf->alloc_rss_size, pf->num_req_vfs, in i40e_determine_queue_usage()
15148 pf->num_vf_qps, pf->num_vmdq_vsis, pf->num_vmdq_qps, in i40e_determine_queue_usage()
15153 * i40e_setup_pf_filter_control - Setup PF static filter control
15165 struct i40e_filter_control_settings *settings = &pf->filter_settings; in i40e_setup_pf_filter_control()
15167 settings->hash_lut_size = I40E_HASH_LUT_SIZE_128; in i40e_setup_pf_filter_control()
15170 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags) || in i40e_setup_pf_filter_control()
15171 test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags)) in i40e_setup_pf_filter_control()
15172 settings->enable_fdir = true; in i40e_setup_pf_filter_control()
15175 settings->enable_ethtype = true; in i40e_setup_pf_filter_control()
15176 settings->enable_macvlan = true; in i40e_setup_pf_filter_control()
15178 if (i40e_set_filter_control(&pf->hw, settings)) in i40e_setup_pf_filter_control()
15179 return -ENOENT; in i40e_setup_pf_filter_control()
15185 #define REMAIN(__x) (INFO_STRING_LEN - (__x))
15189 struct i40e_hw *hw = &pf->hw; in i40e_print_features()
15197 i = snprintf(buf, INFO_STRING_LEN, "Features: PF-id[%d]", hw->pf_id); in i40e_print_features()
15199 i += scnprintf(&buf[i], REMAIN(i), " VFs: %d", pf->num_req_vfs); in i40e_print_features()
15202 pf->hw.func_caps.num_vsis, main_vsi->num_queue_pairs); in i40e_print_features()
15203 if (test_bit(I40E_FLAG_RSS_ENA, pf->flags)) in i40e_print_features()
15205 if (test_bit(I40E_FLAG_FD_ATR_ENA, pf->flags)) in i40e_print_features()
15207 if (test_bit(I40E_FLAG_FD_SB_ENA, pf->flags)) { in i40e_print_features()
15211 if (test_bit(I40E_FLAG_DCB_CAPABLE, pf->flags)) in i40e_print_features()
15215 if (test_bit(I40E_FLAG_PTP_ENA, pf->flags)) in i40e_print_features()
15217 if (test_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags)) in i40e_print_features()
15222 dev_info(&pf->pdev->dev, "%s\n", buf); in i40e_print_features()
15228 * i40e_get_platform_mac_addr - get platform-specific MAC address
15239 if (eth_platform_get_mac_address(&pdev->dev, pf->hw.mac.addr)) in i40e_get_platform_mac_addr()
15240 i40e_get_mac_addr(&pf->hw, pf->hw.mac.addr); in i40e_get_platform_mac_addr()
15244 * i40e_set_fec_in_flags - helper function for setting FEC options in flags
15271 * i40e_check_recovery_mode - check if we are running transition firmware
15281 u32 val = rd32(&pf->hw, I40E_GL_FWSTS); in i40e_check_recovery_mode()
15284 dev_crit(&pf->pdev->dev, "Firmware recovery mode detected. Limiting functionality.\n"); in i40e_check_recovery_mode()
15285 …dev_crit(&pf->pdev->dev, "Refer to the Intel(R) Ethernet Adapters and Devices User Guide for detai… in i40e_check_recovery_mode()
15286 set_bit(__I40E_RECOVERY_MODE, pf->state); in i40e_check_recovery_mode()
15290 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_check_recovery_mode()
15291 …dev_info(&pf->pdev->dev, "Please do Power-On Reset to initialize adapter in normal mode with full … in i40e_check_recovery_mode()
15297 * i40e_pf_loop_reset - perform reset in a loop.
15307 * state is to issue a series of pf-resets and check a return value.
15319 /* wait max 10 seconds for PF reset to succeed */ in i40e_pf_loop_reset()
15321 struct i40e_hw *hw = &pf->hw; in i40e_pf_loop_reset()
15331 pf->pfr_count++; in i40e_pf_loop_reset()
15333 dev_info(&pf->pdev->dev, "PF reset failed: %d\n", ret); in i40e_pf_loop_reset()
15339 * i40e_check_fw_empr - check if FW issued unexpected EMP Reset
15351 const u32 fw_sts = rd32(&pf->hw, I40E_GL_FWSTS) & in i40e_check_fw_empr()
15358 * i40e_handle_resets - handle EMP resets and PF resets
15374 …dev_crit(&pf->pdev->dev, "Entering recovery mode due to repeated FW resets. This may take several … in i40e_handle_resets()
15376 return is_empr ? -EIO : pfr; in i40e_handle_resets()
15380 * i40e_init_recovery_mode - initialize subsystems needed in recovery mode
15395 pci_set_drvdata(pf->pdev, pf); in i40e_init_recovery_mode()
15396 pci_save_state(pf->pdev); in i40e_init_recovery_mode()
15399 timer_setup(&pf->service_timer, i40e_service_timer, 0); in i40e_init_recovery_mode()
15400 pf->service_timer_period = HZ; in i40e_init_recovery_mode()
15402 INIT_WORK(&pf->service_task, i40e_service_task); in i40e_init_recovery_mode()
15403 clear_bit(__I40E_SERVICE_SCHED, pf->state); in i40e_init_recovery_mode()
15414 if (pf->hw.func_caps.num_vsis < I40E_MIN_VSI_ALLOC) in i40e_init_recovery_mode()
15415 pf->num_alloc_vsi = I40E_MIN_VSI_ALLOC; in i40e_init_recovery_mode()
15417 pf->num_alloc_vsi = pf->hw.func_caps.num_vsis; in i40e_init_recovery_mode()
15420 pf->vsi = kcalloc(pf->num_alloc_vsi, sizeof(struct i40e_vsi *), in i40e_init_recovery_mode()
15422 if (!pf->vsi) { in i40e_init_recovery_mode()
15423 err = -ENOMEM; in i40e_init_recovery_mode()
15435 pf->lan_vsi = v_idx; in i40e_init_recovery_mode()
15436 vsi = pf->vsi[v_idx]; in i40e_init_recovery_mode()
15438 err = -EFAULT; in i40e_init_recovery_mode()
15441 vsi->alloc_queue_pairs = 1; in i40e_init_recovery_mode()
15445 err = register_netdev(vsi->netdev); in i40e_init_recovery_mode()
15448 vsi->netdev_registered = true; in i40e_init_recovery_mode()
15459 mod_timer(&pf->service_timer, in i40e_init_recovery_mode()
15460 round_jiffies(jiffies + pf->service_timer_period)); in i40e_init_recovery_mode()
15466 timer_shutdown_sync(&pf->service_timer); in i40e_init_recovery_mode()
15468 iounmap(hw->hw_addr); in i40e_init_recovery_mode()
15469 pci_release_mem_regions(pf->pdev); in i40e_init_recovery_mode()
15470 pci_disable_device(pf->pdev); in i40e_init_recovery_mode()
15477 * i40e_set_subsystem_device_id - set subsystem device id
15487 hw->subsystem_device_id = pf->pdev->subsystem_device ? in i40e_set_subsystem_device_id()
15488 pf->pdev->subsystem_device : in i40e_set_subsystem_device_id()
15493 * i40e_probe - Device initialization routine
15526 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in i40e_probe()
15528 dev_err(&pdev->dev, in i40e_probe()
15536 dev_info(&pdev->dev, in i40e_probe()
15548 pf = i40e_alloc_pf(&pdev->dev); in i40e_probe()
15550 err = -ENOMEM; in i40e_probe()
15553 pf->next_vsi = 0; in i40e_probe()
15554 pf->pdev = pdev; in i40e_probe()
15555 set_bit(__I40E_DOWN, pf->state); in i40e_probe()
15557 hw = &pf->hw; in i40e_probe()
15559 pf->ioremap_len = min_t(int, pci_resource_len(pdev, 0), in i40e_probe()
15566 if (pf->ioremap_len < I40E_GLGEN_STAT_CLEAR) { in i40e_probe()
15567 dev_err(&pdev->dev, "Cannot map registers, bar size 0x%X too small, aborting\n", in i40e_probe()
15568 pf->ioremap_len); in i40e_probe()
15569 err = -ENOMEM; in i40e_probe()
15572 hw->hw_addr = ioremap(pci_resource_start(pdev, 0), pf->ioremap_len); in i40e_probe()
15573 if (!hw->hw_addr) { in i40e_probe()
15574 err = -EIO; in i40e_probe()
15575 dev_info(&pdev->dev, "ioremap(0x%04x, 0x%04x) failed: 0x%x\n", in i40e_probe()
15577 pf->ioremap_len, err); in i40e_probe()
15580 hw->vendor_id = pdev->vendor; in i40e_probe()
15581 hw->device_id = pdev->device; in i40e_probe()
15582 pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); in i40e_probe()
15583 hw->subsystem_vendor_id = pdev->subsystem_vendor; in i40e_probe()
15585 hw->bus.device = PCI_SLOT(pdev->devfn); in i40e_probe()
15586 hw->bus.func = PCI_FUNC(pdev->devfn); in i40e_probe()
15587 hw->bus.bus_id = pdev->bus->number; in i40e_probe()
15592 hw->switch_tag = 0xffff; in i40e_probe()
15593 hw->first_tag = ETH_P_8021AD; in i40e_probe()
15594 hw->second_tag = ETH_P_8021Q; in i40e_probe()
15596 INIT_LIST_HEAD(&pf->l3_flex_pit_list); in i40e_probe()
15597 INIT_LIST_HEAD(&pf->l4_flex_pit_list); in i40e_probe()
15598 INIT_LIST_HEAD(&pf->ddp_old_prof); in i40e_probe()
15603 mutex_init(&hw->aq.asq_mutex); in i40e_probe()
15604 mutex_init(&hw->aq.arq_mutex); in i40e_probe()
15606 pf->msg_enable = netif_msg_init(debug, in i40e_probe()
15610 if (debug < -1) in i40e_probe()
15611 pf->hw.debug_mask = debug; in i40e_probe()
15614 if (hw->revision_id == 0 && in i40e_probe()
15619 pf->corer_count++; in i40e_probe()
15629 dev_warn(&pdev->dev, "unidentified MAC or BLANK NVM: %d\n", in i40e_probe()
15641 hw->aq.num_arq_entries = I40E_MIN_ARQ_LEN; in i40e_probe()
15642 hw->aq.num_asq_entries = I40E_MIN_ASQ_LEN; in i40e_probe()
15644 hw->aq.num_arq_entries = I40E_AQ_LEN; in i40e_probe()
15645 hw->aq.num_asq_entries = I40E_AQ_LEN; in i40e_probe()
15647 hw->aq.arq_buf_size = I40E_MAX_AQ_BUF_SIZE; in i40e_probe()
15648 hw->aq.asq_buf_size = I40E_MAX_AQ_BUF_SIZE; in i40e_probe()
15650 snprintf(pf->int_name, sizeof(pf->int_name) - 1, in i40e_probe()
15651 "%s-%s:misc", in i40e_probe()
15652 dev_driver_string(&pf->pdev->dev), dev_name(&pdev->dev)); in i40e_probe()
15656 dev_warn(&pdev->dev, "unidentified MAC or BLANK NVM: %d\n", in i40e_probe()
15662 pf->hw.fc.requested_mode = I40E_FC_NONE; in i40e_probe()
15666 if (err == -EIO) in i40e_probe()
15667 dev_info(&pdev->dev, in i40e_probe()
15669 hw->aq.api_maj_ver, in i40e_probe()
15670 hw->aq.api_min_ver, in i40e_probe()
15674 dev_info(&pdev->dev, in i40e_probe()
15684 dev_info(&pdev->dev, "fw %d.%d.%05d api %d.%d nvm %s [%04x:%04x] [%04x:%04x]\n", in i40e_probe()
15685 hw->aq.fw_maj_ver, hw->aq.fw_min_ver, hw->aq.fw_build, in i40e_probe()
15686 hw->aq.api_maj_ver, hw->aq.api_min_ver, nvm_ver, in i40e_probe()
15687 hw->vendor_id, hw->device_id, hw->subsystem_vendor_id, in i40e_probe()
15688 hw->subsystem_device_id); in i40e_probe()
15692 dev_dbg(&pdev->dev, in i40e_probe()
15694 hw->aq.api_maj_ver, in i40e_probe()
15695 hw->aq.api_min_ver, in i40e_probe()
15699 dev_info(&pdev->dev, in i40e_probe()
15701 hw->aq.api_maj_ver, in i40e_probe()
15702 hw->aq.api_min_ver, in i40e_probe()
15709 if (hw->revision_id < 1) in i40e_probe()
15710 …dev_warn(&pdev->dev, "This device is a pre-production adapter/LOM. Please be aware there may be is… in i40e_probe()
15720 dev_info(&pdev->dev, "sw_init failed: %d\n", err); in i40e_probe()
15724 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_probe()
15727 err = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp, in i40e_probe()
15728 hw->func_caps.num_rx_qp, 0, 0); in i40e_probe()
15730 dev_info(&pdev->dev, "init_lan_hmc failed: %d\n", err); in i40e_probe()
15736 dev_info(&pdev->dev, "configure_lan_hmc failed: %d\n", err); in i40e_probe()
15737 err = -ENOENT; in i40e_probe()
15745 if (test_bit(I40E_HW_CAP_STOP_FW_LLDP, pf->hw.caps)) { in i40e_probe()
15746 dev_info(&pdev->dev, "Stopping firmware LLDP agent.\n"); in i40e_probe()
15753 if (!is_valid_ether_addr(hw->mac.addr)) { in i40e_probe()
15754 dev_info(&pdev->dev, "invalid MAC address %pM\n", hw->mac.addr); in i40e_probe()
15755 err = -EIO; in i40e_probe()
15758 dev_info(&pdev->dev, "MAC address: %pM\n", hw->mac.addr); in i40e_probe()
15759 ether_addr_copy(hw->mac.perm_addr, hw->mac.addr); in i40e_probe()
15760 i40e_get_port_mac_addr(hw, hw->mac.port_addr); in i40e_probe()
15761 if (is_valid_ether_addr(hw->mac.port_addr)) in i40e_probe()
15762 set_bit(I40E_HW_CAP_PORT_ID_VALID, pf->hw.caps); in i40e_probe()
15769 status = i40e_get_fw_lldp_status(&pf->hw, &lldp_status); in i40e_probe()
15772 (clear_bit(I40E_FLAG_FW_LLDP_DIS, pf->flags)) : in i40e_probe()
15773 (set_bit(I40E_FLAG_FW_LLDP_DIS, pf->flags)); in i40e_probe()
15774 dev_info(&pdev->dev, in i40e_probe()
15775 test_bit(I40E_FLAG_FW_LLDP_DIS, pf->flags) ? in i40e_probe()
15779 /* Enable FW to write default DCB config on link-up */ in i40e_probe()
15784 dev_info(&pdev->dev, "DCB init failed %d, disabled\n", err); in i40e_probe()
15785 clear_bit(I40E_FLAG_DCB_CAPABLE, pf->flags); in i40e_probe()
15786 clear_bit(I40E_FLAG_DCB_ENA, pf->flags); in i40e_probe()
15792 timer_setup(&pf->service_timer, i40e_service_timer, 0); in i40e_probe()
15793 pf->service_timer_period = HZ; in i40e_probe()
15795 INIT_WORK(&pf->service_task, i40e_service_task); in i40e_probe()
15796 clear_bit(__I40E_SERVICE_SCHED, pf->state); in i40e_probe()
15800 if (BIT (hw->port) & wol_nvm_bits || hw->partition_id != 1) in i40e_probe()
15801 pf->wol_en = false; in i40e_probe()
15803 pf->wol_en = true; in i40e_probe()
15804 device_set_wakeup_enable(&pf->pdev->dev, pf->wol_en); in i40e_probe()
15813 * When MSI-X is enabled, it's not allowed to use more TC queue in i40e_probe()
15814 * pairs than MSI-X vectors (pf->num_lan_msix) exist. Thus in i40e_probe()
15815 * vsi->num_queue_pairs will be equal to pf->num_lan_msix, i.e., 1. in i40e_probe()
15818 pf->num_lan_msix = 1; in i40e_probe()
15820 pf->udp_tunnel_nic.set_port = i40e_udp_tunnel_set_port; in i40e_probe()
15821 pf->udp_tunnel_nic.unset_port = i40e_udp_tunnel_unset_port; in i40e_probe()
15822 pf->udp_tunnel_nic.shared = &pf->udp_tunnel_shared; in i40e_probe()
15823 pf->udp_tunnel_nic.tables[0].n_entries = I40E_MAX_PF_UDP_OFFLOAD_PORTS; in i40e_probe()
15824 pf->udp_tunnel_nic.tables[0].tunnel_types = UDP_TUNNEL_TYPE_VXLAN | in i40e_probe()
15832 if (pf->hw.func_caps.num_vsis < I40E_MIN_VSI_ALLOC) in i40e_probe()
15833 pf->num_alloc_vsi = I40E_MIN_VSI_ALLOC; in i40e_probe()
15835 pf->num_alloc_vsi = pf->hw.func_caps.num_vsis; in i40e_probe()
15836 if (pf->num_alloc_vsi > UDP_TUNNEL_NIC_MAX_SHARING_DEVICES) { in i40e_probe()
15837 dev_warn(&pf->pdev->dev, in i40e_probe()
15839 pf->num_alloc_vsi, UDP_TUNNEL_NIC_MAX_SHARING_DEVICES); in i40e_probe()
15840 pf->num_alloc_vsi = UDP_TUNNEL_NIC_MAX_SHARING_DEVICES; in i40e_probe()
15844 pf->vsi = kcalloc(pf->num_alloc_vsi, sizeof(struct i40e_vsi *), in i40e_probe()
15846 if (!pf->vsi) { in i40e_probe()
15847 err = -ENOMEM; in i40e_probe()
15853 if (test_bit(I40E_FLAG_SRIOV_ENA, pf->flags) && in i40e_probe()
15854 test_bit(I40E_FLAG_MSIX_ENA, pf->flags) && in i40e_probe()
15855 !test_bit(__I40E_BAD_EEPROM, pf->state)) { in i40e_probe()
15857 set_bit(I40E_FLAG_VEB_MODE_ENA, pf->flags); in i40e_probe()
15862 dev_info(&pdev->dev, "setup_pf_switch failed: %d\n", err); in i40e_probe()
15867 INIT_LIST_HEAD(&vsi->ch_list); in i40e_probe()
15877 err = i40e_aq_set_phy_int_mask(&pf->hw, in i40e_probe()
15882 dev_info(&pf->pdev->dev, "set phy mask fail, err %pe aq_err %s\n", in i40e_probe()
15883 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_probe()
15886 ratelimit_state_init(&pf->mdd_message_rate_limit, 1 * HZ, 1); in i40e_probe()
15899 if (test_bit(I40E_HW_CAP_RESTART_AUTONEG, pf->hw.caps)) { in i40e_probe()
15901 err = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); in i40e_probe()
15903 dev_info(&pf->pdev->dev, "link restart failed, err %pe aq_err %s\n", in i40e_probe()
15905 libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_probe()
15911 clear_bit(__I40E_DOWN, pf->state); in i40e_probe()
15918 if (test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) { in i40e_probe()
15921 dev_info(&pdev->dev, in i40e_probe()
15931 if (test_bit(I40E_FLAG_SRIOV_ENA, pf->flags) && in i40e_probe()
15932 test_bit(I40E_FLAG_MSIX_ENA, pf->flags) && in i40e_probe()
15933 !test_bit(__I40E_BAD_EEPROM, pf->state)) { in i40e_probe()
15941 dev_info(&pdev->dev, in i40e_probe()
15945 dev_info(&pdev->dev, in i40e_probe()
15952 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) { in i40e_probe()
15953 pf->iwarp_base_vector = i40e_get_lump(pf, pf->irq_pile, in i40e_probe()
15954 pf->num_iwarp_msix, in i40e_probe()
15956 if (pf->iwarp_base_vector < 0) { in i40e_probe()
15957 dev_info(&pdev->dev, in i40e_probe()
15959 pf->num_iwarp_msix, pf->iwarp_base_vector); in i40e_probe()
15960 clear_bit(I40E_FLAG_IWARP_ENA, pf->flags); in i40e_probe()
15970 mod_timer(&pf->service_timer, in i40e_probe()
15971 round_jiffies(jiffies + pf->service_timer_period)); in i40e_probe()
15974 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) { in i40e_probe()
15977 dev_info(&pdev->dev, "Failed to add PF to client API service list: %d\n", in i40e_probe()
15987 if (!test_bit(I40E_HW_CAP_NO_PCI_LINK_CHECK, pf->hw.caps)) { in i40e_probe()
15994 pcie_capability_read_word(pf->pdev, PCI_EXP_LNKSTA, in i40e_probe()
15999 switch (hw->bus.speed) { in i40e_probe()
16009 switch (hw->bus.width) { in i40e_probe()
16022 dev_info(&pdev->dev, "PCI-Express: Speed %sGT/s Width x%s\n", in i40e_probe()
16025 if (hw->bus.width < i40e_bus_width_pcie_x8 || in i40e_probe()
16026 hw->bus.speed < i40e_bus_speed_8000) { in i40e_probe()
16027 …dev_warn(&pdev->dev, "PCI-Express bandwidth available for this device may be insufficient for opti… in i40e_probe()
16028 …dev_warn(&pdev->dev, "Please move the device to a different PCI-e link with more lanes and/or high… in i40e_probe()
16035 dev_dbg(&pf->pdev->dev, "get requested speeds ret = %pe last_status = %s\n", in i40e_probe()
16036 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_probe()
16037 pf->hw.phy.link_info.requested_speeds = abilities.link_speed; in i40e_probe()
16040 i40e_set_fec_in_flags(abilities.fec_cfg_curr_mod_ext_info, pf->flags); in i40e_probe()
16045 dev_dbg(&pf->pdev->dev, "get supported phy types ret = %pe last_status = %s\n", in i40e_probe()
16046 ERR_PTR(err), libie_aq_str(pf->hw.aq.asq_last_status)); in i40e_probe()
16051 rd32(&pf->hw, I40E_PRTGL_SAH)); in i40e_probe()
16053 dev_warn(&pdev->dev, "MFS for port %x (%d) has been set below the default (%d)\n", in i40e_probe()
16054 pf->hw.port, val, MAX_FRAME_SIZE_DEFAULT); in i40e_probe()
16062 i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw, in i40e_probe()
16063 pf->main_vsi_seid); in i40e_probe()
16065 if ((pf->hw.device_id == I40E_DEV_ID_10G_BASE_T) || in i40e_probe()
16066 (pf->hw.device_id == I40E_DEV_ID_10G_BASE_T4)) in i40e_probe()
16067 set_bit(I40E_HW_CAP_PHY_CONTROLS_LEDS, pf->hw.caps); in i40e_probe()
16068 if (pf->hw.device_id == I40E_DEV_ID_SFP_I_X722) in i40e_probe()
16069 set_bit(I40E_HW_CAP_CRT_RETIMER, pf->hw.caps); in i40e_probe()
16079 set_bit(__I40E_DOWN, pf->state); in i40e_probe()
16081 kfree(pf->vsi); in i40e_probe()
16084 timer_shutdown_sync(&pf->service_timer); in i40e_probe()
16089 kfree(pf->qp_pile); in i40e_probe()
16093 iounmap(hw->hw_addr); in i40e_probe()
16105 * i40e_remove - Device removal routine
16110 * Hot-Plug event, or because the driver is going to be removed from
16116 struct i40e_hw *hw = &pf->hw; in i40e_remove()
16136 while (test_and_set_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_remove()
16138 set_bit(__I40E_IN_REMOVE, pf->state); in i40e_remove()
16140 if (test_bit(I40E_FLAG_SRIOV_ENA, pf->flags)) { in i40e_remove()
16141 set_bit(__I40E_VF_RESETS_DISABLED, pf->state); in i40e_remove()
16143 clear_bit(I40E_FLAG_SRIOV_ENA, pf->flags); in i40e_remove()
16146 set_bit(__I40E_SUSPENDED, pf->state); in i40e_remove()
16147 set_bit(__I40E_DOWN, pf->state); in i40e_remove()
16148 if (pf->service_timer.function) in i40e_remove()
16149 timer_shutdown_sync(&pf->service_timer); in i40e_remove()
16150 if (pf->service_task.func) in i40e_remove()
16151 cancel_work_sync(&pf->service_task); in i40e_remove()
16153 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_remove()
16154 struct i40e_vsi *vsi = pf->vsi[0]; in i40e_remove()
16160 unregister_netdev(vsi->netdev); in i40e_remove()
16161 free_netdev(vsi->netdev); in i40e_remove()
16177 if (veb->uplink_seid == pf->mac_seid || in i40e_remove()
16178 veb->uplink_seid == 0) in i40e_remove()
16187 pf->vsi[i] = NULL; in i40e_remove()
16193 if (test_bit(I40E_FLAG_IWARP_ENA, pf->flags)) { in i40e_remove()
16196 dev_warn(&pdev->dev, "Failed to delete client device: %d\n", in i40e_remove()
16201 if (hw->hmc.hmc_obj) { in i40e_remove()
16204 dev_warn(&pdev->dev, in i40e_remove()
16211 if (test_bit(__I40E_RECOVERY_MODE, pf->state) && in i40e_remove()
16212 !test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_remove()
16213 free_irq(pf->pdev->irq, pf); in i40e_remove()
16219 mutex_destroy(&hw->aq.arq_mutex); in i40e_remove()
16220 mutex_destroy(&hw->aq.asq_mutex); in i40e_remove()
16226 if (!test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_remove()
16230 pf->vsi[i] = NULL; in i40e_remove()
16236 pf->veb[i] = NULL; in i40e_remove()
16239 kfree(pf->qp_pile); in i40e_remove()
16240 kfree(pf->vsi); in i40e_remove()
16242 iounmap(hw->hw_addr); in i40e_remove()
16250 * i40e_enable_mc_magic_wake - enable multicast magic packet wake up
16257 struct i40e_hw *hw = &pf->hw; in i40e_enable_mc_magic_wake()
16263 if (main_vsi && main_vsi->netdev) { in i40e_enable_mc_magic_wake()
16264 ether_addr_copy(mac_addr, main_vsi->netdev->dev_addr); in i40e_enable_mc_magic_wake()
16266 dev_err(&pf->pdev->dev, in i40e_enable_mc_magic_wake()
16268 ether_addr_copy(mac_addr, hw->mac.addr); in i40e_enable_mc_magic_wake()
16277 if (hw->func_caps.flex10_enable && hw->partition_id != 1) in i40e_enable_mc_magic_wake()
16282 dev_err(&pf->pdev->dev, in i40e_enable_mc_magic_wake()
16292 dev_err(&pf->pdev->dev, in i40e_enable_mc_magic_wake()
16297 * i40e_io_suspend - suspend all IO operations
16303 struct i40e_hw *hw = &pf->hw; in i40e_io_suspend()
16305 set_bit(__I40E_DOWN, pf->state); in i40e_io_suspend()
16308 timer_delete_sync(&pf->service_timer); in i40e_io_suspend()
16309 cancel_work_sync(&pf->service_task); in i40e_io_suspend()
16316 if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps) && in i40e_io_suspend()
16317 pf->wol_en) in i40e_io_suspend()
16328 wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_io_suspend()
16329 wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_io_suspend()
16344 * i40e_io_resume - resume IO operations
16350 struct device *dev = &pf->pdev->dev; in i40e_io_resume()
16367 clear_bit(__I40E_DOWN, pf->state); in i40e_io_resume()
16373 clear_bit(__I40E_SUSPENDED, pf->state); in i40e_io_resume()
16376 mod_timer(&pf->service_timer, in i40e_io_resume()
16377 round_jiffies(jiffies + pf->service_timer_period)); in i40e_io_resume()
16383 * i40e_pci_error_detected - warning that something funky happened in PCI land
16396 dev_info(&pdev->dev, "%s: error %d\n", __func__, error); in i40e_pci_error_detected()
16399 dev_info(&pdev->dev, in i40e_pci_error_detected()
16400 "Cannot recover - error happened during device probe\n"); in i40e_pci_error_detected()
16405 if (!test_bit(__I40E_SUSPENDED, pf->state)) in i40e_pci_error_detected()
16413 * i40e_pci_error_slot_reset - a PCI slot reset just happened
16427 dev_dbg(&pdev->dev, "%s\n", __func__); in i40e_pci_error_slot_reset()
16430 dev_info(&pdev->dev, in i40e_pci_error_slot_reset()
16431 "Cannot re-enable PCI device after reset.\n"); in i40e_pci_error_slot_reset()
16439 reg = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_pci_error_slot_reset()
16450 * i40e_pci_error_reset_prepare - prepare device driver for pci reset
16461 * i40e_pci_error_reset_done - pci reset done, device driver reset can begin
16468 if (test_bit(__I40E_IN_REMOVE, pf->state)) in i40e_pci_error_reset_done()
16478 * i40e_pci_error_resume - restart operations after PCI error recovery
16488 dev_dbg(&pdev->dev, "%s\n", __func__); in i40e_pci_error_resume()
16489 if (test_bit(__I40E_SUSPENDED, pf->state)) in i40e_pci_error_resume()
16496 * i40e_shutdown - PCI callback for shutting down
16502 struct i40e_hw *hw = &pf->hw; in i40e_shutdown()
16504 set_bit(__I40E_SUSPENDED, pf->state); in i40e_shutdown()
16505 set_bit(__I40E_DOWN, pf->state); in i40e_shutdown()
16507 timer_delete_sync(&pf->service_timer); in i40e_shutdown()
16508 cancel_work_sync(&pf->service_task); in i40e_shutdown()
16517 if (test_bit(I40E_HW_CAP_WOL_MC_MAGIC_PKT_WAKE, pf->hw.caps) && in i40e_shutdown()
16518 pf->wol_en) in i40e_shutdown()
16524 (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_shutdown()
16526 (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_shutdown()
16529 if (test_bit(__I40E_RECOVERY_MODE, pf->state) && in i40e_shutdown()
16530 !test_bit(I40E_FLAG_MSIX_ENA, pf->flags)) in i40e_shutdown()
16531 free_irq(pf->pdev->irq, pf); in i40e_shutdown()
16542 pci_wake_from_d3(pdev, pf->wol_en); in i40e_shutdown()
16548 * i40e_suspend - PM callback for moving to D3
16556 if (test_and_set_bit(__I40E_SUSPENDED, pf->state)) in i40e_suspend()
16562 * i40e_resume - PM callback for waking up from D3
16570 if (!test_bit(__I40E_SUSPENDED, pf->state)) in i40e_resume()
16597 * i40e_init_module - Driver registration routine
16619 return -ENOMEM; in i40e_init_module()
16635 * i40e_exit_module - Driver exit cleanup routine