Lines Matching +full:tcs +full:- +full:wait
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2013 - 2018 Intel Corporation. */
27 static const char i40e_copyright[] = "Copyright (c) 2013 - 2019 Intel Corporation.";
51 /* i40e_pci_tbl - PCI Device ID Table
89 static int debug = -1;
93 MODULE_AUTHOR("Intel Corporation, <e1000-devel@lists.sourceforge.net>");
100 * i40e_allocate_dma_mem_d - OS specific memory alloc for shared code
109 struct i40e_pf *pf = (struct i40e_pf *)hw->back; in i40e_allocate_dma_mem_d()
111 mem->size = ALIGN(size, alignment); in i40e_allocate_dma_mem_d()
112 mem->va = dma_alloc_coherent(&pf->pdev->dev, mem->size, &mem->pa, in i40e_allocate_dma_mem_d()
114 if (!mem->va) in i40e_allocate_dma_mem_d()
115 return -ENOMEM; in i40e_allocate_dma_mem_d()
121 * i40e_free_dma_mem_d - OS specific memory free for shared code
127 struct i40e_pf *pf = (struct i40e_pf *)hw->back; in i40e_free_dma_mem_d()
129 dma_free_coherent(&pf->pdev->dev, mem->size, mem->va, mem->pa); in i40e_free_dma_mem_d()
130 mem->va = NULL; in i40e_free_dma_mem_d()
131 mem->pa = 0; in i40e_free_dma_mem_d()
132 mem->size = 0; in i40e_free_dma_mem_d()
138 * i40e_allocate_virt_mem_d - OS specific memory alloc for shared code
146 mem->size = size; in i40e_allocate_virt_mem_d()
147 mem->va = kzalloc(size, GFP_KERNEL); in i40e_allocate_virt_mem_d()
149 if (!mem->va) in i40e_allocate_virt_mem_d()
150 return -ENOMEM; in i40e_allocate_virt_mem_d()
156 * i40e_free_virt_mem_d - OS specific memory free for shared code
163 kfree(mem->va); in i40e_free_virt_mem_d()
164 mem->va = NULL; in i40e_free_virt_mem_d()
165 mem->size = 0; in i40e_free_virt_mem_d()
171 * i40e_get_lump - find a lump of free generic resource
179 * The search_hint trick and lack of advanced fit-finding only work
186 int ret = -ENOMEM; in i40e_get_lump()
190 dev_info(&pf->pdev->dev, in i40e_get_lump()
193 return -EINVAL; in i40e_get_lump()
197 i = pile->search_hint; in i40e_get_lump()
198 while (i < pile->num_entries) { in i40e_get_lump()
200 if (pile->list[i] & I40E_PILE_VALID_BIT) { in i40e_get_lump()
206 for (j = 0; (j < needed) && ((i+j) < pile->num_entries); j++) { in i40e_get_lump()
207 if (pile->list[i+j] & I40E_PILE_VALID_BIT) in i40e_get_lump()
214 pile->list[i+j] = id | I40E_PILE_VALID_BIT; in i40e_get_lump()
216 pile->search_hint = i + j; in i40e_get_lump()
228 * i40e_put_lump - return a lump of generic resource
241 if (!pile || index >= pile->num_entries) in i40e_put_lump()
242 return -EINVAL; in i40e_put_lump()
245 i < pile->num_entries && pile->list[i] == valid_id; in i40e_put_lump()
247 pile->list[i] = 0; in i40e_put_lump()
251 if (count && index < pile->search_hint) in i40e_put_lump()
252 pile->search_hint = index; in i40e_put_lump()
258 * i40e_find_vsi_from_id - searches for the vsi with the given id
266 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_find_vsi_from_id()
267 if (pf->vsi[i] && (pf->vsi[i]->id == id)) in i40e_find_vsi_from_id()
268 return pf->vsi[i]; in i40e_find_vsi_from_id()
274 * i40e_service_event_schedule - Schedule the service task to wake up
281 if ((!test_bit(__I40E_DOWN, pf->state) && in i40e_service_event_schedule()
282 !test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) || in i40e_service_event_schedule()
283 test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_service_event_schedule()
284 queue_work(i40e_wq, &pf->service_task); in i40e_service_event_schedule()
288 * i40e_tx_timeout - Respond to a Tx Hang
299 struct i40e_vsi *vsi = np->vsi; in i40e_tx_timeout()
300 struct i40e_pf *pf = vsi->back; in i40e_tx_timeout()
305 pf->tx_timeout_count++; in i40e_tx_timeout()
308 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_tx_timeout()
309 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) { in i40e_tx_timeout()
311 vsi->tx_rings[i]->queue_index) { in i40e_tx_timeout()
312 tx_ring = vsi->tx_rings[i]; in i40e_tx_timeout()
318 if (time_after(jiffies, (pf->tx_timeout_last_recovery + HZ*20))) in i40e_tx_timeout()
319 pf->tx_timeout_recovery_level = 1; /* reset after some time */ in i40e_tx_timeout()
321 (pf->tx_timeout_last_recovery + netdev->watchdog_timeo))) in i40e_tx_timeout()
325 if (test_and_set_bit(__I40E_TIMEOUT_RECOVERY_PENDING, pf->state)) in i40e_tx_timeout()
331 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_tx_timeout()
332 val = rd32(&pf->hw, in i40e_tx_timeout()
333 I40E_PFINT_DYN_CTLN(tx_ring->q_vector->v_idx + in i40e_tx_timeout()
334 tx_ring->vsi->base_vector - 1)); in i40e_tx_timeout()
336 val = rd32(&pf->hw, I40E_PFINT_DYN_CTL0); in i40e_tx_timeout()
339 vsi->seid, txqueue, tx_ring->next_to_clean, in i40e_tx_timeout()
340 head, tx_ring->next_to_use, in i40e_tx_timeout()
341 readl(tx_ring->tail), val); in i40e_tx_timeout()
344 pf->tx_timeout_last_recovery = jiffies; in i40e_tx_timeout()
346 pf->tx_timeout_recovery_level, txqueue); in i40e_tx_timeout()
348 switch (pf->tx_timeout_recovery_level) { in i40e_tx_timeout()
350 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_tx_timeout()
353 set_bit(__I40E_CORE_RESET_REQUESTED, pf->state); in i40e_tx_timeout()
356 set_bit(__I40E_GLOBAL_RESET_REQUESTED, pf->state); in i40e_tx_timeout()
364 pf->tx_timeout_recovery_level++; in i40e_tx_timeout()
368 * i40e_get_vsi_stats_struct - Get System Network Statistics
376 return &vsi->net_stats; in i40e_get_vsi_stats_struct()
380 * i40e_get_netdev_stats_struct_tx - populate stats from a Tx ring
391 start = u64_stats_fetch_begin_irq(&ring->syncp); in i40e_get_netdev_stats_struct_tx()
392 packets = ring->stats.packets; in i40e_get_netdev_stats_struct_tx()
393 bytes = ring->stats.bytes; in i40e_get_netdev_stats_struct_tx()
394 } while (u64_stats_fetch_retry_irq(&ring->syncp, start)); in i40e_get_netdev_stats_struct_tx()
396 stats->tx_packets += packets; in i40e_get_netdev_stats_struct_tx()
397 stats->tx_bytes += bytes; in i40e_get_netdev_stats_struct_tx()
401 * i40e_get_netdev_stats_struct - Get statistics for netdev interface
412 struct i40e_vsi *vsi = np->vsi; in i40e_get_netdev_stats_struct()
417 if (test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_get_netdev_stats_struct()
420 if (!vsi->tx_rings) in i40e_get_netdev_stats_struct()
424 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_get_netdev_stats_struct()
428 ring = READ_ONCE(vsi->tx_rings[i]); in i40e_get_netdev_stats_struct()
434 ring = READ_ONCE(vsi->xdp_rings[i]); in i40e_get_netdev_stats_struct()
440 ring = READ_ONCE(vsi->rx_rings[i]); in i40e_get_netdev_stats_struct()
444 start = u64_stats_fetch_begin_irq(&ring->syncp); in i40e_get_netdev_stats_struct()
445 packets = ring->stats.packets; in i40e_get_netdev_stats_struct()
446 bytes = ring->stats.bytes; in i40e_get_netdev_stats_struct()
447 } while (u64_stats_fetch_retry_irq(&ring->syncp, start)); in i40e_get_netdev_stats_struct()
449 stats->rx_packets += packets; in i40e_get_netdev_stats_struct()
450 stats->rx_bytes += bytes; in i40e_get_netdev_stats_struct()
456 stats->multicast = vsi_stats->multicast; in i40e_get_netdev_stats_struct()
457 stats->tx_errors = vsi_stats->tx_errors; in i40e_get_netdev_stats_struct()
458 stats->tx_dropped = vsi_stats->tx_dropped; in i40e_get_netdev_stats_struct()
459 stats->rx_errors = vsi_stats->rx_errors; in i40e_get_netdev_stats_struct()
460 stats->rx_dropped = vsi_stats->rx_dropped; in i40e_get_netdev_stats_struct()
461 stats->rx_crc_errors = vsi_stats->rx_crc_errors; in i40e_get_netdev_stats_struct()
462 stats->rx_length_errors = vsi_stats->rx_length_errors; in i40e_get_netdev_stats_struct()
466 * i40e_vsi_reset_stats - Resets all stats of the given vsi
479 memset(&vsi->net_stats_offsets, 0, sizeof(vsi->net_stats_offsets)); in i40e_vsi_reset_stats()
480 memset(&vsi->eth_stats, 0, sizeof(vsi->eth_stats)); in i40e_vsi_reset_stats()
481 memset(&vsi->eth_stats_offsets, 0, sizeof(vsi->eth_stats_offsets)); in i40e_vsi_reset_stats()
482 if (vsi->rx_rings && vsi->rx_rings[0]) { in i40e_vsi_reset_stats()
483 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_reset_stats()
484 memset(&vsi->rx_rings[i]->stats, 0, in i40e_vsi_reset_stats()
485 sizeof(vsi->rx_rings[i]->stats)); in i40e_vsi_reset_stats()
486 memset(&vsi->rx_rings[i]->rx_stats, 0, in i40e_vsi_reset_stats()
487 sizeof(vsi->rx_rings[i]->rx_stats)); in i40e_vsi_reset_stats()
488 memset(&vsi->tx_rings[i]->stats, 0, in i40e_vsi_reset_stats()
489 sizeof(vsi->tx_rings[i]->stats)); in i40e_vsi_reset_stats()
490 memset(&vsi->tx_rings[i]->tx_stats, 0, in i40e_vsi_reset_stats()
491 sizeof(vsi->tx_rings[i]->tx_stats)); in i40e_vsi_reset_stats()
494 vsi->stat_offsets_loaded = false; in i40e_vsi_reset_stats()
498 * i40e_pf_reset_stats - Reset all of the stats for the given PF
505 memset(&pf->stats, 0, sizeof(pf->stats)); in i40e_pf_reset_stats()
506 memset(&pf->stats_offsets, 0, sizeof(pf->stats_offsets)); in i40e_pf_reset_stats()
507 pf->stat_offsets_loaded = false; in i40e_pf_reset_stats()
510 if (pf->veb[i]) { in i40e_pf_reset_stats()
511 memset(&pf->veb[i]->stats, 0, in i40e_pf_reset_stats()
512 sizeof(pf->veb[i]->stats)); in i40e_pf_reset_stats()
513 memset(&pf->veb[i]->stats_offsets, 0, in i40e_pf_reset_stats()
514 sizeof(pf->veb[i]->stats_offsets)); in i40e_pf_reset_stats()
515 memset(&pf->veb[i]->tc_stats, 0, in i40e_pf_reset_stats()
516 sizeof(pf->veb[i]->tc_stats)); in i40e_pf_reset_stats()
517 memset(&pf->veb[i]->tc_stats_offsets, 0, in i40e_pf_reset_stats()
518 sizeof(pf->veb[i]->tc_stats_offsets)); in i40e_pf_reset_stats()
519 pf->veb[i]->stat_offsets_loaded = false; in i40e_pf_reset_stats()
522 pf->hw_csum_rx_error = 0; in i40e_pf_reset_stats()
526 * i40e_stat_update48 - read and update a 48 bit stat from the chip
538 * the potential roll-over.
545 if (hw->device_id == I40E_DEV_ID_QEMU) { in i40e_stat_update48()
554 *stat = new_data - *offset; in i40e_stat_update48()
556 *stat = (new_data + BIT_ULL(48)) - *offset; in i40e_stat_update48()
561 * i40e_stat_update32 - read and update a 32 bit stat from the chip
577 *stat = (u32)(new_data - *offset); in i40e_stat_update32()
579 *stat = (u32)((new_data + BIT_ULL(32)) - *offset); in i40e_stat_update32()
583 * i40e_stat_update_and_clear32 - read and clear hw reg, update a 32 bit stat
597 * i40e_update_eth_stats - Update VSI-specific ethernet statistics counters.
602 int stat_idx = le16_to_cpu(vsi->info.stat_counter_idx); in i40e_update_eth_stats()
603 struct i40e_pf *pf = vsi->back; in i40e_update_eth_stats()
604 struct i40e_hw *hw = &pf->hw; in i40e_update_eth_stats()
608 es = &vsi->eth_stats; in i40e_update_eth_stats()
609 oes = &vsi->eth_stats_offsets; in i40e_update_eth_stats()
613 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
614 &oes->tx_errors, &es->tx_errors); in i40e_update_eth_stats()
616 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
617 &oes->rx_discards, &es->rx_discards); in i40e_update_eth_stats()
619 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
620 &oes->rx_unknown_protocol, &es->rx_unknown_protocol); in i40e_update_eth_stats()
624 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
625 &oes->rx_bytes, &es->rx_bytes); in i40e_update_eth_stats()
628 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
629 &oes->rx_unicast, &es->rx_unicast); in i40e_update_eth_stats()
632 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
633 &oes->rx_multicast, &es->rx_multicast); in i40e_update_eth_stats()
636 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
637 &oes->rx_broadcast, &es->rx_broadcast); in i40e_update_eth_stats()
641 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
642 &oes->tx_bytes, &es->tx_bytes); in i40e_update_eth_stats()
645 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
646 &oes->tx_unicast, &es->tx_unicast); in i40e_update_eth_stats()
649 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
650 &oes->tx_multicast, &es->tx_multicast); in i40e_update_eth_stats()
653 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
654 &oes->tx_broadcast, &es->tx_broadcast); in i40e_update_eth_stats()
655 vsi->stat_offsets_loaded = true; in i40e_update_eth_stats()
659 * i40e_update_veb_stats - Update Switch component statistics
664 struct i40e_pf *pf = veb->pf; in i40e_update_veb_stats()
665 struct i40e_hw *hw = &pf->hw; in i40e_update_veb_stats()
672 idx = veb->stats_idx; in i40e_update_veb_stats()
673 es = &veb->stats; in i40e_update_veb_stats()
674 oes = &veb->stats_offsets; in i40e_update_veb_stats()
675 veb_es = &veb->tc_stats; in i40e_update_veb_stats()
676 veb_oes = &veb->tc_stats_offsets; in i40e_update_veb_stats()
680 veb->stat_offsets_loaded, in i40e_update_veb_stats()
681 &oes->tx_discards, &es->tx_discards); in i40e_update_veb_stats()
682 if (hw->revision_id > 0) in i40e_update_veb_stats()
684 veb->stat_offsets_loaded, in i40e_update_veb_stats()
685 &oes->rx_unknown_protocol, in i40e_update_veb_stats()
686 &es->rx_unknown_protocol); in i40e_update_veb_stats()
688 veb->stat_offsets_loaded, in i40e_update_veb_stats()
689 &oes->rx_bytes, &es->rx_bytes); in i40e_update_veb_stats()
691 veb->stat_offsets_loaded, in i40e_update_veb_stats()
692 &oes->rx_unicast, &es->rx_unicast); in i40e_update_veb_stats()
694 veb->stat_offsets_loaded, in i40e_update_veb_stats()
695 &oes->rx_multicast, &es->rx_multicast); in i40e_update_veb_stats()
697 veb->stat_offsets_loaded, in i40e_update_veb_stats()
698 &oes->rx_broadcast, &es->rx_broadcast); in i40e_update_veb_stats()
701 veb->stat_offsets_loaded, in i40e_update_veb_stats()
702 &oes->tx_bytes, &es->tx_bytes); in i40e_update_veb_stats()
704 veb->stat_offsets_loaded, in i40e_update_veb_stats()
705 &oes->tx_unicast, &es->tx_unicast); in i40e_update_veb_stats()
707 veb->stat_offsets_loaded, in i40e_update_veb_stats()
708 &oes->tx_multicast, &es->tx_multicast); in i40e_update_veb_stats()
710 veb->stat_offsets_loaded, in i40e_update_veb_stats()
711 &oes->tx_broadcast, &es->tx_broadcast); in i40e_update_veb_stats()
715 veb->stat_offsets_loaded, in i40e_update_veb_stats()
716 &veb_oes->tc_rx_packets[i], in i40e_update_veb_stats()
717 &veb_es->tc_rx_packets[i]); in i40e_update_veb_stats()
720 veb->stat_offsets_loaded, in i40e_update_veb_stats()
721 &veb_oes->tc_rx_bytes[i], in i40e_update_veb_stats()
722 &veb_es->tc_rx_bytes[i]); in i40e_update_veb_stats()
725 veb->stat_offsets_loaded, in i40e_update_veb_stats()
726 &veb_oes->tc_tx_packets[i], in i40e_update_veb_stats()
727 &veb_es->tc_tx_packets[i]); in i40e_update_veb_stats()
730 veb->stat_offsets_loaded, in i40e_update_veb_stats()
731 &veb_oes->tc_tx_bytes[i], in i40e_update_veb_stats()
732 &veb_es->tc_tx_bytes[i]); in i40e_update_veb_stats()
734 veb->stat_offsets_loaded = true; in i40e_update_veb_stats()
738 * i40e_update_vsi_stats - Update the vsi statistics counters.
749 struct i40e_pf *pf = vsi->back; in i40e_update_vsi_stats()
765 if (test_bit(__I40E_VSI_DOWN, vsi->state) || in i40e_update_vsi_stats()
766 test_bit(__I40E_CONFIG_BUSY, pf->state)) in i40e_update_vsi_stats()
770 ons = &vsi->net_stats_offsets; in i40e_update_vsi_stats()
771 es = &vsi->eth_stats; in i40e_update_vsi_stats()
772 oes = &vsi->eth_stats_offsets; in i40e_update_vsi_stats()
783 for (q = 0; q < vsi->num_queue_pairs; q++) { in i40e_update_vsi_stats()
785 p = READ_ONCE(vsi->tx_rings[q]); in i40e_update_vsi_stats()
790 start = u64_stats_fetch_begin_irq(&p->syncp); in i40e_update_vsi_stats()
791 packets = p->stats.packets; in i40e_update_vsi_stats()
792 bytes = p->stats.bytes; in i40e_update_vsi_stats()
793 } while (u64_stats_fetch_retry_irq(&p->syncp, start)); in i40e_update_vsi_stats()
796 tx_restart += p->tx_stats.restart_queue; in i40e_update_vsi_stats()
797 tx_busy += p->tx_stats.tx_busy; in i40e_update_vsi_stats()
798 tx_linearize += p->tx_stats.tx_linearize; in i40e_update_vsi_stats()
799 tx_force_wb += p->tx_stats.tx_force_wb; in i40e_update_vsi_stats()
802 p = READ_ONCE(vsi->rx_rings[q]); in i40e_update_vsi_stats()
807 start = u64_stats_fetch_begin_irq(&p->syncp); in i40e_update_vsi_stats()
808 packets = p->stats.packets; in i40e_update_vsi_stats()
809 bytes = p->stats.bytes; in i40e_update_vsi_stats()
810 } while (u64_stats_fetch_retry_irq(&p->syncp, start)); in i40e_update_vsi_stats()
813 rx_buf += p->rx_stats.alloc_buff_failed; in i40e_update_vsi_stats()
814 rx_page += p->rx_stats.alloc_page_failed; in i40e_update_vsi_stats()
818 p = READ_ONCE(vsi->xdp_rings[q]); in i40e_update_vsi_stats()
823 start = u64_stats_fetch_begin_irq(&p->syncp); in i40e_update_vsi_stats()
824 packets = p->stats.packets; in i40e_update_vsi_stats()
825 bytes = p->stats.bytes; in i40e_update_vsi_stats()
826 } while (u64_stats_fetch_retry_irq(&p->syncp, start)); in i40e_update_vsi_stats()
829 tx_restart += p->tx_stats.restart_queue; in i40e_update_vsi_stats()
830 tx_busy += p->tx_stats.tx_busy; in i40e_update_vsi_stats()
831 tx_linearize += p->tx_stats.tx_linearize; in i40e_update_vsi_stats()
832 tx_force_wb += p->tx_stats.tx_force_wb; in i40e_update_vsi_stats()
836 vsi->tx_restart = tx_restart; in i40e_update_vsi_stats()
837 vsi->tx_busy = tx_busy; in i40e_update_vsi_stats()
838 vsi->tx_linearize = tx_linearize; in i40e_update_vsi_stats()
839 vsi->tx_force_wb = tx_force_wb; in i40e_update_vsi_stats()
840 vsi->rx_page_failed = rx_page; in i40e_update_vsi_stats()
841 vsi->rx_buf_failed = rx_buf; in i40e_update_vsi_stats()
843 ns->rx_packets = rx_p; in i40e_update_vsi_stats()
844 ns->rx_bytes = rx_b; in i40e_update_vsi_stats()
845 ns->tx_packets = tx_p; in i40e_update_vsi_stats()
846 ns->tx_bytes = tx_b; in i40e_update_vsi_stats()
850 ons->tx_errors = oes->tx_errors; in i40e_update_vsi_stats()
851 ns->tx_errors = es->tx_errors; in i40e_update_vsi_stats()
852 ons->multicast = oes->rx_multicast; in i40e_update_vsi_stats()
853 ns->multicast = es->rx_multicast; in i40e_update_vsi_stats()
854 ons->rx_dropped = oes->rx_discards; in i40e_update_vsi_stats()
855 ns->rx_dropped = es->rx_discards; in i40e_update_vsi_stats()
856 ons->tx_dropped = oes->tx_discards; in i40e_update_vsi_stats()
857 ns->tx_dropped = es->tx_discards; in i40e_update_vsi_stats()
860 if (vsi == pf->vsi[pf->lan_vsi]) { in i40e_update_vsi_stats()
861 ns->rx_crc_errors = pf->stats.crc_errors; in i40e_update_vsi_stats()
862 ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes; in i40e_update_vsi_stats()
863 ns->rx_length_errors = pf->stats.rx_length_errors; in i40e_update_vsi_stats()
868 * i40e_update_pf_stats - Update the PF statistics counters.
873 struct i40e_hw_port_stats *osd = &pf->stats_offsets; in i40e_update_pf_stats()
874 struct i40e_hw_port_stats *nsd = &pf->stats; in i40e_update_pf_stats()
875 struct i40e_hw *hw = &pf->hw; in i40e_update_pf_stats()
879 i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port), in i40e_update_pf_stats()
880 I40E_GLPRT_GORCL(hw->port), in i40e_update_pf_stats()
881 pf->stat_offsets_loaded, in i40e_update_pf_stats()
882 &osd->eth.rx_bytes, &nsd->eth.rx_bytes); in i40e_update_pf_stats()
883 i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port), in i40e_update_pf_stats()
884 I40E_GLPRT_GOTCL(hw->port), in i40e_update_pf_stats()
885 pf->stat_offsets_loaded, in i40e_update_pf_stats()
886 &osd->eth.tx_bytes, &nsd->eth.tx_bytes); in i40e_update_pf_stats()
887 i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port), in i40e_update_pf_stats()
888 pf->stat_offsets_loaded, in i40e_update_pf_stats()
889 &osd->eth.rx_discards, in i40e_update_pf_stats()
890 &nsd->eth.rx_discards); in i40e_update_pf_stats()
891 i40e_stat_update48(hw, I40E_GLPRT_UPRCH(hw->port), in i40e_update_pf_stats()
892 I40E_GLPRT_UPRCL(hw->port), in i40e_update_pf_stats()
893 pf->stat_offsets_loaded, in i40e_update_pf_stats()
894 &osd->eth.rx_unicast, in i40e_update_pf_stats()
895 &nsd->eth.rx_unicast); in i40e_update_pf_stats()
896 i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port), in i40e_update_pf_stats()
897 I40E_GLPRT_MPRCL(hw->port), in i40e_update_pf_stats()
898 pf->stat_offsets_loaded, in i40e_update_pf_stats()
899 &osd->eth.rx_multicast, in i40e_update_pf_stats()
900 &nsd->eth.rx_multicast); in i40e_update_pf_stats()
901 i40e_stat_update48(hw, I40E_GLPRT_BPRCH(hw->port), in i40e_update_pf_stats()
902 I40E_GLPRT_BPRCL(hw->port), in i40e_update_pf_stats()
903 pf->stat_offsets_loaded, in i40e_update_pf_stats()
904 &osd->eth.rx_broadcast, in i40e_update_pf_stats()
905 &nsd->eth.rx_broadcast); in i40e_update_pf_stats()
906 i40e_stat_update48(hw, I40E_GLPRT_UPTCH(hw->port), in i40e_update_pf_stats()
907 I40E_GLPRT_UPTCL(hw->port), in i40e_update_pf_stats()
908 pf->stat_offsets_loaded, in i40e_update_pf_stats()
909 &osd->eth.tx_unicast, in i40e_update_pf_stats()
910 &nsd->eth.tx_unicast); in i40e_update_pf_stats()
911 i40e_stat_update48(hw, I40E_GLPRT_MPTCH(hw->port), in i40e_update_pf_stats()
912 I40E_GLPRT_MPTCL(hw->port), in i40e_update_pf_stats()
913 pf->stat_offsets_loaded, in i40e_update_pf_stats()
914 &osd->eth.tx_multicast, in i40e_update_pf_stats()
915 &nsd->eth.tx_multicast); in i40e_update_pf_stats()
916 i40e_stat_update48(hw, I40E_GLPRT_BPTCH(hw->port), in i40e_update_pf_stats()
917 I40E_GLPRT_BPTCL(hw->port), in i40e_update_pf_stats()
918 pf->stat_offsets_loaded, in i40e_update_pf_stats()
919 &osd->eth.tx_broadcast, in i40e_update_pf_stats()
920 &nsd->eth.tx_broadcast); in i40e_update_pf_stats()
922 i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port), in i40e_update_pf_stats()
923 pf->stat_offsets_loaded, in i40e_update_pf_stats()
924 &osd->tx_dropped_link_down, in i40e_update_pf_stats()
925 &nsd->tx_dropped_link_down); in i40e_update_pf_stats()
927 i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port), in i40e_update_pf_stats()
928 pf->stat_offsets_loaded, in i40e_update_pf_stats()
929 &osd->crc_errors, &nsd->crc_errors); in i40e_update_pf_stats()
931 i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port), in i40e_update_pf_stats()
932 pf->stat_offsets_loaded, in i40e_update_pf_stats()
933 &osd->illegal_bytes, &nsd->illegal_bytes); in i40e_update_pf_stats()
935 i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port), in i40e_update_pf_stats()
936 pf->stat_offsets_loaded, in i40e_update_pf_stats()
937 &osd->mac_local_faults, in i40e_update_pf_stats()
938 &nsd->mac_local_faults); in i40e_update_pf_stats()
939 i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port), in i40e_update_pf_stats()
940 pf->stat_offsets_loaded, in i40e_update_pf_stats()
941 &osd->mac_remote_faults, in i40e_update_pf_stats()
942 &nsd->mac_remote_faults); in i40e_update_pf_stats()
944 i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port), in i40e_update_pf_stats()
945 pf->stat_offsets_loaded, in i40e_update_pf_stats()
946 &osd->rx_length_errors, in i40e_update_pf_stats()
947 &nsd->rx_length_errors); in i40e_update_pf_stats()
949 i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port), in i40e_update_pf_stats()
950 pf->stat_offsets_loaded, in i40e_update_pf_stats()
951 &osd->link_xon_rx, &nsd->link_xon_rx); in i40e_update_pf_stats()
952 i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port), in i40e_update_pf_stats()
953 pf->stat_offsets_loaded, in i40e_update_pf_stats()
954 &osd->link_xon_tx, &nsd->link_xon_tx); in i40e_update_pf_stats()
955 i40e_stat_update32(hw, I40E_GLPRT_LXOFFRXC(hw->port), in i40e_update_pf_stats()
956 pf->stat_offsets_loaded, in i40e_update_pf_stats()
957 &osd->link_xoff_rx, &nsd->link_xoff_rx); in i40e_update_pf_stats()
958 i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port), in i40e_update_pf_stats()
959 pf->stat_offsets_loaded, in i40e_update_pf_stats()
960 &osd->link_xoff_tx, &nsd->link_xoff_tx); in i40e_update_pf_stats()
963 i40e_stat_update32(hw, I40E_GLPRT_PXOFFRXC(hw->port, i), in i40e_update_pf_stats()
964 pf->stat_offsets_loaded, in i40e_update_pf_stats()
965 &osd->priority_xoff_rx[i], in i40e_update_pf_stats()
966 &nsd->priority_xoff_rx[i]); in i40e_update_pf_stats()
967 i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i), in i40e_update_pf_stats()
968 pf->stat_offsets_loaded, in i40e_update_pf_stats()
969 &osd->priority_xon_rx[i], in i40e_update_pf_stats()
970 &nsd->priority_xon_rx[i]); in i40e_update_pf_stats()
971 i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i), in i40e_update_pf_stats()
972 pf->stat_offsets_loaded, in i40e_update_pf_stats()
973 &osd->priority_xon_tx[i], in i40e_update_pf_stats()
974 &nsd->priority_xon_tx[i]); in i40e_update_pf_stats()
975 i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i), in i40e_update_pf_stats()
976 pf->stat_offsets_loaded, in i40e_update_pf_stats()
977 &osd->priority_xoff_tx[i], in i40e_update_pf_stats()
978 &nsd->priority_xoff_tx[i]); in i40e_update_pf_stats()
980 I40E_GLPRT_RXON2OFFCNT(hw->port, i), in i40e_update_pf_stats()
981 pf->stat_offsets_loaded, in i40e_update_pf_stats()
982 &osd->priority_xon_2_xoff[i], in i40e_update_pf_stats()
983 &nsd->priority_xon_2_xoff[i]); in i40e_update_pf_stats()
986 i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port), in i40e_update_pf_stats()
987 I40E_GLPRT_PRC64L(hw->port), in i40e_update_pf_stats()
988 pf->stat_offsets_loaded, in i40e_update_pf_stats()
989 &osd->rx_size_64, &nsd->rx_size_64); in i40e_update_pf_stats()
990 i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port), in i40e_update_pf_stats()
991 I40E_GLPRT_PRC127L(hw->port), in i40e_update_pf_stats()
992 pf->stat_offsets_loaded, in i40e_update_pf_stats()
993 &osd->rx_size_127, &nsd->rx_size_127); in i40e_update_pf_stats()
994 i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port), in i40e_update_pf_stats()
995 I40E_GLPRT_PRC255L(hw->port), in i40e_update_pf_stats()
996 pf->stat_offsets_loaded, in i40e_update_pf_stats()
997 &osd->rx_size_255, &nsd->rx_size_255); in i40e_update_pf_stats()
998 i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port), in i40e_update_pf_stats()
999 I40E_GLPRT_PRC511L(hw->port), in i40e_update_pf_stats()
1000 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1001 &osd->rx_size_511, &nsd->rx_size_511); in i40e_update_pf_stats()
1002 i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port), in i40e_update_pf_stats()
1003 I40E_GLPRT_PRC1023L(hw->port), in i40e_update_pf_stats()
1004 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1005 &osd->rx_size_1023, &nsd->rx_size_1023); in i40e_update_pf_stats()
1006 i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port), in i40e_update_pf_stats()
1007 I40E_GLPRT_PRC1522L(hw->port), in i40e_update_pf_stats()
1008 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1009 &osd->rx_size_1522, &nsd->rx_size_1522); in i40e_update_pf_stats()
1010 i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port), in i40e_update_pf_stats()
1011 I40E_GLPRT_PRC9522L(hw->port), in i40e_update_pf_stats()
1012 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1013 &osd->rx_size_big, &nsd->rx_size_big); in i40e_update_pf_stats()
1015 i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port), in i40e_update_pf_stats()
1016 I40E_GLPRT_PTC64L(hw->port), in i40e_update_pf_stats()
1017 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1018 &osd->tx_size_64, &nsd->tx_size_64); in i40e_update_pf_stats()
1019 i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port), in i40e_update_pf_stats()
1020 I40E_GLPRT_PTC127L(hw->port), in i40e_update_pf_stats()
1021 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1022 &osd->tx_size_127, &nsd->tx_size_127); in i40e_update_pf_stats()
1023 i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port), in i40e_update_pf_stats()
1024 I40E_GLPRT_PTC255L(hw->port), in i40e_update_pf_stats()
1025 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1026 &osd->tx_size_255, &nsd->tx_size_255); in i40e_update_pf_stats()
1027 i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port), in i40e_update_pf_stats()
1028 I40E_GLPRT_PTC511L(hw->port), in i40e_update_pf_stats()
1029 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1030 &osd->tx_size_511, &nsd->tx_size_511); in i40e_update_pf_stats()
1031 i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port), in i40e_update_pf_stats()
1032 I40E_GLPRT_PTC1023L(hw->port), in i40e_update_pf_stats()
1033 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1034 &osd->tx_size_1023, &nsd->tx_size_1023); in i40e_update_pf_stats()
1035 i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port), in i40e_update_pf_stats()
1036 I40E_GLPRT_PTC1522L(hw->port), in i40e_update_pf_stats()
1037 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1038 &osd->tx_size_1522, &nsd->tx_size_1522); in i40e_update_pf_stats()
1039 i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port), in i40e_update_pf_stats()
1040 I40E_GLPRT_PTC9522L(hw->port), in i40e_update_pf_stats()
1041 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1042 &osd->tx_size_big, &nsd->tx_size_big); in i40e_update_pf_stats()
1044 i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port), in i40e_update_pf_stats()
1045 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1046 &osd->rx_undersize, &nsd->rx_undersize); in i40e_update_pf_stats()
1047 i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port), in i40e_update_pf_stats()
1048 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1049 &osd->rx_fragments, &nsd->rx_fragments); in i40e_update_pf_stats()
1050 i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port), in i40e_update_pf_stats()
1051 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1052 &osd->rx_oversize, &nsd->rx_oversize); in i40e_update_pf_stats()
1053 i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port), in i40e_update_pf_stats()
1054 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1055 &osd->rx_jabber, &nsd->rx_jabber); in i40e_update_pf_stats()
1059 I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(hw->pf_id)), in i40e_update_pf_stats()
1060 &nsd->fd_atr_match); in i40e_update_pf_stats()
1062 I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(hw->pf_id)), in i40e_update_pf_stats()
1063 &nsd->fd_sb_match); in i40e_update_pf_stats()
1065 I40E_GLQF_PCNT(I40E_FD_ATR_TUNNEL_STAT_IDX(hw->pf_id)), in i40e_update_pf_stats()
1066 &nsd->fd_atr_tunnel_match); in i40e_update_pf_stats()
1069 nsd->tx_lpi_status = in i40e_update_pf_stats()
1072 nsd->rx_lpi_status = in i40e_update_pf_stats()
1076 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1077 &osd->tx_lpi_count, &nsd->tx_lpi_count); in i40e_update_pf_stats()
1079 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1080 &osd->rx_lpi_count, &nsd->rx_lpi_count); in i40e_update_pf_stats()
1082 if (pf->flags & I40E_FLAG_FD_SB_ENABLED && in i40e_update_pf_stats()
1083 !test_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state)) in i40e_update_pf_stats()
1084 nsd->fd_sb_status = true; in i40e_update_pf_stats()
1086 nsd->fd_sb_status = false; in i40e_update_pf_stats()
1088 if (pf->flags & I40E_FLAG_FD_ATR_ENABLED && in i40e_update_pf_stats()
1089 !test_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) in i40e_update_pf_stats()
1090 nsd->fd_atr_status = true; in i40e_update_pf_stats()
1092 nsd->fd_atr_status = false; in i40e_update_pf_stats()
1094 pf->stat_offsets_loaded = true; in i40e_update_pf_stats()
1098 * i40e_update_stats - Update the various statistics counters.
1105 struct i40e_pf *pf = vsi->back; in i40e_update_stats()
1107 if (vsi == pf->vsi[pf->lan_vsi]) in i40e_update_stats()
1114 * i40e_count_filters - counts VSI mac filters
1126 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) in i40e_count_filters()
1133 * i40e_find_filter - Search VSI filter list for specific mac/vlan filter
1150 hash_for_each_possible(vsi->mac_filter_hash, f, hlist, key) { in i40e_find_filter()
1151 if ((ether_addr_equal(macaddr, f->macaddr)) && in i40e_find_filter()
1152 (vlan == f->vlan)) in i40e_find_filter()
1159 * i40e_find_mac - Find a mac addr in the macvlan filters list
1175 hash_for_each_possible(vsi->mac_filter_hash, f, hlist, key) { in i40e_find_mac()
1176 if ((ether_addr_equal(macaddr, f->macaddr))) in i40e_find_mac()
1183 * i40e_is_vsi_in_vlan - Check if VSI is in vlan mode
1191 if (vsi->info.pvid) in i40e_is_vsi_in_vlan()
1214 return vsi->has_vlan_filter; in i40e_is_vsi_in_vlan()
1218 * i40e_correct_mac_vlan_filters - Correct non-VLAN filters if necessary
1224 * Update VLAN=0 and VLAN=-1 (I40E_VLAN_ANY) filters properly so that they
1226 * to be added then we need to update non-VLAN filters to be marked as VLAN=0
1228 * active VLAN filters, we need to make all non-VLAN filters marked as VLAN=-1
1233 * operate in non-VLAN mode and receive all traffic, tagged or untagged.
1238 * In case of memory allocation failure return -ENOMEM. Otherwise, return 0.
1251 s16 pvid = le16_to_cpu(vsi->info.pvid); in i40e_correct_mac_vlan_filters()
1264 * which are marked as VLAN=-1 must be replaced with in i40e_correct_mac_vlan_filters()
1268 * marked as VLAN=-1 in i40e_correct_mac_vlan_filters()
1273 if (pvid && new->f->vlan != pvid) in i40e_correct_mac_vlan_filters()
1274 new->f->vlan = pvid; in i40e_correct_mac_vlan_filters()
1275 else if (vlan_filters && new->f->vlan == I40E_VLAN_ANY) in i40e_correct_mac_vlan_filters()
1276 new->f->vlan = 0; in i40e_correct_mac_vlan_filters()
1277 else if (!vlan_filters && new->f->vlan == 0) in i40e_correct_mac_vlan_filters()
1278 new->f->vlan = I40E_VLAN_ANY; in i40e_correct_mac_vlan_filters()
1282 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_correct_mac_vlan_filters()
1288 if ((pvid && f->vlan != pvid) || in i40e_correct_mac_vlan_filters()
1289 (vlan_filters && f->vlan == I40E_VLAN_ANY) || in i40e_correct_mac_vlan_filters()
1290 (!vlan_filters && f->vlan == 0)) { in i40e_correct_mac_vlan_filters()
1300 add_head = i40e_add_filter(vsi, f->macaddr, new_vlan); in i40e_correct_mac_vlan_filters()
1302 return -ENOMEM; in i40e_correct_mac_vlan_filters()
1307 return -ENOMEM; in i40e_correct_mac_vlan_filters()
1309 new->f = add_head; in i40e_correct_mac_vlan_filters()
1310 new->state = add_head->state; in i40e_correct_mac_vlan_filters()
1313 hlist_add_head(&new->hlist, tmp_add_list); in i40e_correct_mac_vlan_filters()
1316 f->state = I40E_FILTER_REMOVE; in i40e_correct_mac_vlan_filters()
1317 hash_del(&f->hlist); in i40e_correct_mac_vlan_filters()
1318 hlist_add_head(&f->hlist, tmp_del_list); in i40e_correct_mac_vlan_filters()
1322 vsi->has_vlan_filter = !!vlan_filters; in i40e_correct_mac_vlan_filters()
1328 * i40e_rm_default_mac_filter - Remove the default MAC filter set by NVM
1329 * @vsi: the PF Main VSI - inappropriate for any other VSI
1338 struct i40e_pf *pf = vsi->back; in i40e_rm_default_mac_filter()
1341 if (vsi->type != I40E_VSI_MAIN) in i40e_rm_default_mac_filter()
1349 i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_rm_default_mac_filter()
1357 i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_rm_default_mac_filter()
1361 * i40e_add_filter - Add a mac/vlan filter to the VSI
1390 vsi->has_vlan_filter = true; in i40e_add_filter()
1392 ether_addr_copy(f->macaddr, macaddr); in i40e_add_filter()
1393 f->vlan = vlan; in i40e_add_filter()
1394 f->state = I40E_FILTER_NEW; in i40e_add_filter()
1395 INIT_HLIST_NODE(&f->hlist); in i40e_add_filter()
1398 hash_add(vsi->mac_filter_hash, &f->hlist, key); in i40e_add_filter()
1400 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_add_filter()
1401 set_bit(__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); in i40e_add_filter()
1412 if (f->state == I40E_FILTER_REMOVE) in i40e_add_filter()
1413 f->state = I40E_FILTER_ACTIVE; in i40e_add_filter()
1419 * __i40e_del_filter - Remove a specific filter from the VSI
1442 if ((f->state == I40E_FILTER_FAILED) || in __i40e_del_filter()
1443 (f->state == I40E_FILTER_NEW)) { in __i40e_del_filter()
1444 hash_del(&f->hlist); in __i40e_del_filter()
1447 f->state = I40E_FILTER_REMOVE; in __i40e_del_filter()
1450 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in __i40e_del_filter()
1451 set_bit(__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); in __i40e_del_filter()
1455 * i40e_del_filter - Remove a MAC/VLAN filter from the VSI
1478 * i40e_add_mac_filter - Add a MAC filter for all active VLANs
1496 if (vsi->info.pvid) in i40e_add_mac_filter()
1498 le16_to_cpu(vsi->info.pvid)); in i40e_add_mac_filter()
1503 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_add_mac_filter()
1504 if (f->state == I40E_FILTER_REMOVE) in i40e_add_mac_filter()
1506 add = i40e_add_filter(vsi, macaddr, f->vlan); in i40e_add_mac_filter()
1515 * i40e_del_mac_filter - Remove a MAC filter from all VLANs
1531 lockdep_assert_held(&vsi->mac_filter_hash_lock); in i40e_del_mac_filter()
1532 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_del_mac_filter()
1533 if (ether_addr_equal(macaddr, f->macaddr)) { in i40e_del_mac_filter()
1542 return -ENOENT; in i40e_del_mac_filter()
1546 * i40e_set_mac - NDO callback to set mac address
1555 struct i40e_vsi *vsi = np->vsi; in i40e_set_mac()
1556 struct i40e_pf *pf = vsi->back; in i40e_set_mac()
1557 struct i40e_hw *hw = &pf->hw; in i40e_set_mac()
1560 if (!is_valid_ether_addr(addr->sa_data)) in i40e_set_mac()
1561 return -EADDRNOTAVAIL; in i40e_set_mac()
1563 if (ether_addr_equal(netdev->dev_addr, addr->sa_data)) { in i40e_set_mac()
1565 addr->sa_data); in i40e_set_mac()
1569 if (test_bit(__I40E_DOWN, pf->state) || in i40e_set_mac()
1570 test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_set_mac()
1571 return -EADDRNOTAVAIL; in i40e_set_mac()
1573 if (ether_addr_equal(hw->mac.addr, addr->sa_data)) in i40e_set_mac()
1575 hw->mac.addr); in i40e_set_mac()
1577 netdev_info(netdev, "set new mac address %pM\n", addr->sa_data); in i40e_set_mac()
1581 * - Remove old address from MAC filter in i40e_set_mac()
1582 * - Copy new address in i40e_set_mac()
1583 * - Add new address to MAC filter in i40e_set_mac()
1585 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_set_mac()
1586 i40e_del_mac_filter(vsi, netdev->dev_addr); in i40e_set_mac()
1587 ether_addr_copy(netdev->dev_addr, addr->sa_data); in i40e_set_mac()
1588 i40e_add_mac_filter(vsi, netdev->dev_addr); in i40e_set_mac()
1589 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_set_mac()
1591 if (vsi->type == I40E_VSI_MAIN) { in i40e_set_mac()
1595 addr->sa_data, NULL); in i40e_set_mac()
1599 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_set_mac()
1610 * i40e_config_rss_aq - Prepare for RSS using AQ commands
1619 struct i40e_pf *pf = vsi->back; in i40e_config_rss_aq()
1620 struct i40e_hw *hw = &pf->hw; in i40e_config_rss_aq()
1626 ret = i40e_aq_set_rss_key(hw, vsi->id, seed_dw); in i40e_config_rss_aq()
1628 dev_info(&pf->pdev->dev, in i40e_config_rss_aq()
1631 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_config_rss_aq()
1636 bool pf_lut = vsi->type == I40E_VSI_MAIN; in i40e_config_rss_aq()
1638 ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, lut, lut_size); in i40e_config_rss_aq()
1640 dev_info(&pf->pdev->dev, in i40e_config_rss_aq()
1643 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_config_rss_aq()
1651 * i40e_vsi_config_rss - Prepare for VSI(VMDq) RSS if used
1656 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_rss()
1661 if (!(pf->hw_features & I40E_HW_RSS_AQ_CAPABLE)) in i40e_vsi_config_rss()
1663 if (!vsi->rss_size) in i40e_vsi_config_rss()
1664 vsi->rss_size = min_t(int, pf->alloc_rss_size, in i40e_vsi_config_rss()
1665 vsi->num_queue_pairs); in i40e_vsi_config_rss()
1666 if (!vsi->rss_size) in i40e_vsi_config_rss()
1667 return -EINVAL; in i40e_vsi_config_rss()
1668 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in i40e_vsi_config_rss()
1670 return -ENOMEM; in i40e_vsi_config_rss()
1675 if (vsi->rss_lut_user) in i40e_vsi_config_rss()
1676 memcpy(lut, vsi->rss_lut_user, vsi->rss_table_size); in i40e_vsi_config_rss()
1678 i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, vsi->rss_size); in i40e_vsi_config_rss()
1679 if (vsi->rss_hkey_user) in i40e_vsi_config_rss()
1680 memcpy(seed, vsi->rss_hkey_user, I40E_HKEY_ARRAY_SIZE); in i40e_vsi_config_rss()
1683 ret = i40e_config_rss_aq(vsi, seed, lut, vsi->rss_table_size); in i40e_vsi_config_rss()
1689 * i40e_vsi_setup_queue_map_mqprio - Prepares mqprio based tc_config
1704 if (vsi->type != I40E_VSI_MAIN) in i40e_vsi_setup_queue_map_mqprio()
1705 return -EINVAL; in i40e_vsi_setup_queue_map_mqprio()
1708 vsi->tc_config.numtc = vsi->mqprio_qopt.qopt.num_tc; in i40e_vsi_setup_queue_map_mqprio()
1709 vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; in i40e_vsi_setup_queue_map_mqprio()
1710 num_qps = vsi->mqprio_qopt.qopt.count[0]; in i40e_vsi_setup_queue_map_mqprio()
1712 /* find the next higher power-of-2 of num queue pairs */ in i40e_vsi_setup_queue_map_mqprio()
1719 /* Setup queue offset/count for all TCs for given VSI */ in i40e_vsi_setup_queue_map_mqprio()
1720 max_qcount = vsi->mqprio_qopt.qopt.count[0]; in i40e_vsi_setup_queue_map_mqprio()
1723 if (vsi->tc_config.enabled_tc & BIT(i)) { in i40e_vsi_setup_queue_map_mqprio()
1724 offset = vsi->mqprio_qopt.qopt.offset[i]; in i40e_vsi_setup_queue_map_mqprio()
1725 qcount = vsi->mqprio_qopt.qopt.count[i]; in i40e_vsi_setup_queue_map_mqprio()
1728 vsi->tc_config.tc_info[i].qoffset = offset; in i40e_vsi_setup_queue_map_mqprio()
1729 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_setup_queue_map_mqprio()
1730 vsi->tc_config.tc_info[i].netdev_tc = netdev_tc++; in i40e_vsi_setup_queue_map_mqprio()
1736 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_setup_queue_map_mqprio()
1737 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_setup_queue_map_mqprio()
1738 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_setup_queue_map_mqprio()
1743 vsi->num_queue_pairs = offset + qcount; in i40e_vsi_setup_queue_map_mqprio()
1746 ctxt->info.tc_mapping[0] = cpu_to_le16(qmap); in i40e_vsi_setup_queue_map_mqprio()
1747 ctxt->info.mapping_flags |= cpu_to_le16(I40E_AQ_VSI_QUE_MAP_CONTIG); in i40e_vsi_setup_queue_map_mqprio()
1748 ctxt->info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_vsi_setup_queue_map_mqprio()
1749 ctxt->info.valid_sections |= cpu_to_le16(sections); in i40e_vsi_setup_queue_map_mqprio()
1752 vsi->rss_size = max_qcount; in i40e_vsi_setup_queue_map_mqprio()
1755 dev_info(&vsi->back->pdev->dev, in i40e_vsi_setup_queue_map_mqprio()
1760 vsi->reconfig_rss = true; in i40e_vsi_setup_queue_map_mqprio()
1761 dev_dbg(&vsi->back->pdev->dev, in i40e_vsi_setup_queue_map_mqprio()
1767 override_q = vsi->mqprio_qopt.qopt.count[0]; in i40e_vsi_setup_queue_map_mqprio()
1768 if (override_q && override_q < vsi->num_queue_pairs) { in i40e_vsi_setup_queue_map_mqprio()
1769 vsi->cnt_q_avail = vsi->num_queue_pairs - override_q; in i40e_vsi_setup_queue_map_mqprio()
1770 vsi->next_base_queue = override_q; in i40e_vsi_setup_queue_map_mqprio()
1776 * i40e_vsi_setup_queue_map - Setup a VSI queue map based on enabled_tc
1779 * @enabled_tc: Enabled TCs bitmap
1789 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_queue_map()
1803 num_tc_qps = vsi->alloc_queue_pairs; in i40e_vsi_setup_queue_map()
1804 if (enabled_tc && (vsi->back->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_vsi_setup_queue_map()
1811 dev_warn(&pf->pdev->dev, "DCB is enabled but no TC enabled, forcing TC0\n"); in i40e_vsi_setup_queue_map()
1819 vsi->tc_config.numtc = numtc; in i40e_vsi_setup_queue_map()
1820 vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; in i40e_vsi_setup_queue_map()
1822 /* Do not allow use more TC queue pairs than MSI-X vectors exist */ in i40e_vsi_setup_queue_map()
1823 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_setup_queue_map()
1824 num_tc_qps = min_t(int, num_tc_qps, pf->num_lan_msix); in i40e_vsi_setup_queue_map()
1826 /* Setup queue offset/count for all TCs for given VSI */ in i40e_vsi_setup_queue_map()
1829 if (vsi->tc_config.enabled_tc & BIT(i)) { in i40e_vsi_setup_queue_map()
1833 switch (vsi->type) { in i40e_vsi_setup_queue_map()
1835 if (!(pf->flags & (I40E_FLAG_FD_SB_ENABLED | in i40e_vsi_setup_queue_map()
1837 vsi->tc_config.enabled_tc != 1) { in i40e_vsi_setup_queue_map()
1838 qcount = min_t(int, pf->alloc_rss_size, in i40e_vsi_setup_queue_map()
1851 vsi->tc_config.tc_info[i].qoffset = offset; in i40e_vsi_setup_queue_map()
1852 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_setup_queue_map()
1854 /* find the next higher power-of-2 of num queue pairs */ in i40e_vsi_setup_queue_map()
1862 vsi->tc_config.tc_info[i].netdev_tc = netdev_tc++; in i40e_vsi_setup_queue_map()
1873 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_setup_queue_map()
1874 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_setup_queue_map()
1875 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_setup_queue_map()
1879 ctxt->info.tc_mapping[i] = cpu_to_le16(qmap); in i40e_vsi_setup_queue_map()
1883 vsi->num_queue_pairs = offset; in i40e_vsi_setup_queue_map()
1884 if ((vsi->type == I40E_VSI_MAIN) && (numtc == 1)) { in i40e_vsi_setup_queue_map()
1885 if (vsi->req_queue_pairs > 0) in i40e_vsi_setup_queue_map()
1886 vsi->num_queue_pairs = vsi->req_queue_pairs; in i40e_vsi_setup_queue_map()
1887 else if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_setup_queue_map()
1888 vsi->num_queue_pairs = pf->num_lan_msix; in i40e_vsi_setup_queue_map()
1895 ctxt->info.up_enable_bits = enabled_tc; in i40e_vsi_setup_queue_map()
1897 if (vsi->type == I40E_VSI_SRIOV) { in i40e_vsi_setup_queue_map()
1898 ctxt->info.mapping_flags |= in i40e_vsi_setup_queue_map()
1900 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_setup_queue_map()
1901 ctxt->info.queue_mapping[i] = in i40e_vsi_setup_queue_map()
1902 cpu_to_le16(vsi->base_queue + i); in i40e_vsi_setup_queue_map()
1904 ctxt->info.mapping_flags |= in i40e_vsi_setup_queue_map()
1906 ctxt->info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_vsi_setup_queue_map()
1908 ctxt->info.valid_sections |= cpu_to_le16(sections); in i40e_vsi_setup_queue_map()
1912 * i40e_addr_sync - Callback for dev_(mc|uc)_sync to add address
1922 struct i40e_vsi *vsi = np->vsi; in i40e_addr_sync()
1927 return -ENOMEM; in i40e_addr_sync()
1931 * i40e_addr_unsync - Callback for dev_(mc|uc)_sync to remove address
1941 struct i40e_vsi *vsi = np->vsi; in i40e_addr_unsync()
1948 if (ether_addr_equal(addr, netdev->dev_addr)) in i40e_addr_unsync()
1957 * i40e_set_rx_mode - NDO callback to set the netdev filters
1963 struct i40e_vsi *vsi = np->vsi; in i40e_set_rx_mode()
1965 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_set_rx_mode()
1970 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_set_rx_mode()
1973 if (vsi->current_netdev_flags != vsi->netdev->flags) { in i40e_set_rx_mode()
1974 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_set_rx_mode()
1975 set_bit(__I40E_MACVLAN_SYNC_PENDING, vsi->back->state); in i40e_set_rx_mode()
1980 * i40e_undo_del_filter_entries - Undo the changes made to MAC filter entries
1982 * @from: Pointer to list which contains MAC filter entries - changes to
1994 u64 key = i40e_addr_to_hkey(f->macaddr); in i40e_undo_del_filter_entries()
1997 hlist_del(&f->hlist); in i40e_undo_del_filter_entries()
1998 hash_add(vsi->mac_filter_hash, &f->hlist, key); in i40e_undo_del_filter_entries()
2003 * i40e_undo_add_filter_entries - Undo the changes made to MAC filter entries
2005 * @from: Pointer to list which contains MAC filter entries - changes to
2018 hlist_del(&new->hlist); in i40e_undo_add_filter_entries()
2024 * i40e_next_entry - Get the next non-broadcast filter from a list
2027 * Returns the next non-broadcast filter in the list. Required so that we
2035 if (!is_broadcast_ether_addr(next->f->macaddr)) in i40e_next_filter()
2043 * i40e_update_filter_state - Update filter state based on return data
2062 * the firmware return status because we pre-set the filter in i40e_update_filter_state()
2068 add_head->state = I40E_FILTER_FAILED; in i40e_update_filter_state()
2070 add_head->state = I40E_FILTER_ACTIVE; in i40e_update_filter_state()
2083 * i40e_aqc_del_filters - Request firmware to delete a set of filters
2088 * @retval: Set to -EIO on failure to delete
2100 struct i40e_hw *hw = &vsi->back->hw; in i40e_aqc_del_filters()
2104 aq_ret = i40e_aq_remove_macvlan(hw, vsi->seid, list, num_del, NULL); in i40e_aqc_del_filters()
2105 aq_err = hw->aq.asq_last_status; in i40e_aqc_del_filters()
2109 *retval = -EIO; in i40e_aqc_del_filters()
2110 dev_info(&vsi->back->pdev->dev, in i40e_aqc_del_filters()
2118 * i40e_aqc_add_filters - Request firmware to add a set of filters
2126 * __I40E_VSI_OVERFLOW_PROMISC bit in vsi->state if the firmware has run out of
2135 struct i40e_hw *hw = &vsi->back->hw; in i40e_aqc_add_filters()
2138 i40e_aq_add_macvlan(hw, vsi->seid, list, num_add, NULL); in i40e_aqc_add_filters()
2139 aq_err = hw->aq.asq_last_status; in i40e_aqc_add_filters()
2143 if (vsi->type == I40E_VSI_MAIN) { in i40e_aqc_add_filters()
2144 set_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_aqc_add_filters()
2145 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_add_filters()
2148 } else if (vsi->type == I40E_VSI_SRIOV || in i40e_aqc_add_filters()
2149 vsi->type == I40E_VSI_VMDQ1 || in i40e_aqc_add_filters()
2150 vsi->type == I40E_VSI_VMDQ2) { in i40e_aqc_add_filters()
2151 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_add_filters()
2155 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_add_filters()
2157 i40e_aq_str(hw, aq_err), vsi_name, vsi->type); in i40e_aqc_add_filters()
2163 * i40e_aqc_broadcast_filter - Set promiscuous broadcast flags
2178 bool enable = f->state == I40E_FILTER_NEW; in i40e_aqc_broadcast_filter()
2179 struct i40e_hw *hw = &vsi->back->hw; in i40e_aqc_broadcast_filter()
2182 if (f->vlan == I40E_VLAN_ANY) { in i40e_aqc_broadcast_filter()
2184 vsi->seid, in i40e_aqc_broadcast_filter()
2189 vsi->seid, in i40e_aqc_broadcast_filter()
2191 f->vlan, in i40e_aqc_broadcast_filter()
2196 set_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_aqc_broadcast_filter()
2197 dev_warn(&vsi->back->pdev->dev, in i40e_aqc_broadcast_filter()
2199 i40e_aq_str(hw, hw->aq.asq_last_status), in i40e_aqc_broadcast_filter()
2207 * i40e_set_promiscuous - set promiscuous mode
2217 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_set_promiscuous()
2218 struct i40e_hw *hw = &pf->hw; in i40e_set_promiscuous()
2221 if (vsi->type == I40E_VSI_MAIN && in i40e_set_promiscuous()
2222 pf->lan_veb != I40E_NO_VEB && in i40e_set_promiscuous()
2223 !(pf->flags & I40E_FLAG_MFP_ENABLED)) { in i40e_set_promiscuous()
2231 vsi->seid, in i40e_set_promiscuous()
2235 vsi->seid, in i40e_set_promiscuous()
2238 dev_info(&pf->pdev->dev, in i40e_set_promiscuous()
2241 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_set_promiscuous()
2246 vsi->seid, in i40e_set_promiscuous()
2250 dev_info(&pf->pdev->dev, in i40e_set_promiscuous()
2253 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_set_promiscuous()
2257 vsi->seid, in i40e_set_promiscuous()
2260 dev_info(&pf->pdev->dev, in i40e_set_promiscuous()
2263 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_set_promiscuous()
2268 pf->cur_promisc = promisc; in i40e_set_promiscuous()
2274 * i40e_sync_vsi_filters - Update the VSI filter list to the HW
2286 struct i40e_hw *hw = &vsi->back->hw; in i40e_sync_vsi_filters()
2307 while (test_and_set_bit(__I40E_VSI_SYNCING_FILTERS, vsi->state)) in i40e_sync_vsi_filters()
2309 pf = vsi->back; in i40e_sync_vsi_filters()
2311 old_overflow = test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2313 if (vsi->netdev) { in i40e_sync_vsi_filters()
2314 changed_flags = vsi->current_netdev_flags ^ vsi->netdev->flags; in i40e_sync_vsi_filters()
2315 vsi->current_netdev_flags = vsi->netdev->flags; in i40e_sync_vsi_filters()
2321 if (vsi->type == I40E_VSI_SRIOV) in i40e_sync_vsi_filters()
2322 snprintf(vsi_name, sizeof(vsi_name) - 1, "VF %d", vsi->vf_id); in i40e_sync_vsi_filters()
2323 else if (vsi->type != I40E_VSI_MAIN) in i40e_sync_vsi_filters()
2324 snprintf(vsi_name, sizeof(vsi_name) - 1, "vsi %d", vsi->seid); in i40e_sync_vsi_filters()
2326 if (vsi->flags & I40E_VSI_FLAG_FILTER_CHANGED) { in i40e_sync_vsi_filters()
2327 vsi->flags &= ~I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
2329 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2331 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_sync_vsi_filters()
2332 if (f->state == I40E_FILTER_REMOVE) { in i40e_sync_vsi_filters()
2334 hash_del(&f->hlist); in i40e_sync_vsi_filters()
2335 hlist_add_head(&f->hlist, &tmp_del_list); in i40e_sync_vsi_filters()
2340 if (f->state == I40E_FILTER_NEW) { in i40e_sync_vsi_filters()
2347 new->f = f; in i40e_sync_vsi_filters()
2348 new->state = f->state; in i40e_sync_vsi_filters()
2351 hlist_add_head(&new->hlist, &tmp_add_list); in i40e_sync_vsi_filters()
2358 if (f->vlan > 0) in i40e_sync_vsi_filters()
2369 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2374 filter_list_len = hw->aq.asq_buf_size / in i40e_sync_vsi_filters()
2388 if (is_broadcast_ether_addr(f->macaddr)) { in i40e_sync_vsi_filters()
2391 hlist_del(&f->hlist); in i40e_sync_vsi_filters()
2397 ether_addr_copy(del_list[num_del].mac_addr, f->macaddr); in i40e_sync_vsi_filters()
2398 if (f->vlan == I40E_VLAN_ANY) { in i40e_sync_vsi_filters()
2403 cpu_to_le16((u16)(f->vlan)); in i40e_sync_vsi_filters()
2420 hlist_del(&f->hlist); in i40e_sync_vsi_filters()
2435 filter_list_len = hw->aq.asq_buf_size / in i40e_sync_vsi_filters()
2448 if (is_broadcast_ether_addr(new->f->macaddr)) { in i40e_sync_vsi_filters()
2450 new->f)) in i40e_sync_vsi_filters()
2451 new->state = I40E_FILTER_FAILED; in i40e_sync_vsi_filters()
2453 new->state = I40E_FILTER_ACTIVE; in i40e_sync_vsi_filters()
2462 new->f->macaddr); in i40e_sync_vsi_filters()
2463 if (new->f->vlan == I40E_VLAN_ANY) { in i40e_sync_vsi_filters()
2468 cpu_to_le16((u16)(new->f->vlan)); in i40e_sync_vsi_filters()
2492 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2495 if (new->f->state == I40E_FILTER_NEW) in i40e_sync_vsi_filters()
2496 new->f->state = new->state; in i40e_sync_vsi_filters()
2497 hlist_del(&new->hlist); in i40e_sync_vsi_filters()
2500 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2506 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2507 vsi->active_filters = 0; in i40e_sync_vsi_filters()
2508 hash_for_each(vsi->mac_filter_hash, bkt, f, hlist) { in i40e_sync_vsi_filters()
2509 if (f->state == I40E_FILTER_ACTIVE) in i40e_sync_vsi_filters()
2510 vsi->active_filters++; in i40e_sync_vsi_filters()
2511 else if (f->state == I40E_FILTER_FAILED) in i40e_sync_vsi_filters()
2514 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2521 vsi->active_filters < vsi->promisc_threshold) { in i40e_sync_vsi_filters()
2522 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2525 clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2526 vsi->promisc_threshold = 0; in i40e_sync_vsi_filters()
2530 if ((vsi->type == I40E_VSI_SRIOV) && !pf->vf[vsi->vf_id].trusted) { in i40e_sync_vsi_filters()
2531 clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2535 new_overflow = test_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_sync_vsi_filters()
2541 vsi->promisc_threshold = (vsi->active_filters * 3) / 4; in i40e_sync_vsi_filters()
2547 cur_multipromisc = !!(vsi->current_netdev_flags & IFF_ALLMULTI); in i40e_sync_vsi_filters()
2548 aq_ret = i40e_aq_set_vsi_multicast_promiscuous(&vsi->back->hw, in i40e_sync_vsi_filters()
2549 vsi->seid, in i40e_sync_vsi_filters()
2554 hw->aq.asq_last_status); in i40e_sync_vsi_filters()
2555 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2559 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_sync_vsi_filters()
2561 dev_info(&pf->pdev->dev, "%s is %s allmulti mode.\n", in i40e_sync_vsi_filters()
2562 vsi->netdev->name, in i40e_sync_vsi_filters()
2570 cur_promisc = (!!(vsi->current_netdev_flags & IFF_PROMISC) || in i40e_sync_vsi_filters()
2575 hw->aq.asq_last_status); in i40e_sync_vsi_filters()
2576 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2581 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_sync_vsi_filters()
2587 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
2589 clear_bit(__I40E_VSI_SYNCING_FILTERS, vsi->state); in i40e_sync_vsi_filters()
2594 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2598 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_sync_vsi_filters()
2600 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
2601 clear_bit(__I40E_VSI_SYNCING_FILTERS, vsi->state); in i40e_sync_vsi_filters()
2602 return -ENOMEM; in i40e_sync_vsi_filters()
2606 * i40e_sync_filters_subtask - Sync the VSI filter list with HW
2615 if (!test_and_clear_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state)) in i40e_sync_filters_subtask()
2617 if (test_and_set_bit(__I40E_VF_DISABLE, pf->state)) { in i40e_sync_filters_subtask()
2618 set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state); in i40e_sync_filters_subtask()
2622 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_sync_filters_subtask()
2623 if (pf->vsi[v] && in i40e_sync_filters_subtask()
2624 (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED)) { in i40e_sync_filters_subtask()
2625 int ret = i40e_sync_vsi_filters(pf->vsi[v]); in i40e_sync_filters_subtask()
2630 pf->state); in i40e_sync_filters_subtask()
2635 clear_bit(__I40E_VF_DISABLE, pf->state); in i40e_sync_filters_subtask()
2639 * i40e_max_xdp_frame_size - returns the maximum allowed frame size for XDP
2644 if (PAGE_SIZE >= 8192 || (vsi->back->flags & I40E_FLAG_LEGACY_RX)) in i40e_max_xdp_frame_size()
2651 * i40e_change_mtu - NDO callback to change the Maximum Transfer Unit
2660 struct i40e_vsi *vsi = np->vsi; in i40e_change_mtu()
2661 struct i40e_pf *pf = vsi->back; in i40e_change_mtu()
2667 return -EINVAL; in i40e_change_mtu()
2671 netdev->mtu, new_mtu); in i40e_change_mtu()
2672 netdev->mtu = new_mtu; in i40e_change_mtu()
2675 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_change_mtu()
2676 set_bit(__I40E_CLIENT_L2_CHANGE, pf->state); in i40e_change_mtu()
2681 * i40e_ioctl - Access the hwtstamp interface
2689 struct i40e_pf *pf = np->vsi->back; in i40e_ioctl()
2697 return -EOPNOTSUPP; in i40e_ioctl()
2702 * i40e_vlan_stripping_enable - Turn on vlan stripping for the VSI
2711 if (vsi->info.pvid) in i40e_vlan_stripping_enable()
2714 if ((vsi->info.valid_sections & in i40e_vlan_stripping_enable()
2716 ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_MODE_MASK) == 0)) in i40e_vlan_stripping_enable()
2719 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vlan_stripping_enable()
2720 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL | in i40e_vlan_stripping_enable()
2723 ctxt.seid = vsi->seid; in i40e_vlan_stripping_enable()
2724 ctxt.info = vsi->info; in i40e_vlan_stripping_enable()
2725 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vlan_stripping_enable()
2727 dev_info(&vsi->back->pdev->dev, in i40e_vlan_stripping_enable()
2729 i40e_stat_str(&vsi->back->hw, ret), in i40e_vlan_stripping_enable()
2730 i40e_aq_str(&vsi->back->hw, in i40e_vlan_stripping_enable()
2731 vsi->back->hw.aq.asq_last_status)); in i40e_vlan_stripping_enable()
2736 * i40e_vlan_stripping_disable - Turn off vlan stripping for the VSI
2745 if (vsi->info.pvid) in i40e_vlan_stripping_disable()
2748 if ((vsi->info.valid_sections & in i40e_vlan_stripping_disable()
2750 ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_EMOD_MASK) == in i40e_vlan_stripping_disable()
2754 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vlan_stripping_disable()
2755 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL | in i40e_vlan_stripping_disable()
2758 ctxt.seid = vsi->seid; in i40e_vlan_stripping_disable()
2759 ctxt.info = vsi->info; in i40e_vlan_stripping_disable()
2760 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vlan_stripping_disable()
2762 dev_info(&vsi->back->pdev->dev, in i40e_vlan_stripping_disable()
2764 i40e_stat_str(&vsi->back->hw, ret), in i40e_vlan_stripping_disable()
2765 i40e_aq_str(&vsi->back->hw, in i40e_vlan_stripping_disable()
2766 vsi->back->hw.aq.asq_last_status)); in i40e_vlan_stripping_disable()
2771 * i40e_add_vlan_all_mac - Add a MAC/VLAN filter for each existing MAC address
2773 * @vid: vlan id to be added (0 = untagged only , -1 = any)
2789 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_add_vlan_all_mac()
2790 if (f->state == I40E_FILTER_REMOVE) in i40e_add_vlan_all_mac()
2792 add_f = i40e_add_filter(vsi, f->macaddr, vid); in i40e_add_vlan_all_mac()
2794 dev_info(&vsi->back->pdev->dev, in i40e_add_vlan_all_mac()
2796 vid, f->macaddr); in i40e_add_vlan_all_mac()
2797 return -ENOMEM; in i40e_add_vlan_all_mac()
2805 * i40e_vsi_add_vlan - Add VSI membership for given VLAN
2813 if (vsi->info.pvid) in i40e_vsi_add_vlan()
2814 return -EINVAL; in i40e_vsi_add_vlan()
2828 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_add_vlan()
2830 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_add_vlan()
2837 i40e_service_event_schedule(vsi->back); in i40e_vsi_add_vlan()
2842 * i40e_rm_vlan_all_mac - Remove MAC/VLAN pair for all MAC with the given VLAN
2844 * @vid: vlan id to be removed (0 = untagged only , -1 = any)
2860 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_rm_vlan_all_mac()
2861 if (f->vlan == vid) in i40e_rm_vlan_all_mac()
2867 * i40e_vsi_kill_vlan - Remove VSI membership for given VLAN
2873 if (!vid || vsi->info.pvid) in i40e_vsi_kill_vlan()
2876 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_kill_vlan()
2878 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_kill_vlan()
2883 i40e_service_event_schedule(vsi->back); in i40e_vsi_kill_vlan()
2887 * i40e_vlan_rx_add_vid - Add a vlan id filter to HW offload
2898 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_add_vid()
2902 return -EINVAL; in i40e_vlan_rx_add_vid()
2906 set_bit(vid, vsi->active_vlans); in i40e_vlan_rx_add_vid()
2912 * i40e_vlan_rx_add_vid_up - Add a vlan id filter to HW offload in UP path
2921 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_add_vid_up()
2925 set_bit(vid, vsi->active_vlans); in i40e_vlan_rx_add_vid_up()
2929 * i40e_vlan_rx_kill_vid - Remove a vlan id filter from HW offload
2940 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_kill_vid()
2948 clear_bit(vid, vsi->active_vlans); in i40e_vlan_rx_kill_vid()
2954 * i40e_restore_vlan - Reinstate vlans when vsi/netdev comes back up
2961 if (!vsi->netdev) in i40e_restore_vlan()
2964 if (vsi->netdev->features & NETIF_F_HW_VLAN_CTAG_RX) in i40e_restore_vlan()
2969 for_each_set_bit(vid, vsi->active_vlans, VLAN_N_VID) in i40e_restore_vlan()
2970 i40e_vlan_rx_add_vid_up(vsi->netdev, htons(ETH_P_8021Q), in i40e_restore_vlan()
2975 * i40e_vsi_add_pvid - Add pvid for the VSI
2984 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vsi_add_pvid()
2985 vsi->info.pvid = cpu_to_le16(vid); in i40e_vsi_add_pvid()
2986 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_TAGGED | in i40e_vsi_add_pvid()
2990 ctxt.seid = vsi->seid; in i40e_vsi_add_pvid()
2991 ctxt.info = vsi->info; in i40e_vsi_add_pvid()
2992 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vsi_add_pvid()
2994 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_pvid()
2996 i40e_stat_str(&vsi->back->hw, ret), in i40e_vsi_add_pvid()
2997 i40e_aq_str(&vsi->back->hw, in i40e_vsi_add_pvid()
2998 vsi->back->hw.aq.asq_last_status)); in i40e_vsi_add_pvid()
2999 return -ENOENT; in i40e_vsi_add_pvid()
3006 * i40e_vsi_remove_pvid - Remove the pvid from the VSI
3013 vsi->info.pvid = 0; in i40e_vsi_remove_pvid()
3019 * i40e_vsi_setup_tx_resources - Allocate VSI Tx queue resources
3032 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_tx_resources()
3033 err = i40e_setup_tx_descriptors(vsi->tx_rings[i]); in i40e_vsi_setup_tx_resources()
3038 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_tx_resources()
3039 err = i40e_setup_tx_descriptors(vsi->xdp_rings[i]); in i40e_vsi_setup_tx_resources()
3045 * i40e_vsi_free_tx_resources - Free Tx resources for VSI queues
3054 if (vsi->tx_rings) { in i40e_vsi_free_tx_resources()
3055 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_tx_resources()
3056 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) in i40e_vsi_free_tx_resources()
3057 i40e_free_tx_resources(vsi->tx_rings[i]); in i40e_vsi_free_tx_resources()
3060 if (vsi->xdp_rings) { in i40e_vsi_free_tx_resources()
3061 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_tx_resources()
3062 if (vsi->xdp_rings[i] && vsi->xdp_rings[i]->desc) in i40e_vsi_free_tx_resources()
3063 i40e_free_tx_resources(vsi->xdp_rings[i]); in i40e_vsi_free_tx_resources()
3068 * i40e_vsi_setup_rx_resources - Allocate VSI queues Rx resources
3081 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_rx_resources()
3082 err = i40e_setup_rx_descriptors(vsi->rx_rings[i]); in i40e_vsi_setup_rx_resources()
3087 * i40e_vsi_free_rx_resources - Free Rx Resources for VSI queues
3096 if (!vsi->rx_rings) in i40e_vsi_free_rx_resources()
3099 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_rx_resources()
3100 if (vsi->rx_rings[i] && vsi->rx_rings[i]->desc) in i40e_vsi_free_rx_resources()
3101 i40e_free_rx_resources(vsi->rx_rings[i]); in i40e_vsi_free_rx_resources()
3105 * i40e_config_xps_tx_ring - Configure XPS for a Tx ring
3109 * based on the TCs enabled for the VSI that ring belongs to.
3115 if (!ring->q_vector || !ring->netdev || ring->ch) in i40e_config_xps_tx_ring()
3119 if (test_and_set_bit(__I40E_TX_XPS_INIT_DONE, ring->state)) in i40e_config_xps_tx_ring()
3122 cpu = cpumask_local_spread(ring->q_vector->v_idx, -1); in i40e_config_xps_tx_ring()
3123 netif_set_xps_queue(ring->netdev, get_cpu_mask(cpu), in i40e_config_xps_tx_ring()
3124 ring->queue_index); in i40e_config_xps_tx_ring()
3128 * i40e_xsk_pool - Retrieve the AF_XDP buffer pool if XDP and ZC is enabled
3135 bool xdp_on = i40e_enabled_xdp_vsi(ring->vsi); in i40e_xsk_pool()
3136 int qid = ring->queue_index; in i40e_xsk_pool()
3139 qid -= ring->vsi->alloc_queue_pairs; in i40e_xsk_pool()
3141 if (!xdp_on || !test_bit(qid, ring->vsi->af_xdp_zc_qps)) in i40e_xsk_pool()
3144 return xsk_get_pool_from_qid(ring->vsi->netdev, qid); in i40e_xsk_pool()
3148 * i40e_configure_tx_ring - Configure a transmit ring context and rest
3155 struct i40e_vsi *vsi = ring->vsi; in i40e_configure_tx_ring()
3156 u16 pf_q = vsi->base_queue + ring->queue_index; in i40e_configure_tx_ring()
3157 struct i40e_hw *hw = &vsi->back->hw; in i40e_configure_tx_ring()
3163 ring->xsk_pool = i40e_xsk_pool(ring); in i40e_configure_tx_ring()
3166 if (vsi->back->flags & I40E_FLAG_FD_ATR_ENABLED) { in i40e_configure_tx_ring()
3167 ring->atr_sample_rate = vsi->back->atr_sample_rate; in i40e_configure_tx_ring()
3168 ring->atr_count = 0; in i40e_configure_tx_ring()
3170 ring->atr_sample_rate = 0; in i40e_configure_tx_ring()
3180 tx_ctx.base = (ring->dma / 128); in i40e_configure_tx_ring()
3181 tx_ctx.qlen = ring->count; in i40e_configure_tx_ring()
3182 tx_ctx.fd_ena = !!(vsi->back->flags & (I40E_FLAG_FD_SB_ENABLED | in i40e_configure_tx_ring()
3184 tx_ctx.timesync_ena = !!(vsi->back->flags & I40E_FLAG_PTP); in i40e_configure_tx_ring()
3186 if (vsi->type != I40E_VSI_FDIR) in i40e_configure_tx_ring()
3188 tx_ctx.head_wb_addr = ring->dma + in i40e_configure_tx_ring()
3189 (ring->count * sizeof(struct i40e_tx_desc)); in i40e_configure_tx_ring()
3202 if (ring->ch) in i40e_configure_tx_ring()
3204 le16_to_cpu(ring->ch->info.qs_handle[ring->dcb_tc]); in i40e_configure_tx_ring()
3207 tx_ctx.rdylist = le16_to_cpu(vsi->info.qs_handle[ring->dcb_tc]); in i40e_configure_tx_ring()
3214 dev_info(&vsi->back->pdev->dev, in i40e_configure_tx_ring()
3216 ring->queue_index, pf_q, err); in i40e_configure_tx_ring()
3217 return -ENOMEM; in i40e_configure_tx_ring()
3223 dev_info(&vsi->back->pdev->dev, in i40e_configure_tx_ring()
3225 ring->queue_index, pf_q, err); in i40e_configure_tx_ring()
3226 return -ENOMEM; in i40e_configure_tx_ring()
3230 if (ring->ch) { in i40e_configure_tx_ring()
3231 if (ring->ch->type == I40E_VSI_VMDQ2) in i40e_configure_tx_ring()
3234 return -EINVAL; in i40e_configure_tx_ring()
3236 qtx_ctl |= (ring->ch->vsi_number << in i40e_configure_tx_ring()
3240 if (vsi->type == I40E_VSI_VMDQ2) { in i40e_configure_tx_ring()
3242 qtx_ctl |= ((vsi->id) << I40E_QTX_CTL_VFVM_INDX_SHIFT) & in i40e_configure_tx_ring()
3249 qtx_ctl |= ((hw->pf_id << I40E_QTX_CTL_PF_INDX_SHIFT) & in i40e_configure_tx_ring()
3255 ring->tail = hw->hw_addr + I40E_QTX_TAIL(pf_q); in i40e_configure_tx_ring()
3261 * i40e_configure_rx_ring - Configure a receive ring context
3268 struct i40e_vsi *vsi = ring->vsi; in i40e_configure_rx_ring()
3269 u32 chain_len = vsi->back->hw.func_caps.rx_buf_chain_len; in i40e_configure_rx_ring()
3270 u16 pf_q = vsi->base_queue + ring->queue_index; in i40e_configure_rx_ring()
3271 struct i40e_hw *hw = &vsi->back->hw; in i40e_configure_rx_ring()
3277 bitmap_zero(ring->state, __I40E_RING_STATE_NBITS); in i40e_configure_rx_ring()
3282 if (ring->vsi->type == I40E_VSI_MAIN) in i40e_configure_rx_ring()
3283 xdp_rxq_info_unreg_mem_model(&ring->xdp_rxq); in i40e_configure_rx_ring()
3285 kfree(ring->rx_bi); in i40e_configure_rx_ring()
3286 ring->xsk_pool = i40e_xsk_pool(ring); in i40e_configure_rx_ring()
3287 if (ring->xsk_pool) { in i40e_configure_rx_ring()
3291 ring->rx_buf_len = in i40e_configure_rx_ring()
3292 xsk_pool_get_rx_frame_size(ring->xsk_pool); in i40e_configure_rx_ring()
3295 * handling in the fast-path. in i40e_configure_rx_ring()
3298 ret = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, in i40e_configure_rx_ring()
3303 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3305 ring->queue_index); in i40e_configure_rx_ring()
3311 ring->rx_buf_len = vsi->rx_buf_len; in i40e_configure_rx_ring()
3312 if (ring->vsi->type == I40E_VSI_MAIN) { in i40e_configure_rx_ring()
3313 ret = xdp_rxq_info_reg_mem_model(&ring->xdp_rxq, in i40e_configure_rx_ring()
3321 rx_ctx.dbuff = DIV_ROUND_UP(ring->rx_buf_len, in i40e_configure_rx_ring()
3324 rx_ctx.base = (ring->dma / 128); in i40e_configure_rx_ring()
3325 rx_ctx.qlen = ring->count; in i40e_configure_rx_ring()
3335 rx_ctx.rxmax = min_t(u16, vsi->max_frame, chain_len * ring->rx_buf_len); in i40e_configure_rx_ring()
3336 if (hw->revision_id == 0) in i40e_configure_rx_ring()
3350 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3352 ring->queue_index, pf_q, err); in i40e_configure_rx_ring()
3353 return -ENOMEM; in i40e_configure_rx_ring()
3359 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3361 ring->queue_index, pf_q, err); in i40e_configure_rx_ring()
3362 return -ENOMEM; in i40e_configure_rx_ring()
3366 if (!vsi->netdev || (vsi->back->flags & I40E_FLAG_LEGACY_RX)) in i40e_configure_rx_ring()
3372 ring->tail = hw->hw_addr + I40E_QRX_TAIL(pf_q); in i40e_configure_rx_ring()
3373 writel(0, ring->tail); in i40e_configure_rx_ring()
3375 if (ring->xsk_pool) { in i40e_configure_rx_ring()
3376 xsk_pool_set_rxq_info(ring->xsk_pool, &ring->xdp_rxq); in i40e_configure_rx_ring()
3385 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
3387 ring->xsk_pool ? "AF_XDP ZC enabled " : "", in i40e_configure_rx_ring()
3388 ring->queue_index, pf_q); in i40e_configure_rx_ring()
3395 * i40e_vsi_configure_tx - Configure the VSI for Tx
3405 for (i = 0; (i < vsi->num_queue_pairs) && !err; i++) in i40e_vsi_configure_tx()
3406 err = i40e_configure_tx_ring(vsi->tx_rings[i]); in i40e_vsi_configure_tx()
3411 for (i = 0; (i < vsi->num_queue_pairs) && !err; i++) in i40e_vsi_configure_tx()
3412 err = i40e_configure_tx_ring(vsi->xdp_rings[i]); in i40e_vsi_configure_tx()
3418 * i40e_vsi_configure_rx - Configure the VSI for Rx
3428 if (!vsi->netdev || (vsi->back->flags & I40E_FLAG_LEGACY_RX)) { in i40e_vsi_configure_rx()
3429 vsi->max_frame = I40E_MAX_RXBUFFER; in i40e_vsi_configure_rx()
3430 vsi->rx_buf_len = I40E_RXBUFFER_2048; in i40e_vsi_configure_rx()
3433 (vsi->netdev->mtu <= ETH_DATA_LEN)) { in i40e_vsi_configure_rx()
3434 vsi->max_frame = I40E_RXBUFFER_1536 - NET_IP_ALIGN; in i40e_vsi_configure_rx()
3435 vsi->rx_buf_len = I40E_RXBUFFER_1536 - NET_IP_ALIGN; in i40e_vsi_configure_rx()
3438 vsi->max_frame = I40E_MAX_RXBUFFER; in i40e_vsi_configure_rx()
3439 vsi->rx_buf_len = (PAGE_SIZE < 8192) ? I40E_RXBUFFER_3072 : in i40e_vsi_configure_rx()
3444 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_configure_rx()
3445 err = i40e_configure_rx_ring(vsi->rx_rings[i]); in i40e_vsi_configure_rx()
3451 * i40e_vsi_config_dcb_rings - Update rings to reflect DCB TC
3460 if (!(vsi->back->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_vsi_config_dcb_rings()
3462 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_config_dcb_rings()
3463 rx_ring = vsi->rx_rings[i]; in i40e_vsi_config_dcb_rings()
3464 tx_ring = vsi->tx_rings[i]; in i40e_vsi_config_dcb_rings()
3465 rx_ring->dcb_tc = 0; in i40e_vsi_config_dcb_rings()
3466 tx_ring->dcb_tc = 0; in i40e_vsi_config_dcb_rings()
3472 if (!(vsi->tc_config.enabled_tc & BIT_ULL(n))) in i40e_vsi_config_dcb_rings()
3475 qoffset = vsi->tc_config.tc_info[n].qoffset; in i40e_vsi_config_dcb_rings()
3476 qcount = vsi->tc_config.tc_info[n].qcount; in i40e_vsi_config_dcb_rings()
3478 rx_ring = vsi->rx_rings[i]; in i40e_vsi_config_dcb_rings()
3479 tx_ring = vsi->tx_rings[i]; in i40e_vsi_config_dcb_rings()
3480 rx_ring->dcb_tc = n; in i40e_vsi_config_dcb_rings()
3481 tx_ring->dcb_tc = n; in i40e_vsi_config_dcb_rings()
3487 * i40e_set_vsi_rx_mode - Call set_rx_mode on a VSI
3492 if (vsi->netdev) in i40e_set_vsi_rx_mode()
3493 i40e_set_rx_mode(vsi->netdev); in i40e_set_vsi_rx_mode()
3497 * i40e_fdir_filter_restore - Restore the Sideband Flow Director filters
3506 struct i40e_pf *pf = vsi->back; in i40e_fdir_filter_restore()
3509 if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_fdir_filter_restore()
3513 pf->fd_tcp4_filter_cnt = 0; in i40e_fdir_filter_restore()
3514 pf->fd_udp4_filter_cnt = 0; in i40e_fdir_filter_restore()
3515 pf->fd_sctp4_filter_cnt = 0; in i40e_fdir_filter_restore()
3516 pf->fd_ip4_filter_cnt = 0; in i40e_fdir_filter_restore()
3519 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_filter_restore()
3525 * i40e_vsi_configure - Set up the VSI for action
3543 * i40e_vsi_configure_msix - MSIX mode Interrupt Config in the HW
3549 struct i40e_pf *pf = vsi->back; in i40e_vsi_configure_msix()
3550 struct i40e_hw *hw = &pf->hw; in i40e_vsi_configure_msix()
3557 * PFINT_ITRn[0..n-1] gets msix-1..msix-n (qpair interrupts) in i40e_vsi_configure_msix()
3559 qp = vsi->base_queue; in i40e_vsi_configure_msix()
3560 vector = vsi->base_vector; in i40e_vsi_configure_msix()
3561 for (i = 0; i < vsi->num_q_vectors; i++, vector++) { in i40e_vsi_configure_msix()
3562 struct i40e_q_vector *q_vector = vsi->q_vectors[i]; in i40e_vsi_configure_msix()
3564 q_vector->rx.next_update = jiffies + 1; in i40e_vsi_configure_msix()
3565 q_vector->rx.target_itr = in i40e_vsi_configure_msix()
3566 ITR_TO_REG(vsi->rx_rings[i]->itr_setting); in i40e_vsi_configure_msix()
3567 wr32(hw, I40E_PFINT_ITRN(I40E_RX_ITR, vector - 1), in i40e_vsi_configure_msix()
3568 q_vector->rx.target_itr >> 1); in i40e_vsi_configure_msix()
3569 q_vector->rx.current_itr = q_vector->rx.target_itr; in i40e_vsi_configure_msix()
3571 q_vector->tx.next_update = jiffies + 1; in i40e_vsi_configure_msix()
3572 q_vector->tx.target_itr = in i40e_vsi_configure_msix()
3573 ITR_TO_REG(vsi->tx_rings[i]->itr_setting); in i40e_vsi_configure_msix()
3574 wr32(hw, I40E_PFINT_ITRN(I40E_TX_ITR, vector - 1), in i40e_vsi_configure_msix()
3575 q_vector->tx.target_itr >> 1); in i40e_vsi_configure_msix()
3576 q_vector->tx.current_itr = q_vector->tx.target_itr; in i40e_vsi_configure_msix()
3578 wr32(hw, I40E_PFINT_RATEN(vector - 1), in i40e_vsi_configure_msix()
3579 i40e_intrl_usec_to_reg(vsi->int_rate_limit)); in i40e_vsi_configure_msix()
3582 wr32(hw, I40E_PFINT_LNKLSTN(vector - 1), qp); in i40e_vsi_configure_msix()
3583 for (q = 0; q < q_vector->num_ringpairs; q++) { in i40e_vsi_configure_msix()
3584 u32 nextqp = has_xdp ? qp + vsi->alloc_queue_pairs : qp; in i40e_vsi_configure_msix()
3615 if (q == (q_vector->num_ringpairs - 1)) in i40e_vsi_configure_msix()
3628 * i40e_enable_misc_int_causes - enable the non-queue interrupts
3633 struct i40e_hw *hw = &pf->hw; in i40e_enable_misc_int_causes()
3649 if (pf->flags & I40E_FLAG_IWARP_ENABLED) in i40e_enable_misc_int_causes()
3652 if (pf->flags & I40E_FLAG_PTP) in i40e_enable_misc_int_causes()
3666 * i40e_configure_msi_and_legacy - Legacy mode interrupt config in the HW
3671 u32 nextqp = i40e_enabled_xdp_vsi(vsi) ? vsi->alloc_queue_pairs : 0; in i40e_configure_msi_and_legacy()
3672 struct i40e_q_vector *q_vector = vsi->q_vectors[0]; in i40e_configure_msi_and_legacy()
3673 struct i40e_pf *pf = vsi->back; in i40e_configure_msi_and_legacy()
3674 struct i40e_hw *hw = &pf->hw; in i40e_configure_msi_and_legacy()
3678 q_vector->rx.next_update = jiffies + 1; in i40e_configure_msi_and_legacy()
3679 q_vector->rx.target_itr = ITR_TO_REG(vsi->rx_rings[0]->itr_setting); in i40e_configure_msi_and_legacy()
3680 wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), q_vector->rx.target_itr >> 1); in i40e_configure_msi_and_legacy()
3681 q_vector->rx.current_itr = q_vector->rx.target_itr; in i40e_configure_msi_and_legacy()
3682 q_vector->tx.next_update = jiffies + 1; in i40e_configure_msi_and_legacy()
3683 q_vector->tx.target_itr = ITR_TO_REG(vsi->tx_rings[0]->itr_setting); in i40e_configure_msi_and_legacy()
3684 wr32(hw, I40E_PFINT_ITR0(I40E_TX_ITR), q_vector->tx.target_itr >> 1); in i40e_configure_msi_and_legacy()
3685 q_vector->tx.current_itr = q_vector->tx.target_itr; in i40e_configure_msi_and_legacy()
3718 * i40e_irq_dynamic_disable_icr0 - Disable default interrupt generation for icr0
3723 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_disable_icr0()
3731 * i40e_irq_dynamic_enable_icr0 - Enable default interrupt generation for icr0
3736 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_enable_icr0()
3748 * i40e_msix_clean_rings - MSIX mode Interrupt Handler
3756 if (!q_vector->tx.ring && !q_vector->rx.ring) in i40e_msix_clean_rings()
3759 napi_schedule_irqoff(&q_vector->napi); in i40e_msix_clean_rings()
3765 * i40e_irq_affinity_notify - Callback for affinity changes
3778 cpumask_copy(&q_vector->affinity_mask, mask); in i40e_irq_affinity_notify()
3782 * i40e_irq_affinity_release - Callback for affinity notifier release
3792 * i40e_vsi_request_irq_msix - Initialize MSI-X interrupts
3796 * Allocates MSI-X vectors and requests interrupts from the kernel.
3800 int q_vectors = vsi->num_q_vectors; in i40e_vsi_request_irq_msix()
3801 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq_msix()
3802 int base = vsi->base_vector; in i40e_vsi_request_irq_msix()
3810 struct i40e_q_vector *q_vector = vsi->q_vectors[vector]; in i40e_vsi_request_irq_msix()
3812 irq_num = pf->msix_entries[base + vector].vector; in i40e_vsi_request_irq_msix()
3814 if (q_vector->tx.ring && q_vector->rx.ring) { in i40e_vsi_request_irq_msix()
3815 snprintf(q_vector->name, sizeof(q_vector->name) - 1, in i40e_vsi_request_irq_msix()
3816 "%s-%s-%d", basename, "TxRx", rx_int_idx++); in i40e_vsi_request_irq_msix()
3818 } else if (q_vector->rx.ring) { in i40e_vsi_request_irq_msix()
3819 snprintf(q_vector->name, sizeof(q_vector->name) - 1, in i40e_vsi_request_irq_msix()
3820 "%s-%s-%d", basename, "rx", rx_int_idx++); in i40e_vsi_request_irq_msix()
3821 } else if (q_vector->tx.ring) { in i40e_vsi_request_irq_msix()
3822 snprintf(q_vector->name, sizeof(q_vector->name) - 1, in i40e_vsi_request_irq_msix()
3823 "%s-%s-%d", basename, "tx", tx_int_idx++); in i40e_vsi_request_irq_msix()
3829 vsi->irq_handler, in i40e_vsi_request_irq_msix()
3831 q_vector->name, in i40e_vsi_request_irq_msix()
3834 dev_info(&pf->pdev->dev, in i40e_vsi_request_irq_msix()
3840 q_vector->affinity_notify.notify = i40e_irq_affinity_notify; in i40e_vsi_request_irq_msix()
3841 q_vector->affinity_notify.release = i40e_irq_affinity_release; in i40e_vsi_request_irq_msix()
3842 irq_set_affinity_notifier(irq_num, &q_vector->affinity_notify); in i40e_vsi_request_irq_msix()
3849 cpu = cpumask_local_spread(q_vector->v_idx, -1); in i40e_vsi_request_irq_msix()
3853 vsi->irqs_ready = true; in i40e_vsi_request_irq_msix()
3858 vector--; in i40e_vsi_request_irq_msix()
3859 irq_num = pf->msix_entries[base + vector].vector; in i40e_vsi_request_irq_msix()
3862 free_irq(irq_num, &vsi->q_vectors[vector]); in i40e_vsi_request_irq_msix()
3868 * i40e_vsi_disable_irq - Mask off queue interrupt generation on the VSI
3869 * @vsi: the VSI being un-configured
3873 struct i40e_pf *pf = vsi->back; in i40e_vsi_disable_irq()
3874 struct i40e_hw *hw = &pf->hw; in i40e_vsi_disable_irq()
3875 int base = vsi->base_vector; in i40e_vsi_disable_irq()
3879 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_disable_irq()
3882 val = rd32(hw, I40E_QINT_TQCTL(vsi->tx_rings[i]->reg_idx)); in i40e_vsi_disable_irq()
3884 wr32(hw, I40E_QINT_TQCTL(vsi->tx_rings[i]->reg_idx), val); in i40e_vsi_disable_irq()
3886 val = rd32(hw, I40E_QINT_RQCTL(vsi->rx_rings[i]->reg_idx)); in i40e_vsi_disable_irq()
3888 wr32(hw, I40E_QINT_RQCTL(vsi->rx_rings[i]->reg_idx), val); in i40e_vsi_disable_irq()
3892 wr32(hw, I40E_QINT_TQCTL(vsi->xdp_rings[i]->reg_idx), 0); in i40e_vsi_disable_irq()
3896 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_vsi_disable_irq()
3897 for (i = vsi->base_vector; in i40e_vsi_disable_irq()
3898 i < (vsi->num_q_vectors + vsi->base_vector); i++) in i40e_vsi_disable_irq()
3899 wr32(hw, I40E_PFINT_DYN_CTLN(i - 1), 0); in i40e_vsi_disable_irq()
3902 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_vsi_disable_irq()
3903 synchronize_irq(pf->msix_entries[i + base].vector); in i40e_vsi_disable_irq()
3905 /* Legacy and MSI mode - this stops all interrupt handling */ in i40e_vsi_disable_irq()
3909 synchronize_irq(pf->pdev->irq); in i40e_vsi_disable_irq()
3914 * i40e_vsi_enable_irq - Enable IRQ for the given VSI
3919 struct i40e_pf *pf = vsi->back; in i40e_vsi_enable_irq()
3922 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_vsi_enable_irq()
3923 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_vsi_enable_irq()
3929 i40e_flush(&pf->hw); in i40e_vsi_enable_irq()
3934 * i40e_free_misc_vector - Free the vector that handles non-queue events
3940 wr32(&pf->hw, I40E_PFINT_ICR0_ENA, 0); in i40e_free_misc_vector()
3941 i40e_flush(&pf->hw); in i40e_free_misc_vector()
3943 if (pf->flags & I40E_FLAG_MSIX_ENABLED && pf->msix_entries) { in i40e_free_misc_vector()
3944 synchronize_irq(pf->msix_entries[0].vector); in i40e_free_misc_vector()
3945 free_irq(pf->msix_entries[0].vector, pf); in i40e_free_misc_vector()
3946 clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state); in i40e_free_misc_vector()
3951 * i40e_intr - MSI/Legacy and non-queue interrupt handler
3956 * with both queue and non-queue interrupts. This is also used in
3957 * MSIX mode to handle the non-queue interrupts.
3962 struct i40e_hw *hw = &pf->hw; in i40e_intr()
3977 pf->sw_int_count++; in i40e_intr()
3979 if ((pf->flags & I40E_FLAG_IWARP_ENABLED) && in i40e_intr()
3982 dev_dbg(&pf->pdev->dev, "cleared PE_CRITERR\n"); in i40e_intr()
3983 set_bit(__I40E_CORE_RESET_REQUESTED, pf->state); in i40e_intr()
3988 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_intr()
3989 struct i40e_q_vector *q_vector = vsi->q_vectors[0]; in i40e_intr()
3997 if (!test_bit(__I40E_DOWN, pf->state)) in i40e_intr()
3998 napi_schedule_irqoff(&q_vector->napi); in i40e_intr()
4003 set_bit(__I40E_ADMINQ_EVENT_PENDING, pf->state); in i40e_intr()
4004 i40e_debug(&pf->hw, I40E_DEBUG_NVM, "AdminQ event\n"); in i40e_intr()
4009 set_bit(__I40E_MDD_EVENT_PENDING, pf->state); in i40e_intr()
4014 if (test_bit(__I40E_VF_RESETS_DISABLED, pf->state)) { in i40e_intr()
4021 set_bit(__I40E_VFLR_EVENT_PENDING, pf->state); in i40e_intr()
4026 if (!test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_intr()
4027 set_bit(__I40E_RESET_INTR_RECEIVED, pf->state); in i40e_intr()
4033 pf->corer_count++; in i40e_intr()
4035 pf->globr_count++; in i40e_intr()
4037 pf->empr_count++; in i40e_intr()
4038 set_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state); in i40e_intr()
4044 dev_info(&pf->pdev->dev, "HMC error interrupt\n"); in i40e_intr()
4045 dev_info(&pf->pdev->dev, "HMC error info 0x%x, HMC error data 0x%x\n", in i40e_intr()
4065 dev_info(&pf->pdev->dev, "unhandled interrupt icr0=0x%08x\n", in i40e_intr()
4070 dev_info(&pf->pdev->dev, "device will be reset\n"); in i40e_intr()
4071 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_intr()
4079 /* re-enable interrupt causes */ in i40e_intr()
4081 if (!test_bit(__I40E_DOWN, pf->state) || in i40e_intr()
4082 test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_intr()
4091 * i40e_clean_fdir_tx_irq - Reclaim resources after transmit completes
4099 struct i40e_vsi *vsi = tx_ring->vsi; in i40e_clean_fdir_tx_irq()
4100 u16 i = tx_ring->next_to_clean; in i40e_clean_fdir_tx_irq()
4104 tx_buf = &tx_ring->tx_bi[i]; in i40e_clean_fdir_tx_irq()
4106 i -= tx_ring->count; in i40e_clean_fdir_tx_irq()
4109 struct i40e_tx_desc *eop_desc = tx_buf->next_to_watch; in i40e_clean_fdir_tx_irq()
4119 if (!(eop_desc->cmd_type_offset_bsz & in i40e_clean_fdir_tx_irq()
4124 tx_buf->next_to_watch = NULL; in i40e_clean_fdir_tx_irq()
4126 tx_desc->buffer_addr = 0; in i40e_clean_fdir_tx_irq()
4127 tx_desc->cmd_type_offset_bsz = 0; in i40e_clean_fdir_tx_irq()
4133 i -= tx_ring->count; in i40e_clean_fdir_tx_irq()
4134 tx_buf = tx_ring->tx_bi; in i40e_clean_fdir_tx_irq()
4138 dma_unmap_single(tx_ring->dev, in i40e_clean_fdir_tx_irq()
4142 if (tx_buf->tx_flags & I40E_TX_FLAGS_FD_SB) in i40e_clean_fdir_tx_irq()
4143 kfree(tx_buf->raw_buf); in i40e_clean_fdir_tx_irq()
4145 tx_buf->raw_buf = NULL; in i40e_clean_fdir_tx_irq()
4146 tx_buf->tx_flags = 0; in i40e_clean_fdir_tx_irq()
4147 tx_buf->next_to_watch = NULL; in i40e_clean_fdir_tx_irq()
4149 tx_desc->buffer_addr = 0; in i40e_clean_fdir_tx_irq()
4150 tx_desc->cmd_type_offset_bsz = 0; in i40e_clean_fdir_tx_irq()
4157 i -= tx_ring->count; in i40e_clean_fdir_tx_irq()
4158 tx_buf = tx_ring->tx_bi; in i40e_clean_fdir_tx_irq()
4163 budget--; in i40e_clean_fdir_tx_irq()
4166 i += tx_ring->count; in i40e_clean_fdir_tx_irq()
4167 tx_ring->next_to_clean = i; in i40e_clean_fdir_tx_irq()
4169 if (vsi->back->flags & I40E_FLAG_MSIX_ENABLED) in i40e_clean_fdir_tx_irq()
4170 i40e_irq_dynamic_enable(vsi, tx_ring->q_vector->v_idx); in i40e_clean_fdir_tx_irq()
4176 * i40e_fdir_clean_ring - Interrupt Handler for FDIR SB ring
4185 if (!q_vector->tx.ring) in i40e_fdir_clean_ring()
4188 vsi = q_vector->tx.ring->vsi; in i40e_fdir_clean_ring()
4189 i40e_clean_fdir_tx_irq(q_vector->tx.ring, vsi->work_limit); in i40e_fdir_clean_ring()
4195 * i40e_map_vector_to_qp - Assigns the queue pair to the vector
4202 struct i40e_q_vector *q_vector = vsi->q_vectors[v_idx]; in i40e_map_vector_to_qp()
4203 struct i40e_ring *tx_ring = vsi->tx_rings[qp_idx]; in i40e_map_vector_to_qp()
4204 struct i40e_ring *rx_ring = vsi->rx_rings[qp_idx]; in i40e_map_vector_to_qp()
4206 tx_ring->q_vector = q_vector; in i40e_map_vector_to_qp()
4207 tx_ring->next = q_vector->tx.ring; in i40e_map_vector_to_qp()
4208 q_vector->tx.ring = tx_ring; in i40e_map_vector_to_qp()
4209 q_vector->tx.count++; in i40e_map_vector_to_qp()
4213 struct i40e_ring *xdp_ring = vsi->xdp_rings[qp_idx]; in i40e_map_vector_to_qp()
4215 xdp_ring->q_vector = q_vector; in i40e_map_vector_to_qp()
4216 xdp_ring->next = q_vector->tx.ring; in i40e_map_vector_to_qp()
4217 q_vector->tx.ring = xdp_ring; in i40e_map_vector_to_qp()
4218 q_vector->tx.count++; in i40e_map_vector_to_qp()
4221 rx_ring->q_vector = q_vector; in i40e_map_vector_to_qp()
4222 rx_ring->next = q_vector->rx.ring; in i40e_map_vector_to_qp()
4223 q_vector->rx.ring = rx_ring; in i40e_map_vector_to_qp()
4224 q_vector->rx.count++; in i40e_map_vector_to_qp()
4228 * i40e_vsi_map_rings_to_vectors - Maps descriptor rings to vectors
4231 * This function maps descriptor rings to the queue-specific vectors
4232 * we were allotted through the MSI-X enabling code. Ideally, we'd have
4238 int qp_remaining = vsi->num_queue_pairs; in i40e_vsi_map_rings_to_vectors()
4239 int q_vectors = vsi->num_q_vectors; in i40e_vsi_map_rings_to_vectors()
4244 /* If we don't have enough vectors for a 1-to-1 mapping, we'll have to in i40e_vsi_map_rings_to_vectors()
4252 struct i40e_q_vector *q_vector = vsi->q_vectors[v_start]; in i40e_vsi_map_rings_to_vectors()
4254 num_ringpairs = DIV_ROUND_UP(qp_remaining, q_vectors - v_start); in i40e_vsi_map_rings_to_vectors()
4256 q_vector->num_ringpairs = num_ringpairs; in i40e_vsi_map_rings_to_vectors()
4257 q_vector->reg_idx = q_vector->v_idx + vsi->base_vector - 1; in i40e_vsi_map_rings_to_vectors()
4259 q_vector->rx.count = 0; in i40e_vsi_map_rings_to_vectors()
4260 q_vector->tx.count = 0; in i40e_vsi_map_rings_to_vectors()
4261 q_vector->rx.ring = NULL; in i40e_vsi_map_rings_to_vectors()
4262 q_vector->tx.ring = NULL; in i40e_vsi_map_rings_to_vectors()
4264 while (num_ringpairs--) { in i40e_vsi_map_rings_to_vectors()
4267 qp_remaining--; in i40e_vsi_map_rings_to_vectors()
4273 * i40e_vsi_request_irq - Request IRQ from the OS
4279 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq()
4282 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_request_irq()
4284 else if (pf->flags & I40E_FLAG_MSI_ENABLED) in i40e_vsi_request_irq()
4285 err = request_irq(pf->pdev->irq, i40e_intr, 0, in i40e_vsi_request_irq()
4286 pf->int_name, pf); in i40e_vsi_request_irq()
4288 err = request_irq(pf->pdev->irq, i40e_intr, IRQF_SHARED, in i40e_vsi_request_irq()
4289 pf->int_name, pf); in i40e_vsi_request_irq()
4292 dev_info(&pf->pdev->dev, "request_irq failed, Error %d\n", err); in i40e_vsi_request_irq()
4299 * i40e_netpoll - A Polling 'interrupt' handler
4302 * This is used by netconsole to send skbs without having to re-enable
4308 struct i40e_vsi *vsi = np->vsi; in i40e_netpoll()
4309 struct i40e_pf *pf = vsi->back; in i40e_netpoll()
4313 if (test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_netpoll()
4316 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_netpoll()
4317 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_netpoll()
4318 i40e_msix_clean_rings(0, vsi->q_vectors[i]); in i40e_netpoll()
4320 i40e_intr(pf->pdev->irq, netdev); in i40e_netpoll()
4328 * i40e_pf_txq_wait - Wait for a PF's Tx queue to be enabled or disabled
4333 * This routine will wait for the given Tx queue of the PF to reach the
4335 * Returns -ETIMEDOUT in case of failing to reach the requested state after
4344 tx_reg = rd32(&pf->hw, I40E_QTX_ENA(pf_q)); in i40e_pf_txq_wait()
4351 return -ETIMEDOUT; in i40e_pf_txq_wait()
4357 * i40e_control_tx_q - Start or stop a particular Tx queue
4368 struct i40e_hw *hw = &pf->hw; in i40e_control_tx_q()
4373 i40e_pre_tx_queue_cfg(&pf->hw, pf_q, enable); in i40e_control_tx_q()
4401 * i40e_control_wait_tx_q - Start/stop Tx queue and wait for completion
4415 /* wait for the change to finish */ in i40e_control_wait_tx_q()
4418 dev_info(&pf->pdev->dev, in i40e_control_wait_tx_q()
4428 * i40e_vsi_control_tx - Start or stop a VSI's rings
4434 struct i40e_pf *pf = vsi->back; in i40e_vsi_control_tx()
4437 pf_q = vsi->base_queue; in i40e_vsi_control_tx()
4438 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_control_tx()
4439 ret = i40e_control_wait_tx_q(vsi->seid, pf, in i40e_vsi_control_tx()
4448 ret = i40e_control_wait_tx_q(vsi->seid, pf, in i40e_vsi_control_tx()
4449 pf_q + vsi->alloc_queue_pairs, in i40e_vsi_control_tx()
4458 * i40e_pf_rxq_wait - Wait for a PF's Rx queue to be enabled or disabled
4463 * This routine will wait for the given Rx queue of the PF to reach the
4465 * Returns -ETIMEDOUT in case of failing to reach the requested state after
4474 rx_reg = rd32(&pf->hw, I40E_QRX_ENA(pf_q)); in i40e_pf_rxq_wait()
4481 return -ETIMEDOUT; in i40e_pf_rxq_wait()
4487 * i40e_control_rx_q - Start or stop a particular Rx queue
4498 struct i40e_hw *hw = &pf->hw; in i40e_control_rx_q()
4539 /* wait for the change to finish */ in i40e_control_wait_rx_q()
4548 * i40e_vsi_control_rx - Start or stop a VSI's rings
4554 struct i40e_pf *pf = vsi->back; in i40e_vsi_control_rx()
4557 pf_q = vsi->base_queue; in i40e_vsi_control_rx()
4558 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_control_rx()
4561 dev_info(&pf->pdev->dev, in i40e_vsi_control_rx()
4563 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_vsi_control_rx()
4578 * i40e_vsi_start_rings - Start a VSI's rings
4595 * i40e_vsi_stop_rings - Stop a VSI's rings
4600 /* When port TX is suspended, don't wait */ in i40e_vsi_stop_rings()
4601 if (test_bit(__I40E_PORT_SUSPENDED, vsi->back->state)) in i40e_vsi_stop_rings()
4612 * i40e_vsi_stop_rings_no_wait - Stop a VSI's rings and do not delay
4624 struct i40e_pf *pf = vsi->back; in i40e_vsi_stop_rings_no_wait()
4627 pf_q = vsi->base_queue; in i40e_vsi_stop_rings_no_wait()
4628 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_stop_rings_no_wait()
4635 * i40e_vsi_free_irq - Free the irq association with the OS
4640 struct i40e_pf *pf = vsi->back; in i40e_vsi_free_irq()
4641 struct i40e_hw *hw = &pf->hw; in i40e_vsi_free_irq()
4642 int base = vsi->base_vector; in i40e_vsi_free_irq()
4646 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_vsi_free_irq()
4647 if (!vsi->q_vectors) in i40e_vsi_free_irq()
4650 if (!vsi->irqs_ready) in i40e_vsi_free_irq()
4653 vsi->irqs_ready = false; in i40e_vsi_free_irq()
4654 for (i = 0; i < vsi->num_q_vectors; i++) { in i40e_vsi_free_irq()
4659 irq_num = pf->msix_entries[vector].vector; in i40e_vsi_free_irq()
4662 if (!vsi->q_vectors[i] || in i40e_vsi_free_irq()
4663 !vsi->q_vectors[i]->num_ringpairs) in i40e_vsi_free_irq()
4671 free_irq(irq_num, vsi->q_vectors[i]); in i40e_vsi_free_irq()
4680 val = rd32(hw, I40E_PFINT_LNKLSTN(vector - 1)); in i40e_vsi_free_irq()
4685 wr32(hw, I40E_PFINT_LNKLSTN(vector - 1), val); in i40e_vsi_free_irq()
4720 free_irq(pf->pdev->irq, pf); in i40e_vsi_free_irq()
4755 * i40e_free_q_vector - Free memory allocated for specific interrupt vector
4765 struct i40e_q_vector *q_vector = vsi->q_vectors[v_idx]; in i40e_free_q_vector()
4772 i40e_for_each_ring(ring, q_vector->tx) in i40e_free_q_vector()
4773 ring->q_vector = NULL; in i40e_free_q_vector()
4775 i40e_for_each_ring(ring, q_vector->rx) in i40e_free_q_vector()
4776 ring->q_vector = NULL; in i40e_free_q_vector()
4779 if (vsi->netdev) in i40e_free_q_vector()
4780 netif_napi_del(&q_vector->napi); in i40e_free_q_vector()
4782 vsi->q_vectors[v_idx] = NULL; in i40e_free_q_vector()
4788 * i40e_vsi_free_q_vectors - Free memory allocated for interrupt vectors
4789 * @vsi: the VSI being un-configured
4798 for (v_idx = 0; v_idx < vsi->num_q_vectors; v_idx++) in i40e_vsi_free_q_vectors()
4803 * i40e_reset_interrupt_capability - Disable interrupt setup in OS
4809 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_reset_interrupt_capability()
4810 pci_disable_msix(pf->pdev); in i40e_reset_interrupt_capability()
4811 kfree(pf->msix_entries); in i40e_reset_interrupt_capability()
4812 pf->msix_entries = NULL; in i40e_reset_interrupt_capability()
4813 kfree(pf->irq_pile); in i40e_reset_interrupt_capability()
4814 pf->irq_pile = NULL; in i40e_reset_interrupt_capability()
4815 } else if (pf->flags & I40E_FLAG_MSI_ENABLED) { in i40e_reset_interrupt_capability()
4816 pci_disable_msi(pf->pdev); in i40e_reset_interrupt_capability()
4818 pf->flags &= ~(I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED); in i40e_reset_interrupt_capability()
4822 * i40e_clear_interrupt_scheme - Clear the current interrupt scheme settings
4826 * to pre-load conditions
4834 i40e_put_lump(pf->irq_pile, pf->iwarp_base_vector, in i40e_clear_interrupt_scheme()
4837 i40e_put_lump(pf->irq_pile, 0, I40E_PILE_VALID_BIT-1); in i40e_clear_interrupt_scheme()
4838 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_clear_interrupt_scheme()
4839 if (pf->vsi[i]) in i40e_clear_interrupt_scheme()
4840 i40e_vsi_free_q_vectors(pf->vsi[i]); in i40e_clear_interrupt_scheme()
4845 * i40e_napi_enable_all - Enable NAPI for all q_vectors in the VSI
4852 if (!vsi->netdev) in i40e_napi_enable_all()
4855 for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) { in i40e_napi_enable_all()
4856 struct i40e_q_vector *q_vector = vsi->q_vectors[q_idx]; in i40e_napi_enable_all()
4858 if (q_vector->rx.ring || q_vector->tx.ring) in i40e_napi_enable_all()
4859 napi_enable(&q_vector->napi); in i40e_napi_enable_all()
4864 * i40e_napi_disable_all - Disable NAPI for all q_vectors in the VSI
4871 if (!vsi->netdev) in i40e_napi_disable_all()
4874 for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) { in i40e_napi_disable_all()
4875 struct i40e_q_vector *q_vector = vsi->q_vectors[q_idx]; in i40e_napi_disable_all()
4877 if (q_vector->rx.ring || q_vector->tx.ring) in i40e_napi_disable_all()
4878 napi_disable(&q_vector->napi); in i40e_napi_disable_all()
4883 * i40e_vsi_close - Shut down a VSI
4888 struct i40e_pf *pf = vsi->back; in i40e_vsi_close()
4889 if (!test_and_set_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_vsi_close()
4894 vsi->current_netdev_flags = 0; in i40e_vsi_close()
4895 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_vsi_close()
4896 if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_vsi_close()
4897 set_bit(__I40E_CLIENT_RESET, pf->state); in i40e_vsi_close()
4901 * i40e_quiesce_vsi - Pause a given VSI
4906 if (test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_quiesce_vsi()
4909 set_bit(__I40E_VSI_NEEDS_RESTART, vsi->state); in i40e_quiesce_vsi()
4910 if (vsi->netdev && netif_running(vsi->netdev)) in i40e_quiesce_vsi()
4911 vsi->netdev->netdev_ops->ndo_stop(vsi->netdev); in i40e_quiesce_vsi()
4917 * i40e_unquiesce_vsi - Resume a given VSI
4922 if (!test_and_clear_bit(__I40E_VSI_NEEDS_RESTART, vsi->state)) in i40e_unquiesce_vsi()
4925 if (vsi->netdev && netif_running(vsi->netdev)) in i40e_unquiesce_vsi()
4926 vsi->netdev->netdev_ops->ndo_open(vsi->netdev); in i40e_unquiesce_vsi()
4932 * i40e_pf_quiesce_all_vsi - Pause all VSIs on a PF
4939 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_pf_quiesce_all_vsi()
4940 if (pf->vsi[v]) in i40e_pf_quiesce_all_vsi()
4941 i40e_quiesce_vsi(pf->vsi[v]); in i40e_pf_quiesce_all_vsi()
4946 * i40e_pf_unquiesce_all_vsi - Resume all VSIs on a PF
4953 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_pf_unquiesce_all_vsi()
4954 if (pf->vsi[v]) in i40e_pf_unquiesce_all_vsi()
4955 i40e_unquiesce_vsi(pf->vsi[v]); in i40e_pf_unquiesce_all_vsi()
4960 * i40e_vsi_wait_queues_disabled - Wait for VSI's queues to be disabled
4963 * Wait until all queues on a given VSI have been disabled.
4967 struct i40e_pf *pf = vsi->back; in i40e_vsi_wait_queues_disabled()
4970 pf_q = vsi->base_queue; in i40e_vsi_wait_queues_disabled()
4971 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_wait_queues_disabled()
4972 /* Check and wait for the Tx queue */ in i40e_vsi_wait_queues_disabled()
4975 dev_info(&pf->pdev->dev, in i40e_vsi_wait_queues_disabled()
4977 vsi->seid, pf_q); in i40e_vsi_wait_queues_disabled()
4984 /* Check and wait for the XDP Tx queue */ in i40e_vsi_wait_queues_disabled()
4985 ret = i40e_pf_txq_wait(pf, pf_q + vsi->alloc_queue_pairs, in i40e_vsi_wait_queues_disabled()
4988 dev_info(&pf->pdev->dev, in i40e_vsi_wait_queues_disabled()
4990 vsi->seid, pf_q); in i40e_vsi_wait_queues_disabled()
4994 /* Check and wait for the Rx queue */ in i40e_vsi_wait_queues_disabled()
4997 dev_info(&pf->pdev->dev, in i40e_vsi_wait_queues_disabled()
4999 vsi->seid, pf_q); in i40e_vsi_wait_queues_disabled()
5009 * i40e_pf_wait_queues_disabled - Wait for all queues of PF VSIs to be disabled
5019 for (v = 0; v < pf->hw.func_caps.num_vsis; v++) { in i40e_pf_wait_queues_disabled()
5020 if (pf->vsi[v]) { in i40e_pf_wait_queues_disabled()
5021 ret = i40e_vsi_wait_queues_disabled(pf->vsi[v]); in i40e_pf_wait_queues_disabled()
5033 * i40e_get_iscsi_tc_map - Return TC map for iSCSI APP
5042 struct i40e_hw *hw = &pf->hw; in i40e_get_iscsi_tc_map()
5046 struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config; in i40e_get_iscsi_tc_map()
5048 for (i = 0; i < dcbcfg->numapps; i++) { in i40e_get_iscsi_tc_map()
5049 app = dcbcfg->app[i]; in i40e_get_iscsi_tc_map()
5052 tc = dcbcfg->etscfg.prioritytable[app.priority]; in i40e_get_iscsi_tc_map()
5062 * i40e_dcb_get_num_tc - Get the number of TCs from DCBx config
5065 * Return the number of TCs from given DCBx configuration
5075 * and create a bitmask of enabled TCs in i40e_dcb_get_num_tc()
5078 num_tc |= BIT(dcbcfg->etscfg.prioritytable[i]); in i40e_dcb_get_num_tc()
5081 * contiguous TCs starting with TC0 in i40e_dcb_get_num_tc()
5088 pr_err("Non-contiguous TC - Disabling DCB\n"); in i40e_dcb_get_num_tc()
5104 * i40e_dcb_get_enabled_tc - Get enabled traffic classes
5123 * i40e_mqprio_get_enabled_tc - Get enabled traffic classes
5131 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_mqprio_get_enabled_tc()
5132 u8 num_tc = vsi->mqprio_qopt.qopt.num_tc; in i40e_mqprio_get_enabled_tc()
5141 * i40e_pf_get_num_tc - Get enabled traffic classes for PF
5148 struct i40e_hw *hw = &pf->hw; in i40e_pf_get_num_tc()
5151 struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config; in i40e_pf_get_num_tc()
5153 if (pf->flags & I40E_FLAG_TC_MQPRIO) in i40e_pf_get_num_tc()
5154 return pf->vsi[pf->lan_vsi]->mqprio_qopt.qopt.num_tc; in i40e_pf_get_num_tc()
5157 if (!(pf->flags & I40E_FLAG_DCB_ENABLED)) in i40e_pf_get_num_tc()
5160 /* SFP mode will be enabled for all TCs on port */ in i40e_pf_get_num_tc()
5161 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) in i40e_pf_get_num_tc()
5164 /* MFP mode return count of enabled TCs for this PF */ in i40e_pf_get_num_tc()
5165 if (pf->hw.func_caps.iscsi) in i40e_pf_get_num_tc()
5178 * i40e_pf_get_pf_tc_map - Get bitmap for enabled traffic classes
5185 if (pf->flags & I40E_FLAG_TC_MQPRIO) in i40e_pf_get_tc_map()
5191 if (!(pf->flags & I40E_FLAG_DCB_ENABLED)) in i40e_pf_get_tc_map()
5194 /* SFP mode we want PF to be enabled for all TCs */ in i40e_pf_get_tc_map()
5195 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) in i40e_pf_get_tc_map()
5196 return i40e_dcb_get_enabled_tc(&pf->hw.local_dcbx_config); in i40e_pf_get_tc_map()
5199 if (pf->hw.func_caps.iscsi) in i40e_pf_get_tc_map()
5206 * i40e_vsi_get_bw_info - Query VSI BW Information
5215 struct i40e_pf *pf = vsi->back; in i40e_vsi_get_bw_info()
5216 struct i40e_hw *hw = &pf->hw; in i40e_vsi_get_bw_info()
5222 ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid, &bw_config, NULL); in i40e_vsi_get_bw_info()
5224 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
5226 i40e_stat_str(&pf->hw, ret), in i40e_vsi_get_bw_info()
5227 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_vsi_get_bw_info()
5228 return -EINVAL; in i40e_vsi_get_bw_info()
5232 ret = i40e_aq_query_vsi_ets_sla_config(hw, vsi->seid, &bw_ets_config, in i40e_vsi_get_bw_info()
5235 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
5237 i40e_stat_str(&pf->hw, ret), in i40e_vsi_get_bw_info()
5238 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_vsi_get_bw_info()
5239 return -EINVAL; in i40e_vsi_get_bw_info()
5243 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
5244 "Enabled TCs mismatch from querying VSI BW info 0x%08x 0x%08x\n", in i40e_vsi_get_bw_info()
5250 vsi->bw_limit = le16_to_cpu(bw_config.port_bw_limit); in i40e_vsi_get_bw_info()
5251 vsi->bw_max_quanta = bw_config.max_bw; in i40e_vsi_get_bw_info()
5255 vsi->bw_ets_share_credits[i] = bw_ets_config.share_credits[i]; in i40e_vsi_get_bw_info()
5256 vsi->bw_ets_limit_credits[i] = in i40e_vsi_get_bw_info()
5259 vsi->bw_ets_max_quanta[i] = (u8)((tc_bw_max >> (i*4)) & 0x7); in i40e_vsi_get_bw_info()
5266 * i40e_vsi_configure_bw_alloc - Configure VSI BW allocation per TC
5277 struct i40e_pf *pf = vsi->back; in i40e_vsi_configure_bw_alloc()
5282 if (pf->flags & I40E_FLAG_TC_MQPRIO) in i40e_vsi_configure_bw_alloc()
5284 if (!vsi->mqprio_qopt.qopt.hw && !(pf->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_vsi_configure_bw_alloc()
5285 ret = i40e_set_bw_limit(vsi, vsi->seid, 0); in i40e_vsi_configure_bw_alloc()
5287 dev_info(&pf->pdev->dev, in i40e_vsi_configure_bw_alloc()
5288 "Failed to reset tx rate for vsi->seid %u\n", in i40e_vsi_configure_bw_alloc()
5289 vsi->seid); in i40e_vsi_configure_bw_alloc()
5296 ret = i40e_aq_config_vsi_tc_bw(&pf->hw, vsi->seid, &bw_data, NULL); in i40e_vsi_configure_bw_alloc()
5298 dev_info(&pf->pdev->dev, in i40e_vsi_configure_bw_alloc()
5300 pf->hw.aq.asq_last_status); in i40e_vsi_configure_bw_alloc()
5301 return -EINVAL; in i40e_vsi_configure_bw_alloc()
5305 vsi->info.qs_handle[i] = bw_data.qs_handles[i]; in i40e_vsi_configure_bw_alloc()
5311 * i40e_vsi_config_netdev_tc - Setup the netdev TC configuration
5318 struct net_device *netdev = vsi->netdev; in i40e_vsi_config_netdev_tc()
5319 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_netdev_tc()
5320 struct i40e_hw *hw = &pf->hw; in i40e_vsi_config_netdev_tc()
5323 struct i40e_dcbx_config *dcbcfg = &hw->local_dcbx_config; in i40e_vsi_config_netdev_tc()
5333 /* Set up actual enabled TCs on the VSI */ in i40e_vsi_config_netdev_tc()
5334 if (netdev_set_num_tc(netdev, vsi->tc_config.numtc)) in i40e_vsi_config_netdev_tc()
5339 /* Only set TC queues for enabled tcs in i40e_vsi_config_netdev_tc()
5346 if (vsi->tc_config.enabled_tc & BIT(i)) in i40e_vsi_config_netdev_tc()
5348 vsi->tc_config.tc_info[i].netdev_tc, in i40e_vsi_config_netdev_tc()
5349 vsi->tc_config.tc_info[i].qcount, in i40e_vsi_config_netdev_tc()
5350 vsi->tc_config.tc_info[i].qoffset); in i40e_vsi_config_netdev_tc()
5353 if (pf->flags & I40E_FLAG_TC_MQPRIO) in i40e_vsi_config_netdev_tc()
5359 u8 ets_tc = dcbcfg->etscfg.prioritytable[i]; in i40e_vsi_config_netdev_tc()
5361 netdev_tc = vsi->tc_config.tc_info[ets_tc].netdev_tc; in i40e_vsi_config_netdev_tc()
5367 * i40e_vsi_update_queue_map - Update our copy of VSi info with new queue map
5378 vsi->info.mapping_flags = ctxt->info.mapping_flags; in i40e_vsi_update_queue_map()
5379 memcpy(&vsi->info.queue_mapping, in i40e_vsi_update_queue_map()
5380 &ctxt->info.queue_mapping, sizeof(vsi->info.queue_mapping)); in i40e_vsi_update_queue_map()
5381 memcpy(&vsi->info.tc_mapping, ctxt->info.tc_mapping, in i40e_vsi_update_queue_map()
5382 sizeof(vsi->info.tc_mapping)); in i40e_vsi_update_queue_map()
5386 * i40e_vsi_config_tc - Configure VSI Tx Scheduler for given TC map
5390 * This configures a particular VSI for TCs that are mapped to the
5391 * given TC bitmap. It uses default bandwidth share for TCs across
5401 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_tc()
5402 struct i40e_hw *hw = &pf->hw; in i40e_vsi_config_tc()
5407 /* Check if enabled_tc is same as existing or new TCs */ in i40e_vsi_config_tc()
5408 if (vsi->tc_config.enabled_tc == enabled_tc && in i40e_vsi_config_tc()
5409 vsi->mqprio_qopt.mode != TC_MQPRIO_MODE_CHANNEL) in i40e_vsi_config_tc()
5412 /* Enable ETS TCs with equal BW Share for now across all VSIs */ in i40e_vsi_config_tc()
5422 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5424 enabled_tc, vsi->seid); in i40e_vsi_config_tc()
5425 ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid, in i40e_vsi_config_tc()
5428 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5431 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_vsi_config_tc()
5441 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5449 dev_err(&pf->pdev->dev, in i40e_vsi_config_tc()
5451 enabled_tc, vsi->seid); in i40e_vsi_config_tc()
5457 ctxt.seid = vsi->seid; in i40e_vsi_config_tc()
5458 ctxt.pf_num = vsi->back->hw.pf_id; in i40e_vsi_config_tc()
5460 ctxt.uplink_seid = vsi->uplink_seid; in i40e_vsi_config_tc()
5461 ctxt.info = vsi->info; in i40e_vsi_config_tc()
5462 if (vsi->back->flags & I40E_FLAG_TC_MQPRIO) { in i40e_vsi_config_tc()
5470 /* On destroying the qdisc, reset vsi->rss_size, as number of enabled in i40e_vsi_config_tc()
5473 if (!vsi->mqprio_qopt.qopt.hw && vsi->reconfig_rss) { in i40e_vsi_config_tc()
5474 vsi->rss_size = min_t(int, vsi->back->alloc_rss_size, in i40e_vsi_config_tc()
5475 vsi->num_queue_pairs); in i40e_vsi_config_tc()
5478 dev_info(&vsi->back->pdev->dev, in i40e_vsi_config_tc()
5482 vsi->reconfig_rss = false; in i40e_vsi_config_tc()
5484 if (vsi->back->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_vsi_config_tc()
5490 /* Update the VSI after updating the VSI queue-mapping in i40e_vsi_config_tc()
5495 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5498 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_vsi_config_tc()
5503 vsi->info.valid_sections = 0; in i40e_vsi_config_tc()
5508 dev_info(&pf->pdev->dev, in i40e_vsi_config_tc()
5511 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_vsi_config_tc()
5522 * i40e_get_link_speed - Returns link speed for the interface
5528 struct i40e_pf *pf = vsi->back; in i40e_get_link_speed()
5530 switch (pf->hw.phy.link_info.link_speed) { in i40e_get_link_speed()
5542 return -EINVAL; in i40e_get_link_speed()
5547 * i40e_set_bw_limit - setup BW limit for Tx traffic based on max_tx_rate
5556 struct i40e_pf *pf = vsi->back; in i40e_set_bw_limit()
5563 dev_err(&pf->pdev->dev, in i40e_set_bw_limit()
5566 return -EINVAL; in i40e_set_bw_limit()
5569 dev_warn(&pf->pdev->dev, in i40e_set_bw_limit()
5577 ret = i40e_aq_config_vsi_bw_limit(&pf->hw, seid, credits, in i40e_set_bw_limit()
5580 dev_err(&pf->pdev->dev, in i40e_set_bw_limit()
5581 "Failed set tx rate (%llu Mbps) for vsi->seid %u, err %s aq_err %s\n", in i40e_set_bw_limit()
5582 max_tx_rate, seid, i40e_stat_str(&pf->hw, ret), in i40e_set_bw_limit()
5583 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_set_bw_limit()
5588 * i40e_remove_queue_channels - Remove queue channels for the TCs
5591 * Remove queue channels for the TCs
5598 struct i40e_pf *pf = vsi->back; in i40e_remove_queue_channels()
5603 * channel VSIs with non-power-of-2 queue count. in i40e_remove_queue_channels()
5605 vsi->current_rss_size = 0; in i40e_remove_queue_channels()
5608 if (list_empty(&vsi->ch_list)) in i40e_remove_queue_channels()
5611 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_remove_queue_channels()
5614 list_del(&ch->list); in i40e_remove_queue_channels()
5615 p_vsi = ch->parent_vsi; in i40e_remove_queue_channels()
5616 if (!p_vsi || !ch->initialized) { in i40e_remove_queue_channels()
5621 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_remove_queue_channels()
5625 pf_q = ch->base_queue + i; in i40e_remove_queue_channels()
5626 tx_ring = vsi->tx_rings[pf_q]; in i40e_remove_queue_channels()
5627 tx_ring->ch = NULL; in i40e_remove_queue_channels()
5629 rx_ring = vsi->rx_rings[pf_q]; in i40e_remove_queue_channels()
5630 rx_ring->ch = NULL; in i40e_remove_queue_channels()
5634 ret = i40e_set_bw_limit(vsi, ch->seid, 0); in i40e_remove_queue_channels()
5636 dev_info(&vsi->back->pdev->dev, in i40e_remove_queue_channels()
5637 "Failed to reset tx rate for ch->seid %u\n", in i40e_remove_queue_channels()
5638 ch->seid); in i40e_remove_queue_channels()
5642 &pf->cloud_filter_list, cloud_node) { in i40e_remove_queue_channels()
5643 if (cfilter->seid != ch->seid) in i40e_remove_queue_channels()
5646 hash_del(&cfilter->cloud_node); in i40e_remove_queue_channels()
5647 if (cfilter->dst_port) in i40e_remove_queue_channels()
5654 last_aq_status = pf->hw.aq.asq_last_status; in i40e_remove_queue_channels()
5656 dev_info(&pf->pdev->dev, in i40e_remove_queue_channels()
5658 i40e_stat_str(&pf->hw, ret), in i40e_remove_queue_channels()
5659 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_remove_queue_channels()
5664 ret = i40e_aq_delete_element(&vsi->back->hw, ch->seid, in i40e_remove_queue_channels()
5667 dev_err(&vsi->back->pdev->dev, in i40e_remove_queue_channels()
5669 ch->seid, p_vsi->seid); in i40e_remove_queue_channels()
5672 INIT_LIST_HEAD(&vsi->ch_list); in i40e_remove_queue_channels()
5676 * i40e_is_any_channel - channel exist or not
5685 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_is_any_channel()
5686 if (ch->initialized) in i40e_is_any_channel()
5698 * channels/TCs created.
5705 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_get_max_queues_for_channel()
5706 if (!ch->initialized) in i40e_get_max_queues_for_channel()
5708 if (ch->num_queue_pairs > max) in i40e_get_max_queues_for_channel()
5709 max = ch->num_queue_pairs; in i40e_get_max_queues_for_channel()
5716 * i40e_validate_num_queues - validate num_queues w.r.t channel
5732 return -EINVAL; in i40e_validate_num_queues()
5735 if (vsi->current_rss_size) { in i40e_validate_num_queues()
5736 if (num_queues > vsi->current_rss_size) { in i40e_validate_num_queues()
5737 dev_dbg(&pf->pdev->dev, in i40e_validate_num_queues()
5739 num_queues, vsi->current_rss_size); in i40e_validate_num_queues()
5740 return -EINVAL; in i40e_validate_num_queues()
5741 } else if ((num_queues < vsi->current_rss_size) && in i40e_validate_num_queues()
5743 dev_dbg(&pf->pdev->dev, in i40e_validate_num_queues()
5745 num_queues, vsi->current_rss_size); in i40e_validate_num_queues()
5746 return -EINVAL; in i40e_validate_num_queues()
5758 dev_dbg(&pf->pdev->dev, in i40e_validate_num_queues()
5761 return -EINVAL; in i40e_validate_num_queues()
5770 * i40e_vsi_reconfig_rss - reconfig RSS based on specified rss_size
5778 struct i40e_pf *pf = vsi->back; in i40e_vsi_reconfig_rss()
5780 struct i40e_hw *hw = &pf->hw; in i40e_vsi_reconfig_rss()
5785 if (!vsi->rss_size) in i40e_vsi_reconfig_rss()
5786 return -EINVAL; in i40e_vsi_reconfig_rss()
5788 if (rss_size > vsi->rss_size) in i40e_vsi_reconfig_rss()
5789 return -EINVAL; in i40e_vsi_reconfig_rss()
5791 local_rss_size = min_t(int, vsi->rss_size, rss_size); in i40e_vsi_reconfig_rss()
5792 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in i40e_vsi_reconfig_rss()
5794 return -ENOMEM; in i40e_vsi_reconfig_rss()
5797 i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, local_rss_size); in i40e_vsi_reconfig_rss()
5802 if (vsi->rss_hkey_user) in i40e_vsi_reconfig_rss()
5803 memcpy(seed, vsi->rss_hkey_user, I40E_HKEY_ARRAY_SIZE); in i40e_vsi_reconfig_rss()
5807 ret = i40e_config_rss(vsi, seed, lut, vsi->rss_table_size); in i40e_vsi_reconfig_rss()
5809 dev_info(&pf->pdev->dev, in i40e_vsi_reconfig_rss()
5812 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_vsi_reconfig_rss()
5819 if (!vsi->orig_rss_size) in i40e_vsi_reconfig_rss()
5820 vsi->orig_rss_size = vsi->rss_size; in i40e_vsi_reconfig_rss()
5821 vsi->current_rss_size = local_rss_size; in i40e_vsi_reconfig_rss()
5827 * i40e_channel_setup_queue_map - Setup a channel queue map
5845 qcount = min_t(int, ch->num_queue_pairs, pf->num_lan_msix); in i40e_channel_setup_queue_map()
5846 ch->num_queue_pairs = qcount; in i40e_channel_setup_queue_map()
5848 /* find the next higher power-of-2 of num queue pairs */ in i40e_channel_setup_queue_map()
5857 ctxt->info.tc_mapping[0] = cpu_to_le16(qmap); in i40e_channel_setup_queue_map()
5859 ctxt->info.up_enable_bits = 0x1; /* TC0 enabled */ in i40e_channel_setup_queue_map()
5860 ctxt->info.mapping_flags |= cpu_to_le16(I40E_AQ_VSI_QUE_MAP_CONTIG); in i40e_channel_setup_queue_map()
5861 ctxt->info.queue_mapping[0] = cpu_to_le16(ch->base_queue); in i40e_channel_setup_queue_map()
5862 ctxt->info.valid_sections |= cpu_to_le16(sections); in i40e_channel_setup_queue_map()
5866 * i40e_add_channel - add a channel by adding VSI
5876 struct i40e_hw *hw = &pf->hw; in i40e_add_channel()
5881 if (ch->type != I40E_VSI_VMDQ2) { in i40e_add_channel()
5882 dev_info(&pf->pdev->dev, in i40e_add_channel()
5883 "add new vsi failed, ch->type %d\n", ch->type); in i40e_add_channel()
5884 return -EINVAL; in i40e_add_channel()
5888 ctxt.pf_num = hw->pf_id; in i40e_add_channel()
5892 if (ch->type == I40E_VSI_VMDQ2) in i40e_add_channel()
5895 if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED) { in i40e_add_channel()
5908 dev_info(&pf->pdev->dev, in i40e_add_channel()
5910 i40e_stat_str(&pf->hw, ret), in i40e_add_channel()
5911 i40e_aq_str(&pf->hw, in i40e_add_channel()
5912 pf->hw.aq.asq_last_status)); in i40e_add_channel()
5913 return -ENOENT; in i40e_add_channel()
5919 ch->enabled_tc = !i40e_is_channel_macvlan(ch) && enabled_tc; in i40e_add_channel()
5920 ch->seid = ctxt.seid; in i40e_add_channel()
5921 ch->vsi_number = ctxt.vsi_number; in i40e_add_channel()
5922 ch->stat_counter_idx = cpu_to_le16(ctxt.info.stat_counter_idx); in i40e_add_channel()
5928 ch->info.mapping_flags = ctxt.info.mapping_flags; in i40e_add_channel()
5929 memcpy(&ch->info.queue_mapping, in i40e_add_channel()
5931 memcpy(&ch->info.tc_mapping, ctxt.info.tc_mapping, in i40e_add_channel()
5944 bw_data.tc_valid_bits = ch->enabled_tc; in i40e_channel_config_bw()
5948 ret = i40e_aq_config_vsi_tc_bw(&vsi->back->hw, ch->seid, in i40e_channel_config_bw()
5951 dev_info(&vsi->back->pdev->dev, in i40e_channel_config_bw()
5952 "Config VSI BW allocation per TC failed, aq_err: %d for new_vsi->seid %u\n", in i40e_channel_config_bw()
5953 vsi->back->hw.aq.asq_last_status, ch->seid); in i40e_channel_config_bw()
5954 return -EINVAL; in i40e_channel_config_bw()
5958 ch->info.qs_handle[i] = bw_data.qs_handles[i]; in i40e_channel_config_bw()
5964 * i40e_channel_config_tx_ring - config TX ring associated with new channel
5980 /* Enable ETS TCs with equal BW Share for now across all VSIs */ in i40e_channel_config_tx_ring()
5982 if (ch->enabled_tc & BIT(i)) in i40e_channel_config_tx_ring()
5989 dev_info(&vsi->back->pdev->dev, in i40e_channel_config_tx_ring()
5991 ch->enabled_tc, ch->seid); in i40e_channel_config_tx_ring()
5995 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_channel_config_tx_ring()
5999 pf_q = ch->base_queue + i; in i40e_channel_config_tx_ring()
6001 /* Get to TX ring ptr of main VSI, for re-setup TX queue in i40e_channel_config_tx_ring()
6004 tx_ring = vsi->tx_rings[pf_q]; in i40e_channel_config_tx_ring()
6005 tx_ring->ch = ch; in i40e_channel_config_tx_ring()
6008 rx_ring = vsi->rx_rings[pf_q]; in i40e_channel_config_tx_ring()
6009 rx_ring->ch = ch; in i40e_channel_config_tx_ring()
6016 * i40e_setup_hw_channel - setup new channel
6033 ch->initialized = false; in i40e_setup_hw_channel()
6034 ch->base_queue = vsi->next_base_queue; in i40e_setup_hw_channel()
6035 ch->type = type; in i40e_setup_hw_channel()
6040 dev_info(&pf->pdev->dev, in i40e_setup_hw_channel()
6047 ch->initialized = true; in i40e_setup_hw_channel()
6052 dev_info(&pf->pdev->dev, in i40e_setup_hw_channel()
6054 ch->seid); in i40e_setup_hw_channel()
6059 vsi->next_base_queue = vsi->next_base_queue + ch->num_queue_pairs; in i40e_setup_hw_channel()
6060 dev_dbg(&pf->pdev->dev, in i40e_setup_hw_channel()
6061 …"Added channel: vsi_seid %u, vsi_number %u, stat_counter_idx %u, num_queue_pairs %u, pf->next_base… in i40e_setup_hw_channel()
6062 ch->seid, ch->vsi_number, ch->stat_counter_idx, in i40e_setup_hw_channel()
6063 ch->num_queue_pairs, in i40e_setup_hw_channel()
6064 vsi->next_base_queue); in i40e_setup_hw_channel()
6069 * i40e_setup_channel - setup new channel using uplink element
6084 if (vsi->type == I40E_VSI_MAIN) { in i40e_setup_channel()
6087 dev_err(&pf->pdev->dev, "unsupported parent vsi type(%d)\n", in i40e_setup_channel()
6088 vsi->type); in i40e_setup_channel()
6093 seid = pf->vsi[pf->lan_vsi]->uplink_seid; in i40e_setup_channel()
6098 dev_err(&pf->pdev->dev, "failed to setup hw_channel\n"); in i40e_setup_channel()
6102 return ch->initialized ? true : false; in i40e_setup_channel()
6106 * i40e_validate_and_set_switch_mode - sets up switch mode correctly
6115 struct i40e_pf *pf = vsi->back; in i40e_validate_and_set_switch_mode()
6116 struct i40e_hw *hw = &pf->hw; in i40e_validate_and_set_switch_mode()
6121 return -EINVAL; in i40e_validate_and_set_switch_mode()
6123 if (hw->dev_caps.switch_mode) { in i40e_validate_and_set_switch_mode()
6124 /* if switch mode is set, support mode2 (non-tunneled for in i40e_validate_and_set_switch_mode()
6127 u32 switch_mode = hw->dev_caps.switch_mode & in i40e_validate_and_set_switch_mode()
6132 dev_err(&pf->pdev->dev, in i40e_validate_and_set_switch_mode()
6133 "Invalid switch_mode (%d), only non-tunneled mode for cloud filter is supported\n", in i40e_validate_and_set_switch_mode()
6134 hw->dev_caps.switch_mode); in i40e_validate_and_set_switch_mode()
6135 return -EINVAL; in i40e_validate_and_set_switch_mode()
6149 ret = i40e_aq_set_switch_config(hw, pf->last_sw_conf_flags, in i40e_validate_and_set_switch_mode()
6150 pf->last_sw_conf_valid_flags, in i40e_validate_and_set_switch_mode()
6152 if (ret && hw->aq.asq_last_status != I40E_AQ_RC_ESRCH) in i40e_validate_and_set_switch_mode()
6153 dev_err(&pf->pdev->dev, in i40e_validate_and_set_switch_mode()
6157 hw->aq.asq_last_status)); in i40e_validate_and_set_switch_mode()
6163 * i40e_create_queue_channel - function to create channel
6173 struct i40e_pf *pf = vsi->back; in i40e_create_queue_channel()
6178 return -EINVAL; in i40e_create_queue_channel()
6180 if (!ch->num_queue_pairs) { in i40e_create_queue_channel()
6181 dev_err(&pf->pdev->dev, "Invalid num_queues requested: %d\n", in i40e_create_queue_channel()
6182 ch->num_queue_pairs); in i40e_create_queue_channel()
6183 return -EINVAL; in i40e_create_queue_channel()
6187 err = i40e_validate_num_queues(pf, ch->num_queue_pairs, vsi, in i40e_create_queue_channel()
6190 dev_info(&pf->pdev->dev, "Failed to validate num_queues (%d)\n", in i40e_create_queue_channel()
6191 ch->num_queue_pairs); in i40e_create_queue_channel()
6192 return -EINVAL; in i40e_create_queue_channel()
6198 if ((!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) || in i40e_create_queue_channel()
6200 if (!is_power_of_2(vsi->tc_config.tc_info[0].qcount)) { in i40e_create_queue_channel()
6201 dev_dbg(&pf->pdev->dev, in i40e_create_queue_channel()
6203 vsi->tc_config.tc_info[0].qcount); in i40e_create_queue_channel()
6204 return -EINVAL; in i40e_create_queue_channel()
6207 if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) { in i40e_create_queue_channel()
6208 pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; in i40e_create_queue_channel()
6210 if (vsi->type == I40E_VSI_MAIN) { in i40e_create_queue_channel()
6211 if (pf->flags & I40E_FLAG_TC_MQPRIO) in i40e_create_queue_channel()
6224 /* By this time, vsi->cnt_q_avail shall be set to non-zero and in i40e_create_queue_channel()
6227 if (!vsi->cnt_q_avail || vsi->cnt_q_avail < ch->num_queue_pairs) { in i40e_create_queue_channel()
6228 dev_dbg(&pf->pdev->dev, in i40e_create_queue_channel()
6230 vsi->cnt_q_avail, ch->num_queue_pairs); in i40e_create_queue_channel()
6231 return -EINVAL; in i40e_create_queue_channel()
6235 if (reconfig_rss && (vsi->type == I40E_VSI_MAIN)) { in i40e_create_queue_channel()
6236 err = i40e_vsi_reconfig_rss(vsi, ch->num_queue_pairs); in i40e_create_queue_channel()
6238 dev_info(&pf->pdev->dev, in i40e_create_queue_channel()
6240 ch->num_queue_pairs); in i40e_create_queue_channel()
6241 return -EINVAL; in i40e_create_queue_channel()
6246 dev_info(&pf->pdev->dev, "Failed to setup channel\n"); in i40e_create_queue_channel()
6247 return -EINVAL; in i40e_create_queue_channel()
6250 dev_info(&pf->pdev->dev, in i40e_create_queue_channel()
6252 ch->seid, ch->num_queue_pairs); in i40e_create_queue_channel()
6255 if (ch->max_tx_rate) { in i40e_create_queue_channel()
6256 u64 credits = ch->max_tx_rate; in i40e_create_queue_channel()
6258 if (i40e_set_bw_limit(vsi, ch->seid, ch->max_tx_rate)) in i40e_create_queue_channel()
6259 return -EINVAL; in i40e_create_queue_channel()
6262 dev_dbg(&pf->pdev->dev, in i40e_create_queue_channel()
6263 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_create_queue_channel()
6264 ch->max_tx_rate, in i40e_create_queue_channel()
6266 ch->seid); in i40e_create_queue_channel()
6270 ch->parent_vsi = vsi; in i40e_create_queue_channel()
6273 vsi->cnt_q_avail -= ch->num_queue_pairs; in i40e_create_queue_channel()
6279 * i40e_configure_queue_channels - Add queue channel for the given TCs
6282 * Configures queue channel mapping to the given TCs
6290 /* Create app vsi with the TCs. Main VSI with TC0 is already set up */ in i40e_configure_queue_channels()
6291 vsi->tc_seid_map[0] = vsi->seid; in i40e_configure_queue_channels()
6293 if (vsi->tc_config.enabled_tc & BIT(i)) { in i40e_configure_queue_channels()
6296 ret = -ENOMEM; in i40e_configure_queue_channels()
6300 INIT_LIST_HEAD(&ch->list); in i40e_configure_queue_channels()
6301 ch->num_queue_pairs = in i40e_configure_queue_channels()
6302 vsi->tc_config.tc_info[i].qcount; in i40e_configure_queue_channels()
6303 ch->base_queue = in i40e_configure_queue_channels()
6304 vsi->tc_config.tc_info[i].qoffset; in i40e_configure_queue_channels()
6309 max_rate = vsi->mqprio_qopt.max_rate[i]; in i40e_configure_queue_channels()
6311 ch->max_tx_rate = max_rate; in i40e_configure_queue_channels()
6313 list_add_tail(&ch->list, &vsi->ch_list); in i40e_configure_queue_channels()
6317 dev_err(&vsi->back->pdev->dev, in i40e_configure_queue_channels()
6319 i, ch->num_queue_pairs); in i40e_configure_queue_channels()
6322 vsi->tc_seid_map[i] = ch->seid; in i40e_configure_queue_channels()
6333 * i40e_veb_config_tc - Configure TCs for given VEB
6342 struct i40e_pf *pf = veb->pf; in i40e_veb_config_tc()
6346 /* No TCs or already enabled TCs just return */ in i40e_veb_config_tc()
6347 if (!enabled_tc || veb->enabled_tc == enabled_tc) in i40e_veb_config_tc()
6353 /* Enable ETS TCs with equal BW Share for now */ in i40e_veb_config_tc()
6359 ret = i40e_aq_config_switch_comp_bw_config(&pf->hw, veb->seid, in i40e_veb_config_tc()
6362 dev_info(&pf->pdev->dev, in i40e_veb_config_tc()
6364 i40e_stat_str(&pf->hw, ret), in i40e_veb_config_tc()
6365 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_veb_config_tc()
6372 dev_info(&pf->pdev->dev, in i40e_veb_config_tc()
6374 i40e_stat_str(&pf->hw, ret), in i40e_veb_config_tc()
6375 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_veb_config_tc()
6384 * i40e_dcb_reconfigure - Reconfigure all VEBs and VSIs
6397 /* Enable the TCs available on PF to all VEBs */ in i40e_dcb_reconfigure()
6400 if (!pf->veb[v]) in i40e_dcb_reconfigure()
6402 ret = i40e_veb_config_tc(pf->veb[v], tc_map); in i40e_dcb_reconfigure()
6404 dev_info(&pf->pdev->dev, in i40e_dcb_reconfigure()
6406 pf->veb[v]->seid); in i40e_dcb_reconfigure()
6412 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_dcb_reconfigure()
6413 if (!pf->vsi[v]) in i40e_dcb_reconfigure()
6416 /* - Enable all TCs for the LAN VSI in i40e_dcb_reconfigure()
6417 * - For all others keep them at TC0 for now in i40e_dcb_reconfigure()
6419 if (v == pf->lan_vsi) in i40e_dcb_reconfigure()
6424 ret = i40e_vsi_config_tc(pf->vsi[v], tc_map); in i40e_dcb_reconfigure()
6426 dev_info(&pf->pdev->dev, in i40e_dcb_reconfigure()
6428 pf->vsi[v]->seid); in i40e_dcb_reconfigure()
6431 /* Re-configure VSI vectors based on updated TC map */ in i40e_dcb_reconfigure()
6432 i40e_vsi_map_rings_to_vectors(pf->vsi[v]); in i40e_dcb_reconfigure()
6433 if (pf->vsi[v]->netdev) in i40e_dcb_reconfigure()
6434 i40e_dcbnl_set_all(pf->vsi[v]); in i40e_dcb_reconfigure()
6440 * i40e_resume_port_tx - Resume port Tx
6448 struct i40e_hw *hw = &pf->hw; in i40e_resume_port_tx()
6453 dev_info(&pf->pdev->dev, in i40e_resume_port_tx()
6455 i40e_stat_str(&pf->hw, ret), in i40e_resume_port_tx()
6456 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_resume_port_tx()
6458 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_resume_port_tx()
6466 * i40e_init_pf_dcb - Initialize DCB configuration
6474 struct i40e_hw *hw = &pf->hw; in i40e_init_pf_dcb()
6480 if ((pf->hw_features & I40E_HW_NO_DCB_SUPPORT) || in i40e_init_pf_dcb()
6481 (pf->flags & I40E_FLAG_DISABLE_FW_LLDP)) { in i40e_init_pf_dcb()
6482 dev_info(&pf->pdev->dev, "DCB is not supported or FW LLDP is disabled\n"); in i40e_init_pf_dcb()
6490 if ((!hw->func_caps.dcb) || in i40e_init_pf_dcb()
6491 (hw->dcbx_status == I40E_DCBX_STATUS_DISABLED)) { in i40e_init_pf_dcb()
6492 dev_info(&pf->pdev->dev, in i40e_init_pf_dcb()
6496 pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED | in i40e_init_pf_dcb()
6499 pf->flags |= I40E_FLAG_DCB_CAPABLE; in i40e_init_pf_dcb()
6503 if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1) in i40e_init_pf_dcb()
6504 pf->flags |= I40E_FLAG_DCB_ENABLED; in i40e_init_pf_dcb()
6506 pf->flags &= ~I40E_FLAG_DCB_ENABLED; in i40e_init_pf_dcb()
6507 dev_dbg(&pf->pdev->dev, in i40e_init_pf_dcb()
6510 } else if (pf->hw.aq.asq_last_status == I40E_AQ_RC_EPERM) { in i40e_init_pf_dcb()
6511 dev_info(&pf->pdev->dev, "FW LLDP disabled for this PF.\n"); in i40e_init_pf_dcb()
6512 pf->flags |= I40E_FLAG_DISABLE_FW_LLDP; in i40e_init_pf_dcb()
6514 dev_info(&pf->pdev->dev, in i40e_init_pf_dcb()
6516 i40e_stat_str(&pf->hw, err), in i40e_init_pf_dcb()
6517 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_init_pf_dcb()
6526 * i40e_print_link_message - print link up or down
6533 struct i40e_pf *pf = vsi->back; in i40e_print_link_message()
6541 new_speed = pf->hw.phy.link_info.link_speed; in i40e_print_link_message()
6545 if ((vsi->current_isup == isup) && (vsi->current_speed == new_speed)) in i40e_print_link_message()
6547 vsi->current_isup = isup; in i40e_print_link_message()
6548 vsi->current_speed = new_speed; in i40e_print_link_message()
6550 netdev_info(vsi->netdev, "NIC Link is Down\n"); in i40e_print_link_message()
6557 if (pf->hw.func_caps.npar_enable && in i40e_print_link_message()
6558 (pf->hw.phy.link_info.link_speed == I40E_LINK_SPEED_1GB || in i40e_print_link_message()
6559 pf->hw.phy.link_info.link_speed == I40E_LINK_SPEED_100MB)) in i40e_print_link_message()
6560 netdev_warn(vsi->netdev, in i40e_print_link_message()
6563 switch (pf->hw.phy.link_info.link_speed) { in i40e_print_link_message()
6592 switch (pf->hw.fc.current_mode) { in i40e_print_link_message()
6607 if (pf->hw.phy.link_info.link_speed == I40E_LINK_SPEED_25GB) { in i40e_print_link_message()
6612 if (pf->hw.phy.link_info.an_info & I40E_AQ_AN_COMPLETED) in i40e_print_link_message()
6615 if (pf->hw.phy.link_info.fec_info & in i40e_print_link_message()
6617 fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
6618 else if (pf->hw.phy.link_info.fec_info & in i40e_print_link_message()
6620 fec = "CL108 RS-FEC"; in i40e_print_link_message()
6622 /* 'CL108 RS-FEC' should be displayed when RS is requested, or in i40e_print_link_message()
6625 if (vsi->back->hw.phy.link_info.req_fec_info & in i40e_print_link_message()
6627 if (vsi->back->hw.phy.link_info.req_fec_info & in i40e_print_link_message()
6629 req_fec = "CL108 RS-FEC"; in i40e_print_link_message()
6631 req_fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
6633 netdev_info(vsi->netdev, in i40e_print_link_message()
6636 } else if (pf->hw.device_id == I40E_DEV_ID_KX_X722) { in i40e_print_link_message()
6641 if (pf->hw.phy.link_info.an_info & I40E_AQ_AN_COMPLETED) in i40e_print_link_message()
6644 if (pf->hw.phy.link_info.fec_info & in i40e_print_link_message()
6646 fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
6648 if (pf->hw.phy.link_info.req_fec_info & in i40e_print_link_message()
6650 req_fec = "CL74 FC-FEC/BASE-R"; in i40e_print_link_message()
6652 netdev_info(vsi->netdev, in i40e_print_link_message()
6656 netdev_info(vsi->netdev, in i40e_print_link_message()
6664 * i40e_up_complete - Finish the last steps of bringing up a connection
6669 struct i40e_pf *pf = vsi->back; in i40e_up_complete()
6672 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_up_complete()
6682 clear_bit(__I40E_VSI_DOWN, vsi->state); in i40e_up_complete()
6686 if ((pf->hw.phy.link_info.link_info & I40E_AQ_LINK_UP) && in i40e_up_complete()
6687 (vsi->netdev)) { in i40e_up_complete()
6689 netif_tx_start_all_queues(vsi->netdev); in i40e_up_complete()
6690 netif_carrier_on(vsi->netdev); in i40e_up_complete()
6694 if (vsi->type == I40E_VSI_FDIR) { in i40e_up_complete()
6696 pf->fd_add_err = 0; in i40e_up_complete()
6697 pf->fd_atr_cnt = 0; in i40e_up_complete()
6704 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_up_complete()
6711 * i40e_vsi_reinit_locked - Reset the VSI
6719 struct i40e_pf *pf = vsi->back; in i40e_vsi_reinit_locked()
6721 while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) in i40e_vsi_reinit_locked()
6726 clear_bit(__I40E_CONFIG_BUSY, pf->state); in i40e_vsi_reinit_locked()
6730 * i40e_force_link_state - Force the link status
6739 struct i40e_hw *hw = &pf->hw; in i40e_force_link_state()
6753 dev_err(&pf->pdev->dev, in i40e_force_link_state()
6756 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_force_link_state()
6765 dev_err(&pf->pdev->dev, in i40e_force_link_state()
6768 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_force_link_state()
6776 if (pf->flags & I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENABLED) in i40e_force_link_state()
6792 if (pf->flags & I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENABLED) { in i40e_force_link_state()
6810 dev_err(&pf->pdev->dev, in i40e_force_link_state()
6812 i40e_stat_str(&pf->hw, err), in i40e_force_link_state()
6813 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_force_link_state()
6820 /* Wait a little bit (on 40G cards it sometimes takes a really in i40e_force_link_state()
6834 * i40e_up - Bring the connection back up after being down
6841 if (vsi->type == I40E_VSI_MAIN && in i40e_up()
6842 (vsi->back->flags & I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED || in i40e_up()
6843 vsi->back->flags & I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENABLED)) in i40e_up()
6844 i40e_force_link_state(vsi->back, true); in i40e_up()
6854 * i40e_down - Shutdown the connection processing
6862 * sets the vsi->state __I40E_VSI_DOWN bit. in i40e_down()
6864 if (vsi->netdev) { in i40e_down()
6865 netif_carrier_off(vsi->netdev); in i40e_down()
6866 netif_tx_disable(vsi->netdev); in i40e_down()
6870 if (vsi->type == I40E_VSI_MAIN && in i40e_down()
6871 (vsi->back->flags & I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED || in i40e_down()
6872 vsi->back->flags & I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENABLED)) in i40e_down()
6873 i40e_force_link_state(vsi->back, false); in i40e_down()
6876 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_down()
6877 i40e_clean_tx_ring(vsi->tx_rings[i]); in i40e_down()
6879 /* Make sure that in-progress ndo_xdp_xmit and in i40e_down()
6883 i40e_clean_tx_ring(vsi->xdp_rings[i]); in i40e_down()
6885 i40e_clean_rx_ring(vsi->rx_rings[i]); in i40e_down()
6891 * i40e_validate_mqprio_qopt- validate queue mapping info
6902 if (mqprio_qopt->qopt.offset[0] != 0 || in i40e_validate_mqprio_qopt()
6903 mqprio_qopt->qopt.num_tc < 1 || in i40e_validate_mqprio_qopt()
6904 mqprio_qopt->qopt.num_tc > I40E_MAX_TRAFFIC_CLASS) in i40e_validate_mqprio_qopt()
6905 return -EINVAL; in i40e_validate_mqprio_qopt()
6907 if (!mqprio_qopt->qopt.count[i]) in i40e_validate_mqprio_qopt()
6908 return -EINVAL; in i40e_validate_mqprio_qopt()
6909 if (mqprio_qopt->min_rate[i]) { in i40e_validate_mqprio_qopt()
6910 dev_err(&vsi->back->pdev->dev, in i40e_validate_mqprio_qopt()
6912 return -EINVAL; in i40e_validate_mqprio_qopt()
6914 max_rate = mqprio_qopt->max_rate[i]; in i40e_validate_mqprio_qopt()
6918 if (i >= mqprio_qopt->qopt.num_tc - 1) in i40e_validate_mqprio_qopt()
6920 if (mqprio_qopt->qopt.offset[i + 1] != in i40e_validate_mqprio_qopt()
6921 (mqprio_qopt->qopt.offset[i] + mqprio_qopt->qopt.count[i])) in i40e_validate_mqprio_qopt()
6922 return -EINVAL; in i40e_validate_mqprio_qopt()
6924 if (vsi->num_queue_pairs < in i40e_validate_mqprio_qopt()
6925 (mqprio_qopt->qopt.offset[i] + mqprio_qopt->qopt.count[i])) { in i40e_validate_mqprio_qopt()
6926 return -EINVAL; in i40e_validate_mqprio_qopt()
6929 dev_err(&vsi->back->pdev->dev, in i40e_validate_mqprio_qopt()
6931 return -EINVAL; in i40e_validate_mqprio_qopt()
6937 * i40e_vsi_set_default_tc_config - set default values for tc configuration
6946 vsi->tc_config.numtc = 1; in i40e_vsi_set_default_tc_config()
6947 vsi->tc_config.enabled_tc = 1; in i40e_vsi_set_default_tc_config()
6948 qcount = min_t(int, vsi->alloc_queue_pairs, in i40e_vsi_set_default_tc_config()
6949 i40e_pf_get_max_q_per_tc(vsi->back)); in i40e_vsi_set_default_tc_config()
6954 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_set_default_tc_config()
6956 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_set_default_tc_config()
6958 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_set_default_tc_config()
6959 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_set_default_tc_config()
6984 *aq_err = hw->aq.asq_last_status; in i40e_del_macvlan_filter()
7013 *aq_err = hw->aq.asq_last_status; in i40e_add_macvlan_filter()
7019 * i40e_reset_ch_rings - Reset the queue contexts in a channel
7029 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_reset_ch_rings()
7030 pf_q = ch->base_queue + i; in i40e_reset_ch_rings()
7031 tx_ring = vsi->tx_rings[pf_q]; in i40e_reset_ch_rings()
7032 tx_ring->ch = NULL; in i40e_reset_ch_rings()
7033 rx_ring = vsi->rx_rings[pf_q]; in i40e_reset_ch_rings()
7034 rx_ring->ch = NULL; in i40e_reset_ch_rings()
7051 if (list_empty(&vsi->macvlan_list)) in i40e_free_macvlan_channels()
7054 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_free_macvlan_channels()
7059 clear_bit(ch->fwd->bit_no, vsi->fwd_bitmask); in i40e_free_macvlan_channels()
7060 netdev_unbind_sb_channel(vsi->netdev, ch->fwd->netdev); in i40e_free_macvlan_channels()
7061 netdev_set_sb_channel(ch->fwd->netdev, 0); in i40e_free_macvlan_channels()
7062 kfree(ch->fwd); in i40e_free_macvlan_channels()
7063 ch->fwd = NULL; in i40e_free_macvlan_channels()
7066 list_del(&ch->list); in i40e_free_macvlan_channels()
7067 parent_vsi = ch->parent_vsi; in i40e_free_macvlan_channels()
7068 if (!parent_vsi || !ch->initialized) { in i40e_free_macvlan_channels()
7074 ret = i40e_aq_delete_element(&vsi->back->hw, ch->seid, in i40e_free_macvlan_channels()
7077 dev_err(&vsi->back->pdev->dev, in i40e_free_macvlan_channels()
7079 ch->seid, parent_vsi->seid); in i40e_free_macvlan_channels()
7082 vsi->macvlan_cnt = 0; in i40e_free_macvlan_channels()
7086 * i40e_fwd_ring_up - bring the macvlan device up
7096 struct i40e_pf *pf = vsi->back; in i40e_fwd_ring_up()
7097 struct i40e_hw *hw = &pf->hw; in i40e_fwd_ring_up()
7099 if (list_empty(&vsi->macvlan_list)) in i40e_fwd_ring_up()
7100 return -EINVAL; in i40e_fwd_ring_up()
7103 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_fwd_ring_up()
7105 ch->fwd = fwd; in i40e_fwd_ring_up()
7108 netdev_bind_sb_channel_queue(vsi->netdev, vdev, in i40e_fwd_ring_up()
7110 ch->num_queue_pairs, in i40e_fwd_ring_up()
7111 ch->base_queue); in i40e_fwd_ring_up()
7112 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_fwd_ring_up()
7116 pf_q = ch->base_queue + i; in i40e_fwd_ring_up()
7119 tx_ring = vsi->tx_rings[pf_q]; in i40e_fwd_ring_up()
7120 tx_ring->ch = ch; in i40e_fwd_ring_up()
7123 rx_ring = vsi->rx_rings[pf_q]; in i40e_fwd_ring_up()
7124 rx_ring->ch = ch; in i40e_fwd_ring_up()
7136 ret = i40e_add_macvlan_filter(hw, ch->seid, vdev->dev_addr, &aq_err); in i40e_fwd_ring_up()
7140 for (i = 0; i < ch->num_queue_pairs; i++) { in i40e_fwd_ring_up()
7144 pf_q = ch->base_queue + i; in i40e_fwd_ring_up()
7145 rx_ring = vsi->rx_rings[pf_q]; in i40e_fwd_ring_up()
7146 rx_ring->netdev = NULL; in i40e_fwd_ring_up()
7148 dev_info(&pf->pdev->dev, in i40e_fwd_ring_up()
7159 * i40e_setup_macvlans - create the channels which will be macvlans
7168 struct i40e_pf *pf = vsi->back; in i40e_setup_macvlans()
7169 struct i40e_hw *hw = &pf->hw; in i40e_setup_macvlans()
7176 if (vsi->type != I40E_VSI_MAIN || !macvlan_cnt) in i40e_setup_macvlans()
7177 return -EINVAL; in i40e_setup_macvlans()
7179 num_qps = vsi->num_queue_pairs - (macvlan_cnt * qcnt); in i40e_setup_macvlans()
7181 /* find the next higher power-of-2 of num queue pairs */ in i40e_setup_macvlans()
7182 pow = fls(roundup_pow_of_two(num_qps) - 1); in i40e_setup_macvlans()
7191 ctxt.seid = vsi->seid; in i40e_setup_macvlans()
7192 ctxt.pf_num = vsi->back->hw.pf_id; in i40e_setup_macvlans()
7194 ctxt.uplink_seid = vsi->uplink_seid; in i40e_setup_macvlans()
7195 ctxt.info = vsi->info; in i40e_setup_macvlans()
7198 ctxt.info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_setup_macvlans()
7202 vsi->rss_size = max_t(u16, num_qps, qcnt); in i40e_setup_macvlans()
7205 dev_info(&pf->pdev->dev, in i40e_setup_macvlans()
7207 vsi->rss_size); in i40e_setup_macvlans()
7210 vsi->reconfig_rss = true; in i40e_setup_macvlans()
7211 dev_dbg(&vsi->back->pdev->dev, in i40e_setup_macvlans()
7212 "Reconfigured RSS with num_queues (%u)\n", vsi->rss_size); in i40e_setup_macvlans()
7213 vsi->next_base_queue = num_qps; in i40e_setup_macvlans()
7214 vsi->cnt_q_avail = vsi->num_queue_pairs - num_qps; in i40e_setup_macvlans()
7216 /* Update the VSI after updating the VSI queue-mapping in i40e_setup_macvlans()
7221 dev_info(&pf->pdev->dev, in i40e_setup_macvlans()
7224 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_setup_macvlans()
7229 vsi->info.valid_sections = 0; in i40e_setup_macvlans()
7232 INIT_LIST_HEAD(&vsi->macvlan_list); in i40e_setup_macvlans()
7236 ret = -ENOMEM; in i40e_setup_macvlans()
7239 INIT_LIST_HEAD(&ch->list); in i40e_setup_macvlans()
7240 ch->num_queue_pairs = qcnt; in i40e_setup_macvlans()
7242 ret = -EINVAL; in i40e_setup_macvlans()
7246 ch->parent_vsi = vsi; in i40e_setup_macvlans()
7247 vsi->cnt_q_avail -= ch->num_queue_pairs; in i40e_setup_macvlans()
7248 vsi->macvlan_cnt++; in i40e_setup_macvlans()
7249 list_add_tail(&ch->list, &vsi->macvlan_list); in i40e_setup_macvlans()
7255 dev_info(&pf->pdev->dev, "Failed to setup macvlans\n"); in i40e_setup_macvlans()
7262 * i40e_fwd_add - configure macvlans
7270 struct i40e_vsi *vsi = np->vsi; in i40e_fwd_add()
7271 struct i40e_pf *pf = vsi->back; in i40e_fwd_add()
7275 if ((pf->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_fwd_add()
7277 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7279 if ((pf->flags & I40E_FLAG_TC_MQPRIO)) { in i40e_fwd_add()
7281 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7283 if (pf->num_lan_msix < I40E_MIN_MACVLAN_VECTORS) { in i40e_fwd_add()
7285 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7292 return ERR_PTR(-ERANGE); in i40e_fwd_add()
7294 if (!vsi->macvlan_cnt) { in i40e_fwd_add()
7296 set_bit(0, vsi->fwd_bitmask); in i40e_fwd_add()
7302 vectors = pf->num_lan_msix; in i40e_fwd_add()
7306 macvlan_cnt = (vectors - 32) / 4; in i40e_fwd_add()
7310 macvlan_cnt = (vectors - 16) / 2; in i40e_fwd_add()
7314 macvlan_cnt = vectors - 16; in i40e_fwd_add()
7318 macvlan_cnt = vectors - 8; in i40e_fwd_add()
7322 macvlan_cnt = vectors - 1; in i40e_fwd_add()
7326 return ERR_PTR(-EBUSY); in i40e_fwd_add()
7340 avail_macvlan = find_first_zero_bit(vsi->fwd_bitmask, in i40e_fwd_add()
7341 vsi->macvlan_cnt); in i40e_fwd_add()
7343 return ERR_PTR(-EBUSY); in i40e_fwd_add()
7348 return ERR_PTR(-ENOMEM); in i40e_fwd_add()
7350 set_bit(avail_macvlan, vsi->fwd_bitmask); in i40e_fwd_add()
7351 fwd->bit_no = avail_macvlan; in i40e_fwd_add()
7353 fwd->netdev = vdev; in i40e_fwd_add()
7366 return ERR_PTR(-EINVAL); in i40e_fwd_add()
7373 * i40e_del_all_macvlans - Delete all the mac filters on the channels
7379 struct i40e_pf *pf = vsi->back; in i40e_del_all_macvlans()
7380 struct i40e_hw *hw = &pf->hw; in i40e_del_all_macvlans()
7383 if (list_empty(&vsi->macvlan_list)) in i40e_del_all_macvlans()
7386 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_del_all_macvlans()
7388 ret = i40e_del_macvlan_filter(hw, ch->seid, in i40e_del_all_macvlans()
7394 clear_bit(ch->fwd->bit_no, vsi->fwd_bitmask); in i40e_del_all_macvlans()
7395 netdev_unbind_sb_channel(vsi->netdev, in i40e_del_all_macvlans()
7396 ch->fwd->netdev); in i40e_del_all_macvlans()
7397 netdev_set_sb_channel(ch->fwd->netdev, 0); in i40e_del_all_macvlans()
7398 kfree(ch->fwd); in i40e_del_all_macvlans()
7399 ch->fwd = NULL; in i40e_del_all_macvlans()
7406 * i40e_fwd_del - delete macvlan interfaces
7415 struct i40e_vsi *vsi = np->vsi; in i40e_fwd_del()
7416 struct i40e_pf *pf = vsi->back; in i40e_fwd_del()
7417 struct i40e_hw *hw = &pf->hw; in i40e_fwd_del()
7421 list_for_each_entry_safe(ch, ch_tmp, &vsi->macvlan_list, list) { in i40e_fwd_del()
7424 fwd->netdev->dev_addr)) { in i40e_fwd_del()
7425 ret = i40e_del_macvlan_filter(hw, ch->seid, in i40e_fwd_del()
7431 clear_bit(ch->fwd->bit_no, vsi->fwd_bitmask); in i40e_fwd_del()
7432 netdev_unbind_sb_channel(netdev, fwd->netdev); in i40e_fwd_del()
7433 netdev_set_sb_channel(fwd->netdev, 0); in i40e_fwd_del()
7434 kfree(ch->fwd); in i40e_fwd_del()
7435 ch->fwd = NULL; in i40e_fwd_del()
7437 dev_info(&pf->pdev->dev, in i40e_fwd_del()
7448 * i40e_setup_tc - configure multiple traffic classes
7456 struct i40e_vsi *vsi = np->vsi; in i40e_setup_tc()
7457 struct i40e_pf *pf = vsi->back; in i40e_setup_tc()
7461 int ret = -EINVAL; in i40e_setup_tc()
7465 old_queue_pairs = vsi->num_queue_pairs; in i40e_setup_tc()
7466 num_tc = mqprio_qopt->qopt.num_tc; in i40e_setup_tc()
7467 hw = mqprio_qopt->qopt.hw; in i40e_setup_tc()
7468 mode = mqprio_qopt->mode; in i40e_setup_tc()
7470 pf->flags &= ~I40E_FLAG_TC_MQPRIO; in i40e_setup_tc()
7471 memcpy(&vsi->mqprio_qopt, mqprio_qopt, sizeof(*mqprio_qopt)); in i40e_setup_tc()
7476 if (pf->flags & I40E_FLAG_MFP_ENABLED) { in i40e_setup_tc()
7483 pf->flags &= ~I40E_FLAG_TC_MQPRIO; in i40e_setup_tc()
7486 if (!(pf->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_setup_tc()
7500 if (pf->flags & I40E_FLAG_DCB_ENABLED) { in i40e_setup_tc()
7505 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_setup_tc()
7510 memcpy(&vsi->mqprio_qopt, mqprio_qopt, in i40e_setup_tc()
7512 pf->flags |= I40E_FLAG_TC_MQPRIO; in i40e_setup_tc()
7513 pf->flags &= ~I40E_FLAG_DCB_ENABLED; in i40e_setup_tc()
7516 return -EINVAL; in i40e_setup_tc()
7525 if (enabled_tc == vsi->tc_config.enabled_tc && in i40e_setup_tc()
7532 if (!hw && !(pf->flags & I40E_FLAG_TC_MQPRIO)) in i40e_setup_tc()
7535 /* Configure VSI for enabled TCs */ in i40e_setup_tc()
7539 vsi->seid); in i40e_setup_tc()
7543 dev_info(&vsi->back->pdev->dev, in i40e_setup_tc()
7545 vsi->seid, vsi->tc_config.tc_info[0].qcount); in i40e_setup_tc()
7548 if (pf->flags & I40E_FLAG_TC_MQPRIO) { in i40e_setup_tc()
7549 if (vsi->mqprio_qopt.max_rate[0]) { in i40e_setup_tc()
7550 u64 max_tx_rate = vsi->mqprio_qopt.max_rate[0]; in i40e_setup_tc()
7553 ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate); in i40e_setup_tc()
7558 dev_dbg(&vsi->back->pdev->dev, in i40e_setup_tc()
7559 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_setup_tc()
7562 vsi->seid); in i40e_setup_tc()
7570 vsi->num_queue_pairs = old_queue_pairs; in i40e_setup_tc()
7591 * i40e_set_cld_element - sets cloud filter element data
7605 ether_addr_copy(cld->outer_mac, filter->dst_mac); in i40e_set_cld_element()
7606 ether_addr_copy(cld->inner_mac, filter->src_mac); in i40e_set_cld_element()
7608 if (filter->n_proto != ETH_P_IP && filter->n_proto != ETH_P_IPV6) in i40e_set_cld_element()
7611 if (filter->n_proto == ETH_P_IPV6) { in i40e_set_cld_element()
7612 #define IPV6_MAX_INDEX (ARRAY_SIZE(filter->dst_ipv6) - 1) in i40e_set_cld_element()
7613 for (i = 0, j = 0; i < ARRAY_SIZE(filter->dst_ipv6); in i40e_set_cld_element()
7615 ipa = be32_to_cpu(filter->dst_ipv6[IPV6_MAX_INDEX - i]); in i40e_set_cld_element()
7617 memcpy(&cld->ipaddr.raw_v6.data[j], &ipa, sizeof(ipa)); in i40e_set_cld_element()
7620 ipa = be32_to_cpu(filter->dst_ipv4); in i40e_set_cld_element()
7621 memcpy(&cld->ipaddr.v4.data, &ipa, sizeof(ipa)); in i40e_set_cld_element()
7624 cld->inner_vlan = cpu_to_le16(ntohs(filter->vlan_id)); in i40e_set_cld_element()
7627 * fill the cld->tenant_id with cpu_to_le32(filter->tenant_id) in i40e_set_cld_element()
7629 if (filter->tenant_id) in i40e_set_cld_element()
7634 * i40e_add_del_cloud_filter - Add/del cloud filter
7646 struct i40e_pf *pf = vsi->back; in i40e_add_del_cloud_filter()
7665 if (filter->flags >= ARRAY_SIZE(flag_table)) in i40e_add_del_cloud_filter()
7671 if (filter->tunnel_type != I40E_CLOUD_TNL_TYPE_NONE) in i40e_add_del_cloud_filter()
7672 cld_filter.flags = cpu_to_le16(filter->tunnel_type << in i40e_add_del_cloud_filter()
7675 if (filter->n_proto == ETH_P_IPV6) in i40e_add_del_cloud_filter()
7676 cld_filter.flags |= cpu_to_le16(flag_table[filter->flags] | in i40e_add_del_cloud_filter()
7679 cld_filter.flags |= cpu_to_le16(flag_table[filter->flags] | in i40e_add_del_cloud_filter()
7683 ret = i40e_aq_add_cloud_filters(&pf->hw, filter->seid, in i40e_add_del_cloud_filter()
7686 ret = i40e_aq_rem_cloud_filters(&pf->hw, filter->seid, in i40e_add_del_cloud_filter()
7689 dev_dbg(&pf->pdev->dev, in i40e_add_del_cloud_filter()
7691 add ? "add" : "delete", filter->dst_port, ret, in i40e_add_del_cloud_filter()
7692 pf->hw.aq.asq_last_status); in i40e_add_del_cloud_filter()
7694 dev_info(&pf->pdev->dev, in i40e_add_del_cloud_filter()
7696 add ? "Added" : "Deleted", filter->seid); in i40e_add_del_cloud_filter()
7701 * i40e_add_del_cloud_filter_big_buf - Add/del cloud filter using big_buf
7714 struct i40e_pf *pf = vsi->back; in i40e_add_del_cloud_filter_big_buf()
7718 if ((is_valid_ether_addr(filter->dst_mac) && in i40e_add_del_cloud_filter_big_buf()
7719 is_valid_ether_addr(filter->src_mac)) || in i40e_add_del_cloud_filter_big_buf()
7720 (is_multicast_ether_addr(filter->dst_mac) && in i40e_add_del_cloud_filter_big_buf()
7721 is_multicast_ether_addr(filter->src_mac))) in i40e_add_del_cloud_filter_big_buf()
7722 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
7724 /* Big buffer cloud filter needs 'L4 port' to be non-zero. Also, UDP in i40e_add_del_cloud_filter_big_buf()
7727 if (!filter->dst_port || filter->ip_proto == IPPROTO_UDP) in i40e_add_del_cloud_filter_big_buf()
7728 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
7731 if (filter->src_port || filter->src_ipv4 || in i40e_add_del_cloud_filter_big_buf()
7732 !ipv6_addr_any(&filter->ip.v6.src_ip6)) in i40e_add_del_cloud_filter_big_buf()
7733 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
7738 if (is_valid_ether_addr(filter->dst_mac) || in i40e_add_del_cloud_filter_big_buf()
7739 is_valid_ether_addr(filter->src_mac) || in i40e_add_del_cloud_filter_big_buf()
7740 is_multicast_ether_addr(filter->dst_mac) || in i40e_add_del_cloud_filter_big_buf()
7741 is_multicast_ether_addr(filter->src_mac)) { in i40e_add_del_cloud_filter_big_buf()
7743 if (filter->dst_ipv4) in i40e_add_del_cloud_filter_big_buf()
7744 return -EOPNOTSUPP; in i40e_add_del_cloud_filter_big_buf()
7753 if (filter->vlan_id) { in i40e_add_del_cloud_filter_big_buf()
7758 } else if (filter->dst_ipv4 || in i40e_add_del_cloud_filter_big_buf()
7759 !ipv6_addr_any(&filter->ip.v6.dst_ip6)) { in i40e_add_del_cloud_filter_big_buf()
7762 if (filter->n_proto == ETH_P_IPV6) in i40e_add_del_cloud_filter_big_buf()
7769 dev_err(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
7771 return -EINVAL; in i40e_add_del_cloud_filter_big_buf()
7776 be16_to_cpu(filter->dst_port); in i40e_add_del_cloud_filter_big_buf()
7782 dev_err(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
7788 ret = i40e_aq_add_cloud_filters_bb(&pf->hw, filter->seid, in i40e_add_del_cloud_filter_big_buf()
7791 ret = i40e_aq_rem_cloud_filters_bb(&pf->hw, filter->seid, in i40e_add_del_cloud_filter_big_buf()
7796 dev_dbg(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
7798 add ? "add" : "delete", ret, pf->hw.aq.asq_last_status); in i40e_add_del_cloud_filter_big_buf()
7800 dev_info(&pf->pdev->dev, in i40e_add_del_cloud_filter_big_buf()
7802 add ? "add" : "delete", filter->seid, in i40e_add_del_cloud_filter_big_buf()
7803 ntohs(filter->dst_port)); in i40e_add_del_cloud_filter_big_buf()
7808 * i40e_parse_cls_flower - Parse tc flower filters provided by kernel
7819 struct flow_dissector *dissector = rule->match.dissector; in i40e_parse_cls_flower()
7821 struct i40e_pf *pf = vsi->back; in i40e_parse_cls_flower()
7824 if (dissector->used_keys & in i40e_parse_cls_flower()
7833 dev_err(&pf->pdev->dev, "Unsupported key used: 0x%x\n", in i40e_parse_cls_flower()
7834 dissector->used_keys); in i40e_parse_cls_flower()
7835 return -EOPNOTSUPP; in i40e_parse_cls_flower()
7842 if (match.mask->keyid != 0) in i40e_parse_cls_flower()
7845 filter->tenant_id = be32_to_cpu(match.key->keyid); in i40e_parse_cls_flower()
7852 n_proto_key = ntohs(match.key->n_proto); in i40e_parse_cls_flower()
7853 n_proto_mask = ntohs(match.mask->n_proto); in i40e_parse_cls_flower()
7859 filter->n_proto = n_proto_key & n_proto_mask; in i40e_parse_cls_flower()
7860 filter->ip_proto = match.key->ip_proto; in i40e_parse_cls_flower()
7869 if (!is_zero_ether_addr(match.mask->dst)) { in i40e_parse_cls_flower()
7870 if (is_broadcast_ether_addr(match.mask->dst)) { in i40e_parse_cls_flower()
7873 dev_err(&pf->pdev->dev, "Bad ether dest mask %pM\n", in i40e_parse_cls_flower()
7874 match.mask->dst); in i40e_parse_cls_flower()
7879 if (!is_zero_ether_addr(match.mask->src)) { in i40e_parse_cls_flower()
7880 if (is_broadcast_ether_addr(match.mask->src)) { in i40e_parse_cls_flower()
7883 dev_err(&pf->pdev->dev, "Bad ether src mask %pM\n", in i40e_parse_cls_flower()
7884 match.mask->src); in i40e_parse_cls_flower()
7888 ether_addr_copy(filter->dst_mac, match.key->dst); in i40e_parse_cls_flower()
7889 ether_addr_copy(filter->src_mac, match.key->src); in i40e_parse_cls_flower()
7896 if (match.mask->vlan_id) { in i40e_parse_cls_flower()
7897 if (match.mask->vlan_id == VLAN_VID_MASK) { in i40e_parse_cls_flower()
7901 dev_err(&pf->pdev->dev, "Bad vlan mask 0x%04x\n", in i40e_parse_cls_flower()
7902 match.mask->vlan_id); in i40e_parse_cls_flower()
7907 filter->vlan_id = cpu_to_be16(match.key->vlan_id); in i40e_parse_cls_flower()
7914 addr_type = match.key->addr_type; in i40e_parse_cls_flower()
7921 if (match.mask->dst) { in i40e_parse_cls_flower()
7922 if (match.mask->dst == cpu_to_be32(0xffffffff)) { in i40e_parse_cls_flower()
7925 dev_err(&pf->pdev->dev, "Bad ip dst mask %pI4b\n", in i40e_parse_cls_flower()
7926 &match.mask->dst); in i40e_parse_cls_flower()
7931 if (match.mask->src) { in i40e_parse_cls_flower()
7932 if (match.mask->src == cpu_to_be32(0xffffffff)) { in i40e_parse_cls_flower()
7935 dev_err(&pf->pdev->dev, "Bad ip src mask %pI4b\n", in i40e_parse_cls_flower()
7936 &match.mask->src); in i40e_parse_cls_flower()
7942 dev_err(&pf->pdev->dev, "Tenant id not allowed for ip filter\n"); in i40e_parse_cls_flower()
7945 filter->dst_ipv4 = match.key->dst; in i40e_parse_cls_flower()
7946 filter->src_ipv4 = match.key->src; in i40e_parse_cls_flower()
7957 if (ipv6_addr_loopback(&match.key->dst) || in i40e_parse_cls_flower()
7958 ipv6_addr_loopback(&match.key->src)) { in i40e_parse_cls_flower()
7959 dev_err(&pf->pdev->dev, in i40e_parse_cls_flower()
7963 if (!ipv6_addr_any(&match.mask->dst) || in i40e_parse_cls_flower()
7964 !ipv6_addr_any(&match.mask->src)) in i40e_parse_cls_flower()
7967 memcpy(&filter->src_ipv6, &match.key->src.s6_addr32, in i40e_parse_cls_flower()
7968 sizeof(filter->src_ipv6)); in i40e_parse_cls_flower()
7969 memcpy(&filter->dst_ipv6, &match.key->dst.s6_addr32, in i40e_parse_cls_flower()
7970 sizeof(filter->dst_ipv6)); in i40e_parse_cls_flower()
7977 if (match.mask->src) { in i40e_parse_cls_flower()
7978 if (match.mask->src == cpu_to_be16(0xffff)) { in i40e_parse_cls_flower()
7981 dev_err(&pf->pdev->dev, "Bad src port mask 0x%04x\n", in i40e_parse_cls_flower()
7982 be16_to_cpu(match.mask->src)); in i40e_parse_cls_flower()
7987 if (match.mask->dst) { in i40e_parse_cls_flower()
7988 if (match.mask->dst == cpu_to_be16(0xffff)) { in i40e_parse_cls_flower()
7991 dev_err(&pf->pdev->dev, "Bad dst port mask 0x%04x\n", in i40e_parse_cls_flower()
7992 be16_to_cpu(match.mask->dst)); in i40e_parse_cls_flower()
7997 filter->dst_port = match.key->dst; in i40e_parse_cls_flower()
7998 filter->src_port = match.key->src; in i40e_parse_cls_flower()
8000 switch (filter->ip_proto) { in i40e_parse_cls_flower()
8005 dev_err(&pf->pdev->dev, in i40e_parse_cls_flower()
8007 return -EINVAL; in i40e_parse_cls_flower()
8010 filter->flags = field_flags; in i40e_parse_cls_flower()
8028 filter->seid = vsi->seid; in i40e_handle_tclass()
8030 } else if (vsi->tc_config.enabled_tc & BIT(tc)) { in i40e_handle_tclass()
8031 if (!filter->dst_port) { in i40e_handle_tclass()
8032 dev_err(&vsi->back->pdev->dev, in i40e_handle_tclass()
8034 return -EINVAL; in i40e_handle_tclass()
8036 if (list_empty(&vsi->ch_list)) in i40e_handle_tclass()
8037 return -EINVAL; in i40e_handle_tclass()
8038 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, in i40e_handle_tclass()
8040 if (ch->seid == vsi->tc_seid_map[tc]) in i40e_handle_tclass()
8041 filter->seid = ch->seid; in i40e_handle_tclass()
8045 dev_err(&vsi->back->pdev->dev, "TC is not enabled\n"); in i40e_handle_tclass()
8046 return -EINVAL; in i40e_handle_tclass()
8050 * i40e_configure_clsflower - Configure tc flower filters
8058 int tc = tc_classid_to_hwtc(vsi->netdev, cls_flower->classid); in i40e_configure_clsflower()
8060 struct i40e_pf *pf = vsi->back; in i40e_configure_clsflower()
8064 dev_err(&vsi->back->pdev->dev, "Invalid traffic class\n"); in i40e_configure_clsflower()
8065 return -EOPNOTSUPP; in i40e_configure_clsflower()
8068 if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) || in i40e_configure_clsflower()
8069 test_bit(__I40E_RESET_INTR_RECEIVED, pf->state)) in i40e_configure_clsflower()
8070 return -EBUSY; in i40e_configure_clsflower()
8072 if (pf->fdir_pf_active_filters || in i40e_configure_clsflower()
8073 (!hlist_empty(&pf->fdir_filter_list))) { in i40e_configure_clsflower()
8074 dev_err(&vsi->back->pdev->dev, in i40e_configure_clsflower()
8076 return -EINVAL; in i40e_configure_clsflower()
8079 if (vsi->back->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_configure_clsflower()
8080 dev_err(&vsi->back->pdev->dev, in i40e_configure_clsflower()
8081 "Disable Flow Director Sideband, configuring Cloud filters via tc-flower\n"); in i40e_configure_clsflower()
8082 vsi->back->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_configure_clsflower()
8083 vsi->back->flags |= I40E_FLAG_FD_SB_TO_CLOUD_FILTER; in i40e_configure_clsflower()
8088 return -ENOMEM; in i40e_configure_clsflower()
8090 filter->cookie = cls_flower->cookie; in i40e_configure_clsflower()
8101 if (filter->dst_port) in i40e_configure_clsflower()
8107 dev_err(&pf->pdev->dev, in i40e_configure_clsflower()
8109 i40e_stat_str(&pf->hw, err)); in i40e_configure_clsflower()
8114 INIT_HLIST_NODE(&filter->cloud_node); in i40e_configure_clsflower()
8116 hlist_add_head(&filter->cloud_node, &pf->cloud_filter_list); in i40e_configure_clsflower()
8118 pf->num_cloud_filters++; in i40e_configure_clsflower()
8127 * i40e_find_cloud_filter - Find the could filter in the list
8139 &vsi->back->cloud_filter_list, cloud_node) in i40e_find_cloud_filter()
8140 if (!memcmp(cookie, &filter->cookie, sizeof(filter->cookie))) in i40e_find_cloud_filter()
8146 * i40e_delete_clsflower - Remove tc flower filters
8155 struct i40e_pf *pf = vsi->back; in i40e_delete_clsflower()
8158 filter = i40e_find_cloud_filter(vsi, &cls_flower->cookie); in i40e_delete_clsflower()
8161 return -EINVAL; in i40e_delete_clsflower()
8163 hash_del(&filter->cloud_node); in i40e_delete_clsflower()
8165 if (filter->dst_port) in i40e_delete_clsflower()
8172 dev_err(&pf->pdev->dev, in i40e_delete_clsflower()
8174 i40e_stat_str(&pf->hw, err)); in i40e_delete_clsflower()
8175 return i40e_aq_rc_to_posix(err, pf->hw.aq.asq_last_status); in i40e_delete_clsflower()
8178 pf->num_cloud_filters--; in i40e_delete_clsflower()
8179 if (!pf->num_cloud_filters) in i40e_delete_clsflower()
8180 if ((pf->flags & I40E_FLAG_FD_SB_TO_CLOUD_FILTER) && in i40e_delete_clsflower()
8181 !(pf->flags & I40E_FLAG_FD_SB_INACTIVE)) { in i40e_delete_clsflower()
8182 pf->flags |= I40E_FLAG_FD_SB_ENABLED; in i40e_delete_clsflower()
8183 pf->flags &= ~I40E_FLAG_FD_SB_TO_CLOUD_FILTER; in i40e_delete_clsflower()
8184 pf->flags &= ~I40E_FLAG_FD_SB_INACTIVE; in i40e_delete_clsflower()
8190 * i40e_setup_tc_cls_flower - flower classifier offloads
8197 struct i40e_vsi *vsi = np->vsi; in i40e_setup_tc_cls_flower()
8199 switch (cls_flower->command) { in i40e_setup_tc_cls_flower()
8205 return -EOPNOTSUPP; in i40e_setup_tc_cls_flower()
8207 return -EOPNOTSUPP; in i40e_setup_tc_cls_flower()
8216 if (!tc_cls_can_offload_and_chain0(np->vsi->netdev, type_data)) in i40e_setup_tc_block_cb()
8217 return -EOPNOTSUPP; in i40e_setup_tc_block_cb()
8224 return -EOPNOTSUPP; in i40e_setup_tc_block_cb()
8244 return -EOPNOTSUPP; in __i40e_setup_tc()
8249 * i40e_open - Called when a network interface is made active
8263 struct i40e_vsi *vsi = np->vsi; in i40e_open()
8264 struct i40e_pf *pf = vsi->back; in i40e_open()
8268 if (test_bit(__I40E_TESTING, pf->state) || in i40e_open()
8269 test_bit(__I40E_BAD_EEPROM, pf->state)) in i40e_open()
8270 return -EBUSY; in i40e_open()
8275 return -EAGAIN; in i40e_open()
8282 wr32(&pf->hw, I40E_GLLAN_TSOMSK_F, be32_to_cpu(TCP_FLAG_PSH | in i40e_open()
8284 wr32(&pf->hw, I40E_GLLAN_TSOMSK_M, be32_to_cpu(TCP_FLAG_PSH | in i40e_open()
8287 wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); in i40e_open()
8295 * i40e_vsi_open -
8306 struct i40e_pf *pf = vsi->back; in i40e_vsi_open()
8322 if (vsi->netdev) { in i40e_vsi_open()
8323 snprintf(int_name, sizeof(int_name) - 1, "%s-%s", in i40e_vsi_open()
8324 dev_driver_string(&pf->pdev->dev), vsi->netdev->name); in i40e_vsi_open()
8330 err = netif_set_real_num_tx_queues(vsi->netdev, in i40e_vsi_open()
8331 vsi->num_queue_pairs); in i40e_vsi_open()
8335 err = netif_set_real_num_rx_queues(vsi->netdev, in i40e_vsi_open()
8336 vsi->num_queue_pairs); in i40e_vsi_open()
8340 } else if (vsi->type == I40E_VSI_FDIR) { in i40e_vsi_open()
8341 snprintf(int_name, sizeof(int_name) - 1, "%s-%s:fdir", in i40e_vsi_open()
8342 dev_driver_string(&pf->pdev->dev), in i40e_vsi_open()
8343 dev_name(&pf->pdev->dev)); in i40e_vsi_open()
8347 err = -EINVAL; in i40e_vsi_open()
8365 if (vsi == pf->vsi[pf->lan_vsi]) in i40e_vsi_open()
8372 * i40e_fdir_filter_exit - Cleans up the Flow Director accounting
8385 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_filter_exit()
8386 hlist_del(&filter->fdir_node); in i40e_fdir_filter_exit()
8390 list_for_each_entry_safe(pit_entry, tmp, &pf->l3_flex_pit_list, list) { in i40e_fdir_filter_exit()
8391 list_del(&pit_entry->list); in i40e_fdir_filter_exit()
8394 INIT_LIST_HEAD(&pf->l3_flex_pit_list); in i40e_fdir_filter_exit()
8396 list_for_each_entry_safe(pit_entry, tmp, &pf->l4_flex_pit_list, list) { in i40e_fdir_filter_exit()
8397 list_del(&pit_entry->list); in i40e_fdir_filter_exit()
8400 INIT_LIST_HEAD(&pf->l4_flex_pit_list); in i40e_fdir_filter_exit()
8402 pf->fdir_pf_active_filters = 0; in i40e_fdir_filter_exit()
8403 pf->fd_tcp4_filter_cnt = 0; in i40e_fdir_filter_exit()
8404 pf->fd_udp4_filter_cnt = 0; in i40e_fdir_filter_exit()
8405 pf->fd_sctp4_filter_cnt = 0; in i40e_fdir_filter_exit()
8406 pf->fd_ip4_filter_cnt = 0; in i40e_fdir_filter_exit()
8432 * i40e_cloud_filter_exit - Cleans up the cloud filters
8444 &pf->cloud_filter_list, cloud_node) { in i40e_cloud_filter_exit()
8445 hlist_del(&cfilter->cloud_node); in i40e_cloud_filter_exit()
8448 pf->num_cloud_filters = 0; in i40e_cloud_filter_exit()
8450 if ((pf->flags & I40E_FLAG_FD_SB_TO_CLOUD_FILTER) && in i40e_cloud_filter_exit()
8451 !(pf->flags & I40E_FLAG_FD_SB_INACTIVE)) { in i40e_cloud_filter_exit()
8452 pf->flags |= I40E_FLAG_FD_SB_ENABLED; in i40e_cloud_filter_exit()
8453 pf->flags &= ~I40E_FLAG_FD_SB_TO_CLOUD_FILTER; in i40e_cloud_filter_exit()
8454 pf->flags &= ~I40E_FLAG_FD_SB_INACTIVE; in i40e_cloud_filter_exit()
8459 * i40e_close - Disables a network interface
8462 * The close entry point is called when an interface is de-activated
8471 struct i40e_vsi *vsi = np->vsi; in i40e_close()
8479 * i40e_do_reset - Start a PF or Core Reset sequence
8504 dev_dbg(&pf->pdev->dev, "GlobalR requested\n"); in i40e_do_reset()
8505 val = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_do_reset()
8507 wr32(&pf->hw, I40E_GLGEN_RTRIG, val); in i40e_do_reset()
8515 dev_dbg(&pf->pdev->dev, "CoreR requested\n"); in i40e_do_reset()
8516 val = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_do_reset()
8518 wr32(&pf->hw, I40E_GLGEN_RTRIG, val); in i40e_do_reset()
8519 i40e_flush(&pf->hw); in i40e_do_reset()
8525 * Resets only the PF-specific registers in i40e_do_reset()
8527 * This goes directly to the tear-down and rebuild of in i40e_do_reset()
8531 dev_dbg(&pf->pdev->dev, "PFR requested\n"); in i40e_do_reset()
8534 dev_info(&pf->pdev->dev, in i40e_do_reset()
8535 pf->flags & I40E_FLAG_DISABLE_FW_LLDP ? in i40e_do_reset()
8542 /* Find the VSI(s) that requested a re-init */ in i40e_do_reset()
8543 dev_info(&pf->pdev->dev, in i40e_do_reset()
8545 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_do_reset()
8546 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_do_reset()
8550 vsi->state)) in i40e_do_reset()
8551 i40e_vsi_reinit_locked(pf->vsi[v]); in i40e_do_reset()
8557 dev_info(&pf->pdev->dev, "VSI down requested\n"); in i40e_do_reset()
8558 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_do_reset()
8559 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_do_reset()
8563 vsi->state)) { in i40e_do_reset()
8564 set_bit(__I40E_VSI_DOWN, vsi->state); in i40e_do_reset()
8569 dev_info(&pf->pdev->dev, in i40e_do_reset()
8576 * i40e_dcb_need_reconfig - Check if DCB needs reconfig
8588 if (memcmp(&new_cfg->etscfg, in i40e_dcb_need_reconfig()
8589 &old_cfg->etscfg, in i40e_dcb_need_reconfig()
8590 sizeof(new_cfg->etscfg))) { in i40e_dcb_need_reconfig()
8592 if (memcmp(&new_cfg->etscfg.prioritytable, in i40e_dcb_need_reconfig()
8593 &old_cfg->etscfg.prioritytable, in i40e_dcb_need_reconfig()
8594 sizeof(new_cfg->etscfg.prioritytable))) { in i40e_dcb_need_reconfig()
8596 dev_dbg(&pf->pdev->dev, "ETS UP2TC changed.\n"); in i40e_dcb_need_reconfig()
8599 if (memcmp(&new_cfg->etscfg.tcbwtable, in i40e_dcb_need_reconfig()
8600 &old_cfg->etscfg.tcbwtable, in i40e_dcb_need_reconfig()
8601 sizeof(new_cfg->etscfg.tcbwtable))) in i40e_dcb_need_reconfig()
8602 dev_dbg(&pf->pdev->dev, "ETS TC BW Table changed.\n"); in i40e_dcb_need_reconfig()
8604 if (memcmp(&new_cfg->etscfg.tsatable, in i40e_dcb_need_reconfig()
8605 &old_cfg->etscfg.tsatable, in i40e_dcb_need_reconfig()
8606 sizeof(new_cfg->etscfg.tsatable))) in i40e_dcb_need_reconfig()
8607 dev_dbg(&pf->pdev->dev, "ETS TSA Table changed.\n"); in i40e_dcb_need_reconfig()
8611 if (memcmp(&new_cfg->pfc, in i40e_dcb_need_reconfig()
8612 &old_cfg->pfc, in i40e_dcb_need_reconfig()
8613 sizeof(new_cfg->pfc))) { in i40e_dcb_need_reconfig()
8615 dev_dbg(&pf->pdev->dev, "PFC config change detected.\n"); in i40e_dcb_need_reconfig()
8619 if (memcmp(&new_cfg->app, in i40e_dcb_need_reconfig()
8620 &old_cfg->app, in i40e_dcb_need_reconfig()
8621 sizeof(new_cfg->app))) { in i40e_dcb_need_reconfig()
8623 dev_dbg(&pf->pdev->dev, "APP Table change detected.\n"); in i40e_dcb_need_reconfig()
8626 dev_dbg(&pf->pdev->dev, "dcb need_reconfig=%d\n", need_reconfig); in i40e_dcb_need_reconfig()
8631 * i40e_handle_lldp_event - Handle LLDP Change MIB event
8639 (struct i40e_aqc_lldp_get_mib *)&e->desc.params.raw; in i40e_handle_lldp_event()
8640 struct i40e_hw *hw = &pf->hw; in i40e_handle_lldp_event()
8647 if (!(pf->flags & I40E_FLAG_DCB_CAPABLE)) in i40e_handle_lldp_event()
8651 type = ((mib->type >> I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) in i40e_handle_lldp_event()
8653 dev_dbg(&pf->pdev->dev, "LLDP event mib bridge type 0x%x\n", type); in i40e_handle_lldp_event()
8658 type = mib->type & I40E_AQ_LLDP_MIB_TYPE_MASK; in i40e_handle_lldp_event()
8659 dev_dbg(&pf->pdev->dev, in i40e_handle_lldp_event()
8665 &hw->remote_dcbx_config); in i40e_handle_lldp_event()
8670 tmp_dcbx_cfg = hw->local_dcbx_config; in i40e_handle_lldp_event()
8673 memset(&hw->local_dcbx_config, 0, sizeof(hw->local_dcbx_config)); in i40e_handle_lldp_event()
8675 ret = i40e_get_dcb_config(&pf->hw); in i40e_handle_lldp_event()
8677 dev_info(&pf->pdev->dev, in i40e_handle_lldp_event()
8679 i40e_stat_str(&pf->hw, ret), in i40e_handle_lldp_event()
8680 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_handle_lldp_event()
8685 if (!memcmp(&tmp_dcbx_cfg, &hw->local_dcbx_config, in i40e_handle_lldp_event()
8687 dev_dbg(&pf->pdev->dev, "No change detected in DCBX configuration.\n"); in i40e_handle_lldp_event()
8692 &hw->local_dcbx_config); in i40e_handle_lldp_event()
8694 i40e_dcbnl_flush_apps(pf, &tmp_dcbx_cfg, &hw->local_dcbx_config); in i40e_handle_lldp_event()
8700 if (i40e_dcb_get_num_tc(&hw->local_dcbx_config) > 1) in i40e_handle_lldp_event()
8701 pf->flags |= I40E_FLAG_DCB_ENABLED; in i40e_handle_lldp_event()
8703 pf->flags &= ~I40E_FLAG_DCB_ENABLED; in i40e_handle_lldp_event()
8705 set_bit(__I40E_PORT_SUSPENDED, pf->state); in i40e_handle_lldp_event()
8714 clear_bit(__I40E_PORT_SUSPENDED, pf->state); in i40e_handle_lldp_event()
8719 /* Wait for the PF's queues to be disabled */ in i40e_handle_lldp_event()
8723 set_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_handle_lldp_event()
8727 set_bit(__I40E_CLIENT_SERVICE_REQUESTED, pf->state); in i40e_handle_lldp_event()
8728 set_bit(__I40E_CLIENT_L2_CHANGE, pf->state); in i40e_handle_lldp_event()
8737 * i40e_do_reset_safe - Protected reset path for userland calls.
8750 * i40e_handle_lan_overflow_event - Handler for LAN queue overflow event
8761 (struct i40e_aqc_lan_overflow *)&e->desc.params.raw; in i40e_handle_lan_overflow_event()
8762 u32 queue = le32_to_cpu(data->prtdcb_rupto); in i40e_handle_lan_overflow_event()
8763 u32 qtx_ctl = le32_to_cpu(data->otx_ctl); in i40e_handle_lan_overflow_event()
8764 struct i40e_hw *hw = &pf->hw; in i40e_handle_lan_overflow_event()
8768 dev_dbg(&pf->pdev->dev, "overflow Rx Queue Number = %d QTX_CTL=0x%08x\n", in i40e_handle_lan_overflow_event()
8776 vf_id -= hw->func_caps.vf_base_id; in i40e_handle_lan_overflow_event()
8777 vf = &pf->vf[vf_id]; in i40e_handle_lan_overflow_event()
8786 * i40e_get_cur_guaranteed_fd_count - Get the consumed guaranteed FD filters
8793 val = rd32(&pf->hw, I40E_PFQF_FDSTAT); in i40e_get_cur_guaranteed_fd_count()
8799 * i40e_get_current_fd_count - Get total FD filters programmed for this PF
8806 val = rd32(&pf->hw, I40E_PFQF_FDSTAT); in i40e_get_current_fd_count()
8814 * i40e_get_global_fd_count - Get total FD filters programmed on device
8821 val = rd32(&pf->hw, I40E_GLQF_FDCNT_0); in i40e_get_global_fd_count()
8829 * i40e_reenable_fdir_sb - Restore FDir SB capability
8834 if (test_and_clear_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state)) in i40e_reenable_fdir_sb()
8835 if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) && in i40e_reenable_fdir_sb()
8836 (I40E_DEBUG_FD & pf->hw.debug_mask)) in i40e_reenable_fdir_sb()
8837 …dev_info(&pf->pdev->dev, "FD Sideband/ntuple is being enabled since we have space in the table now… in i40e_reenable_fdir_sb()
8841 * i40e_reenable_fdir_atr - Restore FDir ATR capability
8846 if (test_and_clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) { in i40e_reenable_fdir_atr()
8856 if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) && in i40e_reenable_fdir_atr()
8857 (I40E_DEBUG_FD & pf->hw.debug_mask)) in i40e_reenable_fdir_atr()
8858 …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()
8863 * i40e_delete_invalid_filter - Delete an invalid FDIR filter
8871 pf->fdir_pf_active_filters--; in i40e_delete_invalid_filter()
8872 pf->fd_inv = 0; in i40e_delete_invalid_filter()
8874 switch (filter->flow_type) { in i40e_delete_invalid_filter()
8876 pf->fd_tcp4_filter_cnt--; in i40e_delete_invalid_filter()
8879 pf->fd_udp4_filter_cnt--; in i40e_delete_invalid_filter()
8882 pf->fd_sctp4_filter_cnt--; in i40e_delete_invalid_filter()
8885 switch (filter->ip4_proto) { in i40e_delete_invalid_filter()
8887 pf->fd_tcp4_filter_cnt--; in i40e_delete_invalid_filter()
8890 pf->fd_udp4_filter_cnt--; in i40e_delete_invalid_filter()
8893 pf->fd_sctp4_filter_cnt--; in i40e_delete_invalid_filter()
8896 pf->fd_ip4_filter_cnt--; in i40e_delete_invalid_filter()
8903 hlist_del(&filter->fdir_node); in i40e_delete_invalid_filter()
8908 * i40e_fdir_check_and_reenable - Function to reenabe FD ATR or SB if disabled
8917 if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state)) in i40e_fdir_check_and_reenable()
8920 /* Check if we have enough room to re-enable FDir SB capability. */ in i40e_fdir_check_and_reenable()
8922 fcnt_avail = pf->fdir_pf_filter_count; in i40e_fdir_check_and_reenable()
8923 if ((fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM)) || in i40e_fdir_check_and_reenable()
8924 (pf->fd_add_err == 0) || in i40e_fdir_check_and_reenable()
8925 (i40e_get_current_atr_cnt(pf) < pf->fd_atr_cnt)) in i40e_fdir_check_and_reenable()
8928 /* We should wait for even more space before re-enabling ATR. in i40e_fdir_check_and_reenable()
8932 if ((fcnt_prog < (fcnt_avail - I40E_FDIR_BUFFER_HEAD_ROOM_FOR_ATR)) && in i40e_fdir_check_and_reenable()
8933 (pf->fd_tcp4_filter_cnt == 0)) in i40e_fdir_check_and_reenable()
8937 if (pf->fd_inv > 0) { in i40e_fdir_check_and_reenable()
8939 &pf->fdir_filter_list, fdir_node) in i40e_fdir_check_and_reenable()
8940 if (filter->fd_id == pf->fd_inv) in i40e_fdir_check_and_reenable()
8948 * i40e_fdir_flush_and_replay - Function to flush all FD filters and replay SB
8959 if (!time_after(jiffies, pf->fd_flush_timestamp + in i40e_fdir_flush_and_replay()
8964 * should not re-enable ATR for some time. in i40e_fdir_flush_and_replay()
8966 min_flush_time = pf->fd_flush_timestamp + in i40e_fdir_flush_and_replay()
8968 fd_room = pf->fdir_pf_filter_count - pf->fdir_pf_active_filters; in i40e_fdir_flush_and_replay()
8972 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_flush_and_replay()
8973 dev_info(&pf->pdev->dev, "ATR disabled, not enough FD filter space.\n"); in i40e_fdir_flush_and_replay()
8977 pf->fd_flush_timestamp = jiffies; in i40e_fdir_flush_and_replay()
8978 set_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state); in i40e_fdir_flush_and_replay()
8980 wr32(&pf->hw, I40E_PFQF_CTL_1, in i40e_fdir_flush_and_replay()
8982 i40e_flush(&pf->hw); in i40e_fdir_flush_and_replay()
8983 pf->fd_flush_cnt++; in i40e_fdir_flush_and_replay()
8984 pf->fd_add_err = 0; in i40e_fdir_flush_and_replay()
8986 /* Check FD flush status every 5-6msec */ in i40e_fdir_flush_and_replay()
8988 reg = rd32(&pf->hw, I40E_PFQF_CTL_1); in i40e_fdir_flush_and_replay()
8991 } while (flush_wait_retry--); in i40e_fdir_flush_and_replay()
8993 dev_warn(&pf->pdev->dev, "FD table did not flush, needs more time\n"); in i40e_fdir_flush_and_replay()
8996 i40e_fdir_filter_restore(pf->vsi[pf->lan_vsi]); in i40e_fdir_flush_and_replay()
8997 if (!disable_atr && !pf->fd_tcp4_filter_cnt) in i40e_fdir_flush_and_replay()
8998 clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state); in i40e_fdir_flush_and_replay()
8999 clear_bit(__I40E_FD_FLUSH_REQUESTED, pf->state); in i40e_fdir_flush_and_replay()
9000 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_flush_and_replay()
9001 dev_info(&pf->pdev->dev, "FD Filter table flushed and FD-SB replayed.\n"); in i40e_fdir_flush_and_replay()
9006 * i40e_get_current_atr_count - Get the count of total FD ATR filters programmed
9011 return i40e_get_current_fd_count(pf) - pf->fdir_pf_active_filters; in i40e_get_current_atr_cnt()
9015 * i40e_fdir_reinit_subtask - Worker thread to reinit FDIR filter table
9022 if (test_bit(__I40E_DOWN, pf->state)) in i40e_fdir_reinit_subtask()
9025 if (test_bit(__I40E_FD_FLUSH_REQUESTED, pf->state)) in i40e_fdir_reinit_subtask()
9033 * i40e_vsi_link_event - notify VSI of a link event
9039 if (!vsi || test_bit(__I40E_VSI_DOWN, vsi->state)) in i40e_vsi_link_event()
9042 switch (vsi->type) { in i40e_vsi_link_event()
9044 if (!vsi->netdev || !vsi->netdev_registered) in i40e_vsi_link_event()
9048 netif_carrier_on(vsi->netdev); in i40e_vsi_link_event()
9049 netif_tx_wake_all_queues(vsi->netdev); in i40e_vsi_link_event()
9051 netif_carrier_off(vsi->netdev); in i40e_vsi_link_event()
9052 netif_tx_stop_all_queues(vsi->netdev); in i40e_vsi_link_event()
9068 * i40e_veb_link_event - notify elements on the veb of a link event
9077 if (!veb || !veb->pf) in i40e_veb_link_event()
9079 pf = veb->pf; in i40e_veb_link_event()
9083 if (pf->veb[i] && (pf->veb[i]->uplink_seid == veb->seid)) in i40e_veb_link_event()
9084 i40e_veb_link_event(pf->veb[i], link_up); in i40e_veb_link_event()
9087 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_veb_link_event()
9088 if (pf->vsi[i] && (pf->vsi[i]->uplink_seid == veb->seid)) in i40e_veb_link_event()
9089 i40e_vsi_link_event(pf->vsi[i], link_up); in i40e_veb_link_event()
9093 * i40e_link_event - Update netif_carrier status
9098 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_link_event()
9104 pf->hw.phy.get_link_info = true; in i40e_link_event()
9105 old_link = (pf->hw.phy.link_info_old.link_info & I40E_AQ_LINK_UP); in i40e_link_event()
9106 status = i40e_get_link_status(&pf->hw, &new_link); in i40e_link_event()
9110 clear_bit(__I40E_TEMP_LINK_POLLING, pf->state); in i40e_link_event()
9115 set_bit(__I40E_TEMP_LINK_POLLING, pf->state); in i40e_link_event()
9116 dev_dbg(&pf->pdev->dev, "couldn't get link state, status: %d\n", in i40e_link_event()
9121 old_link_speed = pf->hw.phy.link_info_old.link_speed; in i40e_link_event()
9122 new_link_speed = pf->hw.phy.link_info.link_speed; in i40e_link_event()
9126 (test_bit(__I40E_VSI_DOWN, vsi->state) || in i40e_link_event()
9127 new_link == netif_carrier_ok(vsi->netdev))) in i40e_link_event()
9135 if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb]) in i40e_link_event()
9136 i40e_veb_link_event(pf->veb[pf->lan_veb], new_link); in i40e_link_event()
9140 if (pf->vf) in i40e_link_event()
9143 if (pf->flags & I40E_FLAG_PTP) in i40e_link_event()
9148 * i40e_watchdog_subtask - periodic checks not using event driven response
9156 if (test_bit(__I40E_DOWN, pf->state) || in i40e_watchdog_subtask()
9157 test_bit(__I40E_CONFIG_BUSY, pf->state)) in i40e_watchdog_subtask()
9161 if (time_before(jiffies, (pf->service_timer_previous + in i40e_watchdog_subtask()
9162 pf->service_timer_period))) in i40e_watchdog_subtask()
9164 pf->service_timer_previous = jiffies; in i40e_watchdog_subtask()
9166 if ((pf->flags & I40E_FLAG_LINK_POLLING_ENABLED) || in i40e_watchdog_subtask()
9167 test_bit(__I40E_TEMP_LINK_POLLING, pf->state)) in i40e_watchdog_subtask()
9173 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_watchdog_subtask()
9174 if (pf->vsi[i] && pf->vsi[i]->netdev) in i40e_watchdog_subtask()
9175 i40e_update_stats(pf->vsi[i]); in i40e_watchdog_subtask()
9177 if (pf->flags & I40E_FLAG_VEB_STATS_ENABLED) { in i40e_watchdog_subtask()
9180 if (pf->veb[i]) in i40e_watchdog_subtask()
9181 i40e_update_veb_stats(pf->veb[i]); in i40e_watchdog_subtask()
9189 * i40e_reset_subtask - Set up for resetting the device and driver
9196 if (test_bit(__I40E_REINIT_REQUESTED, pf->state)) { in i40e_reset_subtask()
9198 clear_bit(__I40E_REINIT_REQUESTED, pf->state); in i40e_reset_subtask()
9200 if (test_bit(__I40E_PF_RESET_REQUESTED, pf->state)) { in i40e_reset_subtask()
9202 clear_bit(__I40E_PF_RESET_REQUESTED, pf->state); in i40e_reset_subtask()
9204 if (test_bit(__I40E_CORE_RESET_REQUESTED, pf->state)) { in i40e_reset_subtask()
9206 clear_bit(__I40E_CORE_RESET_REQUESTED, pf->state); in i40e_reset_subtask()
9208 if (test_bit(__I40E_GLOBAL_RESET_REQUESTED, pf->state)) { in i40e_reset_subtask()
9210 clear_bit(__I40E_GLOBAL_RESET_REQUESTED, pf->state); in i40e_reset_subtask()
9212 if (test_bit(__I40E_DOWN_REQUESTED, pf->state)) { in i40e_reset_subtask()
9214 clear_bit(__I40E_DOWN_REQUESTED, pf->state); in i40e_reset_subtask()
9220 if (test_bit(__I40E_RESET_INTR_RECEIVED, pf->state)) { in i40e_reset_subtask()
9228 !test_bit(__I40E_DOWN, pf->state) && in i40e_reset_subtask()
9229 !test_bit(__I40E_CONFIG_BUSY, pf->state)) { in i40e_reset_subtask()
9235 * i40e_handle_link_event - Handle link event
9243 (struct i40e_aqc_get_link_status *)&e->desc.params.raw; in i40e_handle_link_event()
9245 /* Do a new status request to re-enable LSE reporting in i40e_handle_link_event()
9254 if (status->phy_type == I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP) { in i40e_handle_link_event()
9255 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
9257 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
9263 if ((status->link_info & I40E_AQ_MEDIA_AVAILABLE) && in i40e_handle_link_event()
9264 (!(status->an_info & I40E_AQ_QUALIFIED_MODULE)) && in i40e_handle_link_event()
9265 (!(status->link_info & I40E_AQ_LINK_UP)) && in i40e_handle_link_event()
9266 (!(pf->flags & I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED))) { in i40e_handle_link_event()
9267 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
9269 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
9276 * i40e_clean_adminq_subtask - Clean the AdminQ rings
9282 struct i40e_hw *hw = &pf->hw; in i40e_clean_adminq_subtask()
9290 if (test_bit(__I40E_RESET_FAILED, pf->state)) in i40e_clean_adminq_subtask()
9294 val = rd32(&pf->hw, pf->hw.aq.arq.len); in i40e_clean_adminq_subtask()
9297 if (hw->debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
9298 dev_info(&pf->pdev->dev, "ARQ VF Error detected\n"); in i40e_clean_adminq_subtask()
9302 if (hw->debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
9303 dev_info(&pf->pdev->dev, "ARQ Overflow Error detected\n"); in i40e_clean_adminq_subtask()
9305 pf->arq_overflows++; in i40e_clean_adminq_subtask()
9308 if (hw->debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
9309 dev_info(&pf->pdev->dev, "ARQ Critical Error detected\n"); in i40e_clean_adminq_subtask()
9313 wr32(&pf->hw, pf->hw.aq.arq.len, val); in i40e_clean_adminq_subtask()
9315 val = rd32(&pf->hw, pf->hw.aq.asq.len); in i40e_clean_adminq_subtask()
9318 if (pf->hw.debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
9319 dev_info(&pf->pdev->dev, "ASQ VF Error detected\n"); in i40e_clean_adminq_subtask()
9323 if (pf->hw.debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
9324 dev_info(&pf->pdev->dev, "ASQ Overflow Error detected\n"); in i40e_clean_adminq_subtask()
9328 if (pf->hw.debug_mask & I40E_DEBUG_AQ) in i40e_clean_adminq_subtask()
9329 dev_info(&pf->pdev->dev, "ASQ Critical Error detected\n"); in i40e_clean_adminq_subtask()
9333 wr32(&pf->hw, pf->hw.aq.asq.len, val); in i40e_clean_adminq_subtask()
9345 dev_info(&pf->pdev->dev, "ARQ event error %d\n", ret); in i40e_clean_adminq_subtask()
9364 dev_dbg(&pf->pdev->dev, "ARQ: Update LLDP MIB event received\n"); in i40e_clean_adminq_subtask()
9372 dev_dbg(&pf->pdev->dev, "ARQ LAN queue overflow event received\n"); in i40e_clean_adminq_subtask()
9376 dev_info(&pf->pdev->dev, "ARQ: Msg from other pf\n"); in i40e_clean_adminq_subtask()
9381 i40e_debug(&pf->hw, I40E_DEBUG_NVM, in i40e_clean_adminq_subtask()
9386 dev_info(&pf->pdev->dev, in i40e_clean_adminq_subtask()
9391 } while (i++ < pf->adminq_work_limit); in i40e_clean_adminq_subtask()
9393 if (i < pf->adminq_work_limit) in i40e_clean_adminq_subtask()
9394 clear_bit(__I40E_ADMINQ_EVENT_PENDING, pf->state); in i40e_clean_adminq_subtask()
9396 /* re-enable Admin queue interrupt cause */ in i40e_clean_adminq_subtask()
9406 * i40e_verify_eeprom - make sure eeprom is good to use
9413 err = i40e_diag_eeprom_test(&pf->hw); in i40e_verify_eeprom()
9416 err = i40e_diag_eeprom_test(&pf->hw); in i40e_verify_eeprom()
9418 dev_info(&pf->pdev->dev, "eeprom check failed (%d), Tx/Rx traffic disabled\n", in i40e_verify_eeprom()
9420 set_bit(__I40E_BAD_EEPROM, pf->state); in i40e_verify_eeprom()
9424 if (!err && test_bit(__I40E_BAD_EEPROM, pf->state)) { in i40e_verify_eeprom()
9425 dev_info(&pf->pdev->dev, "eeprom check passed, Tx/Rx traffic enabled\n"); in i40e_verify_eeprom()
9426 clear_bit(__I40E_BAD_EEPROM, pf->state); in i40e_verify_eeprom()
9434 * enable switch loop back or die - no point in a return value
9438 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_enable_pf_switch_lb()
9442 ctxt.seid = pf->main_vsi_seid; in i40e_enable_pf_switch_lb()
9443 ctxt.pf_num = pf->hw.pf_id; in i40e_enable_pf_switch_lb()
9445 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_enable_pf_switch_lb()
9447 dev_info(&pf->pdev->dev, in i40e_enable_pf_switch_lb()
9449 i40e_stat_str(&pf->hw, ret), in i40e_enable_pf_switch_lb()
9450 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_enable_pf_switch_lb()
9457 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_enable_pf_switch_lb()
9459 dev_info(&pf->pdev->dev, in i40e_enable_pf_switch_lb()
9461 i40e_stat_str(&pf->hw, ret), in i40e_enable_pf_switch_lb()
9462 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_enable_pf_switch_lb()
9470 * disable switch loop back or die - no point in a return value
9474 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_disable_pf_switch_lb()
9478 ctxt.seid = pf->main_vsi_seid; in i40e_disable_pf_switch_lb()
9479 ctxt.pf_num = pf->hw.pf_id; in i40e_disable_pf_switch_lb()
9481 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_disable_pf_switch_lb()
9483 dev_info(&pf->pdev->dev, in i40e_disable_pf_switch_lb()
9485 i40e_stat_str(&pf->hw, ret), in i40e_disable_pf_switch_lb()
9486 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_disable_pf_switch_lb()
9493 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_disable_pf_switch_lb()
9495 dev_info(&pf->pdev->dev, in i40e_disable_pf_switch_lb()
9497 i40e_stat_str(&pf->hw, ret), in i40e_disable_pf_switch_lb()
9498 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_disable_pf_switch_lb()
9503 * i40e_config_bridge_mode - Configure the HW bridge mode
9512 struct i40e_pf *pf = veb->pf; in i40e_config_bridge_mode()
9514 if (pf->hw.debug_mask & I40E_DEBUG_LAN) in i40e_config_bridge_mode()
9515 dev_info(&pf->pdev->dev, "enabling bridge mode: %s\n", in i40e_config_bridge_mode()
9516 veb->bridge_mode == BRIDGE_MODE_VEPA ? "VEPA" : "VEB"); in i40e_config_bridge_mode()
9517 if (veb->bridge_mode & BRIDGE_MODE_VEPA) in i40e_config_bridge_mode()
9524 * i40e_reconstitute_veb - rebuild the VEB and anything connected to it
9535 struct i40e_pf *pf = veb->pf; in i40e_reconstitute_veb()
9540 for (v = 0; v < pf->num_alloc_vsi && !ctl_vsi; v++) { in i40e_reconstitute_veb()
9541 if (pf->vsi[v] && in i40e_reconstitute_veb()
9542 pf->vsi[v]->veb_idx == veb->idx && in i40e_reconstitute_veb()
9543 pf->vsi[v]->flags & I40E_VSI_FLAG_VEB_OWNER) { in i40e_reconstitute_veb()
9544 ctl_vsi = pf->vsi[v]; in i40e_reconstitute_veb()
9549 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
9550 "missing owner VSI for veb_idx %d\n", veb->idx); in i40e_reconstitute_veb()
9551 ret = -ENOENT; in i40e_reconstitute_veb()
9554 if (ctl_vsi != pf->vsi[pf->lan_vsi]) in i40e_reconstitute_veb()
9555 ctl_vsi->uplink_seid = pf->vsi[pf->lan_vsi]->uplink_seid; in i40e_reconstitute_veb()
9558 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
9560 veb->idx, ret); in i40e_reconstitute_veb()
9570 if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED) in i40e_reconstitute_veb()
9571 veb->bridge_mode = BRIDGE_MODE_VEB; in i40e_reconstitute_veb()
9573 veb->bridge_mode = BRIDGE_MODE_VEPA; in i40e_reconstitute_veb()
9577 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_reconstitute_veb()
9578 if (!pf->vsi[v] || pf->vsi[v] == ctl_vsi) in i40e_reconstitute_veb()
9581 if (pf->vsi[v]->veb_idx == veb->idx) { in i40e_reconstitute_veb()
9582 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_reconstitute_veb()
9584 vsi->uplink_seid = veb->seid; in i40e_reconstitute_veb()
9587 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
9596 /* create any VEBs attached to this VEB - RECURSION */ in i40e_reconstitute_veb()
9598 if (pf->veb[veb_idx] && pf->veb[veb_idx]->veb_idx == veb->idx) { in i40e_reconstitute_veb()
9599 pf->veb[veb_idx]->uplink_seid = veb->seid; in i40e_reconstitute_veb()
9600 ret = i40e_reconstitute_veb(pf->veb[veb_idx]); in i40e_reconstitute_veb()
9611 * i40e_get_capabilities - get info about the HW
9627 return -ENOMEM; in i40e_get_capabilities()
9630 err = i40e_aq_discover_capabilities(&pf->hw, cap_buf, buf_len, in i40e_get_capabilities()
9636 if (pf->hw.aq.asq_last_status == I40E_AQ_RC_ENOMEM) { in i40e_get_capabilities()
9639 } else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK) { in i40e_get_capabilities()
9640 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
9642 i40e_stat_str(&pf->hw, err), in i40e_get_capabilities()
9643 i40e_aq_str(&pf->hw, in i40e_get_capabilities()
9644 pf->hw.aq.asq_last_status)); in i40e_get_capabilities()
9645 return -ENODEV; in i40e_get_capabilities()
9649 if (pf->hw.debug_mask & I40E_DEBUG_USER) { in i40e_get_capabilities()
9651 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
9653 pf->hw.pf_id, pf->hw.func_caps.num_vfs, in i40e_get_capabilities()
9654 pf->hw.func_caps.num_msix_vectors, in i40e_get_capabilities()
9655 pf->hw.func_caps.num_msix_vectors_vf, in i40e_get_capabilities()
9656 pf->hw.func_caps.fd_filters_guaranteed, in i40e_get_capabilities()
9657 pf->hw.func_caps.fd_filters_best_effort, in i40e_get_capabilities()
9658 pf->hw.func_caps.num_tx_qp, in i40e_get_capabilities()
9659 pf->hw.func_caps.num_vsis); in i40e_get_capabilities()
9661 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
9663 pf->hw.dev_caps.switch_mode, in i40e_get_capabilities()
9664 pf->hw.dev_caps.valid_functions); in i40e_get_capabilities()
9665 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
9666 "SR-IOV=%d, num_vfs for all function=%u\n", in i40e_get_capabilities()
9667 pf->hw.dev_caps.sr_iov_1_1, in i40e_get_capabilities()
9668 pf->hw.dev_caps.num_vfs); in i40e_get_capabilities()
9669 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
9671 pf->hw.dev_caps.num_vsis, in i40e_get_capabilities()
9672 pf->hw.dev_caps.num_rx_qp, in i40e_get_capabilities()
9673 pf->hw.dev_caps.num_tx_qp); in i40e_get_capabilities()
9677 #define DEF_NUM_VSI (1 + (pf->hw.func_caps.fcoe ? 1 : 0) \ in i40e_get_capabilities()
9678 + pf->hw.func_caps.num_vfs) in i40e_get_capabilities()
9679 if (pf->hw.revision_id == 0 && in i40e_get_capabilities()
9680 pf->hw.func_caps.num_vsis < DEF_NUM_VSI) { in i40e_get_capabilities()
9681 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
9683 pf->hw.func_caps.num_vsis, DEF_NUM_VSI); in i40e_get_capabilities()
9684 pf->hw.func_caps.num_vsis = DEF_NUM_VSI; in i40e_get_capabilities()
9693 * i40e_fdir_sb_setup - initialize the Flow Director resources for Sideband
9703 if (!rd32(&pf->hw, I40E_GLQF_HKEY(0))) { in i40e_fdir_sb_setup()
9712 wr32(&pf->hw, I40E_GLQF_HKEY(i), hkey[i]); in i40e_fdir_sb_setup()
9715 if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_fdir_sb_setup()
9724 pf->vsi[pf->lan_vsi]->seid, 0); in i40e_fdir_sb_setup()
9726 dev_info(&pf->pdev->dev, "Couldn't create FDir VSI\n"); in i40e_fdir_sb_setup()
9727 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_fdir_sb_setup()
9728 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_fdir_sb_setup()
9737 * i40e_fdir_teardown - release the Flow Director resources
9751 * i40e_rebuild_cloud_filters - Rebuilds cloud filters for VSIs
9761 struct i40e_pf *pf = vsi->back; in i40e_rebuild_cloud_filters()
9766 hlist_for_each_entry_safe(cfilter, node, &pf->cloud_filter_list, in i40e_rebuild_cloud_filters()
9768 if (cfilter->seid != seid) in i40e_rebuild_cloud_filters()
9771 if (cfilter->dst_port) in i40e_rebuild_cloud_filters()
9778 dev_dbg(&pf->pdev->dev, in i40e_rebuild_cloud_filters()
9780 i40e_stat_str(&pf->hw, ret), in i40e_rebuild_cloud_filters()
9781 i40e_aq_str(&pf->hw, in i40e_rebuild_cloud_filters()
9782 pf->hw.aq.asq_last_status)); in i40e_rebuild_cloud_filters()
9790 * i40e_rebuild_channels - Rebuilds channel VSIs if they existed before reset
9800 if (list_empty(&vsi->ch_list)) in i40e_rebuild_channels()
9803 list_for_each_entry_safe(ch, ch_tmp, &vsi->ch_list, list) { in i40e_rebuild_channels()
9804 if (!ch->initialized) in i40e_rebuild_channels()
9807 ret = i40e_add_channel(vsi->back, vsi->uplink_seid, ch); in i40e_rebuild_channels()
9809 dev_info(&vsi->back->pdev->dev, in i40e_rebuild_channels()
9811 vsi->uplink_seid); in i40e_rebuild_channels()
9815 ret = i40e_channel_config_tx_ring(vsi->back, vsi, ch); in i40e_rebuild_channels()
9817 dev_info(&vsi->back->pdev->dev, in i40e_rebuild_channels()
9819 ch->seid); in i40e_rebuild_channels()
9823 vsi->next_base_queue = vsi->next_base_queue + in i40e_rebuild_channels()
9824 ch->num_queue_pairs; in i40e_rebuild_channels()
9825 if (ch->max_tx_rate) { in i40e_rebuild_channels()
9826 u64 credits = ch->max_tx_rate; in i40e_rebuild_channels()
9828 if (i40e_set_bw_limit(vsi, ch->seid, in i40e_rebuild_channels()
9829 ch->max_tx_rate)) in i40e_rebuild_channels()
9830 return -EINVAL; in i40e_rebuild_channels()
9833 dev_dbg(&vsi->back->pdev->dev, in i40e_rebuild_channels()
9834 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_rebuild_channels()
9835 ch->max_tx_rate, in i40e_rebuild_channels()
9837 ch->seid); in i40e_rebuild_channels()
9839 ret = i40e_rebuild_cloud_filters(vsi, ch->seid); in i40e_rebuild_channels()
9841 dev_dbg(&vsi->back->pdev->dev, in i40e_rebuild_channels()
9843 ch->seid); in i40e_rebuild_channels()
9851 * i40e_prep_for_reset - prep for the core to reset
9860 struct i40e_hw *hw = &pf->hw; in i40e_prep_for_reset()
9864 clear_bit(__I40E_RESET_INTR_RECEIVED, pf->state); in i40e_prep_for_reset()
9865 if (test_and_set_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_prep_for_reset()
9867 if (i40e_check_asq_alive(&pf->hw)) in i40e_prep_for_reset()
9870 dev_dbg(&pf->pdev->dev, "Tearing down internal switch for reset\n"); in i40e_prep_for_reset()
9873 /* pf_quiesce_all_vsi modifies netdev structures -rtnl_lock needed */ in i40e_prep_for_reset()
9880 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_prep_for_reset()
9881 if (pf->vsi[v]) in i40e_prep_for_reset()
9882 pf->vsi[v]->seid = 0; in i40e_prep_for_reset()
9885 i40e_shutdown_adminq(&pf->hw); in i40e_prep_for_reset()
9888 if (hw->hmc.hmc_obj) { in i40e_prep_for_reset()
9891 dev_warn(&pf->pdev->dev, in i40e_prep_for_reset()
9902 * i40e_send_version - update firmware with driver version
9914 i40e_aq_send_driver_version(&pf->hw, &dv, NULL); in i40e_send_version()
9918 * i40e_get_oem_version - get OEM specific version information
9958 hw->nvm.oem_ver = (gen_snap << I40E_OEM_SNAP_SHIFT) | release; in i40e_get_oem_version()
9959 hw->nvm.eetrack = I40E_OEM_EETRACK_ID; in i40e_get_oem_version()
9963 * i40e_reset - wait for core reset to finish reset, reset pf if corer not seen
9968 struct i40e_hw *hw = &pf->hw; in i40e_reset()
9973 dev_info(&pf->pdev->dev, "PF reset failed, %d\n", ret); in i40e_reset()
9974 set_bit(__I40E_RESET_FAILED, pf->state); in i40e_reset()
9975 clear_bit(__I40E_RESET_RECOVERY_PENDING, pf->state); in i40e_reset()
9977 pf->pfr_count++; in i40e_reset()
9983 * i40e_rebuild - rebuild using a saved config
9985 * @reinit: if the Main VSI needs to re-initialized.
9991 int old_recovery_mode_bit = test_bit(__I40E_RECOVERY_MODE, pf->state); in i40e_rebuild()
9992 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_rebuild()
9993 struct i40e_hw *hw = &pf->hw; in i40e_rebuild()
9999 if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) && in i40e_rebuild()
10001 i40e_set_ethtool_ops(pf->vsi[pf->lan_vsi]->netdev); in i40e_rebuild()
10004 if (test_bit(__I40E_DOWN, pf->state) && in i40e_rebuild()
10005 !test_bit(__I40E_RECOVERY_MODE, pf->state) && in i40e_rebuild()
10008 dev_dbg(&pf->pdev->dev, "Rebuilding internal switch\n"); in i40e_rebuild()
10011 ret = i40e_init_adminq(&pf->hw); in i40e_rebuild()
10013 dev_info(&pf->pdev->dev, "Rebuild AdminQ failed, err %s aq_err %s\n", in i40e_rebuild()
10014 i40e_stat_str(&pf->hw, ret), in i40e_rebuild()
10015 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_rebuild()
10018 i40e_get_oem_version(&pf->hw); in i40e_rebuild()
10020 if (test_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state) && in i40e_rebuild()
10021 ((hw->aq.fw_maj_ver == 4 && hw->aq.fw_min_ver <= 33) || in i40e_rebuild()
10022 hw->aq.fw_maj_ver < 4) && hw->mac.type == I40E_MAC_XL710) { in i40e_rebuild()
10031 /* re-verify the eeprom if we just had an EMP reset */ in i40e_rebuild()
10032 if (test_and_clear_bit(__I40E_EMP_RESET_INTR_RECEIVED, pf->state)) in i40e_rebuild()
10039 if (test_bit(__I40E_RECOVERY_MODE, pf->state) || in i40e_rebuild()
10045 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_rebuild()
10058 free_irq(pf->pdev->irq, pf); in i40e_rebuild()
10078 ret = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp, in i40e_rebuild()
10079 hw->func_caps.num_rx_qp, 0, 0); in i40e_rebuild()
10081 dev_info(&pf->pdev->dev, "init_lan_hmc failed: %d\n", ret); in i40e_rebuild()
10086 dev_info(&pf->pdev->dev, "configure_lan_hmc failed: %d\n", ret); in i40e_rebuild()
10090 /* Enable FW to write a default DCB config on link-up */ in i40e_rebuild()
10096 dev_info(&pf->pdev->dev, "DCB init failed %d, disabled\n", ret); in i40e_rebuild()
10097 pf->flags &= ~I40E_FLAG_DCB_CAPABLE; in i40e_rebuild()
10111 ret = i40e_aq_set_phy_int_mask(&pf->hw, in i40e_rebuild()
10116 dev_info(&pf->pdev->dev, "set phy mask fail, err %s aq_err %s\n", in i40e_rebuild()
10117 i40e_stat_str(&pf->hw, ret), in i40e_rebuild()
10118 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_rebuild()
10121 ret = i40e_set_fc(&pf->hw, &set_fc_aq_fail, true); in i40e_rebuild()
10123 dev_dbg(&pf->pdev->dev, "setting flow control: ret = %s last_status = %s\n", in i40e_rebuild()
10124 i40e_stat_str(&pf->hw, ret), in i40e_rebuild()
10125 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_rebuild()
10134 if (vsi->uplink_seid != pf->mac_seid) { in i40e_rebuild()
10135 dev_dbg(&pf->pdev->dev, "attempting to rebuild switch\n"); in i40e_rebuild()
10138 if (!pf->veb[v]) in i40e_rebuild()
10141 if (pf->veb[v]->uplink_seid == pf->mac_seid || in i40e_rebuild()
10142 pf->veb[v]->uplink_seid == 0) { in i40e_rebuild()
10143 ret = i40e_reconstitute_veb(pf->veb[v]); in i40e_rebuild()
10154 if (pf->veb[v]->uplink_seid == pf->mac_seid) { in i40e_rebuild()
10155 dev_info(&pf->pdev->dev, in i40e_rebuild()
10158 vsi->uplink_seid = pf->mac_seid; in i40e_rebuild()
10160 } else if (pf->veb[v]->uplink_seid == 0) { in i40e_rebuild()
10161 dev_info(&pf->pdev->dev, in i40e_rebuild()
10169 if (vsi->uplink_seid == pf->mac_seid) { in i40e_rebuild()
10170 dev_dbg(&pf->pdev->dev, "attempting to rebuild PF VSI\n"); in i40e_rebuild()
10174 dev_info(&pf->pdev->dev, in i40e_rebuild()
10180 if (vsi->mqprio_qopt.max_rate[0]) { in i40e_rebuild()
10181 u64 max_tx_rate = vsi->mqprio_qopt.max_rate[0]; in i40e_rebuild()
10185 ret = i40e_set_bw_limit(vsi, vsi->seid, max_tx_rate); in i40e_rebuild()
10191 dev_dbg(&vsi->back->pdev->dev, in i40e_rebuild()
10192 "Set tx rate of %llu Mbps (count of 50Mbps %llu) for vsi->seid %u\n", in i40e_rebuild()
10195 vsi->seid); in i40e_rebuild()
10198 ret = i40e_rebuild_cloud_filters(vsi, vsi->seid); in i40e_rebuild()
10223 if (pf->hw_features & I40E_HW_RESTART_AUTONEG) { in i40e_rebuild()
10225 ret = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); in i40e_rebuild()
10227 dev_info(&pf->pdev->dev, "link restart failed, err %s aq_err %s\n", in i40e_rebuild()
10228 i40e_stat_str(&pf->hw, ret), in i40e_rebuild()
10229 i40e_aq_str(&pf->hw, in i40e_rebuild()
10230 pf->hw.aq.asq_last_status)); in i40e_rebuild()
10233 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_rebuild()
10242 i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw, in i40e_rebuild()
10243 pf->main_vsi_seid); in i40e_rebuild()
10253 ret = i40e_set_promiscuous(pf, pf->cur_promisc); in i40e_rebuild()
10255 dev_warn(&pf->pdev->dev, in i40e_rebuild()
10257 pf->cur_promisc ? "on" : "off", in i40e_rebuild()
10258 i40e_stat_str(&pf->hw, ret), in i40e_rebuild()
10259 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_rebuild()
10273 clear_bit(__I40E_RESET_FAILED, pf->state); in i40e_rebuild()
10275 clear_bit(__I40E_RESET_RECOVERY_PENDING, pf->state); in i40e_rebuild()
10276 clear_bit(__I40E_TIMEOUT_RECOVERY_PENDING, pf->state); in i40e_rebuild()
10280 * i40e_reset_and_rebuild - reset and rebuild using a saved config
10282 * @reinit: if the Main VSI needs to re-initialized.
10290 /* Now we wait for GRST to settle out. in i40e_reset_and_rebuild()
10300 * i40e_handle_reset_warning - prep for the PF to reset, reset and rebuild
10322 struct i40e_hw *hw = &pf->hw; in i40e_handle_mdd_event()
10328 if (!test_bit(__I40E_MDD_EVENT_PENDING, pf->state)) in i40e_handle_mdd_event()
10341 I40E_GL_MDET_TX_QUEUE_SHIFT) - in i40e_handle_mdd_event()
10342 pf->hw.func_caps.base_queue; in i40e_handle_mdd_event()
10344 …dev_info(&pf->pdev->dev, "Malicious Driver Detection event 0x%02x on TX queue %d PF number 0x%02x … in i40e_handle_mdd_event()
10356 I40E_GL_MDET_RX_QUEUE_SHIFT) - in i40e_handle_mdd_event()
10357 pf->hw.func_caps.base_queue; in i40e_handle_mdd_event()
10359 …dev_info(&pf->pdev->dev, "Malicious Driver Detection event 0x%02x on RX queue %d of function 0x%02… in i40e_handle_mdd_event()
10369 dev_dbg(&pf->pdev->dev, "TX driver issue detected on PF\n"); in i40e_handle_mdd_event()
10374 dev_dbg(&pf->pdev->dev, "RX driver issue detected on PF\n"); in i40e_handle_mdd_event()
10379 for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) { in i40e_handle_mdd_event()
10380 vf = &(pf->vf[i]); in i40e_handle_mdd_event()
10384 vf->num_mdd_events++; in i40e_handle_mdd_event()
10385 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", in i40e_handle_mdd_event()
10387 dev_info(&pf->pdev->dev, in i40e_handle_mdd_event()
10388 "Use PF Control I/F to re-enable the VF\n"); in i40e_handle_mdd_event()
10389 set_bit(I40E_VF_STATE_DISABLED, &vf->vf_states); in i40e_handle_mdd_event()
10395 vf->num_mdd_events++; in i40e_handle_mdd_event()
10396 dev_info(&pf->pdev->dev, "RX driver issue detected on VF %d\n", in i40e_handle_mdd_event()
10398 dev_info(&pf->pdev->dev, in i40e_handle_mdd_event()
10399 "Use PF Control I/F to re-enable the VF\n"); in i40e_handle_mdd_event()
10400 set_bit(I40E_VF_STATE_DISABLED, &vf->vf_states); in i40e_handle_mdd_event()
10404 /* re-enable mdd interrupt cause */ in i40e_handle_mdd_event()
10405 clear_bit(__I40E_MDD_EVENT_PENDING, pf->state); in i40e_handle_mdd_event()
10413 * i40e_service_task - Run the driver's async subtasks
10424 if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) || in i40e_service_task()
10425 test_bit(__I40E_SUSPENDED, pf->state)) in i40e_service_task()
10428 if (test_and_set_bit(__I40E_SERVICE_SCHED, pf->state)) in i40e_service_task()
10431 if (!test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_service_task()
10432 i40e_detect_recover_hung(pf->vsi[pf->lan_vsi]); in i40e_service_task()
10439 if (test_and_clear_bit(__I40E_CLIENT_RESET, pf->state)) { in i40e_service_task()
10441 i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], in i40e_service_task()
10446 pf->state)) in i40e_service_task()
10448 pf->vsi[pf->lan_vsi]); in i40e_service_task()
10459 clear_bit(__I40E_SERVICE_SCHED, pf->state); in i40e_service_task()
10463 * rather than wait for the timer to tick again. in i40e_service_task()
10465 if (time_after(jiffies, (start_time + pf->service_timer_period)) || in i40e_service_task()
10466 test_bit(__I40E_ADMINQ_EVENT_PENDING, pf->state) || in i40e_service_task()
10467 test_bit(__I40E_MDD_EVENT_PENDING, pf->state) || in i40e_service_task()
10468 test_bit(__I40E_VFLR_EVENT_PENDING, pf->state)) in i40e_service_task()
10473 * i40e_service_timer - timer callback
10480 mod_timer(&pf->service_timer, in i40e_service_timer()
10481 round_jiffies(jiffies + pf->service_timer_period)); in i40e_service_timer()
10486 * i40e_set_num_rings_in_vsi - Determine number of rings in the VSI
10491 struct i40e_pf *pf = vsi->back; in i40e_set_num_rings_in_vsi()
10493 switch (vsi->type) { in i40e_set_num_rings_in_vsi()
10495 vsi->alloc_queue_pairs = pf->num_lan_qps; in i40e_set_num_rings_in_vsi()
10496 if (!vsi->num_tx_desc) in i40e_set_num_rings_in_vsi()
10497 vsi->num_tx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
10499 if (!vsi->num_rx_desc) in i40e_set_num_rings_in_vsi()
10500 vsi->num_rx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
10502 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_set_num_rings_in_vsi()
10503 vsi->num_q_vectors = pf->num_lan_msix; in i40e_set_num_rings_in_vsi()
10505 vsi->num_q_vectors = 1; in i40e_set_num_rings_in_vsi()
10510 vsi->alloc_queue_pairs = 1; in i40e_set_num_rings_in_vsi()
10511 vsi->num_tx_desc = ALIGN(I40E_FDIR_RING_COUNT, in i40e_set_num_rings_in_vsi()
10513 vsi->num_rx_desc = ALIGN(I40E_FDIR_RING_COUNT, in i40e_set_num_rings_in_vsi()
10515 vsi->num_q_vectors = pf->num_fdsb_msix; in i40e_set_num_rings_in_vsi()
10519 vsi->alloc_queue_pairs = pf->num_vmdq_qps; in i40e_set_num_rings_in_vsi()
10520 if (!vsi->num_tx_desc) in i40e_set_num_rings_in_vsi()
10521 vsi->num_tx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
10523 if (!vsi->num_rx_desc) in i40e_set_num_rings_in_vsi()
10524 vsi->num_rx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
10526 vsi->num_q_vectors = pf->num_vmdq_msix; in i40e_set_num_rings_in_vsi()
10530 vsi->alloc_queue_pairs = pf->num_vf_qps; in i40e_set_num_rings_in_vsi()
10531 if (!vsi->num_tx_desc) in i40e_set_num_rings_in_vsi()
10532 vsi->num_tx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
10534 if (!vsi->num_rx_desc) in i40e_set_num_rings_in_vsi()
10535 vsi->num_rx_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
10541 return -ENODATA; in i40e_set_num_rings_in_vsi()
10548 * i40e_vsi_alloc_arrays - Allocate queue and vector pointer arrays for the vsi
10562 size = sizeof(struct i40e_ring *) * vsi->alloc_queue_pairs * in i40e_vsi_alloc_arrays()
10564 vsi->tx_rings = kzalloc(size, GFP_KERNEL); in i40e_vsi_alloc_arrays()
10565 if (!vsi->tx_rings) in i40e_vsi_alloc_arrays()
10566 return -ENOMEM; in i40e_vsi_alloc_arrays()
10567 next_rings = vsi->tx_rings + vsi->alloc_queue_pairs; in i40e_vsi_alloc_arrays()
10569 vsi->xdp_rings = next_rings; in i40e_vsi_alloc_arrays()
10570 next_rings += vsi->alloc_queue_pairs; in i40e_vsi_alloc_arrays()
10572 vsi->rx_rings = next_rings; in i40e_vsi_alloc_arrays()
10576 size = sizeof(struct i40e_q_vector *) * vsi->num_q_vectors; in i40e_vsi_alloc_arrays()
10577 vsi->q_vectors = kzalloc(size, GFP_KERNEL); in i40e_vsi_alloc_arrays()
10578 if (!vsi->q_vectors) { in i40e_vsi_alloc_arrays()
10579 ret = -ENOMEM; in i40e_vsi_alloc_arrays()
10586 kfree(vsi->tx_rings); in i40e_vsi_alloc_arrays()
10591 * i40e_vsi_mem_alloc - Allocates the next available struct vsi in the PF
10600 int ret = -ENODEV; in i40e_vsi_mem_alloc()
10606 mutex_lock(&pf->switch_mutex); in i40e_vsi_mem_alloc()
10614 i = pf->next_vsi; in i40e_vsi_mem_alloc()
10615 while (i < pf->num_alloc_vsi && pf->vsi[i]) in i40e_vsi_mem_alloc()
10617 if (i >= pf->num_alloc_vsi) { in i40e_vsi_mem_alloc()
10619 while (i < pf->next_vsi && pf->vsi[i]) in i40e_vsi_mem_alloc()
10623 if (i < pf->num_alloc_vsi && !pf->vsi[i]) { in i40e_vsi_mem_alloc()
10626 ret = -ENODEV; in i40e_vsi_mem_alloc()
10629 pf->next_vsi = ++i; in i40e_vsi_mem_alloc()
10633 ret = -ENOMEM; in i40e_vsi_mem_alloc()
10636 vsi->type = type; in i40e_vsi_mem_alloc()
10637 vsi->back = pf; in i40e_vsi_mem_alloc()
10638 set_bit(__I40E_VSI_DOWN, vsi->state); in i40e_vsi_mem_alloc()
10639 vsi->flags = 0; in i40e_vsi_mem_alloc()
10640 vsi->idx = vsi_idx; in i40e_vsi_mem_alloc()
10641 vsi->int_rate_limit = 0; in i40e_vsi_mem_alloc()
10642 vsi->rss_table_size = (vsi->type == I40E_VSI_MAIN) ? in i40e_vsi_mem_alloc()
10643 pf->rss_table_size : 64; in i40e_vsi_mem_alloc()
10644 vsi->netdev_registered = false; in i40e_vsi_mem_alloc()
10645 vsi->work_limit = I40E_DEFAULT_IRQ_WORK; in i40e_vsi_mem_alloc()
10646 hash_init(vsi->mac_filter_hash); in i40e_vsi_mem_alloc()
10647 vsi->irqs_ready = false; in i40e_vsi_mem_alloc()
10650 vsi->af_xdp_zc_qps = bitmap_zalloc(pf->num_lan_qps, GFP_KERNEL); in i40e_vsi_mem_alloc()
10651 if (!vsi->af_xdp_zc_qps) in i40e_vsi_mem_alloc()
10667 spin_lock_init(&vsi->mac_filter_hash_lock); in i40e_vsi_mem_alloc()
10668 pf->vsi[vsi_idx] = vsi; in i40e_vsi_mem_alloc()
10673 bitmap_free(vsi->af_xdp_zc_qps); in i40e_vsi_mem_alloc()
10674 pf->next_vsi = i - 1; in i40e_vsi_mem_alloc()
10677 mutex_unlock(&pf->switch_mutex); in i40e_vsi_mem_alloc()
10682 * i40e_vsi_free_arrays - Free queue and vector pointer arrays for the VSI
10693 kfree(vsi->q_vectors); in i40e_vsi_free_arrays()
10694 vsi->q_vectors = NULL; in i40e_vsi_free_arrays()
10696 kfree(vsi->tx_rings); in i40e_vsi_free_arrays()
10697 vsi->tx_rings = NULL; in i40e_vsi_free_arrays()
10698 vsi->rx_rings = NULL; in i40e_vsi_free_arrays()
10699 vsi->xdp_rings = NULL; in i40e_vsi_free_arrays()
10703 * i40e_clear_rss_config_user - clear the user configured RSS hash keys
10712 kfree(vsi->rss_hkey_user); in i40e_clear_rss_config_user()
10713 vsi->rss_hkey_user = NULL; in i40e_clear_rss_config_user()
10715 kfree(vsi->rss_lut_user); in i40e_clear_rss_config_user()
10716 vsi->rss_lut_user = NULL; in i40e_clear_rss_config_user()
10720 * i40e_vsi_clear - Deallocate the VSI provided
10721 * @vsi: the VSI being un-configured
10730 if (!vsi->back) in i40e_vsi_clear()
10732 pf = vsi->back; in i40e_vsi_clear()
10734 mutex_lock(&pf->switch_mutex); in i40e_vsi_clear()
10735 if (!pf->vsi[vsi->idx]) { in i40e_vsi_clear()
10736 dev_err(&pf->pdev->dev, "pf->vsi[%d] is NULL, just free vsi[%d](type %d)\n", in i40e_vsi_clear()
10737 vsi->idx, vsi->idx, vsi->type); in i40e_vsi_clear()
10741 if (pf->vsi[vsi->idx] != vsi) { in i40e_vsi_clear()
10742 dev_err(&pf->pdev->dev, in i40e_vsi_clear()
10743 "pf->vsi[%d](type %d) != vsi[%d](type %d): no free!\n", in i40e_vsi_clear()
10744 pf->vsi[vsi->idx]->idx, in i40e_vsi_clear()
10745 pf->vsi[vsi->idx]->type, in i40e_vsi_clear()
10746 vsi->idx, vsi->type); in i40e_vsi_clear()
10751 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_clear()
10752 i40e_put_lump(pf->irq_pile, vsi->base_vector, vsi->idx); in i40e_vsi_clear()
10754 bitmap_free(vsi->af_xdp_zc_qps); in i40e_vsi_clear()
10758 pf->vsi[vsi->idx] = NULL; in i40e_vsi_clear()
10759 if (vsi->idx < pf->next_vsi) in i40e_vsi_clear()
10760 pf->next_vsi = vsi->idx; in i40e_vsi_clear()
10763 mutex_unlock(&pf->switch_mutex); in i40e_vsi_clear()
10771 * i40e_vsi_clear_rings - Deallocates the Rx and Tx rings for the provided VSI
10778 if (vsi->tx_rings && vsi->tx_rings[0]) { in i40e_vsi_clear_rings()
10779 for (i = 0; i < vsi->alloc_queue_pairs; i++) { in i40e_vsi_clear_rings()
10780 kfree_rcu(vsi->tx_rings[i], rcu); in i40e_vsi_clear_rings()
10781 WRITE_ONCE(vsi->tx_rings[i], NULL); in i40e_vsi_clear_rings()
10782 WRITE_ONCE(vsi->rx_rings[i], NULL); in i40e_vsi_clear_rings()
10783 if (vsi->xdp_rings) in i40e_vsi_clear_rings()
10784 WRITE_ONCE(vsi->xdp_rings[i], NULL); in i40e_vsi_clear_rings()
10790 * i40e_alloc_rings - Allocates the Rx and Tx rings for the provided VSI
10796 struct i40e_pf *pf = vsi->back; in i40e_alloc_rings()
10800 for (i = 0; i < vsi->alloc_queue_pairs; i++) { in i40e_alloc_rings()
10806 ring->queue_index = i; in i40e_alloc_rings()
10807 ring->reg_idx = vsi->base_queue + i; in i40e_alloc_rings()
10808 ring->ring_active = false; in i40e_alloc_rings()
10809 ring->vsi = vsi; in i40e_alloc_rings()
10810 ring->netdev = vsi->netdev; in i40e_alloc_rings()
10811 ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
10812 ring->count = vsi->num_tx_desc; in i40e_alloc_rings()
10813 ring->size = 0; in i40e_alloc_rings()
10814 ring->dcb_tc = 0; in i40e_alloc_rings()
10815 if (vsi->back->hw_features & I40E_HW_WB_ON_ITR_CAPABLE) in i40e_alloc_rings()
10816 ring->flags = I40E_TXR_FLAGS_WB_ON_ITR; in i40e_alloc_rings()
10817 ring->itr_setting = pf->tx_itr_default; in i40e_alloc_rings()
10818 WRITE_ONCE(vsi->tx_rings[i], ring++); in i40e_alloc_rings()
10823 ring->queue_index = vsi->alloc_queue_pairs + i; in i40e_alloc_rings()
10824 ring->reg_idx = vsi->base_queue + ring->queue_index; in i40e_alloc_rings()
10825 ring->ring_active = false; in i40e_alloc_rings()
10826 ring->vsi = vsi; in i40e_alloc_rings()
10827 ring->netdev = NULL; in i40e_alloc_rings()
10828 ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
10829 ring->count = vsi->num_tx_desc; in i40e_alloc_rings()
10830 ring->size = 0; in i40e_alloc_rings()
10831 ring->dcb_tc = 0; in i40e_alloc_rings()
10832 if (vsi->back->hw_features & I40E_HW_WB_ON_ITR_CAPABLE) in i40e_alloc_rings()
10833 ring->flags = I40E_TXR_FLAGS_WB_ON_ITR; in i40e_alloc_rings()
10835 ring->itr_setting = pf->tx_itr_default; in i40e_alloc_rings()
10836 WRITE_ONCE(vsi->xdp_rings[i], ring++); in i40e_alloc_rings()
10839 ring->queue_index = i; in i40e_alloc_rings()
10840 ring->reg_idx = vsi->base_queue + i; in i40e_alloc_rings()
10841 ring->ring_active = false; in i40e_alloc_rings()
10842 ring->vsi = vsi; in i40e_alloc_rings()
10843 ring->netdev = vsi->netdev; in i40e_alloc_rings()
10844 ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
10845 ring->count = vsi->num_rx_desc; in i40e_alloc_rings()
10846 ring->size = 0; in i40e_alloc_rings()
10847 ring->dcb_tc = 0; in i40e_alloc_rings()
10848 ring->itr_setting = pf->rx_itr_default; in i40e_alloc_rings()
10849 WRITE_ONCE(vsi->rx_rings[i], ring); in i40e_alloc_rings()
10856 return -ENOMEM; in i40e_alloc_rings()
10860 * i40e_reserve_msix_vectors - Reserve MSI-X vectors in the kernel
10862 * @vectors: the number of MSI-X vectors to request
10868 vectors = pci_enable_msix_range(pf->pdev, pf->msix_entries, in i40e_reserve_msix_vectors()
10871 dev_info(&pf->pdev->dev, in i40e_reserve_msix_vectors()
10872 "MSI-X vector reservation failed: %d\n", vectors); in i40e_reserve_msix_vectors()
10880 * i40e_init_msix - Setup the MSIX capability
10889 struct i40e_hw *hw = &pf->hw; in i40e_init_msix()
10896 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_init_msix()
10897 return -ENODEV; in i40e_init_msix()
10900 * - Add 1 for "other" cause for Admin Queue events, etc. in i40e_init_msix()
10901 * - The number of LAN queue pairs in i40e_init_msix()
10902 * - Queues being used for RSS. in i40e_init_msix()
10906 * - assumes symmetric Tx/Rx pairing in i40e_init_msix()
10907 * - The number of VMDq pairs in i40e_init_msix()
10908 * - The CPU count within the NUMA node if iWARP is enabled in i40e_init_msix()
10914 vectors_left = hw->func_caps.num_msix_vectors; in i40e_init_msix()
10920 vectors_left--; in i40e_init_msix()
10931 pf->num_lan_msix = min_t(int, cpus, vectors_left / 2); in i40e_init_msix()
10932 vectors_left -= pf->num_lan_msix; in i40e_init_msix()
10935 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_init_msix()
10937 pf->num_fdsb_msix = 1; in i40e_init_msix()
10939 vectors_left--; in i40e_init_msix()
10941 pf->num_fdsb_msix = 0; in i40e_init_msix()
10946 if (pf->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_init_msix()
10947 iwarp_requested = pf->num_iwarp_msix; in i40e_init_msix()
10950 pf->num_iwarp_msix = 0; in i40e_init_msix()
10951 else if (vectors_left < pf->num_iwarp_msix) in i40e_init_msix()
10952 pf->num_iwarp_msix = 1; in i40e_init_msix()
10953 v_budget += pf->num_iwarp_msix; in i40e_init_msix()
10954 vectors_left -= pf->num_iwarp_msix; in i40e_init_msix()
10958 if (pf->flags & I40E_FLAG_VMDQ_ENABLED) { in i40e_init_msix()
10960 pf->num_vmdq_msix = 0; in i40e_init_msix()
10961 pf->num_vmdq_qps = 0; in i40e_init_msix()
10964 pf->num_vmdq_vsis * pf->num_vmdq_qps; in i40e_init_msix()
10975 pf->num_vmdq_qps = 1; in i40e_init_msix()
10976 vmdq_vecs_wanted = pf->num_vmdq_vsis; in i40e_init_msix()
10981 pf->num_vmdq_msix = pf->num_vmdq_qps; in i40e_init_msix()
10984 vectors_left -= vmdq_vecs; in i40e_init_msix()
10997 extra_vectors = min_t(int, cpus - pf->num_lan_msix, vectors_left); in i40e_init_msix()
10998 pf->num_lan_msix += extra_vectors; in i40e_init_msix()
10999 vectors_left -= extra_vectors; in i40e_init_msix()
11002 …remaining vectors underflowed. This is an accounting bug when determining total MSI-X vectors.\n"); in i40e_init_msix()
11004 v_budget += pf->num_lan_msix; in i40e_init_msix()
11005 pf->msix_entries = kcalloc(v_budget, sizeof(struct msix_entry), in i40e_init_msix()
11007 if (!pf->msix_entries) in i40e_init_msix()
11008 return -ENOMEM; in i40e_init_msix()
11011 pf->msix_entries[i].entry = i; in i40e_init_msix()
11015 pf->flags &= ~I40E_FLAG_MSIX_ENABLED; in i40e_init_msix()
11016 kfree(pf->msix_entries); in i40e_init_msix()
11017 pf->msix_entries = NULL; in i40e_init_msix()
11018 pci_disable_msix(pf->pdev); in i40e_init_msix()
11019 return -ENODEV; in i40e_init_msix()
11023 pf->num_vmdq_vsis = 0; in i40e_init_msix()
11024 pf->num_vmdq_qps = 0; in i40e_init_msix()
11025 pf->num_lan_qps = 1; in i40e_init_msix()
11026 pf->num_lan_msix = 1; in i40e_init_msix()
11036 dev_info(&pf->pdev->dev, in i40e_init_msix()
11037 "MSI-X vector limit reached with %d, wanted %d, attempting to redistribute vectors\n", in i40e_init_msix()
11040 vec = v_actual - 1; in i40e_init_msix()
11043 pf->num_vmdq_msix = 1; /* force VMDqs to only one vector */ in i40e_init_msix()
11044 pf->num_vmdq_vsis = 1; in i40e_init_msix()
11045 pf->num_vmdq_qps = 1; in i40e_init_msix()
11050 pf->num_lan_msix = 1; in i40e_init_msix()
11053 if (pf->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_init_msix()
11054 pf->num_lan_msix = 1; in i40e_init_msix()
11055 pf->num_iwarp_msix = 1; in i40e_init_msix()
11057 pf->num_lan_msix = 2; in i40e_init_msix()
11061 if (pf->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_init_msix()
11062 pf->num_iwarp_msix = min_t(int, (vec / 3), in i40e_init_msix()
11064 pf->num_vmdq_vsis = min_t(int, (vec / 3), in i40e_init_msix()
11067 pf->num_vmdq_vsis = min_t(int, (vec / 2), in i40e_init_msix()
11070 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_init_msix()
11071 pf->num_fdsb_msix = 1; in i40e_init_msix()
11072 vec--; in i40e_init_msix()
11074 pf->num_lan_msix = min_t(int, in i40e_init_msix()
11075 (vec - (pf->num_iwarp_msix + pf->num_vmdq_vsis)), in i40e_init_msix()
11076 pf->num_lan_msix); in i40e_init_msix()
11077 pf->num_lan_qps = pf->num_lan_msix; in i40e_init_msix()
11082 if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) && in i40e_init_msix()
11083 (pf->num_fdsb_msix == 0)) { in i40e_init_msix()
11084 dev_info(&pf->pdev->dev, "Sideband Flowdir disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
11085 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_init_msix()
11086 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_init_msix()
11088 if ((pf->flags & I40E_FLAG_VMDQ_ENABLED) && in i40e_init_msix()
11089 (pf->num_vmdq_msix == 0)) { in i40e_init_msix()
11090 dev_info(&pf->pdev->dev, "VMDq disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
11091 pf->flags &= ~I40E_FLAG_VMDQ_ENABLED; in i40e_init_msix()
11094 if ((pf->flags & I40E_FLAG_IWARP_ENABLED) && in i40e_init_msix()
11095 (pf->num_iwarp_msix == 0)) { in i40e_init_msix()
11096 dev_info(&pf->pdev->dev, "IWARP disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
11097 pf->flags &= ~I40E_FLAG_IWARP_ENABLED; in i40e_init_msix()
11099 i40e_debug(&pf->hw, I40E_DEBUG_INIT, in i40e_init_msix()
11100 "MSI-X vector distribution: PF %d, VMDq %d, FDSB %d, iWARP %d\n", in i40e_init_msix()
11101 pf->num_lan_msix, in i40e_init_msix()
11102 pf->num_vmdq_msix * pf->num_vmdq_vsis, in i40e_init_msix()
11103 pf->num_fdsb_msix, in i40e_init_msix()
11104 pf->num_iwarp_msix); in i40e_init_msix()
11110 * i40e_vsi_alloc_q_vector - Allocate memory for a single interrupt vector
11114 * We allocate one q_vector. If allocation fails we return -ENOMEM.
11123 return -ENOMEM; in i40e_vsi_alloc_q_vector()
11125 q_vector->vsi = vsi; in i40e_vsi_alloc_q_vector()
11126 q_vector->v_idx = v_idx; in i40e_vsi_alloc_q_vector()
11127 cpumask_copy(&q_vector->affinity_mask, cpu_possible_mask); in i40e_vsi_alloc_q_vector()
11129 if (vsi->netdev) in i40e_vsi_alloc_q_vector()
11130 netif_napi_add(vsi->netdev, &q_vector->napi, in i40e_vsi_alloc_q_vector()
11134 vsi->q_vectors[v_idx] = q_vector; in i40e_vsi_alloc_q_vector()
11140 * i40e_vsi_alloc_q_vectors - Allocate memory for interrupt vectors
11144 * return -ENOMEM.
11148 struct i40e_pf *pf = vsi->back; in i40e_vsi_alloc_q_vectors()
11152 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_alloc_q_vectors()
11153 num_q_vectors = vsi->num_q_vectors; in i40e_vsi_alloc_q_vectors()
11154 else if (vsi == pf->vsi[pf->lan_vsi]) in i40e_vsi_alloc_q_vectors()
11157 return -EINVAL; in i40e_vsi_alloc_q_vectors()
11168 while (v_idx--) in i40e_vsi_alloc_q_vectors()
11175 * i40e_init_interrupt_scheme - Determine proper interrupt scheme
11183 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_init_interrupt_scheme()
11186 pf->flags &= ~(I40E_FLAG_MSIX_ENABLED | in i40e_init_interrupt_scheme()
11195 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_init_interrupt_scheme()
11202 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED) && in i40e_init_interrupt_scheme()
11203 (pf->flags & I40E_FLAG_MSI_ENABLED)) { in i40e_init_interrupt_scheme()
11204 dev_info(&pf->pdev->dev, "MSI-X not available, trying MSI\n"); in i40e_init_interrupt_scheme()
11205 vectors = pci_enable_msi(pf->pdev); in i40e_init_interrupt_scheme()
11207 dev_info(&pf->pdev->dev, "MSI init failed - %d\n", in i40e_init_interrupt_scheme()
11209 pf->flags &= ~I40E_FLAG_MSI_ENABLED; in i40e_init_interrupt_scheme()
11214 if (!(pf->flags & (I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED))) in i40e_init_interrupt_scheme()
11215 dev_info(&pf->pdev->dev, "MSI-X and MSI not available, falling back to Legacy IRQ\n"); in i40e_init_interrupt_scheme()
11219 pf->irq_pile = kzalloc(size, GFP_KERNEL); in i40e_init_interrupt_scheme()
11220 if (!pf->irq_pile) in i40e_init_interrupt_scheme()
11221 return -ENOMEM; in i40e_init_interrupt_scheme()
11223 pf->irq_pile->num_entries = vectors; in i40e_init_interrupt_scheme()
11224 pf->irq_pile->search_hint = 0; in i40e_init_interrupt_scheme()
11227 (void)i40e_get_lump(pf, pf->irq_pile, 1, I40E_PILE_VALID_BIT - 1); in i40e_init_interrupt_scheme()
11233 * i40e_restore_interrupt_scheme - Restore the interrupt scheme
11237 * device. This should be called during resume to re-allocate the q_vectors
11244 /* We cleared the MSI and MSI-X flags when disabling the old interrupt in i40e_restore_interrupt_scheme()
11245 * scheme. We need to re-enabled them here in order to attempt to in i40e_restore_interrupt_scheme()
11246 * re-acquire the MSI or MSI-X vectors in i40e_restore_interrupt_scheme()
11248 pf->flags |= (I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED); in i40e_restore_interrupt_scheme()
11254 /* Now that we've re-acquired IRQs, we need to remap the vectors and in i40e_restore_interrupt_scheme()
11257 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_restore_interrupt_scheme()
11258 if (pf->vsi[i]) { in i40e_restore_interrupt_scheme()
11259 err = i40e_vsi_alloc_q_vectors(pf->vsi[i]); in i40e_restore_interrupt_scheme()
11262 i40e_vsi_map_rings_to_vectors(pf->vsi[i]); in i40e_restore_interrupt_scheme()
11270 if (pf->flags & I40E_FLAG_IWARP_ENABLED) in i40e_restore_interrupt_scheme()
11276 while (i--) { in i40e_restore_interrupt_scheme()
11277 if (pf->vsi[i]) in i40e_restore_interrupt_scheme()
11278 i40e_vsi_free_q_vectors(pf->vsi[i]); in i40e_restore_interrupt_scheme()
11285 * i40e_setup_misc_vector_for_recovery_mode - Setup the misc vector to handle
11290 * the non-queue interrupts, e.g. AdminQ and errors in recovery mode.
11298 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_setup_misc_vector_for_recovery_mode()
11302 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector_for_recovery_mode()
11303 "MSI-X misc vector request failed, error %d\n", in i40e_setup_misc_vector_for_recovery_mode()
11308 u32 flags = pf->flags & I40E_FLAG_MSI_ENABLED ? 0 : IRQF_SHARED; in i40e_setup_misc_vector_for_recovery_mode()
11310 err = request_irq(pf->pdev->irq, i40e_intr, flags, in i40e_setup_misc_vector_for_recovery_mode()
11311 pf->int_name, pf); in i40e_setup_misc_vector_for_recovery_mode()
11314 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector_for_recovery_mode()
11327 * i40e_setup_misc_vector - Setup the misc vector to handle non queue events
11331 * non-queue interrupts, e.g. AdminQ and errors. This is not used
11336 struct i40e_hw *hw = &pf->hw; in i40e_setup_misc_vector()
11340 if (!test_and_set_bit(__I40E_MISC_IRQ_REQUESTED, pf->state)) { in i40e_setup_misc_vector()
11341 err = request_irq(pf->msix_entries[0].vector, in i40e_setup_misc_vector()
11342 i40e_intr, 0, pf->int_name, pf); in i40e_setup_misc_vector()
11344 clear_bit(__I40E_MISC_IRQ_REQUESTED, pf->state); in i40e_setup_misc_vector()
11345 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector()
11347 pf->int_name, err); in i40e_setup_misc_vector()
11348 return -EFAULT; in i40e_setup_misc_vector()
11366 * i40e_get_rss_aq - Get RSS keys and lut by using AQ commands
11377 struct i40e_pf *pf = vsi->back; in i40e_get_rss_aq()
11378 struct i40e_hw *hw = &pf->hw; in i40e_get_rss_aq()
11382 ret = i40e_aq_get_rss_key(hw, vsi->id, in i40e_get_rss_aq()
11385 dev_info(&pf->pdev->dev, in i40e_get_rss_aq()
11387 i40e_stat_str(&pf->hw, ret), in i40e_get_rss_aq()
11388 i40e_aq_str(&pf->hw, in i40e_get_rss_aq()
11389 pf->hw.aq.asq_last_status)); in i40e_get_rss_aq()
11395 bool pf_lut = vsi->type == I40E_VSI_MAIN; in i40e_get_rss_aq()
11397 ret = i40e_aq_get_rss_lut(hw, vsi->id, pf_lut, lut, lut_size); in i40e_get_rss_aq()
11399 dev_info(&pf->pdev->dev, in i40e_get_rss_aq()
11401 i40e_stat_str(&pf->hw, ret), in i40e_get_rss_aq()
11402 i40e_aq_str(&pf->hw, in i40e_get_rss_aq()
11403 pf->hw.aq.asq_last_status)); in i40e_get_rss_aq()
11412 * i40e_config_rss_reg - Configure RSS keys and lut by writing registers
11423 struct i40e_pf *pf = vsi->back; in i40e_config_rss_reg()
11424 struct i40e_hw *hw = &pf->hw; in i40e_config_rss_reg()
11425 u16 vf_id = vsi->vf_id; in i40e_config_rss_reg()
11432 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_rss_reg()
11435 } else if (vsi->type == I40E_VSI_SRIOV) { in i40e_config_rss_reg()
11439 dev_err(&pf->pdev->dev, "Cannot set RSS seed - invalid VSI type\n"); in i40e_config_rss_reg()
11446 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_rss_reg()
11448 return -EINVAL; in i40e_config_rss_reg()
11451 } else if (vsi->type == I40E_VSI_SRIOV) { in i40e_config_rss_reg()
11453 return -EINVAL; in i40e_config_rss_reg()
11457 dev_err(&pf->pdev->dev, "Cannot set RSS LUT - invalid VSI type\n"); in i40e_config_rss_reg()
11466 * i40e_get_rss_reg - Get the RSS keys and lut by reading registers
11477 struct i40e_pf *pf = vsi->back; in i40e_get_rss_reg()
11478 struct i40e_hw *hw = &pf->hw; in i40e_get_rss_reg()
11491 return -EINVAL; in i40e_get_rss_reg()
11500 * i40e_config_rss - Configure RSS keys and lut
11510 struct i40e_pf *pf = vsi->back; in i40e_config_rss()
11512 if (pf->hw_features & I40E_HW_RSS_AQ_CAPABLE) in i40e_config_rss()
11519 * i40e_get_rss - Get RSS keys and lut
11529 struct i40e_pf *pf = vsi->back; in i40e_get_rss()
11531 if (pf->hw_features & I40E_HW_RSS_AQ_CAPABLE) in i40e_get_rss()
11538 * i40e_fill_rss_lut - Fill the RSS lookup table with default values
11554 * i40e_pf_config_rss - Prepare for RSS if used
11559 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_pf_config_rss()
11562 struct i40e_hw *hw = &pf->hw; in i40e_pf_config_rss()
11577 reg_val = (pf->rss_table_size == 512) ? in i40e_pf_config_rss()
11583 if (!vsi->rss_size) { in i40e_pf_config_rss()
11586 * could end up with zero TCs. Check for that to avoid in i40e_pf_config_rss()
11587 * divide-by-zero. It probably won't pass traffic, but it also in i40e_pf_config_rss()
11590 qcount = vsi->num_queue_pairs / in i40e_pf_config_rss()
11591 (vsi->tc_config.numtc ? vsi->tc_config.numtc : 1); in i40e_pf_config_rss()
11592 vsi->rss_size = min_t(int, pf->alloc_rss_size, qcount); in i40e_pf_config_rss()
11594 if (!vsi->rss_size) in i40e_pf_config_rss()
11595 return -EINVAL; in i40e_pf_config_rss()
11597 lut = kzalloc(vsi->rss_table_size, GFP_KERNEL); in i40e_pf_config_rss()
11599 return -ENOMEM; in i40e_pf_config_rss()
11602 if (vsi->rss_lut_user) in i40e_pf_config_rss()
11603 memcpy(lut, vsi->rss_lut_user, vsi->rss_table_size); in i40e_pf_config_rss()
11605 i40e_fill_rss_lut(pf, lut, vsi->rss_table_size, vsi->rss_size); in i40e_pf_config_rss()
11610 if (vsi->rss_hkey_user) in i40e_pf_config_rss()
11611 memcpy(seed, vsi->rss_hkey_user, I40E_HKEY_ARRAY_SIZE); in i40e_pf_config_rss()
11614 ret = i40e_config_rss(vsi, seed, lut, vsi->rss_table_size); in i40e_pf_config_rss()
11621 * i40e_reconfig_rss_queues - change number of queues for rss and rebuild
11631 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_reconfig_rss_queues()
11634 if (!(pf->flags & I40E_FLAG_RSS_ENABLED)) in i40e_reconfig_rss_queues()
11638 new_rss_size = min_t(int, queue_count, pf->rss_size_max); in i40e_reconfig_rss_queues()
11640 if (queue_count != vsi->num_queue_pairs) { in i40e_reconfig_rss_queues()
11643 vsi->req_queue_pairs = queue_count; in i40e_reconfig_rss_queues()
11646 pf->alloc_rss_size = new_rss_size; in i40e_reconfig_rss_queues()
11653 if (queue_count < vsi->rss_size) { in i40e_reconfig_rss_queues()
11655 dev_dbg(&pf->pdev->dev, in i40e_reconfig_rss_queues()
11659 /* Reset vsi->rss_size, as number of enabled queues changed */ in i40e_reconfig_rss_queues()
11660 qcount = vsi->num_queue_pairs / vsi->tc_config.numtc; in i40e_reconfig_rss_queues()
11661 vsi->rss_size = min_t(int, pf->alloc_rss_size, qcount); in i40e_reconfig_rss_queues()
11665 dev_info(&pf->pdev->dev, "User requested queue count/HW max RSS count: %d/%d\n", in i40e_reconfig_rss_queues()
11666 vsi->req_queue_pairs, pf->rss_size_max); in i40e_reconfig_rss_queues()
11667 return pf->alloc_rss_size; in i40e_reconfig_rss_queues()
11671 * i40e_get_partition_bw_setting - Retrieve BW settings for this PF partition
11680 status = i40e_read_bw_from_alt_ram(&pf->hw, &max_bw, &min_bw, in i40e_get_partition_bw_setting()
11685 pf->min_bw = min_bw; in i40e_get_partition_bw_setting()
11687 pf->max_bw = max_bw; in i40e_get_partition_bw_setting()
11694 * i40e_set_partition_bw_setting - Set BW settings for this PF partition
11703 bw_data.pf_valid_bits = cpu_to_le16(BIT(pf->hw.pf_id)); in i40e_set_partition_bw_setting()
11704 bw_data.max_bw[pf->hw.pf_id] = pf->max_bw & I40E_ALT_BW_VALUE_MASK; in i40e_set_partition_bw_setting()
11705 bw_data.min_bw[pf->hw.pf_id] = pf->min_bw & I40E_ALT_BW_VALUE_MASK; in i40e_set_partition_bw_setting()
11708 status = i40e_aq_configure_partition_bw(&pf->hw, &bw_data, NULL); in i40e_set_partition_bw_setting()
11714 * i40e_commit_partition_bw_setting - Commit BW settings for this PF partition
11724 if (pf->hw.partition_id != 1) { in i40e_commit_partition_bw_setting()
11725 dev_info(&pf->pdev->dev, in i40e_commit_partition_bw_setting()
11727 pf->hw.partition_id); in i40e_commit_partition_bw_setting()
11733 ret = i40e_acquire_nvm(&pf->hw, I40E_RESOURCE_READ); in i40e_commit_partition_bw_setting()
11734 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_partition_bw_setting()
11736 dev_info(&pf->pdev->dev, in i40e_commit_partition_bw_setting()
11738 i40e_stat_str(&pf->hw, ret), in i40e_commit_partition_bw_setting()
11739 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_partition_bw_setting()
11743 /* Read word 0x10 of NVM - SW compatibility word 1 */ in i40e_commit_partition_bw_setting()
11744 ret = i40e_aq_read_nvm(&pf->hw, in i40e_commit_partition_bw_setting()
11751 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_partition_bw_setting()
11752 i40e_release_nvm(&pf->hw); in i40e_commit_partition_bw_setting()
11754 dev_info(&pf->pdev->dev, "NVM read error, err %s aq_err %s\n", in i40e_commit_partition_bw_setting()
11755 i40e_stat_str(&pf->hw, ret), in i40e_commit_partition_bw_setting()
11756 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_partition_bw_setting()
11760 /* Wait a bit for NVM release to complete */ in i40e_commit_partition_bw_setting()
11764 ret = i40e_acquire_nvm(&pf->hw, I40E_RESOURCE_WRITE); in i40e_commit_partition_bw_setting()
11765 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_partition_bw_setting()
11767 dev_info(&pf->pdev->dev, in i40e_commit_partition_bw_setting()
11769 i40e_stat_str(&pf->hw, ret), in i40e_commit_partition_bw_setting()
11770 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_partition_bw_setting()
11775 * the NVM - thus storing the bandwidth values permanently. in i40e_commit_partition_bw_setting()
11777 ret = i40e_aq_update_nvm(&pf->hw, in i40e_commit_partition_bw_setting()
11784 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_partition_bw_setting()
11785 i40e_release_nvm(&pf->hw); in i40e_commit_partition_bw_setting()
11787 dev_info(&pf->pdev->dev, in i40e_commit_partition_bw_setting()
11789 i40e_stat_str(&pf->hw, ret), in i40e_commit_partition_bw_setting()
11790 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_partition_bw_setting()
11797 * i40e_is_total_port_shutdown_enabled - read NVM and return value
11816 read_status = i40e_read_nvm_word(&pf->hw, in i40e_is_total_port_shutdown_enabled()
11821 read_status = i40e_read_nvm_word(&pf->hw, in i40e_is_total_port_shutdown_enabled()
11828 read_status = i40e_read_nvm_module_data(&pf->hw, in i40e_is_total_port_shutdown_enabled()
11836 link_behavior >>= (pf->hw.port * I40E_LINK_BEHAVIOR_PORT_BIT_LENGTH); in i40e_is_total_port_shutdown_enabled()
11842 dev_warn(&pf->pdev->dev, in i40e_is_total_port_shutdown_enabled()
11843 "total-port-shutdown feature is off due to read nvm error: %s\n", in i40e_is_total_port_shutdown_enabled()
11844 i40e_stat_str(&pf->hw, read_status)); in i40e_is_total_port_shutdown_enabled()
11849 * i40e_sw_init - Initialize general software structures (struct i40e_pf)
11862 pf->flags = I40E_FLAG_RX_CSUM_ENABLED | in i40e_sw_init()
11867 pf->rx_itr_default = I40E_ITR_RX_DEF; in i40e_sw_init()
11868 pf->tx_itr_default = I40E_ITR_TX_DEF; in i40e_sw_init()
11873 pf->rss_size_max = BIT(pf->hw.func_caps.rss_table_entry_width); in i40e_sw_init()
11874 pf->alloc_rss_size = 1; in i40e_sw_init()
11875 pf->rss_table_size = pf->hw.func_caps.rss_table_size; in i40e_sw_init()
11876 pf->rss_size_max = min_t(int, pf->rss_size_max, in i40e_sw_init()
11877 pf->hw.func_caps.num_tx_qp); in i40e_sw_init()
11878 if (pf->hw.func_caps.rss) { in i40e_sw_init()
11879 pf->flags |= I40E_FLAG_RSS_ENABLED; in i40e_sw_init()
11880 pf->alloc_rss_size = min_t(int, pf->rss_size_max, in i40e_sw_init()
11885 if (pf->hw.func_caps.npar_enable || pf->hw.func_caps.flex10_enable) { in i40e_sw_init()
11886 pf->flags |= I40E_FLAG_MFP_ENABLED; in i40e_sw_init()
11887 dev_info(&pf->pdev->dev, "MFP mode Enabled\n"); in i40e_sw_init()
11889 dev_warn(&pf->pdev->dev, in i40e_sw_init()
11892 dev_info(&pf->pdev->dev, in i40e_sw_init()
11894 pf->min_bw, pf->max_bw); in i40e_sw_init()
11901 if ((pf->hw.func_caps.fd_filters_guaranteed > 0) || in i40e_sw_init()
11902 (pf->hw.func_caps.fd_filters_best_effort > 0)) { in i40e_sw_init()
11903 pf->flags |= I40E_FLAG_FD_ATR_ENABLED; in i40e_sw_init()
11904 pf->atr_sample_rate = I40E_DEFAULT_ATR_SAMPLE_RATE; in i40e_sw_init()
11905 if (pf->flags & I40E_FLAG_MFP_ENABLED && in i40e_sw_init()
11906 pf->hw.num_partitions > 1) in i40e_sw_init()
11907 dev_info(&pf->pdev->dev, in i40e_sw_init()
11910 pf->flags |= I40E_FLAG_FD_SB_ENABLED; in i40e_sw_init()
11911 pf->fdir_pf_filter_count = in i40e_sw_init()
11912 pf->hw.func_caps.fd_filters_guaranteed; in i40e_sw_init()
11913 pf->hw.fdir_shared_filter_count = in i40e_sw_init()
11914 pf->hw.func_caps.fd_filters_best_effort; in i40e_sw_init()
11917 if (pf->hw.mac.type == I40E_MAC_X722) { in i40e_sw_init()
11918 pf->hw_features |= (I40E_HW_RSS_AQ_CAPABLE | in i40e_sw_init()
11931 if (rd32(&pf->hw, I40E_GLQF_FDEVICTENA(1)) != in i40e_sw_init()
11933 dev_warn(&pf->pdev->dev, in i40e_sw_init()
11935 pf->hw_features &= ~I40E_HW_ATR_EVICT_CAPABLE; in i40e_sw_init()
11937 } else if ((pf->hw.aq.api_maj_ver > 1) || in i40e_sw_init()
11938 ((pf->hw.aq.api_maj_ver == 1) && in i40e_sw_init()
11939 (pf->hw.aq.api_min_ver > 4))) { in i40e_sw_init()
11941 pf->hw_features |= I40E_HW_GENEVE_OFFLOAD_CAPABLE; in i40e_sw_init()
11945 if (pf->hw_features & I40E_HW_ATR_EVICT_CAPABLE) in i40e_sw_init()
11946 pf->flags |= I40E_FLAG_HW_ATR_EVICT_ENABLED; in i40e_sw_init()
11948 if ((pf->hw.mac.type == I40E_MAC_XL710) && in i40e_sw_init()
11949 (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) || in i40e_sw_init()
11950 (pf->hw.aq.fw_maj_ver < 4))) { in i40e_sw_init()
11951 pf->hw_features |= I40E_HW_RESTART_AUTONEG; in i40e_sw_init()
11953 pf->hw_features |= I40E_HW_NO_DCB_SUPPORT; in i40e_sw_init()
11957 if ((pf->hw.mac.type == I40E_MAC_XL710) && in i40e_sw_init()
11958 (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 3)) || in i40e_sw_init()
11959 (pf->hw.aq.fw_maj_ver < 4))) in i40e_sw_init()
11960 pf->hw_features |= I40E_HW_STOP_FW_LLDP; in i40e_sw_init()
11963 if ((pf->hw.mac.type == I40E_MAC_XL710) && in i40e_sw_init()
11964 (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver >= 40)) || in i40e_sw_init()
11965 (pf->hw.aq.fw_maj_ver >= 5))) in i40e_sw_init()
11966 pf->hw_features |= I40E_HW_USE_SET_LLDP_MIB; in i40e_sw_init()
11969 if (pf->hw.mac.type == I40E_MAC_XL710 && in i40e_sw_init()
11970 pf->hw.aq.fw_maj_ver >= 6) in i40e_sw_init()
11971 pf->hw_features |= I40E_HW_PTP_L4_CAPABLE; in i40e_sw_init()
11973 if (pf->hw.func_caps.vmdq && num_online_cpus() != 1) { in i40e_sw_init()
11974 pf->num_vmdq_vsis = I40E_DEFAULT_NUM_VMDQ_VSI; in i40e_sw_init()
11975 pf->flags |= I40E_FLAG_VMDQ_ENABLED; in i40e_sw_init()
11976 pf->num_vmdq_qps = i40e_default_queues_per_vmdq(pf); in i40e_sw_init()
11979 if (pf->hw.func_caps.iwarp && num_online_cpus() != 1) { in i40e_sw_init()
11980 pf->flags |= I40E_FLAG_IWARP_ENABLED; in i40e_sw_init()
11982 pf->num_iwarp_msix = (int)num_online_cpus() + 1; in i40e_sw_init()
11989 if (pf->hw.mac.type == I40E_MAC_XL710 && in i40e_sw_init()
11990 pf->hw.func_caps.npar_enable && in i40e_sw_init()
11991 (pf->hw.flags & I40E_HW_FLAG_FW_LLDP_STOPPABLE)) in i40e_sw_init()
11992 pf->hw.flags &= ~I40E_HW_FLAG_FW_LLDP_STOPPABLE; in i40e_sw_init()
11995 if (pf->hw.func_caps.num_vfs && pf->hw.partition_id == 1) { in i40e_sw_init()
11996 pf->num_vf_qps = I40E_DEFAULT_QUEUES_PER_VF; in i40e_sw_init()
11997 pf->flags |= I40E_FLAG_SRIOV_ENABLED; in i40e_sw_init()
11998 pf->num_req_vfs = min_t(int, in i40e_sw_init()
11999 pf->hw.func_caps.num_vfs, in i40e_sw_init()
12003 pf->eeprom_version = 0xDEAD; in i40e_sw_init()
12004 pf->lan_veb = I40E_NO_VEB; in i40e_sw_init()
12005 pf->lan_vsi = I40E_NO_VSI; in i40e_sw_init()
12008 pf->flags &= ~I40E_FLAG_VEB_STATS_ENABLED; in i40e_sw_init()
12012 + (sizeof(u16) * pf->hw.func_caps.num_tx_qp); in i40e_sw_init()
12013 pf->qp_pile = kzalloc(size, GFP_KERNEL); in i40e_sw_init()
12014 if (!pf->qp_pile) { in i40e_sw_init()
12015 err = -ENOMEM; in i40e_sw_init()
12018 pf->qp_pile->num_entries = pf->hw.func_caps.num_tx_qp; in i40e_sw_init()
12019 pf->qp_pile->search_hint = 0; in i40e_sw_init()
12021 pf->tx_timeout_recovery_level = 1; in i40e_sw_init()
12023 if (pf->hw.mac.type != I40E_MAC_X722 && in i40e_sw_init()
12028 pf->flags |= (I40E_FLAG_TOTAL_PORT_SHUTDOWN_ENABLED | in i40e_sw_init()
12030 dev_info(&pf->pdev->dev, in i40e_sw_init()
12031 "total-port-shutdown was enabled, link-down-on-close is forced on\n"); in i40e_sw_init()
12033 mutex_init(&pf->switch_mutex); in i40e_sw_init()
12040 * i40e_set_ntuple - set the ntuple feature flag and take action
12050 /* Check if Flow Director n-tuple support was enabled or disabled. If in i40e_set_ntuple()
12055 if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_set_ntuple()
12057 /* enable FD_SB only if there is MSI-X vector and no cloud in i40e_set_ntuple()
12060 if (pf->num_fdsb_msix > 0 && !pf->num_cloud_filters) { in i40e_set_ntuple()
12061 pf->flags |= I40E_FLAG_FD_SB_ENABLED; in i40e_set_ntuple()
12062 pf->flags &= ~I40E_FLAG_FD_SB_INACTIVE; in i40e_set_ntuple()
12066 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_set_ntuple()
12070 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_set_ntuple()
12071 clear_bit(__I40E_FD_SB_AUTO_DISABLED, pf->state); in i40e_set_ntuple()
12072 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_set_ntuple()
12075 pf->fd_add_err = 0; in i40e_set_ntuple()
12076 pf->fd_atr_cnt = 0; in i40e_set_ntuple()
12077 /* if ATR was auto disabled it can be re-enabled. */ in i40e_set_ntuple()
12078 if (test_and_clear_bit(__I40E_FD_ATR_AUTO_DISABLED, pf->state)) in i40e_set_ntuple()
12079 if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) && in i40e_set_ntuple()
12080 (I40E_DEBUG_FD & pf->hw.debug_mask)) in i40e_set_ntuple()
12081 dev_info(&pf->pdev->dev, "ATR re-enabled.\n"); in i40e_set_ntuple()
12087 * i40e_clear_rss_lut - clear the rx hash lookup table
12092 struct i40e_pf *pf = vsi->back; in i40e_clear_rss_lut()
12093 struct i40e_hw *hw = &pf->hw; in i40e_clear_rss_lut()
12094 u16 vf_id = vsi->vf_id; in i40e_clear_rss_lut()
12097 if (vsi->type == I40E_VSI_MAIN) { in i40e_clear_rss_lut()
12100 } else if (vsi->type == I40E_VSI_SRIOV) { in i40e_clear_rss_lut()
12104 dev_err(&pf->pdev->dev, "Cannot set RSS LUT - invalid VSI type\n"); in i40e_clear_rss_lut()
12109 * i40e_set_features - set the netdev feature flags
12118 struct i40e_vsi *vsi = np->vsi; in i40e_set_features()
12119 struct i40e_pf *pf = vsi->back; in i40e_set_features()
12122 if (features & NETIF_F_RXHASH && !(netdev->features & NETIF_F_RXHASH)) in i40e_set_features()
12125 netdev->features & NETIF_F_RXHASH) in i40e_set_features()
12133 if (!(features & NETIF_F_HW_TC) && pf->num_cloud_filters) { in i40e_set_features()
12134 dev_err(&pf->pdev->dev, in i40e_set_features()
12136 return -EINVAL; in i40e_set_features()
12139 if (!(features & NETIF_F_HW_L2FW_DOFFLOAD) && vsi->macvlan_cnt) in i40e_set_features()
12155 struct i40e_hw *hw = &np->vsi->back->hw; in i40e_udp_tunnel_set_port()
12159 type = ti->type == UDP_TUNNEL_TYPE_VXLAN ? I40E_AQC_TUNNEL_TYPE_VXLAN : in i40e_udp_tunnel_set_port()
12162 ret = i40e_aq_add_udp_tunnel(hw, ntohs(ti->port), type, &filter_index, in i40e_udp_tunnel_set_port()
12167 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_udp_tunnel_set_port()
12168 return -EIO; in i40e_udp_tunnel_set_port()
12180 struct i40e_hw *hw = &np->vsi->back->hw; in i40e_udp_tunnel_unset_port()
12183 ret = i40e_aq_del_udp_tunnel(hw, ti->hw_priv, NULL); in i40e_udp_tunnel_unset_port()
12187 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_udp_tunnel_unset_port()
12188 return -EIO; in i40e_udp_tunnel_unset_port()
12198 struct i40e_pf *pf = np->vsi->back; in i40e_get_phys_port_id()
12199 struct i40e_hw *hw = &pf->hw; in i40e_get_phys_port_id()
12201 if (!(pf->hw_features & I40E_HW_PORT_ID_VALID)) in i40e_get_phys_port_id()
12202 return -EOPNOTSUPP; in i40e_get_phys_port_id()
12204 ppid->id_len = min_t(int, sizeof(hw->mac.port_addr), sizeof(ppid->id)); in i40e_get_phys_port_id()
12205 memcpy(ppid->id, hw->mac.port_addr, ppid->id_len); in i40e_get_phys_port_id()
12211 * i40e_ndo_fdb_add - add an entry to the hardware database
12227 struct i40e_pf *pf = np->vsi->back; in i40e_ndo_fdb_add()
12230 if (!(pf->flags & I40E_FLAG_SRIOV_ENABLED)) in i40e_ndo_fdb_add()
12231 return -EOPNOTSUPP; in i40e_ndo_fdb_add()
12234 pr_info("%s: vlans aren't supported yet for dev_uc|mc_add()\n", dev->name); in i40e_ndo_fdb_add()
12235 return -EINVAL; in i40e_ndo_fdb_add()
12241 if (ndm->ndm_state && !(ndm->ndm_state & NUD_PERMANENT)) { in i40e_ndo_fdb_add()
12243 return -EINVAL; in i40e_ndo_fdb_add()
12251 err = -EINVAL; in i40e_ndo_fdb_add()
12254 if (err == -EEXIST && !(flags & NLM_F_EXCL)) in i40e_ndo_fdb_add()
12261 * i40e_ndo_bridge_setlink - Set the hardware bridge mode
12282 struct i40e_vsi *vsi = np->vsi; in i40e_ndo_bridge_setlink()
12283 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_setlink()
12289 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) in i40e_ndo_bridge_setlink()
12290 return -EOPNOTSUPP; in i40e_ndo_bridge_setlink()
12294 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_ndo_bridge_setlink()
12295 veb = pf->veb[i]; in i40e_ndo_bridge_setlink()
12309 return -EINVAL; in i40e_ndo_bridge_setlink()
12313 veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid, in i40e_ndo_bridge_setlink()
12314 vsi->tc_config.enabled_tc); in i40e_ndo_bridge_setlink()
12316 veb->bridge_mode = mode; in i40e_ndo_bridge_setlink()
12320 return -ENOENT; in i40e_ndo_bridge_setlink()
12323 } else if (mode != veb->bridge_mode) { in i40e_ndo_bridge_setlink()
12325 veb->bridge_mode = mode; in i40e_ndo_bridge_setlink()
12328 pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; in i40e_ndo_bridge_setlink()
12330 pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; in i40e_ndo_bridge_setlink()
12340 * i40e_ndo_bridge_getlink - Get the hardware bridge mode
12357 struct i40e_vsi *vsi = np->vsi; in i40e_ndo_bridge_getlink()
12358 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_getlink()
12363 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) in i40e_ndo_bridge_getlink()
12364 return -EOPNOTSUPP; in i40e_ndo_bridge_getlink()
12368 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_ndo_bridge_getlink()
12369 veb = pf->veb[i]; in i40e_ndo_bridge_getlink()
12375 return ndo_dflt_bridge_getlink(skb, pid, seq, dev, veb->bridge_mode, in i40e_ndo_bridge_getlink()
12380 * i40e_features_check - Validate encapsulated packet conforms to limits
12395 if (skb->ip_summed != CHECKSUM_PARTIAL) in i40e_features_check()
12401 if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_size < 64)) in i40e_features_check()
12405 len = skb_network_header(skb) - skb->data; in i40e_features_check()
12410 len = skb_transport_header(skb) - skb_network_header(skb); in i40e_features_check()
12414 if (skb->encapsulation) { in i40e_features_check()
12416 len = skb_inner_network_header(skb) - skb_transport_header(skb); in i40e_features_check()
12421 len = skb_inner_transport_header(skb) - in i40e_features_check()
12438 * i40e_xdp_setup - add/remove an XDP program
12445 int frame_size = vsi->netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN; in i40e_xdp_setup()
12446 struct i40e_pf *pf = vsi->back; in i40e_xdp_setup()
12452 if (frame_size > vsi->rx_buf_len) in i40e_xdp_setup()
12453 return -EINVAL; in i40e_xdp_setup()
12458 /* When turning XDP on->off/off->on we reset and rebuild the rings. */ in i40e_xdp_setup()
12464 old_prog = xchg(&vsi->xdp_prog, prog); in i40e_xdp_setup()
12468 /* Wait until ndo_xsk_wakeup completes. */ in i40e_xdp_setup()
12473 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_xdp_setup()
12474 WRITE_ONCE(vsi->rx_rings[i]->xdp_prog, vsi->xdp_prog); in i40e_xdp_setup()
12483 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_xdp_setup()
12484 if (vsi->xdp_rings[i]->xsk_pool) in i40e_xdp_setup()
12485 (void)i40e_xsk_wakeup(vsi->netdev, i, in i40e_xdp_setup()
12492 * i40e_enter_busy_conf - Enters busy config state
12499 struct i40e_pf *pf = vsi->back; in i40e_enter_busy_conf()
12502 while (test_and_set_bit(__I40E_CONFIG_BUSY, pf->state)) { in i40e_enter_busy_conf()
12503 timeout--; in i40e_enter_busy_conf()
12505 return -EBUSY; in i40e_enter_busy_conf()
12513 * i40e_exit_busy_conf - Exits busy config state
12518 struct i40e_pf *pf = vsi->back; in i40e_exit_busy_conf()
12520 clear_bit(__I40E_CONFIG_BUSY, pf->state); in i40e_exit_busy_conf()
12524 * i40e_queue_pair_reset_stats - Resets all statistics for a queue pair
12530 memset(&vsi->rx_rings[queue_pair]->rx_stats, 0, in i40e_queue_pair_reset_stats()
12531 sizeof(vsi->rx_rings[queue_pair]->rx_stats)); in i40e_queue_pair_reset_stats()
12532 memset(&vsi->tx_rings[queue_pair]->stats, 0, in i40e_queue_pair_reset_stats()
12533 sizeof(vsi->tx_rings[queue_pair]->stats)); in i40e_queue_pair_reset_stats()
12535 memset(&vsi->xdp_rings[queue_pair]->stats, 0, in i40e_queue_pair_reset_stats()
12536 sizeof(vsi->xdp_rings[queue_pair]->stats)); in i40e_queue_pair_reset_stats()
12541 * i40e_queue_pair_clean_rings - Cleans all the rings of a queue pair
12547 i40e_clean_tx_ring(vsi->tx_rings[queue_pair]); in i40e_queue_pair_clean_rings()
12549 /* Make sure that in-progress ndo_xdp_xmit calls are in i40e_queue_pair_clean_rings()
12553 i40e_clean_tx_ring(vsi->xdp_rings[queue_pair]); in i40e_queue_pair_clean_rings()
12555 i40e_clean_rx_ring(vsi->rx_rings[queue_pair]); in i40e_queue_pair_clean_rings()
12559 * i40e_queue_pair_toggle_napi - Enables/disables NAPI for a queue pair
12567 struct i40e_ring *rxr = vsi->rx_rings[queue_pair]; in i40e_queue_pair_toggle_napi()
12568 struct i40e_q_vector *q_vector = rxr->q_vector; in i40e_queue_pair_toggle_napi()
12570 if (!vsi->netdev) in i40e_queue_pair_toggle_napi()
12574 if (q_vector->rx.ring || q_vector->tx.ring) { in i40e_queue_pair_toggle_napi()
12576 napi_enable(&q_vector->napi); in i40e_queue_pair_toggle_napi()
12578 napi_disable(&q_vector->napi); in i40e_queue_pair_toggle_napi()
12583 * i40e_queue_pair_toggle_rings - Enables/disables all rings for a queue pair
12593 struct i40e_pf *pf = vsi->back; in i40e_queue_pair_toggle_rings()
12596 pf_q = vsi->base_queue + queue_pair; in i40e_queue_pair_toggle_rings()
12597 ret = i40e_control_wait_tx_q(vsi->seid, pf, pf_q, in i40e_queue_pair_toggle_rings()
12600 dev_info(&pf->pdev->dev, in i40e_queue_pair_toggle_rings()
12602 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_queue_pair_toggle_rings()
12609 dev_info(&pf->pdev->dev, in i40e_queue_pair_toggle_rings()
12611 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_queue_pair_toggle_rings()
12624 ret = i40e_control_wait_tx_q(vsi->seid, pf, in i40e_queue_pair_toggle_rings()
12625 pf_q + vsi->alloc_queue_pairs, in i40e_queue_pair_toggle_rings()
12628 dev_info(&pf->pdev->dev, in i40e_queue_pair_toggle_rings()
12630 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_queue_pair_toggle_rings()
12637 * i40e_queue_pair_enable_irq - Enables interrupts for a queue pair
12643 struct i40e_ring *rxr = vsi->rx_rings[queue_pair]; in i40e_queue_pair_enable_irq()
12644 struct i40e_pf *pf = vsi->back; in i40e_queue_pair_enable_irq()
12645 struct i40e_hw *hw = &pf->hw; in i40e_queue_pair_enable_irq()
12648 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_queue_pair_enable_irq()
12649 i40e_irq_dynamic_enable(vsi, rxr->q_vector->v_idx); in i40e_queue_pair_enable_irq()
12657 * i40e_queue_pair_disable_irq - Disables interrupts for a queue pair
12663 struct i40e_ring *rxr = vsi->rx_rings[queue_pair]; in i40e_queue_pair_disable_irq()
12664 struct i40e_pf *pf = vsi->back; in i40e_queue_pair_disable_irq()
12665 struct i40e_hw *hw = &pf->hw; in i40e_queue_pair_disable_irq()
12673 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_queue_pair_disable_irq()
12674 u32 intpf = vsi->base_vector + rxr->q_vector->v_idx; in i40e_queue_pair_disable_irq()
12676 wr32(hw, I40E_PFINT_DYN_CTLN(intpf - 1), 0); in i40e_queue_pair_disable_irq()
12678 synchronize_irq(pf->msix_entries[intpf].vector); in i40e_queue_pair_disable_irq()
12680 /* Legacy and MSI mode - this stops all interrupt handling */ in i40e_queue_pair_disable_irq()
12684 synchronize_irq(pf->pdev->irq); in i40e_queue_pair_disable_irq()
12689 * i40e_queue_pair_disable - Disables a queue pair
12713 * i40e_queue_pair_enable - Enables a queue pair
12723 err = i40e_configure_tx_ring(vsi->tx_rings[queue_pair]); in i40e_queue_pair_enable()
12728 err = i40e_configure_tx_ring(vsi->xdp_rings[queue_pair]); in i40e_queue_pair_enable()
12733 err = i40e_configure_rx_ring(vsi->rx_rings[queue_pair]); in i40e_queue_pair_enable()
12747 * i40e_xdp - implements ndo_bpf for i40e
12755 struct i40e_vsi *vsi = np->vsi; in i40e_xdp()
12757 if (vsi->type != I40E_VSI_MAIN) in i40e_xdp()
12758 return -EINVAL; in i40e_xdp()
12760 switch (xdp->command) { in i40e_xdp()
12762 return i40e_xdp_setup(vsi, xdp->prog); in i40e_xdp()
12764 return i40e_xsk_pool_setup(vsi, xdp->xsk.pool, in i40e_xdp()
12765 xdp->xsk.queue_id); in i40e_xdp()
12767 return -EINVAL; in i40e_xdp()
12812 * i40e_config_netdev - Setup the netdev flags
12819 struct i40e_pf *pf = vsi->back; in i40e_config_netdev()
12820 struct i40e_hw *hw = &pf->hw; in i40e_config_netdev()
12830 netdev = alloc_etherdev_mq(etherdev_size, vsi->alloc_queue_pairs); in i40e_config_netdev()
12832 return -ENOMEM; in i40e_config_netdev()
12834 vsi->netdev = netdev; in i40e_config_netdev()
12836 np->vsi = vsi; in i40e_config_netdev()
12859 if (!(pf->hw_features & I40E_HW_OUTER_UDP_CSUM_CAPABLE)) in i40e_config_netdev()
12860 netdev->gso_partial_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM; in i40e_config_netdev()
12862 netdev->udp_tunnel_nic_info = &pf->udp_tunnel_nic; in i40e_config_netdev()
12864 netdev->gso_partial_features |= NETIF_F_GSO_GRE_CSUM; in i40e_config_netdev()
12866 netdev->hw_enc_features |= hw_enc_features; in i40e_config_netdev()
12869 netdev->vlan_features |= hw_enc_features | NETIF_F_TSO_MANGLEID; in i40e_config_netdev()
12872 netdev->hw_features |= NETIF_F_HW_L2FW_DOFFLOAD; in i40e_config_netdev()
12878 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) in i40e_config_netdev()
12881 netdev->hw_features |= hw_features; in i40e_config_netdev()
12883 netdev->features |= hw_features | NETIF_F_HW_VLAN_CTAG_FILTER; in i40e_config_netdev()
12884 netdev->hw_enc_features |= NETIF_F_TSO_MANGLEID; in i40e_config_netdev()
12886 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_netdev()
12887 SET_NETDEV_DEV(netdev, &pf->pdev->dev); in i40e_config_netdev()
12888 ether_addr_copy(mac_addr, hw->mac.perm_addr); in i40e_config_netdev()
12890 * some older NVM configurations load a default MAC-VLAN in i40e_config_netdev()
12900 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
12902 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
12907 * original name by IFNAMSIZ - 4 in i40e_config_netdev()
12909 snprintf(netdev->name, IFNAMSIZ, "%.*sv%%d", in i40e_config_netdev()
12910 IFNAMSIZ - 4, in i40e_config_netdev()
12911 pf->vsi[pf->lan_vsi]->netdev->name); in i40e_config_netdev()
12914 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
12916 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
12933 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
12935 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_config_netdev()
12937 ether_addr_copy(netdev->dev_addr, mac_addr); in i40e_config_netdev()
12938 ether_addr_copy(netdev->perm_addr, mac_addr); in i40e_config_netdev()
12940 /* i40iw_net_event() reads 16 bytes from neigh->primary_key */ in i40e_config_netdev()
12941 netdev->neigh_priv_len = sizeof(u32) * 4; in i40e_config_netdev()
12943 netdev->priv_flags |= IFF_UNICAST_FLT; in i40e_config_netdev()
12944 netdev->priv_flags |= IFF_SUPP_NOFCS; in i40e_config_netdev()
12946 i40e_vsi_config_netdev_tc(vsi, vsi->tc_config.enabled_tc); in i40e_config_netdev()
12948 netdev->netdev_ops = &i40e_netdev_ops; in i40e_config_netdev()
12949 netdev->watchdog_timeo = 5 * HZ; in i40e_config_netdev()
12952 /* MTU range: 68 - 9706 */ in i40e_config_netdev()
12953 netdev->min_mtu = ETH_MIN_MTU; in i40e_config_netdev()
12954 netdev->max_mtu = I40E_MAX_RXBUFFER - I40E_PACKET_HDR_PAD; in i40e_config_netdev()
12960 * i40e_vsi_delete - Delete a VSI from the switch
12968 if (vsi == vsi->back->vsi[vsi->back->lan_vsi]) in i40e_vsi_delete()
12971 i40e_aq_delete_element(&vsi->back->hw, vsi->seid, NULL); in i40e_vsi_delete()
12975 * i40e_is_vsi_uplink_mode_veb - Check if the VSI's uplink bridge mode is VEB
12983 struct i40e_pf *pf = vsi->back; in i40e_is_vsi_uplink_mode_veb()
12986 if (vsi->veb_idx >= I40E_MAX_VEB) in i40e_is_vsi_uplink_mode_veb()
12989 veb = pf->veb[vsi->veb_idx]; in i40e_is_vsi_uplink_mode_veb()
12991 dev_info(&pf->pdev->dev, in i40e_is_vsi_uplink_mode_veb()
12993 return -ENOENT; in i40e_is_vsi_uplink_mode_veb()
12997 if (veb->bridge_mode & BRIDGE_MODE_VEPA) { in i40e_is_vsi_uplink_mode_veb()
13009 * i40e_add_vsi - Add a VSI to the switch
13017 int ret = -ENODEV; in i40e_add_vsi()
13018 struct i40e_pf *pf = vsi->back; in i40e_add_vsi()
13019 struct i40e_hw *hw = &pf->hw; in i40e_add_vsi()
13029 switch (vsi->type) { in i40e_add_vsi()
13036 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
13037 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
13039 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_add_vsi()
13042 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13044 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
13045 i40e_aq_str(&pf->hw, in i40e_add_vsi()
13046 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13047 return -ENOENT; in i40e_add_vsi()
13049 vsi->info = ctxt.info; in i40e_add_vsi()
13050 vsi->info.valid_sections = 0; in i40e_add_vsi()
13052 vsi->seid = ctxt.seid; in i40e_add_vsi()
13053 vsi->id = ctxt.vsi_number; in i40e_add_vsi()
13058 * negative logic - if it's set, we need to fiddle with in i40e_add_vsi()
13061 if (pf->flags & I40E_FLAG_SOURCE_PRUNING_DISABLED) { in i40e_add_vsi()
13063 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
13064 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
13072 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13074 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
13075 i40e_aq_str(&pf->hw, in i40e_add_vsi()
13076 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13077 ret = -ENOENT; in i40e_add_vsi()
13083 if ((pf->flags & I40E_FLAG_MFP_ENABLED) && in i40e_add_vsi()
13084 !(pf->hw.func_caps.iscsi)) { /* NIC type PF */ in i40e_add_vsi()
13086 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
13087 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
13092 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13094 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
13095 i40e_aq_str(&pf->hw, in i40e_add_vsi()
13096 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13097 ret = -ENOENT; in i40e_add_vsi()
13102 vsi->info.valid_sections = 0; in i40e_add_vsi()
13105 * reconfigure it to enable all TCs that are in i40e_add_vsi()
13115 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13116 "failed to configure TCs for main VSI tc_map 0x%08x, err %s aq_err %s\n", in i40e_add_vsi()
13118 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
13119 i40e_aq_str(&pf->hw, in i40e_add_vsi()
13120 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13126 ctxt.pf_num = hw->pf_id; in i40e_add_vsi()
13128 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
13131 if ((pf->flags & I40E_FLAG_VEB_MODE_ENABLED) && in i40e_add_vsi()
13142 ctxt.pf_num = hw->pf_id; in i40e_add_vsi()
13144 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
13163 ctxt.pf_num = hw->pf_id; in i40e_add_vsi()
13164 ctxt.vf_num = vsi->vf_id + hw->func_caps.vf_base_id; in i40e_add_vsi()
13165 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
13179 if (vsi->back->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_add_vsi()
13189 if (pf->vf[vsi->vf_id].spoofchk) { in i40e_add_vsi()
13205 return -ENODEV; in i40e_add_vsi()
13208 if (vsi->type != I40E_VSI_MAIN) { in i40e_add_vsi()
13211 dev_info(&vsi->back->pdev->dev, in i40e_add_vsi()
13213 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
13214 i40e_aq_str(&pf->hw, in i40e_add_vsi()
13215 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13216 ret = -ENOENT; in i40e_add_vsi()
13219 vsi->info = ctxt.info; in i40e_add_vsi()
13220 vsi->info.valid_sections = 0; in i40e_add_vsi()
13221 vsi->seid = ctxt.seid; in i40e_add_vsi()
13222 vsi->id = ctxt.vsi_number; in i40e_add_vsi()
13225 vsi->active_filters = 0; in i40e_add_vsi()
13226 clear_bit(__I40E_VSI_OVERFLOW_PROMISC, vsi->state); in i40e_add_vsi()
13227 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_add_vsi()
13229 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { in i40e_add_vsi()
13230 f->state = I40E_FILTER_NEW; in i40e_add_vsi()
13233 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_add_vsi()
13236 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_add_vsi()
13237 set_bit(__I40E_MACVLAN_SYNC_PENDING, pf->state); in i40e_add_vsi()
13243 dev_info(&pf->pdev->dev, in i40e_add_vsi()
13245 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
13246 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_vsi()
13256 * i40e_vsi_release - Delete a VSI and free its resources
13270 pf = vsi->back; in i40e_vsi_release()
13272 /* release of a VEB-owner or last VSI is not allowed */ in i40e_vsi_release()
13273 if (vsi->flags & I40E_VSI_FLAG_VEB_OWNER) { in i40e_vsi_release()
13274 dev_info(&pf->pdev->dev, "VSI %d has existing VEB %d\n", in i40e_vsi_release()
13275 vsi->seid, vsi->uplink_seid); in i40e_vsi_release()
13276 return -ENODEV; in i40e_vsi_release()
13278 if (vsi == pf->vsi[pf->lan_vsi] && in i40e_vsi_release()
13279 !test_bit(__I40E_DOWN, pf->state)) { in i40e_vsi_release()
13280 dev_info(&pf->pdev->dev, "Can't remove PF VSI\n"); in i40e_vsi_release()
13281 return -ENODEV; in i40e_vsi_release()
13284 uplink_seid = vsi->uplink_seid; in i40e_vsi_release()
13285 if (vsi->type != I40E_VSI_SRIOV) { in i40e_vsi_release()
13286 if (vsi->netdev_registered) { in i40e_vsi_release()
13287 vsi->netdev_registered = false; in i40e_vsi_release()
13288 if (vsi->netdev) { in i40e_vsi_release()
13290 unregister_netdev(vsi->netdev); in i40e_vsi_release()
13298 spin_lock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_release()
13301 if (vsi->netdev) { in i40e_vsi_release()
13302 __dev_uc_unsync(vsi->netdev, NULL); in i40e_vsi_release()
13303 __dev_mc_unsync(vsi->netdev, NULL); in i40e_vsi_release()
13307 hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) in i40e_vsi_release()
13310 spin_unlock_bh(&vsi->mac_filter_hash_lock); in i40e_vsi_release()
13316 if (vsi->netdev) { in i40e_vsi_release()
13317 free_netdev(vsi->netdev); in i40e_vsi_release()
13318 vsi->netdev = NULL; in i40e_vsi_release()
13328 * the orphan VEBs yet. We'll wait for an explicit remove request in i40e_vsi_release()
13331 for (n = 0, i = 0; i < pf->num_alloc_vsi; i++) { in i40e_vsi_release()
13332 if (pf->vsi[i] && in i40e_vsi_release()
13333 pf->vsi[i]->uplink_seid == uplink_seid && in i40e_vsi_release()
13334 (pf->vsi[i]->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) { in i40e_vsi_release()
13339 if (!pf->veb[i]) in i40e_vsi_release()
13341 if (pf->veb[i]->uplink_seid == uplink_seid) in i40e_vsi_release()
13343 if (pf->veb[i]->seid == uplink_seid) in i40e_vsi_release()
13344 veb = pf->veb[i]; in i40e_vsi_release()
13346 if (n == 0 && veb && veb->uplink_seid != 0) in i40e_vsi_release()
13353 * i40e_vsi_setup_vectors - Set up the q_vectors for the given VSI
13364 int ret = -ENOENT; in i40e_vsi_setup_vectors()
13365 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_vectors()
13367 if (vsi->q_vectors[0]) { in i40e_vsi_setup_vectors()
13368 dev_info(&pf->pdev->dev, "VSI %d has existing q_vectors\n", in i40e_vsi_setup_vectors()
13369 vsi->seid); in i40e_vsi_setup_vectors()
13370 return -EEXIST; in i40e_vsi_setup_vectors()
13373 if (vsi->base_vector) { in i40e_vsi_setup_vectors()
13374 dev_info(&pf->pdev->dev, "VSI %d has non-zero base vector %d\n", in i40e_vsi_setup_vectors()
13375 vsi->seid, vsi->base_vector); in i40e_vsi_setup_vectors()
13376 return -EEXIST; in i40e_vsi_setup_vectors()
13381 dev_info(&pf->pdev->dev, in i40e_vsi_setup_vectors()
13383 vsi->num_q_vectors, vsi->seid, ret); in i40e_vsi_setup_vectors()
13384 vsi->num_q_vectors = 0; in i40e_vsi_setup_vectors()
13391 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_vsi_setup_vectors()
13393 if (vsi->num_q_vectors) in i40e_vsi_setup_vectors()
13394 vsi->base_vector = i40e_get_lump(pf, pf->irq_pile, in i40e_vsi_setup_vectors()
13395 vsi->num_q_vectors, vsi->idx); in i40e_vsi_setup_vectors()
13396 if (vsi->base_vector < 0) { in i40e_vsi_setup_vectors()
13397 dev_info(&pf->pdev->dev, in i40e_vsi_setup_vectors()
13399 vsi->num_q_vectors, vsi->seid, vsi->base_vector); in i40e_vsi_setup_vectors()
13401 ret = -ENOENT; in i40e_vsi_setup_vectors()
13410 * i40e_vsi_reinit_setup - return and reallocate resources for a VSI
13413 * This re-allocates a vsi's queue resources.
13428 pf = vsi->back; in i40e_vsi_reinit_setup()
13430 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_reinit_setup()
13439 alloc_queue_pairs = vsi->alloc_queue_pairs * in i40e_vsi_reinit_setup()
13442 ret = i40e_get_lump(pf, pf->qp_pile, alloc_queue_pairs, vsi->idx); in i40e_vsi_reinit_setup()
13444 dev_info(&pf->pdev->dev, in i40e_vsi_reinit_setup()
13446 alloc_queue_pairs, vsi->seid, ret); in i40e_vsi_reinit_setup()
13449 vsi->base_queue = ret; in i40e_vsi_reinit_setup()
13454 enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc; in i40e_vsi_reinit_setup()
13455 pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0; in i40e_vsi_reinit_setup()
13456 pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid; in i40e_vsi_reinit_setup()
13457 i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc); in i40e_vsi_reinit_setup()
13458 if (vsi->type == I40E_VSI_MAIN) in i40e_vsi_reinit_setup()
13459 i40e_rm_default_mac_filter(vsi, pf->hw.mac.perm_addr); in i40e_vsi_reinit_setup()
13472 if (vsi->netdev_registered) { in i40e_vsi_reinit_setup()
13473 vsi->netdev_registered = false; in i40e_vsi_reinit_setup()
13474 unregister_netdev(vsi->netdev); in i40e_vsi_reinit_setup()
13475 free_netdev(vsi->netdev); in i40e_vsi_reinit_setup()
13476 vsi->netdev = NULL; in i40e_vsi_reinit_setup()
13478 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_reinit_setup()
13485 * i40e_vsi_setup - Set up a VSI by a given type
13507 * - the PF's port seid in i40e_vsi_setup()
13510 * - seid of an existing VEB in i40e_vsi_setup()
13511 * - seid of a VSI that owns an existing VEB in i40e_vsi_setup()
13512 * - seid of a VSI that doesn't own a VEB in i40e_vsi_setup()
13514 * - seid of the PF VSI, which is what creates the first VEB in i40e_vsi_setup()
13520 if (pf->veb[i] && pf->veb[i]->seid == uplink_seid) { in i40e_vsi_setup()
13521 veb = pf->veb[i]; in i40e_vsi_setup()
13526 if (!veb && uplink_seid != pf->mac_seid) { in i40e_vsi_setup()
13528 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_vsi_setup()
13529 if (pf->vsi[i] && pf->vsi[i]->seid == uplink_seid) { in i40e_vsi_setup()
13530 vsi = pf->vsi[i]; in i40e_vsi_setup()
13535 dev_info(&pf->pdev->dev, "no such uplink_seid %d\n", in i40e_vsi_setup()
13540 if (vsi->uplink_seid == pf->mac_seid) in i40e_vsi_setup()
13541 veb = i40e_veb_setup(pf, 0, pf->mac_seid, vsi->seid, in i40e_vsi_setup()
13542 vsi->tc_config.enabled_tc); in i40e_vsi_setup()
13543 else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) in i40e_vsi_setup()
13544 veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid, in i40e_vsi_setup()
13545 vsi->tc_config.enabled_tc); in i40e_vsi_setup()
13547 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) { in i40e_vsi_setup()
13548 dev_info(&vsi->back->pdev->dev, in i40e_vsi_setup()
13556 if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) { in i40e_vsi_setup()
13557 veb->bridge_mode = BRIDGE_MODE_VEPA; in i40e_vsi_setup()
13558 pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; in i40e_vsi_setup()
13563 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_vsi_setup()
13564 veb = pf->veb[i]; in i40e_vsi_setup()
13567 dev_info(&pf->pdev->dev, "couldn't add VEB\n"); in i40e_vsi_setup()
13571 vsi->flags |= I40E_VSI_FLAG_VEB_OWNER; in i40e_vsi_setup()
13572 uplink_seid = veb->seid; in i40e_vsi_setup()
13579 vsi = pf->vsi[v_idx]; in i40e_vsi_setup()
13582 vsi->type = type; in i40e_vsi_setup()
13583 vsi->veb_idx = (veb ? veb->idx : I40E_NO_VEB); in i40e_vsi_setup()
13586 pf->lan_vsi = v_idx; in i40e_vsi_setup()
13588 vsi->vf_id = param1; in i40e_vsi_setup()
13590 alloc_queue_pairs = vsi->alloc_queue_pairs * in i40e_vsi_setup()
13593 ret = i40e_get_lump(pf, pf->qp_pile, alloc_queue_pairs, vsi->idx); in i40e_vsi_setup()
13595 dev_info(&pf->pdev->dev, in i40e_vsi_setup()
13597 alloc_queue_pairs, vsi->seid, ret); in i40e_vsi_setup()
13600 vsi->base_queue = ret; in i40e_vsi_setup()
13603 vsi->uplink_seid = uplink_seid; in i40e_vsi_setup()
13608 switch (vsi->type) { in i40e_vsi_setup()
13615 ret = register_netdev(vsi->netdev); in i40e_vsi_setup()
13618 vsi->netdev_registered = true; in i40e_vsi_setup()
13619 netif_carrier_off(vsi->netdev); in i40e_vsi_setup()
13645 if ((pf->hw_features & I40E_HW_RSS_AQ_CAPABLE) && in i40e_vsi_setup()
13646 (vsi->type == I40E_VSI_VMDQ2)) { in i40e_vsi_setup()
13654 if (vsi->netdev_registered) { in i40e_vsi_setup()
13655 vsi->netdev_registered = false; in i40e_vsi_setup()
13656 unregister_netdev(vsi->netdev); in i40e_vsi_setup()
13657 free_netdev(vsi->netdev); in i40e_vsi_setup()
13658 vsi->netdev = NULL; in i40e_vsi_setup()
13661 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_setup()
13669 * i40e_veb_get_bw_info - Query VEB BW information
13678 struct i40e_pf *pf = veb->pf; in i40e_veb_get_bw_info()
13679 struct i40e_hw *hw = &pf->hw; in i40e_veb_get_bw_info()
13684 ret = i40e_aq_query_switch_comp_bw_config(hw, veb->seid, in i40e_veb_get_bw_info()
13687 dev_info(&pf->pdev->dev, in i40e_veb_get_bw_info()
13689 i40e_stat_str(&pf->hw, ret), in i40e_veb_get_bw_info()
13690 i40e_aq_str(&pf->hw, hw->aq.asq_last_status)); in i40e_veb_get_bw_info()
13694 ret = i40e_aq_query_switch_comp_ets_config(hw, veb->seid, in i40e_veb_get_bw_info()
13697 dev_info(&pf->pdev->dev, in i40e_veb_get_bw_info()
13699 i40e_stat_str(&pf->hw, ret), in i40e_veb_get_bw_info()
13700 i40e_aq_str(&pf->hw, hw->aq.asq_last_status)); in i40e_veb_get_bw_info()
13704 veb->bw_limit = le16_to_cpu(ets_data.port_bw_limit); in i40e_veb_get_bw_info()
13705 veb->bw_max_quanta = ets_data.tc_bw_max; in i40e_veb_get_bw_info()
13706 veb->is_abs_credits = bw_data.absolute_credits_enable; in i40e_veb_get_bw_info()
13707 veb->enabled_tc = ets_data.tc_valid_bits; in i40e_veb_get_bw_info()
13711 veb->bw_tc_share_credits[i] = bw_data.tc_bw_share_credits[i]; in i40e_veb_get_bw_info()
13712 veb->bw_tc_limit_credits[i] = in i40e_veb_get_bw_info()
13714 veb->bw_tc_max_quanta[i] = ((tc_bw_max >> (i*4)) & 0x7); in i40e_veb_get_bw_info()
13722 * i40e_veb_mem_alloc - Allocates the next available struct veb in the PF
13730 int ret = -ENOENT; in i40e_veb_mem_alloc()
13735 mutex_lock(&pf->switch_mutex); in i40e_veb_mem_alloc()
13744 while ((i < I40E_MAX_VEB) && (pf->veb[i] != NULL)) in i40e_veb_mem_alloc()
13747 ret = -ENOMEM; in i40e_veb_mem_alloc()
13753 ret = -ENOMEM; in i40e_veb_mem_alloc()
13756 veb->pf = pf; in i40e_veb_mem_alloc()
13757 veb->idx = i; in i40e_veb_mem_alloc()
13758 veb->enabled_tc = 1; in i40e_veb_mem_alloc()
13760 pf->veb[i] = veb; in i40e_veb_mem_alloc()
13763 mutex_unlock(&pf->switch_mutex); in i40e_veb_mem_alloc()
13768 * i40e_switch_branch_release - Delete a branch of the switch tree
13776 struct i40e_pf *pf = branch->pf; in i40e_switch_branch_release()
13777 u16 branch_seid = branch->seid; in i40e_switch_branch_release()
13778 u16 veb_idx = branch->idx; in i40e_switch_branch_release()
13781 /* release any VEBs on this VEB - RECURSION */ in i40e_switch_branch_release()
13783 if (!pf->veb[i]) in i40e_switch_branch_release()
13785 if (pf->veb[i]->uplink_seid == branch->seid) in i40e_switch_branch_release()
13786 i40e_switch_branch_release(pf->veb[i]); in i40e_switch_branch_release()
13794 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_switch_branch_release()
13795 if (!pf->vsi[i]) in i40e_switch_branch_release()
13797 if (pf->vsi[i]->uplink_seid == branch_seid && in i40e_switch_branch_release()
13798 (pf->vsi[i]->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) { in i40e_switch_branch_release()
13799 i40e_vsi_release(pf->vsi[i]); in i40e_switch_branch_release()
13808 if (pf->veb[veb_idx]) in i40e_switch_branch_release()
13809 i40e_veb_release(pf->veb[veb_idx]); in i40e_switch_branch_release()
13813 * i40e_veb_clear - remove veb struct
13821 if (veb->pf) { in i40e_veb_clear()
13822 struct i40e_pf *pf = veb->pf; in i40e_veb_clear()
13824 mutex_lock(&pf->switch_mutex); in i40e_veb_clear()
13825 if (pf->veb[veb->idx] == veb) in i40e_veb_clear()
13826 pf->veb[veb->idx] = NULL; in i40e_veb_clear()
13827 mutex_unlock(&pf->switch_mutex); in i40e_veb_clear()
13834 * i40e_veb_release - Delete a VEB and free its resources
13843 pf = veb->pf; in i40e_veb_release()
13846 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_veb_release()
13847 if (pf->vsi[i] && pf->vsi[i]->uplink_seid == veb->seid) { in i40e_veb_release()
13849 vsi = pf->vsi[i]; in i40e_veb_release()
13853 dev_info(&pf->pdev->dev, in i40e_veb_release()
13855 veb->seid, n); in i40e_veb_release()
13860 vsi->flags &= ~I40E_VSI_FLAG_VEB_OWNER; in i40e_veb_release()
13861 if (veb->uplink_seid) { in i40e_veb_release()
13862 vsi->uplink_seid = veb->uplink_seid; in i40e_veb_release()
13863 if (veb->uplink_seid == pf->mac_seid) in i40e_veb_release()
13864 vsi->veb_idx = I40E_NO_VEB; in i40e_veb_release()
13866 vsi->veb_idx = veb->veb_idx; in i40e_veb_release()
13869 vsi->uplink_seid = pf->vsi[pf->lan_vsi]->uplink_seid; in i40e_veb_release()
13870 vsi->veb_idx = pf->vsi[pf->lan_vsi]->veb_idx; in i40e_veb_release()
13873 i40e_aq_delete_element(&pf->hw, veb->seid, NULL); in i40e_veb_release()
13878 * i40e_add_veb - create the VEB in the switch
13884 struct i40e_pf *pf = veb->pf; in i40e_add_veb()
13885 bool enable_stats = !!(pf->flags & I40E_FLAG_VEB_STATS_ENABLED); in i40e_add_veb()
13888 ret = i40e_aq_add_veb(&pf->hw, veb->uplink_seid, vsi->seid, in i40e_add_veb()
13889 veb->enabled_tc, false, in i40e_add_veb()
13890 &veb->seid, enable_stats, NULL); in i40e_add_veb()
13894 dev_info(&pf->pdev->dev, in i40e_add_veb()
13896 i40e_stat_str(&pf->hw, ret), in i40e_add_veb()
13897 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_veb()
13898 return -EPERM; in i40e_add_veb()
13902 ret = i40e_aq_get_veb_parameters(&pf->hw, veb->seid, NULL, NULL, in i40e_add_veb()
13903 &veb->stats_idx, NULL, NULL, NULL); in i40e_add_veb()
13905 dev_info(&pf->pdev->dev, in i40e_add_veb()
13907 i40e_stat_str(&pf->hw, ret), in i40e_add_veb()
13908 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_veb()
13909 return -EPERM; in i40e_add_veb()
13913 dev_info(&pf->pdev->dev, in i40e_add_veb()
13915 i40e_stat_str(&pf->hw, ret), in i40e_add_veb()
13916 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_veb()
13917 i40e_aq_delete_element(&pf->hw, veb->seid, NULL); in i40e_add_veb()
13918 return -ENOENT; in i40e_add_veb()
13921 vsi->uplink_seid = veb->seid; in i40e_add_veb()
13922 vsi->veb_idx = veb->idx; in i40e_add_veb()
13923 vsi->flags |= I40E_VSI_FLAG_VEB_OWNER; in i40e_add_veb()
13929 * i40e_veb_setup - Set up a VEB
13934 * @enabled_tc: Enabled TC bit-map
13955 dev_info(&pf->pdev->dev, in i40e_veb_setup()
13962 for (vsi_idx = 0; vsi_idx < pf->num_alloc_vsi; vsi_idx++) in i40e_veb_setup()
13963 if (pf->vsi[vsi_idx] && pf->vsi[vsi_idx]->seid == vsi_seid) in i40e_veb_setup()
13965 if (vsi_idx == pf->num_alloc_vsi && vsi_seid != 0) { in i40e_veb_setup()
13966 dev_info(&pf->pdev->dev, "vsi seid %d not found\n", in i40e_veb_setup()
13971 if (uplink_seid && uplink_seid != pf->mac_seid) { in i40e_veb_setup()
13973 if (pf->veb[veb_idx] && in i40e_veb_setup()
13974 pf->veb[veb_idx]->seid == uplink_seid) { in i40e_veb_setup()
13975 uplink_veb = pf->veb[veb_idx]; in i40e_veb_setup()
13980 dev_info(&pf->pdev->dev, in i40e_veb_setup()
13990 veb = pf->veb[veb_idx]; in i40e_veb_setup()
13991 veb->flags = flags; in i40e_veb_setup()
13992 veb->uplink_seid = uplink_seid; in i40e_veb_setup()
13993 veb->veb_idx = (uplink_veb ? uplink_veb->idx : I40E_NO_VEB); in i40e_veb_setup()
13994 veb->enabled_tc = (enabled_tc ? enabled_tc : 0x1); in i40e_veb_setup()
13997 ret = i40e_add_veb(veb, pf->vsi[vsi_idx]); in i40e_veb_setup()
14000 if (vsi_idx == pf->lan_vsi) in i40e_veb_setup()
14001 pf->lan_veb = veb->idx; in i40e_veb_setup()
14012 * i40e_setup_pf_switch_element - set PF vars based on switch type
14024 u16 downlink_seid = le16_to_cpu(ele->downlink_seid); in i40e_setup_pf_switch_element()
14025 u16 uplink_seid = le16_to_cpu(ele->uplink_seid); in i40e_setup_pf_switch_element()
14026 u8 element_type = ele->element_type; in i40e_setup_pf_switch_element()
14027 u16 seid = le16_to_cpu(ele->seid); in i40e_setup_pf_switch_element()
14030 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch_element()
14036 pf->mac_seid = seid; in i40e_setup_pf_switch_element()
14040 if (uplink_seid != pf->mac_seid) in i40e_setup_pf_switch_element()
14042 if (pf->lan_veb >= I40E_MAX_VEB) { in i40e_setup_pf_switch_element()
14047 if (pf->veb[v] && (pf->veb[v]->seid == seid)) { in i40e_setup_pf_switch_element()
14048 pf->lan_veb = v; in i40e_setup_pf_switch_element()
14052 if (pf->lan_veb >= I40E_MAX_VEB) { in i40e_setup_pf_switch_element()
14056 pf->lan_veb = v; in i40e_setup_pf_switch_element()
14059 if (pf->lan_veb >= I40E_MAX_VEB) in i40e_setup_pf_switch_element()
14062 pf->veb[pf->lan_veb]->seid = seid; in i40e_setup_pf_switch_element()
14063 pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid; in i40e_setup_pf_switch_element()
14064 pf->veb[pf->lan_veb]->pf = pf; in i40e_setup_pf_switch_element()
14065 pf->veb[pf->lan_veb]->veb_idx = I40E_NO_VEB; in i40e_setup_pf_switch_element()
14073 pf->mac_seid = uplink_seid; in i40e_setup_pf_switch_element()
14074 pf->pf_seid = downlink_seid; in i40e_setup_pf_switch_element()
14075 pf->main_vsi_seid = seid; in i40e_setup_pf_switch_element()
14077 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch_element()
14079 pf->pf_seid, pf->main_vsi_seid); in i40e_setup_pf_switch_element()
14090 dev_info(&pf->pdev->dev, "unknown element type=%d seid=%d\n", in i40e_setup_pf_switch_element()
14097 * i40e_fetch_switch_configuration - Get switch config from firmware
14114 return -ENOMEM; in i40e_fetch_switch_configuration()
14120 ret = i40e_aq_get_switch_config(&pf->hw, sw_config, in i40e_fetch_switch_configuration()
14124 dev_info(&pf->pdev->dev, in i40e_fetch_switch_configuration()
14126 i40e_stat_str(&pf->hw, ret), in i40e_fetch_switch_configuration()
14127 i40e_aq_str(&pf->hw, in i40e_fetch_switch_configuration()
14128 pf->hw.aq.asq_last_status)); in i40e_fetch_switch_configuration()
14130 return -ENOENT; in i40e_fetch_switch_configuration()
14133 num_reported = le16_to_cpu(sw_config->header.num_reported); in i40e_fetch_switch_configuration()
14134 num_total = le16_to_cpu(sw_config->header.num_total); in i40e_fetch_switch_configuration()
14137 dev_info(&pf->pdev->dev, in i40e_fetch_switch_configuration()
14143 &sw_config->element[i]; in i40e_fetch_switch_configuration()
14155 * i40e_setup_pf_switch - Setup the HW switch on startup or after reset
14157 * @reinit: if the Main VSI needs to re-initialized.
14169 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch()
14171 i40e_stat_str(&pf->hw, ret), in i40e_setup_pf_switch()
14172 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_setup_pf_switch()
14183 if ((pf->hw.pf_id == 0) && in i40e_setup_pf_switch()
14184 !(pf->flags & I40E_FLAG_TRUE_PROMISC_SUPPORT)) { in i40e_setup_pf_switch()
14186 pf->last_sw_conf_flags = flags; in i40e_setup_pf_switch()
14189 if (pf->hw.pf_id == 0) { in i40e_setup_pf_switch()
14193 ret = i40e_aq_set_switch_config(&pf->hw, flags, valid_flags, 0, in i40e_setup_pf_switch()
14195 if (ret && pf->hw.aq.asq_last_status != I40E_AQ_RC_ESRCH) { in i40e_setup_pf_switch()
14196 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch()
14198 i40e_stat_str(&pf->hw, ret), in i40e_setup_pf_switch()
14199 i40e_aq_str(&pf->hw, in i40e_setup_pf_switch()
14200 pf->hw.aq.asq_last_status)); in i40e_setup_pf_switch()
14203 pf->last_sw_conf_valid_flags = valid_flags; in i40e_setup_pf_switch()
14207 if (pf->lan_vsi == I40E_NO_VSI || reinit) { in i40e_setup_pf_switch()
14214 if (pf->lan_veb < I40E_MAX_VEB && pf->veb[pf->lan_veb]) in i40e_setup_pf_switch()
14215 uplink_seid = pf->veb[pf->lan_veb]->seid; in i40e_setup_pf_switch()
14217 uplink_seid = pf->mac_seid; in i40e_setup_pf_switch()
14218 if (pf->lan_vsi == I40E_NO_VSI) in i40e_setup_pf_switch()
14221 vsi = i40e_vsi_reinit_setup(pf->vsi[pf->lan_vsi]); in i40e_setup_pf_switch()
14223 dev_info(&pf->pdev->dev, "setup of MAIN VSI failed\n"); in i40e_setup_pf_switch()
14226 return -EAGAIN; in i40e_setup_pf_switch()
14230 u8 enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc; in i40e_setup_pf_switch()
14232 pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0; in i40e_setup_pf_switch()
14233 pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid; in i40e_setup_pf_switch()
14234 i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc); in i40e_setup_pf_switch()
14236 i40e_vlan_stripping_disable(pf->vsi[pf->lan_vsi]); in i40e_setup_pf_switch()
14243 dev_info(&pf->pdev->dev, "setup_pf_filter_control failed: %d\n", in i40e_setup_pf_switch()
14251 if ((pf->flags & I40E_FLAG_RSS_ENABLED)) in i40e_setup_pf_switch()
14257 /* Initialize user-specific link properties */ in i40e_setup_pf_switch()
14258 pf->fc_autoneg_status = ((pf->hw.phy.link_info.an_info & in i40e_setup_pf_switch()
14264 udp_tunnel_nic_reset_ntf(pf->vsi[pf->lan_vsi]->netdev); in i40e_setup_pf_switch()
14270 * i40e_determine_queue_usage - Work out queue distribution
14278 pf->num_lan_qps = 0; in i40e_determine_queue_usage()
14284 queues_left = pf->hw.func_caps.num_tx_qp; in i40e_determine_queue_usage()
14287 !(pf->flags & I40E_FLAG_MSIX_ENABLED)) { in i40e_determine_queue_usage()
14290 pf->alloc_rss_size = pf->num_lan_qps = 1; in i40e_determine_queue_usage()
14293 pf->flags &= ~(I40E_FLAG_RSS_ENABLED | in i40e_determine_queue_usage()
14301 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_determine_queue_usage()
14302 } else if (!(pf->flags & (I40E_FLAG_RSS_ENABLED | in i40e_determine_queue_usage()
14307 pf->alloc_rss_size = pf->num_lan_qps = 1; in i40e_determine_queue_usage()
14308 queues_left -= pf->num_lan_qps; in i40e_determine_queue_usage()
14310 pf->flags &= ~(I40E_FLAG_RSS_ENABLED | in i40e_determine_queue_usage()
14316 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_determine_queue_usage()
14318 /* Not enough queues for all TCs */ in i40e_determine_queue_usage()
14319 if ((pf->flags & I40E_FLAG_DCB_CAPABLE) && in i40e_determine_queue_usage()
14321 pf->flags &= ~(I40E_FLAG_DCB_CAPABLE | in i40e_determine_queue_usage()
14323 dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n"); in i40e_determine_queue_usage()
14327 q_max = max_t(int, pf->rss_size_max, num_online_cpus()); in i40e_determine_queue_usage()
14328 q_max = min_t(int, q_max, pf->hw.func_caps.num_tx_qp); in i40e_determine_queue_usage()
14329 q_max = min_t(int, q_max, pf->hw.func_caps.num_msix_vectors); in i40e_determine_queue_usage()
14330 pf->num_lan_qps = q_max; in i40e_determine_queue_usage()
14332 queues_left -= pf->num_lan_qps; in i40e_determine_queue_usage()
14335 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_determine_queue_usage()
14337 queues_left -= 1; /* save 1 queue for FD */ in i40e_determine_queue_usage()
14339 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_determine_queue_usage()
14340 pf->flags |= I40E_FLAG_FD_SB_INACTIVE; in i40e_determine_queue_usage()
14341 …dev_info(&pf->pdev->dev, "not enough queues for Flow Director. Flow Director feature is disabled\n… in i40e_determine_queue_usage()
14345 if ((pf->flags & I40E_FLAG_SRIOV_ENABLED) && in i40e_determine_queue_usage()
14346 pf->num_vf_qps && pf->num_req_vfs && queues_left) { in i40e_determine_queue_usage()
14347 pf->num_req_vfs = min_t(int, pf->num_req_vfs, in i40e_determine_queue_usage()
14348 (queues_left / pf->num_vf_qps)); in i40e_determine_queue_usage()
14349 queues_left -= (pf->num_req_vfs * pf->num_vf_qps); in i40e_determine_queue_usage()
14352 if ((pf->flags & I40E_FLAG_VMDQ_ENABLED) && in i40e_determine_queue_usage()
14353 pf->num_vmdq_vsis && pf->num_vmdq_qps && queues_left) { in i40e_determine_queue_usage()
14354 pf->num_vmdq_vsis = min_t(int, pf->num_vmdq_vsis, in i40e_determine_queue_usage()
14355 (queues_left / pf->num_vmdq_qps)); in i40e_determine_queue_usage()
14356 queues_left -= (pf->num_vmdq_vsis * pf->num_vmdq_qps); in i40e_determine_queue_usage()
14359 pf->queues_left = queues_left; in i40e_determine_queue_usage()
14360 dev_dbg(&pf->pdev->dev, in i40e_determine_queue_usage()
14362 pf->hw.func_caps.num_tx_qp, in i40e_determine_queue_usage()
14363 !!(pf->flags & I40E_FLAG_FD_SB_ENABLED), in i40e_determine_queue_usage()
14364 pf->num_lan_qps, pf->alloc_rss_size, pf->num_req_vfs, in i40e_determine_queue_usage()
14365 pf->num_vf_qps, pf->num_vmdq_vsis, pf->num_vmdq_qps, in i40e_determine_queue_usage()
14370 * i40e_setup_pf_filter_control - Setup PF static filter control
14382 struct i40e_filter_control_settings *settings = &pf->filter_settings; in i40e_setup_pf_filter_control()
14384 settings->hash_lut_size = I40E_HASH_LUT_SIZE_128; in i40e_setup_pf_filter_control()
14387 if (pf->flags & (I40E_FLAG_FD_SB_ENABLED | I40E_FLAG_FD_ATR_ENABLED)) in i40e_setup_pf_filter_control()
14388 settings->enable_fdir = true; in i40e_setup_pf_filter_control()
14391 settings->enable_ethtype = true; in i40e_setup_pf_filter_control()
14392 settings->enable_macvlan = true; in i40e_setup_pf_filter_control()
14394 if (i40e_set_filter_control(&pf->hw, settings)) in i40e_setup_pf_filter_control()
14395 return -ENOENT; in i40e_setup_pf_filter_control()
14401 #define REMAIN(__x) (INFO_STRING_LEN - (__x))
14404 struct i40e_hw *hw = &pf->hw; in i40e_print_features()
14412 i = snprintf(buf, INFO_STRING_LEN, "Features: PF-id[%d]", hw->pf_id); in i40e_print_features()
14414 i += scnprintf(&buf[i], REMAIN(i), " VFs: %d", pf->num_req_vfs); in i40e_print_features()
14417 pf->hw.func_caps.num_vsis, in i40e_print_features()
14418 pf->vsi[pf->lan_vsi]->num_queue_pairs); in i40e_print_features()
14419 if (pf->flags & I40E_FLAG_RSS_ENABLED) in i40e_print_features()
14421 if (pf->flags & I40E_FLAG_FD_ATR_ENABLED) in i40e_print_features()
14423 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_print_features()
14427 if (pf->flags & I40E_FLAG_DCB_CAPABLE) in i40e_print_features()
14431 if (pf->flags & I40E_FLAG_PTP) in i40e_print_features()
14433 if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED) in i40e_print_features()
14438 dev_info(&pf->pdev->dev, "%s\n", buf); in i40e_print_features()
14444 * i40e_get_platform_mac_addr - get platform-specific MAC address
14455 if (eth_platform_get_mac_address(&pdev->dev, pf->hw.mac.addr)) in i40e_get_platform_mac_addr()
14456 i40e_get_mac_addr(&pf->hw, pf->hw.mac.addr); in i40e_get_platform_mac_addr()
14460 * i40e_set_fec_in_flags - helper function for setting FEC options in flags
14483 * i40e_check_recovery_mode - check if we are running transition firmware
14493 u32 val = rd32(&pf->hw, I40E_GL_FWSTS); in i40e_check_recovery_mode()
14496 dev_crit(&pf->pdev->dev, "Firmware recovery mode detected. Limiting functionality.\n"); in i40e_check_recovery_mode()
14497 …dev_crit(&pf->pdev->dev, "Refer to the Intel(R) Ethernet Adapters and Devices User Guide for detai… in i40e_check_recovery_mode()
14498 set_bit(__I40E_RECOVERY_MODE, pf->state); in i40e_check_recovery_mode()
14502 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_check_recovery_mode()
14503 …dev_info(&pf->pdev->dev, "Please do Power-On Reset to initialize adapter in normal mode with full … in i40e_check_recovery_mode()
14509 * i40e_pf_loop_reset - perform reset in a loop.
14519 * state is to issue a series of pf-resets and check a return value.
14531 /* wait max 10 seconds for PF reset to succeed */ in i40e_pf_loop_reset()
14534 struct i40e_hw *hw = &pf->hw; in i40e_pf_loop_reset()
14544 pf->pfr_count++; in i40e_pf_loop_reset()
14546 dev_info(&pf->pdev->dev, "PF reset failed: %d\n", ret); in i40e_pf_loop_reset()
14552 * i40e_check_fw_empr - check if FW issued unexpected EMP Reset
14564 const u32 fw_sts = rd32(&pf->hw, I40E_GL_FWSTS) & in i40e_check_fw_empr()
14571 * i40e_handle_resets - handle EMP resets and PF resets
14587 …dev_crit(&pf->pdev->dev, "Entering recovery mode due to repeated FW resets. This may take several … in i40e_handle_resets()
14593 * i40e_init_recovery_mode - initialize subsystems needed in recovery mode
14608 pci_save_state(pf->pdev); in i40e_init_recovery_mode()
14611 timer_setup(&pf->service_timer, i40e_service_timer, 0); in i40e_init_recovery_mode()
14612 pf->service_timer_period = HZ; in i40e_init_recovery_mode()
14614 INIT_WORK(&pf->service_task, i40e_service_task); in i40e_init_recovery_mode()
14615 clear_bit(__I40E_SERVICE_SCHED, pf->state); in i40e_init_recovery_mode()
14626 if (pf->hw.func_caps.num_vsis < I40E_MIN_VSI_ALLOC) in i40e_init_recovery_mode()
14627 pf->num_alloc_vsi = I40E_MIN_VSI_ALLOC; in i40e_init_recovery_mode()
14629 pf->num_alloc_vsi = pf->hw.func_caps.num_vsis; in i40e_init_recovery_mode()
14632 pf->vsi = kcalloc(pf->num_alloc_vsi, sizeof(struct i40e_vsi *), in i40e_init_recovery_mode()
14634 if (!pf->vsi) { in i40e_init_recovery_mode()
14635 err = -ENOMEM; in i40e_init_recovery_mode()
14645 pf->lan_vsi = v_idx; in i40e_init_recovery_mode()
14646 vsi = pf->vsi[v_idx]; in i40e_init_recovery_mode()
14649 vsi->alloc_queue_pairs = 1; in i40e_init_recovery_mode()
14653 err = register_netdev(vsi->netdev); in i40e_init_recovery_mode()
14656 vsi->netdev_registered = true; in i40e_init_recovery_mode()
14667 mod_timer(&pf->service_timer, in i40e_init_recovery_mode()
14668 round_jiffies(jiffies + pf->service_timer_period)); in i40e_init_recovery_mode()
14674 del_timer_sync(&pf->service_timer); in i40e_init_recovery_mode()
14676 iounmap(hw->hw_addr); in i40e_init_recovery_mode()
14677 pci_disable_pcie_error_reporting(pf->pdev); in i40e_init_recovery_mode()
14678 pci_release_mem_regions(pf->pdev); in i40e_init_recovery_mode()
14679 pci_disable_device(pf->pdev); in i40e_init_recovery_mode()
14686 * i40e_probe - Device initialization routine
14714 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in i40e_probe()
14716 err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in i40e_probe()
14718 dev_err(&pdev->dev, in i40e_probe()
14727 dev_info(&pdev->dev, in i40e_probe()
14742 err = -ENOMEM; in i40e_probe()
14745 pf->next_vsi = 0; in i40e_probe()
14746 pf->pdev = pdev; in i40e_probe()
14747 set_bit(__I40E_DOWN, pf->state); in i40e_probe()
14749 hw = &pf->hw; in i40e_probe()
14750 hw->back = pf; in i40e_probe()
14752 pf->ioremap_len = min_t(int, pci_resource_len(pdev, 0), in i40e_probe()
14759 if (pf->ioremap_len < I40E_GLGEN_STAT_CLEAR) { in i40e_probe()
14760 dev_err(&pdev->dev, "Cannot map registers, bar size 0x%X too small, aborting\n", in i40e_probe()
14761 pf->ioremap_len); in i40e_probe()
14762 err = -ENOMEM; in i40e_probe()
14765 hw->hw_addr = ioremap(pci_resource_start(pdev, 0), pf->ioremap_len); in i40e_probe()
14766 if (!hw->hw_addr) { in i40e_probe()
14767 err = -EIO; in i40e_probe()
14768 dev_info(&pdev->dev, "ioremap(0x%04x, 0x%04x) failed: 0x%x\n", in i40e_probe()
14770 pf->ioremap_len, err); in i40e_probe()
14773 hw->vendor_id = pdev->vendor; in i40e_probe()
14774 hw->device_id = pdev->device; in i40e_probe()
14775 pci_read_config_byte(pdev, PCI_REVISION_ID, &hw->revision_id); in i40e_probe()
14776 hw->subsystem_vendor_id = pdev->subsystem_vendor; in i40e_probe()
14777 hw->subsystem_device_id = pdev->subsystem_device; in i40e_probe()
14778 hw->bus.device = PCI_SLOT(pdev->devfn); in i40e_probe()
14779 hw->bus.func = PCI_FUNC(pdev->devfn); in i40e_probe()
14780 hw->bus.bus_id = pdev->bus->number; in i40e_probe()
14781 pf->instance = pfs_found; in i40e_probe()
14786 hw->switch_tag = 0xffff; in i40e_probe()
14787 hw->first_tag = ETH_P_8021AD; in i40e_probe()
14788 hw->second_tag = ETH_P_8021Q; in i40e_probe()
14790 INIT_LIST_HEAD(&pf->l3_flex_pit_list); in i40e_probe()
14791 INIT_LIST_HEAD(&pf->l4_flex_pit_list); in i40e_probe()
14792 INIT_LIST_HEAD(&pf->ddp_old_prof); in i40e_probe()
14797 mutex_init(&hw->aq.asq_mutex); in i40e_probe()
14798 mutex_init(&hw->aq.arq_mutex); in i40e_probe()
14800 pf->msg_enable = netif_msg_init(debug, in i40e_probe()
14804 if (debug < -1) in i40e_probe()
14805 pf->hw.debug_mask = debug; in i40e_probe()
14808 if (hw->revision_id == 0 && in i40e_probe()
14813 pf->corer_count++; in i40e_probe()
14823 dev_warn(&pdev->dev, "unidentified MAC or BLANK NVM: %d\n", in i40e_probe()
14834 hw->aq.num_arq_entries = I40E_AQ_LEN; in i40e_probe()
14835 hw->aq.num_asq_entries = I40E_AQ_LEN; in i40e_probe()
14836 hw->aq.arq_buf_size = I40E_MAX_AQ_BUF_SIZE; in i40e_probe()
14837 hw->aq.asq_buf_size = I40E_MAX_AQ_BUF_SIZE; in i40e_probe()
14838 pf->adminq_work_limit = I40E_AQ_WORK_LIMIT; in i40e_probe()
14840 snprintf(pf->int_name, sizeof(pf->int_name) - 1, in i40e_probe()
14841 "%s-%s:misc", in i40e_probe()
14842 dev_driver_string(&pf->pdev->dev), dev_name(&pdev->dev)); in i40e_probe()
14846 dev_warn(&pdev->dev, "unidentified MAC or BLANK NVM: %d\n", in i40e_probe()
14852 pf->hw.fc.requested_mode = I40E_FC_NONE; in i40e_probe()
14857 dev_info(&pdev->dev, in i40e_probe()
14859 hw->aq.api_maj_ver, in i40e_probe()
14860 hw->aq.api_min_ver, in i40e_probe()
14864 dev_info(&pdev->dev, in i40e_probe()
14872 dev_info(&pdev->dev, "fw %d.%d.%05d api %d.%d nvm %s [%04x:%04x] [%04x:%04x]\n", in i40e_probe()
14873 hw->aq.fw_maj_ver, hw->aq.fw_min_ver, hw->aq.fw_build, in i40e_probe()
14874 hw->aq.api_maj_ver, hw->aq.api_min_ver, in i40e_probe()
14875 i40e_nvm_version_str(hw), hw->vendor_id, hw->device_id, in i40e_probe()
14876 hw->subsystem_vendor_id, hw->subsystem_device_id); in i40e_probe()
14878 if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR && in i40e_probe()
14879 hw->aq.api_min_ver > I40E_FW_MINOR_VERSION(hw)) in i40e_probe()
14880 dev_info(&pdev->dev, in i40e_probe()
14882 hw->aq.api_maj_ver, in i40e_probe()
14883 hw->aq.api_min_ver, in i40e_probe()
14886 else if (hw->aq.api_maj_ver == 1 && hw->aq.api_min_ver < 4) in i40e_probe()
14887 dev_info(&pdev->dev, in i40e_probe()
14889 hw->aq.api_maj_ver, in i40e_probe()
14890 hw->aq.api_min_ver, in i40e_probe()
14897 if (hw->revision_id < 1) in i40e_probe()
14898 …dev_warn(&pdev->dev, "This device is a pre-production adapter/LOM. Please be aware there may be is… in i40e_probe()
14908 dev_info(&pdev->dev, "sw_init failed: %d\n", err); in i40e_probe()
14912 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_probe()
14915 err = i40e_init_lan_hmc(hw, hw->func_caps.num_tx_qp, in i40e_probe()
14916 hw->func_caps.num_rx_qp, 0, 0); in i40e_probe()
14918 dev_info(&pdev->dev, "init_lan_hmc failed: %d\n", err); in i40e_probe()
14924 dev_info(&pdev->dev, "configure_lan_hmc failed: %d\n", err); in i40e_probe()
14925 err = -ENOENT; in i40e_probe()
14933 if (pf->hw_features & I40E_HW_STOP_FW_LLDP) { in i40e_probe()
14934 dev_info(&pdev->dev, "Stopping firmware LLDP agent.\n"); in i40e_probe()
14941 if (!is_valid_ether_addr(hw->mac.addr)) { in i40e_probe()
14942 dev_info(&pdev->dev, "invalid MAC address %pM\n", hw->mac.addr); in i40e_probe()
14943 err = -EIO; in i40e_probe()
14946 dev_info(&pdev->dev, "MAC address: %pM\n", hw->mac.addr); in i40e_probe()
14947 ether_addr_copy(hw->mac.perm_addr, hw->mac.addr); in i40e_probe()
14948 i40e_get_port_mac_addr(hw, hw->mac.port_addr); in i40e_probe()
14949 if (is_valid_ether_addr(hw->mac.port_addr)) in i40e_probe()
14950 pf->hw_features |= I40E_HW_PORT_ID_VALID; in i40e_probe()
14955 dev_info(&pdev->dev, in i40e_probe()
14956 (pf->flags & I40E_FLAG_DISABLE_FW_LLDP) ? in i40e_probe()
14960 /* Enable FW to write default DCB config on link-up */ in i40e_probe()
14966 dev_info(&pdev->dev, "DCB init failed %d, disabled\n", err); in i40e_probe()
14967 pf->flags &= ~(I40E_FLAG_DCB_CAPABLE | I40E_FLAG_DCB_ENABLED); in i40e_probe()
14973 timer_setup(&pf->service_timer, i40e_service_timer, 0); in i40e_probe()
14974 pf->service_timer_period = HZ; in i40e_probe()
14976 INIT_WORK(&pf->service_task, i40e_service_task); in i40e_probe()
14977 clear_bit(__I40E_SERVICE_SCHED, pf->state); in i40e_probe()
14981 if (BIT (hw->port) & wol_nvm_bits || hw->partition_id != 1) in i40e_probe()
14982 pf->wol_en = false; in i40e_probe()
14984 pf->wol_en = true; in i40e_probe()
14985 device_set_wakeup_enable(&pf->pdev->dev, pf->wol_en); in i40e_probe()
14993 pf->udp_tunnel_nic.set_port = i40e_udp_tunnel_set_port; in i40e_probe()
14994 pf->udp_tunnel_nic.unset_port = i40e_udp_tunnel_unset_port; in i40e_probe()
14995 pf->udp_tunnel_nic.flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP; in i40e_probe()
14996 pf->udp_tunnel_nic.shared = &pf->udp_tunnel_shared; in i40e_probe()
14997 pf->udp_tunnel_nic.tables[0].n_entries = I40E_MAX_PF_UDP_OFFLOAD_PORTS; in i40e_probe()
14998 pf->udp_tunnel_nic.tables[0].tunnel_types = UDP_TUNNEL_TYPE_VXLAN | in i40e_probe()
15006 if (pf->hw.func_caps.num_vsis < I40E_MIN_VSI_ALLOC) in i40e_probe()
15007 pf->num_alloc_vsi = I40E_MIN_VSI_ALLOC; in i40e_probe()
15009 pf->num_alloc_vsi = pf->hw.func_caps.num_vsis; in i40e_probe()
15010 if (pf->num_alloc_vsi > UDP_TUNNEL_NIC_MAX_SHARING_DEVICES) { in i40e_probe()
15011 dev_warn(&pf->pdev->dev, in i40e_probe()
15013 pf->num_alloc_vsi, UDP_TUNNEL_NIC_MAX_SHARING_DEVICES); in i40e_probe()
15014 pf->num_alloc_vsi = UDP_TUNNEL_NIC_MAX_SHARING_DEVICES; in i40e_probe()
15018 pf->vsi = kcalloc(pf->num_alloc_vsi, sizeof(struct i40e_vsi *), in i40e_probe()
15020 if (!pf->vsi) { in i40e_probe()
15021 err = -ENOMEM; in i40e_probe()
15027 if ((pf->flags & I40E_FLAG_SRIOV_ENABLED) && in i40e_probe()
15028 (pf->flags & I40E_FLAG_MSIX_ENABLED) && in i40e_probe()
15029 !test_bit(__I40E_BAD_EEPROM, pf->state)) { in i40e_probe()
15031 pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; in i40e_probe()
15036 dev_info(&pdev->dev, "setup_pf_switch failed: %d\n", err); in i40e_probe()
15039 INIT_LIST_HEAD(&pf->vsi[pf->lan_vsi]->ch_list); in i40e_probe()
15044 dev_dbg(&pf->pdev->dev, in i40e_probe()
15047 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_probe()
15049 dev_dbg(&pf->pdev->dev, in i40e_probe()
15052 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_probe()
15054 dev_dbg(&pf->pdev->dev, in i40e_probe()
15057 i40e_aq_str(hw, hw->aq.asq_last_status)); in i40e_probe()
15060 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_probe()
15061 if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) { in i40e_probe()
15062 i40e_vsi_open(pf->vsi[i]); in i40e_probe()
15070 err = i40e_aq_set_phy_int_mask(&pf->hw, in i40e_probe()
15075 dev_info(&pf->pdev->dev, "set phy mask fail, err %s aq_err %s\n", in i40e_probe()
15076 i40e_stat_str(&pf->hw, err), in i40e_probe()
15077 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_probe()
15090 if (pf->hw_features & I40E_HW_RESTART_AUTONEG) { in i40e_probe()
15092 err = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); in i40e_probe()
15094 dev_info(&pf->pdev->dev, "link restart failed, err %s aq_err %s\n", in i40e_probe()
15095 i40e_stat_str(&pf->hw, err), in i40e_probe()
15096 i40e_aq_str(&pf->hw, in i40e_probe()
15097 pf->hw.aq.asq_last_status)); in i40e_probe()
15103 clear_bit(__I40E_DOWN, pf->state); in i40e_probe()
15110 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_probe()
15113 dev_info(&pdev->dev, in i40e_probe()
15121 if ((pf->flags & I40E_FLAG_SRIOV_ENABLED) && in i40e_probe()
15122 (pf->flags & I40E_FLAG_MSIX_ENABLED) && in i40e_probe()
15123 !test_bit(__I40E_BAD_EEPROM, pf->state)) { in i40e_probe()
15131 dev_info(&pdev->dev, in i40e_probe()
15135 dev_info(&pdev->dev, in i40e_probe()
15142 if (pf->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_probe()
15143 pf->iwarp_base_vector = i40e_get_lump(pf, pf->irq_pile, in i40e_probe()
15144 pf->num_iwarp_msix, in i40e_probe()
15146 if (pf->iwarp_base_vector < 0) { in i40e_probe()
15147 dev_info(&pdev->dev, in i40e_probe()
15149 pf->num_iwarp_msix, pf->iwarp_base_vector); in i40e_probe()
15150 pf->flags &= ~I40E_FLAG_IWARP_ENABLED; in i40e_probe()
15160 mod_timer(&pf->service_timer, in i40e_probe()
15161 round_jiffies(jiffies + pf->service_timer_period)); in i40e_probe()
15164 if (pf->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_probe()
15167 dev_info(&pdev->dev, "Failed to add PF to client API service list: %d\n", in i40e_probe()
15177 if (!(pf->hw_features & I40E_HW_NO_PCI_LINK_CHECK)) { in i40e_probe()
15184 pcie_capability_read_word(pf->pdev, PCI_EXP_LNKSTA, in i40e_probe()
15189 switch (hw->bus.speed) { in i40e_probe()
15199 switch (hw->bus.width) { in i40e_probe()
15212 dev_info(&pdev->dev, "PCI-Express: Speed %sGT/s Width x%s\n", in i40e_probe()
15215 if (hw->bus.width < i40e_bus_width_pcie_x8 || in i40e_probe()
15216 hw->bus.speed < i40e_bus_speed_8000) { in i40e_probe()
15217 …dev_warn(&pdev->dev, "PCI-Express bandwidth available for this device may be insufficient for opti… in i40e_probe()
15218 …dev_warn(&pdev->dev, "Please move the device to a different PCI-e link with more lanes and/or high… in i40e_probe()
15225 dev_dbg(&pf->pdev->dev, "get requested speeds ret = %s last_status = %s\n", in i40e_probe()
15226 i40e_stat_str(&pf->hw, err), in i40e_probe()
15227 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_probe()
15228 pf->hw.phy.link_info.requested_speeds = abilities.link_speed; in i40e_probe()
15231 i40e_set_fec_in_flags(abilities.fec_cfg_curr_mod_ext_info, &pf->flags); in i40e_probe()
15236 dev_dbg(&pf->pdev->dev, "get supported phy types ret = %s last_status = %s\n", in i40e_probe()
15237 i40e_stat_str(&pf->hw, err), in i40e_probe()
15238 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_probe()
15242 val = (rd32(&pf->hw, I40E_PRTGL_SAH) & in i40e_probe()
15245 dev_warn(&pdev->dev, "MFS for port %x has been set below the default: %x\n", in i40e_probe()
15254 i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw, in i40e_probe()
15255 pf->main_vsi_seid); in i40e_probe()
15257 if ((pf->hw.device_id == I40E_DEV_ID_10G_BASE_T) || in i40e_probe()
15258 (pf->hw.device_id == I40E_DEV_ID_10G_BASE_T4)) in i40e_probe()
15259 pf->hw_features |= I40E_HW_PHY_CONTROLS_LEDS; in i40e_probe()
15260 if (pf->hw.device_id == I40E_DEV_ID_SFP_I_X722) in i40e_probe()
15261 pf->hw_features |= I40E_HW_HAVE_CRT_RETIMER; in i40e_probe()
15269 set_bit(__I40E_DOWN, pf->state); in i40e_probe()
15271 kfree(pf->vsi); in i40e_probe()
15274 del_timer_sync(&pf->service_timer); in i40e_probe()
15279 kfree(pf->qp_pile); in i40e_probe()
15283 iounmap(hw->hw_addr); in i40e_probe()
15296 * i40e_remove - Device removal routine
15301 * Hot-Plug event, or because the driver is going to be removed from
15307 struct i40e_hw *hw = &pf->hw; in i40e_remove()
15319 while (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state)) in i40e_remove()
15322 if (pf->flags & I40E_FLAG_SRIOV_ENABLED) { in i40e_remove()
15323 set_bit(__I40E_VF_RESETS_DISABLED, pf->state); in i40e_remove()
15325 pf->flags &= ~I40E_FLAG_SRIOV_ENABLED; in i40e_remove()
15328 set_bit(__I40E_SUSPENDED, pf->state); in i40e_remove()
15329 set_bit(__I40E_DOWN, pf->state); in i40e_remove()
15330 if (pf->service_timer.function) in i40e_remove()
15331 del_timer_sync(&pf->service_timer); in i40e_remove()
15332 if (pf->service_task.func) in i40e_remove()
15333 cancel_work_sync(&pf->service_task); in i40e_remove()
15335 if (test_bit(__I40E_RECOVERY_MODE, pf->state)) { in i40e_remove()
15336 struct i40e_vsi *vsi = pf->vsi[0]; in i40e_remove()
15342 unregister_netdev(vsi->netdev); in i40e_remove()
15343 free_netdev(vsi->netdev); in i40e_remove()
15351 i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false); in i40e_remove()
15359 if (!pf->veb[i]) in i40e_remove()
15362 if (pf->veb[i]->uplink_seid == pf->mac_seid || in i40e_remove()
15363 pf->veb[i]->uplink_seid == 0) in i40e_remove()
15364 i40e_switch_branch_release(pf->veb[i]); in i40e_remove()
15370 if (pf->vsi[pf->lan_vsi]) in i40e_remove()
15371 i40e_vsi_release(pf->vsi[pf->lan_vsi]); in i40e_remove()
15376 if (pf->flags & I40E_FLAG_IWARP_ENABLED) { in i40e_remove()
15379 dev_warn(&pdev->dev, "Failed to delete client device: %d\n", in i40e_remove()
15384 if (hw->hmc.hmc_obj) { in i40e_remove()
15387 dev_warn(&pdev->dev, in i40e_remove()
15394 if (test_bit(__I40E_RECOVERY_MODE, pf->state) && in i40e_remove()
15395 !(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_remove()
15396 free_irq(pf->pdev->irq, pf); in i40e_remove()
15402 mutex_destroy(&hw->aq.arq_mutex); in i40e_remove()
15403 mutex_destroy(&hw->aq.asq_mutex); in i40e_remove()
15408 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_remove()
15409 if (pf->vsi[i]) { in i40e_remove()
15410 if (!test_bit(__I40E_RECOVERY_MODE, pf->state)) in i40e_remove()
15411 i40e_vsi_clear_rings(pf->vsi[i]); in i40e_remove()
15412 i40e_vsi_clear(pf->vsi[i]); in i40e_remove()
15413 pf->vsi[i] = NULL; in i40e_remove()
15419 kfree(pf->veb[i]); in i40e_remove()
15420 pf->veb[i] = NULL; in i40e_remove()
15423 kfree(pf->qp_pile); in i40e_remove()
15424 kfree(pf->vsi); in i40e_remove()
15426 iounmap(hw->hw_addr); in i40e_remove()
15435 * i40e_pci_error_detected - warning that something funky happened in PCI land
15448 dev_info(&pdev->dev, "%s: error %d\n", __func__, error); in i40e_pci_error_detected()
15451 dev_info(&pdev->dev, in i40e_pci_error_detected()
15452 "Cannot recover - error happened during device probe\n"); in i40e_pci_error_detected()
15457 if (!test_bit(__I40E_SUSPENDED, pf->state)) in i40e_pci_error_detected()
15465 * i40e_pci_error_slot_reset - a PCI slot reset just happened
15479 dev_dbg(&pdev->dev, "%s\n", __func__); in i40e_pci_error_slot_reset()
15481 dev_info(&pdev->dev, in i40e_pci_error_slot_reset()
15482 "Cannot re-enable PCI device after reset.\n"); in i40e_pci_error_slot_reset()
15490 reg = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_pci_error_slot_reset()
15501 * i40e_pci_error_reset_prepare - prepare device driver for pci reset
15512 * i40e_pci_error_reset_done - pci reset done, device driver reset can begin
15523 * i40e_pci_error_resume - restart operations after PCI error recovery
15533 dev_dbg(&pdev->dev, "%s\n", __func__); in i40e_pci_error_resume()
15534 if (test_bit(__I40E_SUSPENDED, pf->state)) in i40e_pci_error_resume()
15541 * i40e_enable_mc_magic_wake - enable multicast magic packet wake up
15547 struct i40e_hw *hw = &pf->hw; in i40e_enable_mc_magic_wake()
15553 if (pf->vsi[pf->lan_vsi] && pf->vsi[pf->lan_vsi]->netdev) { in i40e_enable_mc_magic_wake()
15555 pf->vsi[pf->lan_vsi]->netdev->dev_addr); in i40e_enable_mc_magic_wake()
15557 dev_err(&pf->pdev->dev, in i40e_enable_mc_magic_wake()
15559 ether_addr_copy(mac_addr, hw->mac.addr); in i40e_enable_mc_magic_wake()
15568 if (hw->func_caps.flex10_enable && hw->partition_id != 1) in i40e_enable_mc_magic_wake()
15573 dev_err(&pf->pdev->dev, in i40e_enable_mc_magic_wake()
15583 dev_err(&pf->pdev->dev, in i40e_enable_mc_magic_wake()
15588 * i40e_shutdown - PCI callback for shutting down
15594 struct i40e_hw *hw = &pf->hw; in i40e_shutdown()
15596 set_bit(__I40E_SUSPENDED, pf->state); in i40e_shutdown()
15597 set_bit(__I40E_DOWN, pf->state); in i40e_shutdown()
15599 del_timer_sync(&pf->service_timer); in i40e_shutdown()
15600 cancel_work_sync(&pf->service_task); in i40e_shutdown()
15607 i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false); in i40e_shutdown()
15609 if (pf->wol_en && (pf->hw_features & I40E_HW_WOL_MC_MAGIC_PKT_WAKE)) in i40e_shutdown()
15615 (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_shutdown()
15617 (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_shutdown()
15620 if (test_bit(__I40E_RECOVERY_MODE, pf->state) && in i40e_shutdown()
15621 !(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_shutdown()
15622 free_irq(pf->pdev->irq, pf); in i40e_shutdown()
15633 pci_wake_from_d3(pdev, pf->wol_en); in i40e_shutdown()
15639 * i40e_suspend - PM callback for moving to D3
15645 struct i40e_hw *hw = &pf->hw; in i40e_suspend()
15648 if (test_and_set_bit(__I40E_SUSPENDED, pf->state)) in i40e_suspend()
15651 set_bit(__I40E_DOWN, pf->state); in i40e_suspend()
15654 del_timer_sync(&pf->service_timer); in i40e_suspend()
15655 cancel_work_sync(&pf->service_task); in i40e_suspend()
15660 i40e_notify_client_of_netdev_close(pf->vsi[pf->lan_vsi], false); in i40e_suspend()
15662 if (pf->wol_en && (pf->hw_features & I40E_HW_WOL_MC_MAGIC_PKT_WAKE)) in i40e_suspend()
15673 wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_suspend()
15674 wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_suspend()
15689 * i40e_resume - PM callback for waking up from D3
15698 if (!test_bit(__I40E_SUSPENDED, pf->state)) in i40e_resume()
15715 clear_bit(__I40E_DOWN, pf->state); in i40e_resume()
15721 clear_bit(__I40E_SUSPENDED, pf->state); in i40e_resume()
15724 mod_timer(&pf->service_timer, in i40e_resume()
15725 round_jiffies(jiffies + pf->service_timer_period)); in i40e_resume()
15754 * i40e_init_module - Driver registration routine
15774 return -ENOMEM; in i40e_init_module()
15783 * i40e_exit_module - Driver exit cleanup routine