Lines Matching refs:pf
51 static void i40e_handle_reset_warning(struct i40e_pf *pf);
54 static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit);
55 static int i40e_setup_misc_vector(struct i40e_pf *pf);
56 static void i40e_determine_queue_usage(struct i40e_pf *pf);
57 static int i40e_setup_pf_filter_control(struct i40e_pf *pf);
58 static void i40e_fdir_sb_setup(struct i40e_pf *pf);
110 struct i40e_pf *pf = (struct i40e_pf *)hw->back; in i40e_allocate_dma_mem_d() local
113 mem->va = dma_zalloc_coherent(&pf->pdev->dev, mem->size, in i40e_allocate_dma_mem_d()
128 struct i40e_pf *pf = (struct i40e_pf *)hw->back; in i40e_free_dma_mem_d() local
130 dma_free_coherent(&pf->pdev->dev, mem->size, mem->va, mem->pa); in i40e_free_dma_mem_d()
184 static int i40e_get_lump(struct i40e_pf *pf, struct i40e_lump_tracking *pile, in i40e_get_lump() argument
191 dev_info(&pf->pdev->dev, in i40e_get_lump()
263 struct i40e_vsi *i40e_find_vsi_from_id(struct i40e_pf *pf, u16 id) in i40e_find_vsi_from_id() argument
267 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_find_vsi_from_id()
268 if (pf->vsi[i] && (pf->vsi[i]->id == id)) in i40e_find_vsi_from_id()
269 return pf->vsi[i]; in i40e_find_vsi_from_id()
280 static void i40e_service_event_schedule(struct i40e_pf *pf) in i40e_service_event_schedule() argument
282 if (!test_bit(__I40E_DOWN, &pf->state) && in i40e_service_event_schedule()
283 !test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state) && in i40e_service_event_schedule()
284 !test_and_set_bit(__I40E_SERVICE_SCHED, &pf->state)) in i40e_service_event_schedule()
285 schedule_work(&pf->service_task); in i40e_service_event_schedule()
304 struct i40e_pf *pf = vsi->back; in i40e_tx_timeout() local
309 pf->tx_timeout_count++; in i40e_tx_timeout()
341 if (time_after(jiffies, (pf->tx_timeout_last_recovery + HZ*20))) in i40e_tx_timeout()
342 pf->tx_timeout_recovery_level = 1; /* reset after some time */ in i40e_tx_timeout()
344 (pf->tx_timeout_last_recovery + netdev->watchdog_timeo))) in i40e_tx_timeout()
350 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_tx_timeout()
351 val = rd32(&pf->hw, in i40e_tx_timeout()
355 val = rd32(&pf->hw, I40E_PFINT_DYN_CTL0); in i40e_tx_timeout()
363 pf->tx_timeout_last_recovery = jiffies; in i40e_tx_timeout()
365 pf->tx_timeout_recovery_level, hung_queue); in i40e_tx_timeout()
367 switch (pf->tx_timeout_recovery_level) { in i40e_tx_timeout()
369 set_bit(__I40E_PF_RESET_REQUESTED, &pf->state); in i40e_tx_timeout()
372 set_bit(__I40E_CORE_RESET_REQUESTED, &pf->state); in i40e_tx_timeout()
375 set_bit(__I40E_GLOBAL_RESET_REQUESTED, &pf->state); in i40e_tx_timeout()
382 i40e_service_event_schedule(pf); in i40e_tx_timeout()
383 pf->tx_timeout_recovery_level++; in i40e_tx_timeout()
523 void i40e_pf_reset_stats(struct i40e_pf *pf) in i40e_pf_reset_stats() argument
527 memset(&pf->stats, 0, sizeof(pf->stats)); in i40e_pf_reset_stats()
528 memset(&pf->stats_offsets, 0, sizeof(pf->stats_offsets)); in i40e_pf_reset_stats()
529 pf->stat_offsets_loaded = false; in i40e_pf_reset_stats()
532 if (pf->veb[i]) { in i40e_pf_reset_stats()
533 memset(&pf->veb[i]->stats, 0, in i40e_pf_reset_stats()
534 sizeof(pf->veb[i]->stats)); in i40e_pf_reset_stats()
535 memset(&pf->veb[i]->stats_offsets, 0, in i40e_pf_reset_stats()
536 sizeof(pf->veb[i]->stats_offsets)); in i40e_pf_reset_stats()
537 pf->veb[i]->stat_offsets_loaded = false; in i40e_pf_reset_stats()
606 struct i40e_pf *pf = vsi->back; in i40e_update_eth_stats() local
607 struct i40e_hw *hw = &pf->hw; in i40e_update_eth_stats()
670 struct i40e_pf *pf = veb->pf; in i40e_update_veb_stats() local
671 struct i40e_hw *hw = &pf->hw; in i40e_update_veb_stats()
750 struct i40e_pf *pf = vsi->back; in i40e_update_fcoe_stats() local
751 struct i40e_hw *hw = &pf->hw; in i40e_update_fcoe_stats()
759 idx = (pf->pf_seid - I40E_BASE_PF_SEID) + I40E_FCOE_PF_STAT_OFFSET; in i40e_update_fcoe_stats()
798 static void i40e_update_link_xoff_rx(struct i40e_pf *pf) in i40e_update_link_xoff_rx() argument
800 struct i40e_hw_port_stats *osd = &pf->stats_offsets; in i40e_update_link_xoff_rx()
801 struct i40e_hw_port_stats *nsd = &pf->stats; in i40e_update_link_xoff_rx()
802 struct i40e_hw *hw = &pf->hw; in i40e_update_link_xoff_rx()
811 pf->stat_offsets_loaded, in i40e_update_link_xoff_rx()
826 static void i40e_update_prio_xoff_rx(struct i40e_pf *pf) in i40e_update_prio_xoff_rx() argument
828 struct i40e_hw_port_stats *osd = &pf->stats_offsets; in i40e_update_prio_xoff_rx()
829 struct i40e_hw_port_stats *nsd = &pf->stats; in i40e_update_prio_xoff_rx()
832 struct i40e_hw *hw = &pf->hw; in i40e_update_prio_xoff_rx()
840 i40e_update_link_xoff_rx(pf); in i40e_update_prio_xoff_rx()
848 pf->stat_offsets_loaded, in i40e_update_prio_xoff_rx()
873 struct i40e_pf *pf = vsi->back; in i40e_update_vsi_stats() local
889 test_bit(__I40E_CONFIG_BUSY, &pf->state)) in i40e_update_vsi_stats()
957 if (vsi == pf->vsi[pf->lan_vsi]) { in i40e_update_vsi_stats()
958 ns->rx_crc_errors = pf->stats.crc_errors; in i40e_update_vsi_stats()
959 ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes; in i40e_update_vsi_stats()
960 ns->rx_length_errors = pf->stats.rx_length_errors; in i40e_update_vsi_stats()
968 static void i40e_update_pf_stats(struct i40e_pf *pf) in i40e_update_pf_stats() argument
970 struct i40e_hw_port_stats *osd = &pf->stats_offsets; in i40e_update_pf_stats()
971 struct i40e_hw_port_stats *nsd = &pf->stats; in i40e_update_pf_stats()
972 struct i40e_hw *hw = &pf->hw; in i40e_update_pf_stats()
978 pf->stat_offsets_loaded, in i40e_update_pf_stats()
982 pf->stat_offsets_loaded, in i40e_update_pf_stats()
985 pf->stat_offsets_loaded, in i40e_update_pf_stats()
990 pf->stat_offsets_loaded, in i40e_update_pf_stats()
995 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1000 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1005 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1010 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1015 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1020 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1025 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1029 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1033 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1037 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1042 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1047 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1050 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1052 i40e_update_prio_xoff_rx(pf); /* handles I40E_GLPRT_LXOFFRXC */ in i40e_update_pf_stats()
1054 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1059 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1063 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1067 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1072 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1079 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1083 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1087 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1091 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1095 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1099 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1103 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1108 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1112 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1116 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1120 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1124 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1128 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1132 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1136 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1139 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1142 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1145 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1150 I40E_GLQF_PCNT(I40E_FD_ATR_STAT_IDX(pf->hw.pf_id)), in i40e_update_pf_stats()
1151 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1154 I40E_GLQF_PCNT(I40E_FD_SB_STAT_IDX(pf->hw.pf_id)), in i40e_update_pf_stats()
1155 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1158 I40E_GLQF_PCNT(I40E_FD_ATR_TUNNEL_STAT_IDX(pf->hw.pf_id)), in i40e_update_pf_stats()
1159 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1170 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1173 pf->stat_offsets_loaded, in i40e_update_pf_stats()
1176 if (pf->flags & I40E_FLAG_FD_SB_ENABLED && in i40e_update_pf_stats()
1177 !(pf->auto_disable_flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_update_pf_stats()
1182 if (pf->flags & I40E_FLAG_FD_ATR_ENABLED && in i40e_update_pf_stats()
1183 !(pf->auto_disable_flags & I40E_FLAG_FD_ATR_ENABLED)) in i40e_update_pf_stats()
1188 pf->stat_offsets_loaded = true; in i40e_update_pf_stats()
1199 struct i40e_pf *pf = vsi->back; in i40e_update_stats() local
1201 if (vsi == pf->vsi[pf->lan_vsi]) in i40e_update_stats()
1202 i40e_update_pf_stats(pf); in i40e_update_stats()
1330 struct i40e_pf *pf = vsi->back; in i40e_rm_default_mac_filter() local
1342 ret = i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_rm_default_mac_filter()
1482 struct i40e_pf *pf = vsi->back; in i40e_set_mac() local
1483 struct i40e_hw *hw = &pf->hw; in i40e_set_mac()
1526 i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_set_mac()
1540 i40e_aq_add_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_set_mac()
1577 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_queue_map() local
1597 dev_warn(&pf->pdev->dev, "DCB is enabled but no TC enabled, forcing TC0\n"); in i40e_vsi_setup_queue_map()
1612 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_setup_queue_map()
1613 qcount = min_t(int, vsi->alloc_queue_pairs, pf->num_lan_msix); in i40e_vsi_setup_queue_map()
1617 num_tc_qps = min_t(int, num_tc_qps, i40e_pf_get_max_q_per_tc(pf)); in i40e_vsi_setup_queue_map()
1628 qcount = min_t(int, pf->rss_size, num_tc_qps); in i40e_vsi_setup_queue_map()
1679 else if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_setup_queue_map()
1680 vsi->num_queue_pairs = pf->num_lan_msix; in i40e_vsi_setup_queue_map()
1870 struct i40e_pf *pf; in i40e_sync_vsi_filters() local
1882 pf = vsi->back; in i40e_sync_vsi_filters()
1938 filter_list_len = pf->hw.aq.asq_buf_size / in i40e_sync_vsi_filters()
1969 ret = i40e_aq_remove_macvlan(&pf->hw, in i40e_sync_vsi_filters()
1972 aq_err = pf->hw.aq.asq_last_status; in i40e_sync_vsi_filters()
1977 dev_err(&pf->pdev->dev, in i40e_sync_vsi_filters()
1979 i40e_stat_str(&pf->hw, ret), in i40e_sync_vsi_filters()
1980 i40e_aq_str(&pf->hw, aq_err)); in i40e_sync_vsi_filters()
1990 ret = i40e_aq_remove_macvlan(&pf->hw, vsi->seid, in i40e_sync_vsi_filters()
1992 aq_err = pf->hw.aq.asq_last_status; in i40e_sync_vsi_filters()
1996 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
1998 i40e_stat_str(&pf->hw, ret), in i40e_sync_vsi_filters()
1999 i40e_aq_str(&pf->hw, aq_err)); in i40e_sync_vsi_filters()
2009 filter_list_len = pf->hw.aq.asq_buf_size / in i40e_sync_vsi_filters()
2043 ret = i40e_aq_add_macvlan(&pf->hw, vsi->seid, in i40e_sync_vsi_filters()
2046 aq_err = pf->hw.aq.asq_last_status; in i40e_sync_vsi_filters()
2061 ret = i40e_aq_add_macvlan(&pf->hw, vsi->seid, in i40e_sync_vsi_filters()
2063 aq_err = pf->hw.aq.asq_last_status; in i40e_sync_vsi_filters()
2070 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2072 i40e_stat_str(&pf->hw, ret), in i40e_sync_vsi_filters()
2073 i40e_aq_str(&pf->hw, aq_err)); in i40e_sync_vsi_filters()
2074 if ((pf->hw.aq.asq_last_status == I40E_AQ_RC_ENOSPC) && in i40e_sync_vsi_filters()
2080 dev_info(&pf->pdev->dev, "promiscuous mode forced on\n"); in i40e_sync_vsi_filters()
2095 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2097 i40e_stat_str(&pf->hw, ret), in i40e_sync_vsi_filters()
2098 i40e_aq_str(&pf->hw, in i40e_sync_vsi_filters()
2099 pf->hw.aq.asq_last_status)); in i40e_sync_vsi_filters()
2107 if (vsi->type == I40E_VSI_MAIN && pf->lan_veb != I40E_NO_VEB) { in i40e_sync_vsi_filters()
2113 if (pf->cur_promisc != cur_promisc) { in i40e_sync_vsi_filters()
2114 pf->cur_promisc = cur_promisc; in i40e_sync_vsi_filters()
2116 i40e_do_reset_safe(pf, in i40e_sync_vsi_filters()
2119 i40e_do_reset(pf, in i40e_sync_vsi_filters()
2128 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2130 ret, pf->hw.aq.asq_last_status); in i40e_sync_vsi_filters()
2136 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2138 ret, pf->hw.aq.asq_last_status); in i40e_sync_vsi_filters()
2144 dev_info(&pf->pdev->dev, in i40e_sync_vsi_filters()
2146 i40e_stat_str(&pf->hw, ret), in i40e_sync_vsi_filters()
2147 i40e_aq_str(&pf->hw, in i40e_sync_vsi_filters()
2148 pf->hw.aq.asq_last_status)); in i40e_sync_vsi_filters()
2159 static void i40e_sync_filters_subtask(struct i40e_pf *pf) in i40e_sync_filters_subtask() argument
2163 if (!pf || !(pf->flags & I40E_FLAG_FILTER_SYNC)) in i40e_sync_filters_subtask()
2165 pf->flags &= ~I40E_FLAG_FILTER_SYNC; in i40e_sync_filters_subtask()
2167 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_sync_filters_subtask()
2168 if (pf->vsi[v] && in i40e_sync_filters_subtask()
2169 (pf->vsi[v]->flags & I40E_VSI_FLAG_FILTER_CHANGED)) in i40e_sync_filters_subtask()
2170 i40e_sync_vsi_filters(pf->vsi[v], true); in i40e_sync_filters_subtask()
2209 struct i40e_pf *pf = np->vsi->back; in i40e_ioctl() local
2213 return i40e_ptp_get_ts_config(pf, ifr); in i40e_ioctl()
2215 return i40e_ptp_set_ts_config(pf, ifr); in i40e_ioctl()
3039 struct i40e_pf *pf = vsi->back; in i40e_fdir_filter_restore() local
3042 if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_fdir_filter_restore()
3046 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_filter_restore()
3075 struct i40e_pf *pf = vsi->back; in i40e_vsi_configure_msix() local
3076 struct i40e_hw *hw = &pf->hw; in i40e_vsi_configure_msix()
3140 static void i40e_enable_misc_int_causes(struct i40e_pf *pf) in i40e_enable_misc_int_causes() argument
3142 struct i40e_hw *hw = &pf->hw; in i40e_enable_misc_int_causes()
3158 if (pf->flags & I40E_FLAG_IWARP_ENABLED) in i40e_enable_misc_int_causes()
3161 if (pf->flags & I40E_FLAG_PTP) in i40e_enable_misc_int_causes()
3181 struct i40e_pf *pf = vsi->back; in i40e_configure_msi_and_legacy() local
3182 struct i40e_hw *hw = &pf->hw; in i40e_configure_msi_and_legacy()
3194 i40e_enable_misc_int_causes(pf); in i40e_configure_msi_and_legacy()
3218 void i40e_irq_dynamic_disable_icr0(struct i40e_pf *pf) in i40e_irq_dynamic_disable_icr0() argument
3220 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_disable_icr0()
3231 void i40e_irq_dynamic_enable_icr0(struct i40e_pf *pf) in i40e_irq_dynamic_enable_icr0() argument
3233 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_enable_icr0()
3251 struct i40e_pf *pf = vsi->back; in i40e_irq_dynamic_disable() local
3252 struct i40e_hw *hw = &pf->hw; in i40e_irq_dynamic_disable()
3287 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq_msix() local
3310 err = request_irq(pf->msix_entries[base + vector].vector, in i40e_vsi_request_irq_msix()
3316 dev_info(&pf->pdev->dev, in i40e_vsi_request_irq_msix()
3321 irq_set_affinity_hint(pf->msix_entries[base + vector].vector, in i40e_vsi_request_irq_msix()
3331 irq_set_affinity_hint(pf->msix_entries[base + vector].vector, in i40e_vsi_request_irq_msix()
3333 free_irq(pf->msix_entries[base + vector].vector, in i40e_vsi_request_irq_msix()
3345 struct i40e_pf *pf = vsi->back; in i40e_vsi_disable_irq() local
3346 struct i40e_hw *hw = &pf->hw; in i40e_vsi_disable_irq()
3355 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_vsi_disable_irq()
3362 synchronize_irq(pf->msix_entries[i + base].vector); in i40e_vsi_disable_irq()
3368 synchronize_irq(pf->pdev->irq); in i40e_vsi_disable_irq()
3378 struct i40e_pf *pf = vsi->back; in i40e_vsi_enable_irq() local
3381 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_vsi_enable_irq()
3385 i40e_irq_dynamic_enable_icr0(pf); in i40e_vsi_enable_irq()
3388 i40e_flush(&pf->hw); in i40e_vsi_enable_irq()
3396 static void i40e_stop_misc_vector(struct i40e_pf *pf) in i40e_stop_misc_vector() argument
3399 wr32(&pf->hw, I40E_PFINT_ICR0_ENA, 0); in i40e_stop_misc_vector()
3400 i40e_flush(&pf->hw); in i40e_stop_misc_vector()
3414 struct i40e_pf *pf = (struct i40e_pf *)data; in i40e_intr() local
3415 struct i40e_hw *hw = &pf->hw; in i40e_intr()
3430 pf->sw_int_count++; in i40e_intr()
3432 if ((pf->flags & I40E_FLAG_IWARP_ENABLED) && in i40e_intr()
3436 dev_info(&pf->pdev->dev, "cleared PE_CRITERR\n"); in i40e_intr()
3441 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_intr()
3454 if (!test_bit(__I40E_DOWN, &pf->state)) in i40e_intr()
3460 set_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state); in i40e_intr()
3465 set_bit(__I40E_MDD_EVENT_PENDING, &pf->state); in i40e_intr()
3470 set_bit(__I40E_VFLR_EVENT_PENDING, &pf->state); in i40e_intr()
3474 if (!test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state)) in i40e_intr()
3475 set_bit(__I40E_RESET_INTR_RECEIVED, &pf->state); in i40e_intr()
3481 pf->corer_count++; in i40e_intr()
3483 pf->globr_count++; in i40e_intr()
3485 pf->empr_count++; in i40e_intr()
3486 set_bit(__I40E_EMP_RESET_INTR_RECEIVED, &pf->state); in i40e_intr()
3492 dev_info(&pf->pdev->dev, "HMC error interrupt\n"); in i40e_intr()
3493 dev_info(&pf->pdev->dev, "HMC error info 0x%x, HMC error data 0x%x\n", in i40e_intr()
3503 i40e_ptp_tx_hwtstamp(pf); in i40e_intr()
3513 dev_info(&pf->pdev->dev, "unhandled interrupt icr0=0x%08x\n", in i40e_intr()
3518 dev_info(&pf->pdev->dev, "device will be reset\n"); in i40e_intr()
3519 set_bit(__I40E_PF_RESET_REQUESTED, &pf->state); in i40e_intr()
3520 i40e_service_event_schedule(pf); in i40e_intr()
3529 if (!test_bit(__I40E_DOWN, &pf->state)) { in i40e_intr()
3530 i40e_service_event_schedule(pf); in i40e_intr()
3531 i40e_irq_dynamic_enable_icr0(pf); in i40e_intr()
3715 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq() local
3718 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_request_irq()
3720 else if (pf->flags & I40E_FLAG_MSI_ENABLED) in i40e_vsi_request_irq()
3721 err = request_irq(pf->pdev->irq, i40e_intr, 0, in i40e_vsi_request_irq()
3722 pf->int_name, pf); in i40e_vsi_request_irq()
3724 err = request_irq(pf->pdev->irq, i40e_intr, IRQF_SHARED, in i40e_vsi_request_irq()
3725 pf->int_name, pf); in i40e_vsi_request_irq()
3728 dev_info(&pf->pdev->dev, "request_irq failed, Error %d\n", err); in i40e_vsi_request_irq()
3749 struct i40e_pf *pf = vsi->back; in i40e_netpoll() local
3756 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_netpoll()
3760 i40e_intr(pf->pdev->irq, netdev); in i40e_netpoll()
3776 static int i40e_pf_txq_wait(struct i40e_pf *pf, int pf_q, bool enable) in i40e_pf_txq_wait() argument
3782 tx_reg = rd32(&pf->hw, I40E_QTX_ENA(pf_q)); in i40e_pf_txq_wait()
3801 struct i40e_pf *pf = vsi->back; in i40e_vsi_control_tx() local
3802 struct i40e_hw *hw = &pf->hw; in i40e_vsi_control_tx()
3810 i40e_pre_tx_queue_cfg(&pf->hw, pf_q, enable); in i40e_vsi_control_tx()
3835 if (!enable && test_bit(__I40E_PORT_TX_SUSPENDED, &pf->state)) in i40e_vsi_control_tx()
3839 ret = i40e_pf_txq_wait(pf, pf_q, enable); in i40e_vsi_control_tx()
3841 dev_info(&pf->pdev->dev, in i40e_vsi_control_tx()
3864 static int i40e_pf_rxq_wait(struct i40e_pf *pf, int pf_q, bool enable) in i40e_pf_rxq_wait() argument
3870 rx_reg = rd32(&pf->hw, I40E_QRX_ENA(pf_q)); in i40e_pf_rxq_wait()
3889 struct i40e_pf *pf = vsi->back; in i40e_vsi_control_rx() local
3890 struct i40e_hw *hw = &pf->hw; in i40e_vsi_control_rx()
3916 ret = i40e_pf_rxq_wait(pf, pf_q, enable); in i40e_vsi_control_rx()
3918 dev_info(&pf->pdev->dev, in i40e_vsi_control_rx()
3958 struct i40e_pf *pf = vsi->back; in i40e_vsi_free_irq() local
3959 struct i40e_hw *hw = &pf->hw; in i40e_vsi_free_irq()
3964 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_vsi_free_irq()
3981 irq_set_affinity_hint(pf->msix_entries[vector].vector, in i40e_vsi_free_irq()
3983 free_irq(pf->msix_entries[vector].vector, in i40e_vsi_free_irq()
4033 free_irq(pf->pdev->irq, pf); in i40e_vsi_free_irq()
4119 static void i40e_reset_interrupt_capability(struct i40e_pf *pf) in i40e_reset_interrupt_capability() argument
4122 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_reset_interrupt_capability()
4123 pci_disable_msix(pf->pdev); in i40e_reset_interrupt_capability()
4124 kfree(pf->msix_entries); in i40e_reset_interrupt_capability()
4125 pf->msix_entries = NULL; in i40e_reset_interrupt_capability()
4126 kfree(pf->irq_pile); in i40e_reset_interrupt_capability()
4127 pf->irq_pile = NULL; in i40e_reset_interrupt_capability()
4128 } else if (pf->flags & I40E_FLAG_MSI_ENABLED) { in i40e_reset_interrupt_capability()
4129 pci_disable_msi(pf->pdev); in i40e_reset_interrupt_capability()
4131 pf->flags &= ~(I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED); in i40e_reset_interrupt_capability()
4141 static void i40e_clear_interrupt_scheme(struct i40e_pf *pf) in i40e_clear_interrupt_scheme() argument
4145 i40e_stop_misc_vector(pf); in i40e_clear_interrupt_scheme()
4146 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_clear_interrupt_scheme()
4147 synchronize_irq(pf->msix_entries[0].vector); in i40e_clear_interrupt_scheme()
4148 free_irq(pf->msix_entries[0].vector, pf); in i40e_clear_interrupt_scheme()
4151 i40e_put_lump(pf->irq_pile, 0, I40E_PILE_VALID_BIT-1); in i40e_clear_interrupt_scheme()
4152 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_clear_interrupt_scheme()
4153 if (pf->vsi[i]) in i40e_clear_interrupt_scheme()
4154 i40e_vsi_free_q_vectors(pf->vsi[i]); in i40e_clear_interrupt_scheme()
4155 i40e_reset_interrupt_capability(pf); in i40e_clear_interrupt_scheme()
4246 static void i40e_pf_quiesce_all_vsi(struct i40e_pf *pf) in i40e_pf_quiesce_all_vsi() argument
4250 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_pf_quiesce_all_vsi()
4251 if (pf->vsi[v]) in i40e_pf_quiesce_all_vsi()
4252 i40e_quiesce_vsi(pf->vsi[v]); in i40e_pf_quiesce_all_vsi()
4260 static void i40e_pf_unquiesce_all_vsi(struct i40e_pf *pf) in i40e_pf_unquiesce_all_vsi() argument
4264 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_pf_unquiesce_all_vsi()
4265 if (pf->vsi[v]) in i40e_pf_unquiesce_all_vsi()
4266 i40e_unquiesce_vsi(pf->vsi[v]); in i40e_pf_unquiesce_all_vsi()
4279 struct i40e_pf *pf = vsi->back; in i40e_vsi_wait_txq_disabled() local
4285 ret = i40e_pf_txq_wait(pf, pf_q, false); in i40e_vsi_wait_txq_disabled()
4287 dev_info(&pf->pdev->dev, in i40e_vsi_wait_txq_disabled()
4304 static int i40e_pf_wait_txq_disabled(struct i40e_pf *pf) in i40e_pf_wait_txq_disabled() argument
4308 for (v = 0; v < pf->hw.func_caps.num_vsis; v++) { in i40e_pf_wait_txq_disabled()
4310 if (pf->vsi[v] && pf->vsi[v]->type != I40E_VSI_FCOE) { in i40e_pf_wait_txq_disabled()
4311 ret = i40e_vsi_wait_txq_disabled(pf->vsi[v]); in i40e_pf_wait_txq_disabled()
4336 struct i40e_pf *pf; in i40e_detect_recover_hung_queue() local
4340 pf = vsi->back; in i40e_detect_recover_hung_queue()
4356 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_detect_recover_hung_queue()
4357 val = rd32(&pf->hw, in i40e_detect_recover_hung_queue()
4361 val = rd32(&pf->hw, I40E_PFINT_DYN_CTL0); in i40e_detect_recover_hung_queue()
4384 static void i40e_detect_recover_hung(struct i40e_pf *pf) in i40e_detect_recover_hung() argument
4391 vsi = pf->vsi[pf->lan_vsi]; in i40e_detect_recover_hung()
4430 static u8 i40e_get_iscsi_tc_map(struct i40e_pf *pf) in i40e_get_iscsi_tc_map() argument
4433 struct i40e_hw *hw = &pf->hw; in i40e_get_iscsi_tc_map()
4504 static u8 i40e_pf_get_num_tc(struct i40e_pf *pf) in i40e_pf_get_num_tc() argument
4506 struct i40e_hw *hw = &pf->hw; in i40e_pf_get_num_tc()
4512 if (!(pf->flags & I40E_FLAG_DCB_ENABLED)) in i40e_pf_get_num_tc()
4516 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) in i40e_pf_get_num_tc()
4520 if (pf->hw.func_caps.iscsi) in i40e_pf_get_num_tc()
4521 enabled_tc = i40e_get_iscsi_tc_map(pf); in i40e_pf_get_num_tc()
4540 static u8 i40e_pf_get_default_tc(struct i40e_pf *pf) in i40e_pf_get_default_tc() argument
4542 u8 enabled_tc = pf->hw.func_caps.enabled_tcmap; in i40e_pf_get_default_tc()
4563 static u8 i40e_pf_get_tc_map(struct i40e_pf *pf) in i40e_pf_get_tc_map() argument
4566 if (!(pf->flags & I40E_FLAG_DCB_ENABLED)) in i40e_pf_get_tc_map()
4567 return i40e_pf_get_default_tc(pf); in i40e_pf_get_tc_map()
4570 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) in i40e_pf_get_tc_map()
4571 return i40e_dcb_get_enabled_tc(&pf->hw.local_dcbx_config); in i40e_pf_get_tc_map()
4574 if (pf->hw.func_caps.iscsi) in i40e_pf_get_tc_map()
4575 return i40e_get_iscsi_tc_map(pf); in i40e_pf_get_tc_map()
4577 return i40e_pf_get_default_tc(pf); in i40e_pf_get_tc_map()
4590 struct i40e_pf *pf = vsi->back; in i40e_vsi_get_bw_info() local
4591 struct i40e_hw *hw = &pf->hw; in i40e_vsi_get_bw_info()
4599 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
4601 i40e_stat_str(&pf->hw, ret), in i40e_vsi_get_bw_info()
4602 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_vsi_get_bw_info()
4610 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
4612 i40e_stat_str(&pf->hw, ret), in i40e_vsi_get_bw_info()
4613 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_vsi_get_bw_info()
4618 dev_info(&pf->pdev->dev, in i40e_vsi_get_bw_info()
4683 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_netdev_tc() local
4684 struct i40e_hw *hw = &pf->hw; in i40e_vsi_config_netdev_tc()
4833 struct i40e_pf *pf = veb->pf; in i40e_veb_config_tc() local
4850 ret = i40e_aq_config_switch_comp_bw_config(&pf->hw, veb->seid, in i40e_veb_config_tc()
4853 dev_info(&pf->pdev->dev, in i40e_veb_config_tc()
4855 i40e_stat_str(&pf->hw, ret), in i40e_veb_config_tc()
4856 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_veb_config_tc()
4863 dev_info(&pf->pdev->dev, in i40e_veb_config_tc()
4865 i40e_stat_str(&pf->hw, ret), in i40e_veb_config_tc()
4866 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_veb_config_tc()
4882 static void i40e_dcb_reconfigure(struct i40e_pf *pf) in i40e_dcb_reconfigure() argument
4889 tc_map = i40e_pf_get_tc_map(pf); in i40e_dcb_reconfigure()
4891 if (!pf->veb[v]) in i40e_dcb_reconfigure()
4893 ret = i40e_veb_config_tc(pf->veb[v], tc_map); in i40e_dcb_reconfigure()
4895 dev_info(&pf->pdev->dev, in i40e_dcb_reconfigure()
4897 pf->veb[v]->seid); in i40e_dcb_reconfigure()
4903 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_dcb_reconfigure()
4904 if (!pf->vsi[v]) in i40e_dcb_reconfigure()
4914 if (v == pf->lan_vsi) in i40e_dcb_reconfigure()
4915 tc_map = i40e_pf_get_tc_map(pf); in i40e_dcb_reconfigure()
4917 tc_map = i40e_pf_get_default_tc(pf); in i40e_dcb_reconfigure()
4919 if (pf->vsi[v]->type == I40E_VSI_FCOE) in i40e_dcb_reconfigure()
4920 tc_map = i40e_get_fcoe_tc_map(pf); in i40e_dcb_reconfigure()
4923 ret = i40e_vsi_config_tc(pf->vsi[v], tc_map); in i40e_dcb_reconfigure()
4925 dev_info(&pf->pdev->dev, in i40e_dcb_reconfigure()
4927 pf->vsi[v]->seid); in i40e_dcb_reconfigure()
4931 i40e_vsi_map_rings_to_vectors(pf->vsi[v]); in i40e_dcb_reconfigure()
4932 if (pf->vsi[v]->netdev) in i40e_dcb_reconfigure()
4933 i40e_dcbnl_set_all(pf->vsi[v]); in i40e_dcb_reconfigure()
4945 static int i40e_resume_port_tx(struct i40e_pf *pf) in i40e_resume_port_tx() argument
4947 struct i40e_hw *hw = &pf->hw; in i40e_resume_port_tx()
4952 dev_info(&pf->pdev->dev, in i40e_resume_port_tx()
4954 i40e_stat_str(&pf->hw, ret), in i40e_resume_port_tx()
4955 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_resume_port_tx()
4957 set_bit(__I40E_PF_RESET_REQUESTED, &pf->state); in i40e_resume_port_tx()
4958 i40e_service_event_schedule(pf); in i40e_resume_port_tx()
4971 static int i40e_init_pf_dcb(struct i40e_pf *pf) in i40e_init_pf_dcb() argument
4973 struct i40e_hw *hw = &pf->hw; in i40e_init_pf_dcb()
4977 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) || in i40e_init_pf_dcb()
4978 (pf->hw.aq.fw_maj_ver < 4)) in i40e_init_pf_dcb()
4987 dev_info(&pf->pdev->dev, in i40e_init_pf_dcb()
4990 if (pf->flags & I40E_FLAG_MFP_ENABLED) in i40e_init_pf_dcb()
4995 pf->dcbx_cap = DCB_CAP_DCBX_LLD_MANAGED | in i40e_init_pf_dcb()
4998 pf->flags |= I40E_FLAG_DCB_CAPABLE; in i40e_init_pf_dcb()
5001 pf->flags |= I40E_FLAG_DCB_ENABLED; in i40e_init_pf_dcb()
5002 dev_dbg(&pf->pdev->dev, in i40e_init_pf_dcb()
5006 dev_info(&pf->pdev->dev, in i40e_init_pf_dcb()
5008 i40e_stat_str(&pf->hw, err), in i40e_init_pf_dcb()
5009 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_init_pf_dcb()
5089 struct i40e_pf *pf = vsi->back; in i40e_up_complete() local
5092 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_up_complete()
5106 if ((pf->hw.phy.link_info.link_info & I40E_AQ_LINK_UP) && in i40e_up_complete()
5114 if ((pf->hw.phy.link_info.link_info & in i40e_up_complete()
5116 (!(pf->hw.phy.link_info.an_info & in i40e_up_complete()
5125 pf->fd_add_err = pf->fd_atr_cnt = 0; in i40e_up_complete()
5126 if (pf->fd_tcp_rule > 0) { in i40e_up_complete()
5127 pf->flags &= ~I40E_FLAG_FD_ATR_ENABLED; in i40e_up_complete()
5128 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_up_complete()
5129 dev_info(&pf->pdev->dev, "Forcing ATR off, sideband rules for TCP/IPv4 exist\n"); in i40e_up_complete()
5130 pf->fd_tcp_rule = 0; in i40e_up_complete()
5134 i40e_service_event_schedule(pf); in i40e_up_complete()
5148 struct i40e_pf *pf = vsi->back; in i40e_vsi_reinit_locked() local
5151 while (test_and_set_bit(__I40E_CONFIG_BUSY, &pf->state)) in i40e_vsi_reinit_locked()
5162 clear_bit(__I40E_CONFIG_BUSY, &pf->state); in i40e_vsi_reinit_locked()
5218 struct i40e_pf *pf = vsi->back; in i40e_setup_tc() local
5224 if (!(pf->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_setup_tc()
5230 if (pf->flags & I40E_FLAG_MFP_ENABLED) { in i40e_setup_tc()
5236 if (tc > i40e_pf_get_num_tc(pf)) { in i40e_setup_tc()
5283 struct i40e_pf *pf = vsi->back; in i40e_open() local
5287 if (test_bit(__I40E_TESTING, &pf->state) || in i40e_open()
5288 test_bit(__I40E_BAD_EEPROM, &pf->state)) in i40e_open()
5298 wr32(&pf->hw, I40E_GLLAN_TSOMSK_F, be32_to_cpu(TCP_FLAG_PSH | in i40e_open()
5300 wr32(&pf->hw, I40E_GLLAN_TSOMSK_M, be32_to_cpu(TCP_FLAG_PSH | in i40e_open()
5303 wr32(&pf->hw, I40E_GLLAN_TSOMSK_L, be32_to_cpu(TCP_FLAG_CWR) >> 16); in i40e_open()
5322 struct i40e_pf *pf = vsi->back; in i40e_vsi_open() local
5340 dev_driver_string(&pf->pdev->dev), vsi->netdev->name); in i40e_vsi_open()
5358 dev_driver_string(&pf->pdev->dev), in i40e_vsi_open()
5359 dev_name(&pf->pdev->dev)); in i40e_vsi_open()
5381 if (vsi == pf->vsi[pf->lan_vsi]) in i40e_vsi_open()
5382 i40e_do_reset(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED)); in i40e_vsi_open()
5394 static void i40e_fdir_filter_exit(struct i40e_pf *pf) in i40e_fdir_filter_exit() argument
5400 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_filter_exit()
5404 pf->fdir_pf_active_filters = 0; in i40e_fdir_filter_exit()
5440 void i40e_do_reset(struct i40e_pf *pf, u32 reset_flags) in i40e_do_reset() argument
5446 if (i40e_check_asq_alive(&pf->hw)) in i40e_do_reset()
5447 i40e_vc_notify_reset(pf); in i40e_do_reset()
5460 dev_dbg(&pf->pdev->dev, "GlobalR requested\n"); in i40e_do_reset()
5461 val = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_do_reset()
5463 wr32(&pf->hw, I40E_GLGEN_RTRIG, val); in i40e_do_reset()
5471 dev_dbg(&pf->pdev->dev, "CoreR requested\n"); in i40e_do_reset()
5472 val = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_do_reset()
5474 wr32(&pf->hw, I40E_GLGEN_RTRIG, val); in i40e_do_reset()
5475 i40e_flush(&pf->hw); in i40e_do_reset()
5487 dev_dbg(&pf->pdev->dev, "PFR requested\n"); in i40e_do_reset()
5488 i40e_handle_reset_warning(pf); in i40e_do_reset()
5494 dev_info(&pf->pdev->dev, in i40e_do_reset()
5496 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_do_reset()
5497 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_do_reset()
5501 i40e_vsi_reinit_locked(pf->vsi[v]); in i40e_do_reset()
5509 dev_info(&pf->pdev->dev, "VSI down requested\n"); in i40e_do_reset()
5510 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_do_reset()
5511 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_do_reset()
5521 dev_info(&pf->pdev->dev, in i40e_do_reset()
5533 bool i40e_dcb_need_reconfig(struct i40e_pf *pf, in i40e_dcb_need_reconfig() argument
5548 dev_dbg(&pf->pdev->dev, "ETS UP2TC changed.\n"); in i40e_dcb_need_reconfig()
5554 dev_dbg(&pf->pdev->dev, "ETS TC BW Table changed.\n"); in i40e_dcb_need_reconfig()
5559 dev_dbg(&pf->pdev->dev, "ETS TSA Table changed.\n"); in i40e_dcb_need_reconfig()
5567 dev_dbg(&pf->pdev->dev, "PFC config change detected.\n"); in i40e_dcb_need_reconfig()
5575 dev_dbg(&pf->pdev->dev, "APP Table change detected.\n"); in i40e_dcb_need_reconfig()
5578 dev_dbg(&pf->pdev->dev, "dcb need_reconfig=%d\n", need_reconfig); in i40e_dcb_need_reconfig()
5587 static int i40e_handle_lldp_event(struct i40e_pf *pf, in i40e_handle_lldp_event() argument
5592 struct i40e_hw *hw = &pf->hw; in i40e_handle_lldp_event()
5599 if (!(pf->flags & I40E_FLAG_DCB_CAPABLE)) in i40e_handle_lldp_event()
5605 dev_dbg(&pf->pdev->dev, "LLDP event mib bridge type 0x%x\n", type); in i40e_handle_lldp_event()
5611 dev_dbg(&pf->pdev->dev, in i40e_handle_lldp_event()
5627 ret = i40e_get_dcb_config(&pf->hw); in i40e_handle_lldp_event()
5629 dev_info(&pf->pdev->dev, in i40e_handle_lldp_event()
5631 i40e_stat_str(&pf->hw, ret), in i40e_handle_lldp_event()
5632 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_handle_lldp_event()
5639 dev_dbg(&pf->pdev->dev, "No change detected in DCBX configuration.\n"); in i40e_handle_lldp_event()
5643 need_reconfig = i40e_dcb_need_reconfig(pf, &tmp_dcbx_cfg, in i40e_handle_lldp_event()
5646 i40e_dcbnl_flush_apps(pf, &tmp_dcbx_cfg, &hw->local_dcbx_config); in i40e_handle_lldp_event()
5653 pf->flags |= I40E_FLAG_DCB_ENABLED; in i40e_handle_lldp_event()
5655 pf->flags &= ~I40E_FLAG_DCB_ENABLED; in i40e_handle_lldp_event()
5657 set_bit(__I40E_PORT_TX_SUSPENDED, &pf->state); in i40e_handle_lldp_event()
5659 i40e_pf_quiesce_all_vsi(pf); in i40e_handle_lldp_event()
5662 i40e_dcb_reconfigure(pf); in i40e_handle_lldp_event()
5664 ret = i40e_resume_port_tx(pf); in i40e_handle_lldp_event()
5666 clear_bit(__I40E_PORT_TX_SUSPENDED, &pf->state); in i40e_handle_lldp_event()
5672 ret = i40e_pf_wait_txq_disabled(pf); in i40e_handle_lldp_event()
5675 set_bit(__I40E_PF_RESET_REQUESTED, &pf->state); in i40e_handle_lldp_event()
5676 i40e_service_event_schedule(pf); in i40e_handle_lldp_event()
5678 i40e_pf_unquiesce_all_vsi(pf); in i40e_handle_lldp_event()
5692 void i40e_do_reset_safe(struct i40e_pf *pf, u32 reset_flags) in i40e_do_reset_safe() argument
5695 i40e_do_reset(pf, reset_flags); in i40e_do_reset_safe()
5707 static void i40e_handle_lan_overflow_event(struct i40e_pf *pf, in i40e_handle_lan_overflow_event() argument
5714 struct i40e_hw *hw = &pf->hw; in i40e_handle_lan_overflow_event()
5718 dev_dbg(&pf->pdev->dev, "overflow Rx Queue Number = %d QTX_CTL=0x%08x\n", in i40e_handle_lan_overflow_event()
5727 vf = &pf->vf[vf_id]; in i40e_handle_lan_overflow_event()
5739 static void i40e_service_event_complete(struct i40e_pf *pf) in i40e_service_event_complete() argument
5741 BUG_ON(!test_bit(__I40E_SERVICE_SCHED, &pf->state)); in i40e_service_event_complete()
5745 clear_bit(__I40E_SERVICE_SCHED, &pf->state); in i40e_service_event_complete()
5752 u32 i40e_get_cur_guaranteed_fd_count(struct i40e_pf *pf) in i40e_get_cur_guaranteed_fd_count() argument
5756 val = rd32(&pf->hw, I40E_PFQF_FDSTAT); in i40e_get_cur_guaranteed_fd_count()
5765 u32 i40e_get_current_fd_count(struct i40e_pf *pf) in i40e_get_current_fd_count() argument
5769 val = rd32(&pf->hw, I40E_PFQF_FDSTAT); in i40e_get_current_fd_count()
5780 u32 i40e_get_global_fd_count(struct i40e_pf *pf) in i40e_get_global_fd_count() argument
5784 val = rd32(&pf->hw, I40E_GLQF_FDCNT_0); in i40e_get_global_fd_count()
5795 void i40e_fdir_check_and_reenable(struct i40e_pf *pf) in i40e_fdir_check_and_reenable() argument
5801 if (test_bit(__I40E_FD_FLUSH_REQUESTED, &pf->state)) in i40e_fdir_check_and_reenable()
5807 fcnt_prog = i40e_get_global_fd_count(pf); in i40e_fdir_check_and_reenable()
5808 fcnt_avail = pf->fdir_pf_filter_count; in i40e_fdir_check_and_reenable()
5810 (pf->fd_add_err == 0) || in i40e_fdir_check_and_reenable()
5811 (i40e_get_current_atr_cnt(pf) < pf->fd_atr_cnt)) { in i40e_fdir_check_and_reenable()
5812 if ((pf->flags & I40E_FLAG_FD_SB_ENABLED) && in i40e_fdir_check_and_reenable()
5813 (pf->auto_disable_flags & I40E_FLAG_FD_SB_ENABLED)) { in i40e_fdir_check_and_reenable()
5814 pf->auto_disable_flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_fdir_check_and_reenable()
5815 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_check_and_reenable()
5816 …dev_info(&pf->pdev->dev, "FD Sideband/ntuple is being enabled since we have space in the table now… in i40e_fdir_check_and_reenable()
5821 if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) && in i40e_fdir_check_and_reenable()
5822 (pf->auto_disable_flags & I40E_FLAG_FD_ATR_ENABLED)) { in i40e_fdir_check_and_reenable()
5823 pf->auto_disable_flags &= ~I40E_FLAG_FD_ATR_ENABLED; in i40e_fdir_check_and_reenable()
5824 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_check_and_reenable()
5825 dev_info(&pf->pdev->dev, "ATR is being enabled since we have space in the table now\n"); in i40e_fdir_check_and_reenable()
5830 if (pf->fd_inv > 0) { in i40e_fdir_check_and_reenable()
5832 &pf->fdir_filter_list, fdir_node) { in i40e_fdir_check_and_reenable()
5833 if (filter->fd_id == pf->fd_inv) { in i40e_fdir_check_and_reenable()
5836 pf->fdir_pf_active_filters--; in i40e_fdir_check_and_reenable()
5848 static void i40e_fdir_flush_and_replay(struct i40e_pf *pf) in i40e_fdir_flush_and_replay() argument
5856 if (!(pf->flags & (I40E_FLAG_FD_SB_ENABLED | I40E_FLAG_FD_ATR_ENABLED))) in i40e_fdir_flush_and_replay()
5859 if (!time_after(jiffies, pf->fd_flush_timestamp + in i40e_fdir_flush_and_replay()
5866 min_flush_time = pf->fd_flush_timestamp + in i40e_fdir_flush_and_replay()
5868 fd_room = pf->fdir_pf_filter_count - pf->fdir_pf_active_filters; in i40e_fdir_flush_and_replay()
5872 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_flush_and_replay()
5873 dev_info(&pf->pdev->dev, "ATR disabled, not enough FD filter space.\n"); in i40e_fdir_flush_and_replay()
5877 pf->fd_flush_timestamp = jiffies; in i40e_fdir_flush_and_replay()
5878 pf->flags &= ~I40E_FLAG_FD_ATR_ENABLED; in i40e_fdir_flush_and_replay()
5880 wr32(&pf->hw, I40E_PFQF_CTL_1, in i40e_fdir_flush_and_replay()
5882 i40e_flush(&pf->hw); in i40e_fdir_flush_and_replay()
5883 pf->fd_flush_cnt++; in i40e_fdir_flush_and_replay()
5884 pf->fd_add_err = 0; in i40e_fdir_flush_and_replay()
5888 reg = rd32(&pf->hw, I40E_PFQF_CTL_1); in i40e_fdir_flush_and_replay()
5893 dev_warn(&pf->pdev->dev, "FD table did not flush, needs more time\n"); in i40e_fdir_flush_and_replay()
5896 i40e_fdir_filter_restore(pf->vsi[pf->lan_vsi]); in i40e_fdir_flush_and_replay()
5898 pf->flags |= I40E_FLAG_FD_ATR_ENABLED; in i40e_fdir_flush_and_replay()
5899 clear_bit(__I40E_FD_FLUSH_REQUESTED, &pf->state); in i40e_fdir_flush_and_replay()
5900 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_fdir_flush_and_replay()
5901 dev_info(&pf->pdev->dev, "FD Filter table flushed and FD-SB replayed.\n"); in i40e_fdir_flush_and_replay()
5910 u32 i40e_get_current_atr_cnt(struct i40e_pf *pf) in i40e_get_current_atr_cnt() argument
5912 return i40e_get_current_fd_count(pf) - pf->fdir_pf_active_filters; in i40e_get_current_atr_cnt()
5926 static void i40e_fdir_reinit_subtask(struct i40e_pf *pf) in i40e_fdir_reinit_subtask() argument
5930 if (test_bit(__I40E_DOWN, &pf->state)) in i40e_fdir_reinit_subtask()
5933 if (!(pf->flags & (I40E_FLAG_FD_SB_ENABLED | I40E_FLAG_FD_ATR_ENABLED))) in i40e_fdir_reinit_subtask()
5936 if (test_bit(__I40E_FD_FLUSH_REQUESTED, &pf->state)) in i40e_fdir_reinit_subtask()
5937 i40e_fdir_flush_and_replay(pf); in i40e_fdir_reinit_subtask()
5939 i40e_fdir_check_and_reenable(pf); in i40e_fdir_reinit_subtask()
5987 struct i40e_pf *pf; in i40e_veb_link_event() local
5990 if (!veb || !veb->pf) in i40e_veb_link_event()
5992 pf = veb->pf; in i40e_veb_link_event()
5996 if (pf->veb[i] && (pf->veb[i]->uplink_seid == veb->seid)) in i40e_veb_link_event()
5997 i40e_veb_link_event(pf->veb[i], link_up); in i40e_veb_link_event()
6000 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_veb_link_event()
6001 if (pf->vsi[i] && (pf->vsi[i]->uplink_seid == veb->seid)) in i40e_veb_link_event()
6002 i40e_vsi_link_event(pf->vsi[i], link_up); in i40e_veb_link_event()
6009 static void i40e_link_event(struct i40e_pf *pf) in i40e_link_event() argument
6011 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_link_event()
6017 pf->hw.phy.get_link_info = true; in i40e_link_event()
6019 old_link = (pf->hw.phy.link_info_old.link_info & I40E_AQ_LINK_UP); in i40e_link_event()
6021 status = i40e_get_link_status(&pf->hw, &new_link); in i40e_link_event()
6023 dev_dbg(&pf->pdev->dev, "couldn't get link state, status: %d\n", in i40e_link_event()
6028 old_link_speed = pf->hw.phy.link_info_old.link_speed; in i40e_link_event()
6029 new_link_speed = pf->hw.phy.link_info.link_speed; in i40e_link_event()
6043 if (pf->lan_veb != I40E_NO_VEB && pf->veb[pf->lan_veb]) in i40e_link_event()
6044 i40e_veb_link_event(pf->veb[pf->lan_veb], new_link); in i40e_link_event()
6048 if (pf->vf) in i40e_link_event()
6049 i40e_vc_notify_link_state(pf); in i40e_link_event()
6051 if (pf->flags & I40E_FLAG_PTP) in i40e_link_event()
6052 i40e_ptp_set_increment(pf); in i40e_link_event()
6059 static void i40e_watchdog_subtask(struct i40e_pf *pf) in i40e_watchdog_subtask() argument
6064 if (test_bit(__I40E_DOWN, &pf->state) || in i40e_watchdog_subtask()
6065 test_bit(__I40E_CONFIG_BUSY, &pf->state)) in i40e_watchdog_subtask()
6069 if (time_before(jiffies, (pf->service_timer_previous + in i40e_watchdog_subtask()
6070 pf->service_timer_period))) in i40e_watchdog_subtask()
6072 pf->service_timer_previous = jiffies; in i40e_watchdog_subtask()
6074 if (pf->flags & I40E_FLAG_LINK_POLLING_ENABLED) in i40e_watchdog_subtask()
6075 i40e_link_event(pf); in i40e_watchdog_subtask()
6080 for (i = 0; i < pf->num_alloc_vsi; i++) in i40e_watchdog_subtask()
6081 if (pf->vsi[i] && pf->vsi[i]->netdev) in i40e_watchdog_subtask()
6082 i40e_update_stats(pf->vsi[i]); in i40e_watchdog_subtask()
6084 if (pf->flags & I40E_FLAG_VEB_STATS_ENABLED) { in i40e_watchdog_subtask()
6087 if (pf->veb[i]) in i40e_watchdog_subtask()
6088 i40e_update_veb_stats(pf->veb[i]); in i40e_watchdog_subtask()
6091 i40e_ptp_rx_hang(pf->vsi[pf->lan_vsi]); in i40e_watchdog_subtask()
6098 static void i40e_reset_subtask(struct i40e_pf *pf) in i40e_reset_subtask() argument
6103 if (test_bit(__I40E_REINIT_REQUESTED, &pf->state)) { in i40e_reset_subtask()
6105 clear_bit(__I40E_REINIT_REQUESTED, &pf->state); in i40e_reset_subtask()
6107 if (test_bit(__I40E_PF_RESET_REQUESTED, &pf->state)) { in i40e_reset_subtask()
6109 clear_bit(__I40E_PF_RESET_REQUESTED, &pf->state); in i40e_reset_subtask()
6111 if (test_bit(__I40E_CORE_RESET_REQUESTED, &pf->state)) { in i40e_reset_subtask()
6113 clear_bit(__I40E_CORE_RESET_REQUESTED, &pf->state); in i40e_reset_subtask()
6115 if (test_bit(__I40E_GLOBAL_RESET_REQUESTED, &pf->state)) { in i40e_reset_subtask()
6117 clear_bit(__I40E_GLOBAL_RESET_REQUESTED, &pf->state); in i40e_reset_subtask()
6119 if (test_bit(__I40E_DOWN_REQUESTED, &pf->state)) { in i40e_reset_subtask()
6121 clear_bit(__I40E_DOWN_REQUESTED, &pf->state); in i40e_reset_subtask()
6127 if (test_bit(__I40E_RESET_INTR_RECEIVED, &pf->state)) { in i40e_reset_subtask()
6128 i40e_handle_reset_warning(pf); in i40e_reset_subtask()
6134 !test_bit(__I40E_DOWN, &pf->state) && in i40e_reset_subtask()
6135 !test_bit(__I40E_CONFIG_BUSY, &pf->state)) in i40e_reset_subtask()
6136 i40e_do_reset(pf, reset_flags); in i40e_reset_subtask()
6147 static void i40e_handle_link_event(struct i40e_pf *pf, in i40e_handle_link_event() argument
6150 struct i40e_hw *hw = &pf->hw; in i40e_handle_link_event()
6163 i40e_link_event(pf); in i40e_handle_link_event()
6169 dev_err(&pf->pdev->dev, in i40e_handle_link_event()
6177 static void i40e_clean_adminq_subtask(struct i40e_pf *pf) in i40e_clean_adminq_subtask() argument
6180 struct i40e_hw *hw = &pf->hw; in i40e_clean_adminq_subtask()
6188 if (test_bit(__I40E_RESET_FAILED, &pf->state)) in i40e_clean_adminq_subtask()
6192 val = rd32(&pf->hw, pf->hw.aq.arq.len); in i40e_clean_adminq_subtask()
6195 dev_info(&pf->pdev->dev, "ARQ VF Error detected\n"); in i40e_clean_adminq_subtask()
6199 dev_info(&pf->pdev->dev, "ARQ Overflow Error detected\n"); in i40e_clean_adminq_subtask()
6203 dev_info(&pf->pdev->dev, "ARQ Critical Error detected\n"); in i40e_clean_adminq_subtask()
6207 wr32(&pf->hw, pf->hw.aq.arq.len, val); in i40e_clean_adminq_subtask()
6209 val = rd32(&pf->hw, pf->hw.aq.asq.len); in i40e_clean_adminq_subtask()
6212 dev_info(&pf->pdev->dev, "ASQ VF Error detected\n"); in i40e_clean_adminq_subtask()
6216 dev_info(&pf->pdev->dev, "ASQ Overflow Error detected\n"); in i40e_clean_adminq_subtask()
6220 dev_info(&pf->pdev->dev, "ASQ Critical Error detected\n"); in i40e_clean_adminq_subtask()
6224 wr32(&pf->hw, pf->hw.aq.asq.len, val); in i40e_clean_adminq_subtask()
6236 dev_info(&pf->pdev->dev, "ARQ event error %d\n", ret); in i40e_clean_adminq_subtask()
6244 i40e_handle_link_event(pf, &event); in i40e_clean_adminq_subtask()
6247 ret = i40e_vc_process_vf_msg(pf, in i40e_clean_adminq_subtask()
6255 dev_dbg(&pf->pdev->dev, "ARQ: Update LLDP MIB event received\n"); in i40e_clean_adminq_subtask()
6258 ret = i40e_handle_lldp_event(pf, &event); in i40e_clean_adminq_subtask()
6263 dev_dbg(&pf->pdev->dev, "ARQ LAN queue overflow event received\n"); in i40e_clean_adminq_subtask()
6264 i40e_handle_lan_overflow_event(pf, &event); in i40e_clean_adminq_subtask()
6267 dev_info(&pf->pdev->dev, "ARQ: Msg from other pf\n"); in i40e_clean_adminq_subtask()
6271 i40e_debug(&pf->hw, I40E_DEBUG_NVM, "ARQ NVM operation completed\n"); in i40e_clean_adminq_subtask()
6274 dev_info(&pf->pdev->dev, in i40e_clean_adminq_subtask()
6279 } while (pending && (i++ < pf->adminq_work_limit)); in i40e_clean_adminq_subtask()
6281 clear_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state); in i40e_clean_adminq_subtask()
6295 static void i40e_verify_eeprom(struct i40e_pf *pf) in i40e_verify_eeprom() argument
6299 err = i40e_diag_eeprom_test(&pf->hw); in i40e_verify_eeprom()
6302 err = i40e_diag_eeprom_test(&pf->hw); in i40e_verify_eeprom()
6304 dev_info(&pf->pdev->dev, "eeprom check failed (%d), Tx/Rx traffic disabled\n", in i40e_verify_eeprom()
6306 set_bit(__I40E_BAD_EEPROM, &pf->state); in i40e_verify_eeprom()
6310 if (!err && test_bit(__I40E_BAD_EEPROM, &pf->state)) { in i40e_verify_eeprom()
6311 dev_info(&pf->pdev->dev, "eeprom check passed, Tx/Rx traffic enabled\n"); in i40e_verify_eeprom()
6312 clear_bit(__I40E_BAD_EEPROM, &pf->state); in i40e_verify_eeprom()
6322 static void i40e_enable_pf_switch_lb(struct i40e_pf *pf) in i40e_enable_pf_switch_lb() argument
6324 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_enable_pf_switch_lb()
6328 ctxt.seid = pf->main_vsi_seid; in i40e_enable_pf_switch_lb()
6329 ctxt.pf_num = pf->hw.pf_id; in i40e_enable_pf_switch_lb()
6331 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_enable_pf_switch_lb()
6333 dev_info(&pf->pdev->dev, in i40e_enable_pf_switch_lb()
6335 i40e_stat_str(&pf->hw, ret), in i40e_enable_pf_switch_lb()
6336 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_enable_pf_switch_lb()
6345 dev_info(&pf->pdev->dev, in i40e_enable_pf_switch_lb()
6347 i40e_stat_str(&pf->hw, ret), in i40e_enable_pf_switch_lb()
6348 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_enable_pf_switch_lb()
6358 static void i40e_disable_pf_switch_lb(struct i40e_pf *pf) in i40e_disable_pf_switch_lb() argument
6360 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_disable_pf_switch_lb()
6364 ctxt.seid = pf->main_vsi_seid; in i40e_disable_pf_switch_lb()
6365 ctxt.pf_num = pf->hw.pf_id; in i40e_disable_pf_switch_lb()
6367 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_disable_pf_switch_lb()
6369 dev_info(&pf->pdev->dev, in i40e_disable_pf_switch_lb()
6371 i40e_stat_str(&pf->hw, ret), in i40e_disable_pf_switch_lb()
6372 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_disable_pf_switch_lb()
6381 dev_info(&pf->pdev->dev, in i40e_disable_pf_switch_lb()
6383 i40e_stat_str(&pf->hw, ret), in i40e_disable_pf_switch_lb()
6384 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_disable_pf_switch_lb()
6398 struct i40e_pf *pf = veb->pf; in i40e_config_bridge_mode() local
6400 if (pf->hw.debug_mask & I40E_DEBUG_LAN) in i40e_config_bridge_mode()
6401 dev_info(&pf->pdev->dev, "enabling bridge mode: %s\n", in i40e_config_bridge_mode()
6404 i40e_disable_pf_switch_lb(pf); in i40e_config_bridge_mode()
6406 i40e_enable_pf_switch_lb(pf); in i40e_config_bridge_mode()
6421 struct i40e_pf *pf = veb->pf; in i40e_reconstitute_veb() local
6426 for (v = 0; v < pf->num_alloc_vsi && !ctl_vsi; v++) { in i40e_reconstitute_veb()
6427 if (pf->vsi[v] && in i40e_reconstitute_veb()
6428 pf->vsi[v]->veb_idx == veb->idx && in i40e_reconstitute_veb()
6429 pf->vsi[v]->flags & I40E_VSI_FLAG_VEB_OWNER) { in i40e_reconstitute_veb()
6430 ctl_vsi = pf->vsi[v]; in i40e_reconstitute_veb()
6435 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
6440 if (ctl_vsi != pf->vsi[pf->lan_vsi]) in i40e_reconstitute_veb()
6441 ctl_vsi->uplink_seid = pf->vsi[pf->lan_vsi]->uplink_seid; in i40e_reconstitute_veb()
6444 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
6456 if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED) in i40e_reconstitute_veb()
6463 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_reconstitute_veb()
6464 if (!pf->vsi[v] || pf->vsi[v] == ctl_vsi) in i40e_reconstitute_veb()
6467 if (pf->vsi[v]->veb_idx == veb->idx) { in i40e_reconstitute_veb()
6468 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_reconstitute_veb()
6473 dev_info(&pf->pdev->dev, in i40e_reconstitute_veb()
6484 if (pf->veb[veb_idx] && pf->veb[veb_idx]->veb_idx == veb->idx) { in i40e_reconstitute_veb()
6485 pf->veb[veb_idx]->uplink_seid = veb->seid; in i40e_reconstitute_veb()
6486 ret = i40e_reconstitute_veb(pf->veb[veb_idx]); in i40e_reconstitute_veb()
6500 static int i40e_get_capabilities(struct i40e_pf *pf) in i40e_get_capabilities() argument
6514 err = i40e_aq_discover_capabilities(&pf->hw, cap_buf, buf_len, in i40e_get_capabilities()
6521 if (pf->hw.aq.asq_last_status == I40E_AQ_RC_ENOMEM) { in i40e_get_capabilities()
6524 } else if (pf->hw.aq.asq_last_status != I40E_AQ_RC_OK) { in i40e_get_capabilities()
6525 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
6527 i40e_stat_str(&pf->hw, err), in i40e_get_capabilities()
6528 i40e_aq_str(&pf->hw, in i40e_get_capabilities()
6529 pf->hw.aq.asq_last_status)); in i40e_get_capabilities()
6534 if (pf->hw.debug_mask & I40E_DEBUG_USER) in i40e_get_capabilities()
6535 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
6537 pf->hw.pf_id, pf->hw.func_caps.num_vfs, in i40e_get_capabilities()
6538 pf->hw.func_caps.num_msix_vectors, in i40e_get_capabilities()
6539 pf->hw.func_caps.num_msix_vectors_vf, in i40e_get_capabilities()
6540 pf->hw.func_caps.fd_filters_guaranteed, in i40e_get_capabilities()
6541 pf->hw.func_caps.fd_filters_best_effort, in i40e_get_capabilities()
6542 pf->hw.func_caps.num_tx_qp, in i40e_get_capabilities()
6543 pf->hw.func_caps.num_vsis); in i40e_get_capabilities()
6545 #define DEF_NUM_VSI (1 + (pf->hw.func_caps.fcoe ? 1 : 0) \ in i40e_get_capabilities()
6546 + pf->hw.func_caps.num_vfs) in i40e_get_capabilities()
6547 if (pf->hw.revision_id == 0 && (DEF_NUM_VSI > pf->hw.func_caps.num_vsis)) { in i40e_get_capabilities()
6548 dev_info(&pf->pdev->dev, in i40e_get_capabilities()
6550 pf->hw.func_caps.num_vsis, DEF_NUM_VSI); in i40e_get_capabilities()
6551 pf->hw.func_caps.num_vsis = DEF_NUM_VSI; in i40e_get_capabilities()
6563 static void i40e_fdir_sb_setup(struct i40e_pf *pf) in i40e_fdir_sb_setup() argument
6571 if (!rd32(&pf->hw, I40E_GLQF_HKEY(0))) { in i40e_fdir_sb_setup()
6579 wr32(&pf->hw, I40E_GLQF_HKEY(i), hkey[i]); in i40e_fdir_sb_setup()
6582 if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_fdir_sb_setup()
6587 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_fdir_sb_setup()
6588 if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) { in i40e_fdir_sb_setup()
6589 vsi = pf->vsi[i]; in i40e_fdir_sb_setup()
6596 vsi = i40e_vsi_setup(pf, I40E_VSI_FDIR, in i40e_fdir_sb_setup()
6597 pf->vsi[pf->lan_vsi]->seid, 0); in i40e_fdir_sb_setup()
6599 dev_info(&pf->pdev->dev, "Couldn't create FDir VSI\n"); in i40e_fdir_sb_setup()
6600 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_fdir_sb_setup()
6612 static void i40e_fdir_teardown(struct i40e_pf *pf) in i40e_fdir_teardown() argument
6616 i40e_fdir_filter_exit(pf); in i40e_fdir_teardown()
6617 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_fdir_teardown()
6618 if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) { in i40e_fdir_teardown()
6619 i40e_vsi_release(pf->vsi[i]); in i40e_fdir_teardown()
6631 static void i40e_prep_for_reset(struct i40e_pf *pf) in i40e_prep_for_reset() argument
6633 struct i40e_hw *hw = &pf->hw; in i40e_prep_for_reset()
6637 clear_bit(__I40E_RESET_INTR_RECEIVED, &pf->state); in i40e_prep_for_reset()
6638 if (test_and_set_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state)) in i40e_prep_for_reset()
6641 dev_dbg(&pf->pdev->dev, "Tearing down internal switch for reset\n"); in i40e_prep_for_reset()
6644 i40e_pf_quiesce_all_vsi(pf); in i40e_prep_for_reset()
6646 for (v = 0; v < pf->num_alloc_vsi; v++) { in i40e_prep_for_reset()
6647 if (pf->vsi[v]) in i40e_prep_for_reset()
6648 pf->vsi[v]->seid = 0; in i40e_prep_for_reset()
6651 i40e_shutdown_adminq(&pf->hw); in i40e_prep_for_reset()
6657 dev_warn(&pf->pdev->dev, in i40e_prep_for_reset()
6666 static void i40e_send_version(struct i40e_pf *pf) in i40e_send_version() argument
6675 i40e_aq_send_driver_version(&pf->hw, &dv, NULL); in i40e_send_version()
6683 static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit) in i40e_reset_and_rebuild() argument
6685 struct i40e_hw *hw = &pf->hw; in i40e_reset_and_rebuild()
6696 dev_info(&pf->pdev->dev, "PF reset failed, %d\n", ret); in i40e_reset_and_rebuild()
6697 set_bit(__I40E_RESET_FAILED, &pf->state); in i40e_reset_and_rebuild()
6700 pf->pfr_count++; in i40e_reset_and_rebuild()
6702 if (test_bit(__I40E_DOWN, &pf->state)) in i40e_reset_and_rebuild()
6704 dev_dbg(&pf->pdev->dev, "Rebuilding internal switch\n"); in i40e_reset_and_rebuild()
6707 ret = i40e_init_adminq(&pf->hw); in i40e_reset_and_rebuild()
6709 dev_info(&pf->pdev->dev, "Rebuild AdminQ failed, err %s aq_err %s\n", in i40e_reset_and_rebuild()
6710 i40e_stat_str(&pf->hw, ret), in i40e_reset_and_rebuild()
6711 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_reset_and_rebuild()
6716 if (test_and_clear_bit(__I40E_EMP_RESET_INTR_RECEIVED, &pf->state)) in i40e_reset_and_rebuild()
6717 i40e_verify_eeprom(pf); in i40e_reset_and_rebuild()
6720 ret = i40e_get_capabilities(pf); in i40e_reset_and_rebuild()
6726 pf->fcoe_hmc_cntx_num, pf->fcoe_hmc_filt_num); in i40e_reset_and_rebuild()
6728 dev_info(&pf->pdev->dev, "init_lan_hmc failed: %d\n", ret); in i40e_reset_and_rebuild()
6733 dev_info(&pf->pdev->dev, "configure_lan_hmc failed: %d\n", ret); in i40e_reset_and_rebuild()
6738 ret = i40e_init_pf_dcb(pf); in i40e_reset_and_rebuild()
6740 dev_info(&pf->pdev->dev, "DCB init failed %d, disabled\n", ret); in i40e_reset_and_rebuild()
6741 pf->flags &= ~I40E_FLAG_DCB_CAPABLE; in i40e_reset_and_rebuild()
6746 i40e_init_pf_fcoe(pf); in i40e_reset_and_rebuild()
6750 ret = i40e_setup_pf_switch(pf, reinit); in i40e_reset_and_rebuild()
6757 ret = i40e_aq_set_phy_int_mask(&pf->hw, in i40e_reset_and_rebuild()
6761 dev_info(&pf->pdev->dev, "set phy mask fail, err %s aq_err %s\n", in i40e_reset_and_rebuild()
6762 i40e_stat_str(&pf->hw, ret), in i40e_reset_and_rebuild()
6763 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_reset_and_rebuild()
6766 ret = i40e_set_fc(&pf->hw, &set_fc_aq_fail, true); in i40e_reset_and_rebuild()
6768 dev_dbg(&pf->pdev->dev, "setting flow control: ret = %s last_status = %s\n", in i40e_reset_and_rebuild()
6769 i40e_stat_str(&pf->hw, ret), in i40e_reset_and_rebuild()
6770 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_reset_and_rebuild()
6779 if (pf->vsi[pf->lan_vsi]->uplink_seid != pf->mac_seid) { in i40e_reset_and_rebuild()
6780 dev_dbg(&pf->pdev->dev, "attempting to rebuild switch\n"); in i40e_reset_and_rebuild()
6783 if (!pf->veb[v]) in i40e_reset_and_rebuild()
6786 if (pf->veb[v]->uplink_seid == pf->mac_seid || in i40e_reset_and_rebuild()
6787 pf->veb[v]->uplink_seid == 0) { in i40e_reset_and_rebuild()
6788 ret = i40e_reconstitute_veb(pf->veb[v]); in i40e_reset_and_rebuild()
6799 if (pf->veb[v]->uplink_seid == pf->mac_seid) { in i40e_reset_and_rebuild()
6800 dev_info(&pf->pdev->dev, in i40e_reset_and_rebuild()
6803 pf->vsi[pf->lan_vsi]->uplink_seid in i40e_reset_and_rebuild()
6804 = pf->mac_seid; in i40e_reset_and_rebuild()
6806 } else if (pf->veb[v]->uplink_seid == 0) { in i40e_reset_and_rebuild()
6807 dev_info(&pf->pdev->dev, in i40e_reset_and_rebuild()
6815 if (pf->vsi[pf->lan_vsi]->uplink_seid == pf->mac_seid) { in i40e_reset_and_rebuild()
6816 dev_dbg(&pf->pdev->dev, "attempting to rebuild PF VSI\n"); in i40e_reset_and_rebuild()
6818 ret = i40e_add_vsi(pf->vsi[pf->lan_vsi]); in i40e_reset_and_rebuild()
6820 dev_info(&pf->pdev->dev, in i40e_reset_and_rebuild()
6826 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) || in i40e_reset_and_rebuild()
6827 (pf->hw.aq.fw_maj_ver < 4)) { in i40e_reset_and_rebuild()
6829 ret = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); in i40e_reset_and_rebuild()
6831 dev_info(&pf->pdev->dev, "link restart failed, err %s aq_err %s\n", in i40e_reset_and_rebuild()
6832 i40e_stat_str(&pf->hw, ret), in i40e_reset_and_rebuild()
6833 i40e_aq_str(&pf->hw, in i40e_reset_and_rebuild()
6834 pf->hw.aq.asq_last_status)); in i40e_reset_and_rebuild()
6837 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_reset_and_rebuild()
6838 ret = i40e_setup_misc_vector(pf); in i40e_reset_and_rebuild()
6846 i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw, in i40e_reset_and_rebuild()
6847 pf->main_vsi_seid); in i40e_reset_and_rebuild()
6850 i40e_pf_unquiesce_all_vsi(pf); in i40e_reset_and_rebuild()
6852 if (pf->num_alloc_vfs) { in i40e_reset_and_rebuild()
6853 for (v = 0; v < pf->num_alloc_vfs; v++) in i40e_reset_and_rebuild()
6854 i40e_reset_vf(&pf->vf[v], true); in i40e_reset_and_rebuild()
6858 i40e_send_version(pf); in i40e_reset_and_rebuild()
6861 clear_bit(__I40E_RESET_FAILED, &pf->state); in i40e_reset_and_rebuild()
6863 clear_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state); in i40e_reset_and_rebuild()
6873 static void i40e_handle_reset_warning(struct i40e_pf *pf) in i40e_handle_reset_warning() argument
6875 i40e_prep_for_reset(pf); in i40e_handle_reset_warning()
6876 i40e_reset_and_rebuild(pf, false); in i40e_handle_reset_warning()
6885 static void i40e_handle_mdd_event(struct i40e_pf *pf) in i40e_handle_mdd_event() argument
6887 struct i40e_hw *hw = &pf->hw; in i40e_handle_mdd_event()
6894 if (!test_bit(__I40E_MDD_EVENT_PENDING, &pf->state)) in i40e_handle_mdd_event()
6908 pf->hw.func_caps.base_queue; in i40e_handle_mdd_event()
6909 if (netif_msg_tx_err(pf)) in i40e_handle_mdd_event()
6910 …dev_info(&pf->pdev->dev, "Malicious Driver Detection event 0x%02x on TX queue %d PF number 0x%02x … in i40e_handle_mdd_event()
6923 pf->hw.func_caps.base_queue; in i40e_handle_mdd_event()
6924 if (netif_msg_rx_err(pf)) in i40e_handle_mdd_event()
6925 …dev_info(&pf->pdev->dev, "Malicious Driver Detection event 0x%02x on RX queue %d of function 0x%02… in i40e_handle_mdd_event()
6935 dev_info(&pf->pdev->dev, "TX driver issue detected, PF reset issued\n"); in i40e_handle_mdd_event()
6941 dev_info(&pf->pdev->dev, "RX driver issue detected, PF reset issued\n"); in i40e_handle_mdd_event()
6946 set_bit(__I40E_PF_RESET_REQUESTED, &pf->state); in i40e_handle_mdd_event()
6947 i40e_service_event_schedule(pf); in i40e_handle_mdd_event()
6952 for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) { in i40e_handle_mdd_event()
6953 vf = &(pf->vf[i]); in i40e_handle_mdd_event()
6958 dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", in i40e_handle_mdd_event()
6966 dev_info(&pf->pdev->dev, "RX driver issue detected on VF %d\n", in i40e_handle_mdd_event()
6971 dev_info(&pf->pdev->dev, in i40e_handle_mdd_event()
6973 dev_info(&pf->pdev->dev, in i40e_handle_mdd_event()
6980 clear_bit(__I40E_MDD_EVENT_PENDING, &pf->state); in i40e_handle_mdd_event()
6992 static void i40e_sync_vxlan_filters_subtask(struct i40e_pf *pf) in i40e_sync_vxlan_filters_subtask() argument
6994 struct i40e_hw *hw = &pf->hw; in i40e_sync_vxlan_filters_subtask()
6999 if (!(pf->flags & I40E_FLAG_VXLAN_FILTER_SYNC)) in i40e_sync_vxlan_filters_subtask()
7002 pf->flags &= ~I40E_FLAG_VXLAN_FILTER_SYNC; in i40e_sync_vxlan_filters_subtask()
7005 if (pf->pending_vxlan_bitmap & BIT_ULL(i)) { in i40e_sync_vxlan_filters_subtask()
7006 pf->pending_vxlan_bitmap &= ~BIT_ULL(i); in i40e_sync_vxlan_filters_subtask()
7007 port = pf->vxlan_ports[i]; in i40e_sync_vxlan_filters_subtask()
7016 dev_info(&pf->pdev->dev, in i40e_sync_vxlan_filters_subtask()
7020 i40e_stat_str(&pf->hw, ret), in i40e_sync_vxlan_filters_subtask()
7021 i40e_aq_str(&pf->hw, in i40e_sync_vxlan_filters_subtask()
7022 pf->hw.aq.asq_last_status)); in i40e_sync_vxlan_filters_subtask()
7023 pf->vxlan_ports[i] = 0; in i40e_sync_vxlan_filters_subtask()
7036 struct i40e_pf *pf = container_of(work, in i40e_service_task() local
7042 if (test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state)) { in i40e_service_task()
7043 i40e_service_event_complete(pf); in i40e_service_task()
7047 i40e_detect_recover_hung(pf); in i40e_service_task()
7048 i40e_reset_subtask(pf); in i40e_service_task()
7049 i40e_handle_mdd_event(pf); in i40e_service_task()
7050 i40e_vc_process_vflr_event(pf); in i40e_service_task()
7051 i40e_watchdog_subtask(pf); in i40e_service_task()
7052 i40e_fdir_reinit_subtask(pf); in i40e_service_task()
7053 i40e_sync_filters_subtask(pf); in i40e_service_task()
7055 i40e_sync_vxlan_filters_subtask(pf); in i40e_service_task()
7057 i40e_clean_adminq_subtask(pf); in i40e_service_task()
7059 i40e_service_event_complete(pf); in i40e_service_task()
7065 if (time_after(jiffies, (start_time + pf->service_timer_period)) || in i40e_service_task()
7066 test_bit(__I40E_ADMINQ_EVENT_PENDING, &pf->state) || in i40e_service_task()
7067 test_bit(__I40E_MDD_EVENT_PENDING, &pf->state) || in i40e_service_task()
7068 test_bit(__I40E_VFLR_EVENT_PENDING, &pf->state)) in i40e_service_task()
7069 i40e_service_event_schedule(pf); in i40e_service_task()
7078 struct i40e_pf *pf = (struct i40e_pf *)data; in i40e_service_timer() local
7080 mod_timer(&pf->service_timer, in i40e_service_timer()
7081 round_jiffies(jiffies + pf->service_timer_period)); in i40e_service_timer()
7082 i40e_service_event_schedule(pf); in i40e_service_timer()
7091 struct i40e_pf *pf = vsi->back; in i40e_set_num_rings_in_vsi() local
7095 vsi->alloc_queue_pairs = pf->num_lan_qps; in i40e_set_num_rings_in_vsi()
7098 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_set_num_rings_in_vsi()
7099 vsi->num_q_vectors = pf->num_lan_msix; in i40e_set_num_rings_in_vsi()
7113 vsi->alloc_queue_pairs = pf->num_vmdq_qps; in i40e_set_num_rings_in_vsi()
7116 vsi->num_q_vectors = pf->num_vmdq_msix; in i40e_set_num_rings_in_vsi()
7120 vsi->alloc_queue_pairs = pf->num_vf_qps; in i40e_set_num_rings_in_vsi()
7127 vsi->alloc_queue_pairs = pf->num_fcoe_qps; in i40e_set_num_rings_in_vsi()
7130 vsi->num_q_vectors = pf->num_fcoe_msix; in i40e_set_num_rings_in_vsi()
7186 static int i40e_vsi_mem_alloc(struct i40e_pf *pf, enum i40e_vsi_type type) in i40e_vsi_mem_alloc() argument
7194 mutex_lock(&pf->switch_mutex); in i40e_vsi_mem_alloc()
7202 i = pf->next_vsi; in i40e_vsi_mem_alloc()
7203 while (i < pf->num_alloc_vsi && pf->vsi[i]) in i40e_vsi_mem_alloc()
7205 if (i >= pf->num_alloc_vsi) { in i40e_vsi_mem_alloc()
7207 while (i < pf->next_vsi && pf->vsi[i]) in i40e_vsi_mem_alloc()
7211 if (i < pf->num_alloc_vsi && !pf->vsi[i]) { in i40e_vsi_mem_alloc()
7217 pf->next_vsi = ++i; in i40e_vsi_mem_alloc()
7225 vsi->back = pf; in i40e_vsi_mem_alloc()
7229 vsi->rx_itr_setting = pf->rx_itr_default; in i40e_vsi_mem_alloc()
7230 vsi->tx_itr_setting = pf->tx_itr_default; in i40e_vsi_mem_alloc()
7233 pf->rss_table_size : 64; in i40e_vsi_mem_alloc()
7252 pf->vsi[vsi_idx] = vsi; in i40e_vsi_mem_alloc()
7257 pf->next_vsi = i - 1; in i40e_vsi_mem_alloc()
7260 mutex_unlock(&pf->switch_mutex); in i40e_vsi_mem_alloc()
7290 struct i40e_pf *pf; in i40e_vsi_clear() local
7297 pf = vsi->back; in i40e_vsi_clear()
7299 mutex_lock(&pf->switch_mutex); in i40e_vsi_clear()
7300 if (!pf->vsi[vsi->idx]) { in i40e_vsi_clear()
7301 dev_err(&pf->pdev->dev, "pf->vsi[%d] is NULL, just free vsi[%d](%p,type %d)\n", in i40e_vsi_clear()
7306 if (pf->vsi[vsi->idx] != vsi) { in i40e_vsi_clear()
7307 dev_err(&pf->pdev->dev, in i40e_vsi_clear()
7309 pf->vsi[vsi->idx]->idx, in i40e_vsi_clear()
7310 pf->vsi[vsi->idx], in i40e_vsi_clear()
7311 pf->vsi[vsi->idx]->type, in i40e_vsi_clear()
7317 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_clear()
7318 i40e_put_lump(pf->irq_pile, vsi->base_vector, vsi->idx); in i40e_vsi_clear()
7322 pf->vsi[vsi->idx] = NULL; in i40e_vsi_clear()
7323 if (vsi->idx < pf->next_vsi) in i40e_vsi_clear()
7324 pf->next_vsi = vsi->idx; in i40e_vsi_clear()
7327 mutex_unlock(&pf->switch_mutex); in i40e_vsi_clear()
7358 struct i40e_pf *pf = vsi->back; in i40e_alloc_rings() local
7373 tx_ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
7389 rx_ring->dev = &pf->pdev->dev; in i40e_alloc_rings()
7393 if (pf->flags & I40E_FLAG_16BYTE_RX_DESC_ENABLED) in i40e_alloc_rings()
7414 static int i40e_reserve_msix_vectors(struct i40e_pf *pf, int vectors) in i40e_reserve_msix_vectors() argument
7416 vectors = pci_enable_msix_range(pf->pdev, pf->msix_entries, in i40e_reserve_msix_vectors()
7419 dev_info(&pf->pdev->dev, in i40e_reserve_msix_vectors()
7435 static int i40e_init_msix(struct i40e_pf *pf) in i40e_init_msix() argument
7437 struct i40e_hw *hw = &pf->hw; in i40e_init_msix()
7442 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_init_msix()
7472 pf->num_lan_msix = min_t(int, num_online_cpus(), vectors_left); in i40e_init_msix()
7473 vectors_left -= pf->num_lan_msix; in i40e_init_msix()
7474 v_budget += pf->num_lan_msix; in i40e_init_msix()
7477 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_init_msix()
7482 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_init_msix()
7488 if (pf->flags & I40E_FLAG_FCOE_ENABLED) { in i40e_init_msix()
7490 pf->num_fcoe_msix = 0; in i40e_init_msix()
7491 else if (vectors_left >= pf->num_fcoe_qps) in i40e_init_msix()
7492 pf->num_fcoe_msix = pf->num_fcoe_qps; in i40e_init_msix()
7494 pf->num_fcoe_msix = 1; in i40e_init_msix()
7495 v_budget += pf->num_fcoe_msix; in i40e_init_msix()
7496 vectors_left -= pf->num_fcoe_msix; in i40e_init_msix()
7501 if (pf->flags & I40E_FLAG_VMDQ_ENABLED) { in i40e_init_msix()
7502 int vmdq_vecs_wanted = pf->num_vmdq_vsis * pf->num_vmdq_qps; in i40e_init_msix()
7512 pf->num_vmdq_qps = 1; in i40e_init_msix()
7513 pf->num_vmdq_msix = pf->num_vmdq_qps; in i40e_init_msix()
7519 pf->msix_entries = kcalloc(v_budget, sizeof(struct msix_entry), in i40e_init_msix()
7521 if (!pf->msix_entries) in i40e_init_msix()
7525 pf->msix_entries[i].entry = i; in i40e_init_msix()
7526 v_actual = i40e_reserve_msix_vectors(pf, v_budget); in i40e_init_msix()
7535 pf->num_fcoe_qps = 0; in i40e_init_msix()
7536 pf->num_fcoe_msix = 0; in i40e_init_msix()
7538 pf->num_vmdq_msix = 0; in i40e_init_msix()
7542 pf->flags &= ~I40E_FLAG_MSIX_ENABLED; in i40e_init_msix()
7543 kfree(pf->msix_entries); in i40e_init_msix()
7544 pf->msix_entries = NULL; in i40e_init_msix()
7549 pf->num_vmdq_vsis = 0; in i40e_init_msix()
7550 pf->num_vmdq_qps = 0; in i40e_init_msix()
7551 pf->num_lan_qps = 1; in i40e_init_msix()
7552 pf->num_lan_msix = 1; in i40e_init_msix()
7561 pf->num_vmdq_msix = 1; /* force VMDqs to only one vector */ in i40e_init_msix()
7562 pf->num_vmdq_vsis = 1; in i40e_init_msix()
7563 pf->num_vmdq_qps = 1; in i40e_init_msix()
7564 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_init_msix()
7569 pf->num_lan_msix = 1; in i40e_init_msix()
7574 if (pf->flags & I40E_FLAG_FCOE_ENABLED) { in i40e_init_msix()
7575 pf->num_lan_msix = 1; in i40e_init_msix()
7576 pf->num_fcoe_msix = 1; in i40e_init_msix()
7579 pf->num_lan_msix = 2; in i40e_init_msix()
7585 if (pf->flags & I40E_FLAG_FCOE_ENABLED) { in i40e_init_msix()
7586 pf->num_fcoe_msix = 1; in i40e_init_msix()
7591 pf->num_lan_msix = min_t(int, vec, pf->num_lan_qps); in i40e_init_msix()
7596 if ((pf->flags & I40E_FLAG_VMDQ_ENABLED) && in i40e_init_msix()
7597 (pf->num_vmdq_msix == 0)) { in i40e_init_msix()
7598 dev_info(&pf->pdev->dev, "VMDq disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
7599 pf->flags &= ~I40E_FLAG_VMDQ_ENABLED; in i40e_init_msix()
7603 if ((pf->flags & I40E_FLAG_FCOE_ENABLED) && (pf->num_fcoe_msix == 0)) { in i40e_init_msix()
7604 dev_info(&pf->pdev->dev, "FCOE disabled, not enough MSI-X vectors\n"); in i40e_init_msix()
7605 pf->flags &= ~I40E_FLAG_FCOE_ENABLED; in i40e_init_msix()
7652 struct i40e_pf *pf = vsi->back; in i40e_vsi_alloc_q_vectors() local
7657 if (pf->flags & I40E_FLAG_MSIX_ENABLED) in i40e_vsi_alloc_q_vectors()
7659 else if (vsi == pf->vsi[pf->lan_vsi]) in i40e_vsi_alloc_q_vectors()
7683 static int i40e_init_interrupt_scheme(struct i40e_pf *pf) in i40e_init_interrupt_scheme() argument
7688 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_init_interrupt_scheme()
7689 vectors = i40e_init_msix(pf); in i40e_init_interrupt_scheme()
7691 pf->flags &= ~(I40E_FLAG_MSIX_ENABLED | in i40e_init_interrupt_scheme()
7703 i40e_determine_queue_usage(pf); in i40e_init_interrupt_scheme()
7707 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED) && in i40e_init_interrupt_scheme()
7708 (pf->flags & I40E_FLAG_MSI_ENABLED)) { in i40e_init_interrupt_scheme()
7709 dev_info(&pf->pdev->dev, "MSI-X not available, trying MSI\n"); in i40e_init_interrupt_scheme()
7710 vectors = pci_enable_msi(pf->pdev); in i40e_init_interrupt_scheme()
7712 dev_info(&pf->pdev->dev, "MSI init failed - %d\n", in i40e_init_interrupt_scheme()
7714 pf->flags &= ~I40E_FLAG_MSI_ENABLED; in i40e_init_interrupt_scheme()
7719 if (!(pf->flags & (I40E_FLAG_MSIX_ENABLED | I40E_FLAG_MSI_ENABLED))) in i40e_init_interrupt_scheme()
7720 dev_info(&pf->pdev->dev, "MSI-X and MSI not available, falling back to Legacy IRQ\n"); in i40e_init_interrupt_scheme()
7724 pf->irq_pile = kzalloc(size, GFP_KERNEL); in i40e_init_interrupt_scheme()
7725 if (!pf->irq_pile) { in i40e_init_interrupt_scheme()
7726 dev_err(&pf->pdev->dev, "error allocating irq_pile memory\n"); in i40e_init_interrupt_scheme()
7729 pf->irq_pile->num_entries = vectors; in i40e_init_interrupt_scheme()
7730 pf->irq_pile->search_hint = 0; in i40e_init_interrupt_scheme()
7733 (void)i40e_get_lump(pf, pf->irq_pile, 1, I40E_PILE_VALID_BIT - 1); in i40e_init_interrupt_scheme()
7746 static int i40e_setup_misc_vector(struct i40e_pf *pf) in i40e_setup_misc_vector() argument
7748 struct i40e_hw *hw = &pf->hw; in i40e_setup_misc_vector()
7754 if (!test_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state)) { in i40e_setup_misc_vector()
7755 err = request_irq(pf->msix_entries[0].vector, in i40e_setup_misc_vector()
7756 i40e_intr, 0, pf->int_name, pf); in i40e_setup_misc_vector()
7758 dev_info(&pf->pdev->dev, in i40e_setup_misc_vector()
7760 pf->int_name, err); in i40e_setup_misc_vector()
7765 i40e_enable_misc_int_causes(pf); in i40e_setup_misc_vector()
7773 i40e_irq_dynamic_enable_icr0(pf); in i40e_setup_misc_vector()
7786 struct i40e_pf *pf = vsi->back; in i40e_config_rss_aq() local
7787 struct i40e_hw *hw = &pf->hw; in i40e_config_rss_aq()
7795 rss_lut = kzalloc(pf->rss_table_size, GFP_KERNEL); in i40e_config_rss_aq()
7805 dev_info(&pf->pdev->dev, in i40e_config_rss_aq()
7807 i40e_stat_str(&pf->hw, ret), in i40e_config_rss_aq()
7808 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_config_rss_aq()
7818 dev_info(&pf->pdev->dev, in i40e_config_rss_aq()
7820 i40e_stat_str(&pf->hw, ret), in i40e_config_rss_aq()
7821 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_config_rss_aq()
7835 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_rss() local
7838 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs); in i40e_vsi_config_rss()
7840 if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) in i40e_vsi_config_rss()
7851 static int i40e_config_rss_reg(struct i40e_pf *pf, const u8 *seed) in i40e_config_rss_reg() argument
7853 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_config_rss_reg()
7854 struct i40e_hw *hw = &pf->hw; in i40e_config_rss_reg()
7872 wr32(&pf->hw, I40E_PFQF_HLUT(i), lut); in i40e_config_rss_reg()
7883 static int i40e_config_rss(struct i40e_pf *pf) in i40e_config_rss() argument
7885 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_config_rss()
7887 struct i40e_hw *hw = &pf->hw; in i40e_config_rss()
7896 hena |= i40e_pf_get_default_rss_hena(pf); in i40e_config_rss()
7901 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs); in i40e_config_rss()
7905 reg_val = (pf->rss_table_size == 512) ? in i40e_config_rss()
7910 if (pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) in i40e_config_rss()
7911 return i40e_config_rss_aq(pf->vsi[pf->lan_vsi], seed); in i40e_config_rss()
7913 return i40e_config_rss_reg(pf, seed); in i40e_config_rss()
7924 int i40e_reconfig_rss_queues(struct i40e_pf *pf, int queue_count) in i40e_reconfig_rss_queues() argument
7926 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_reconfig_rss_queues()
7929 if (!(pf->flags & I40E_FLAG_RSS_ENABLED)) in i40e_reconfig_rss_queues()
7932 new_rss_size = min_t(int, queue_count, pf->rss_size_max); in i40e_reconfig_rss_queues()
7936 i40e_prep_for_reset(pf); in i40e_reconfig_rss_queues()
7938 pf->rss_size = new_rss_size; in i40e_reconfig_rss_queues()
7940 i40e_reset_and_rebuild(pf, true); in i40e_reconfig_rss_queues()
7941 i40e_config_rss(pf); in i40e_reconfig_rss_queues()
7943 dev_info(&pf->pdev->dev, "RSS count: %d\n", pf->rss_size); in i40e_reconfig_rss_queues()
7944 return pf->rss_size; in i40e_reconfig_rss_queues()
7951 i40e_status i40e_get_npar_bw_setting(struct i40e_pf *pf) in i40e_get_npar_bw_setting() argument
7957 status = i40e_read_bw_from_alt_ram(&pf->hw, &max_bw, &min_bw, in i40e_get_npar_bw_setting()
7962 pf->npar_min_bw = min_bw; in i40e_get_npar_bw_setting()
7964 pf->npar_max_bw = max_bw; in i40e_get_npar_bw_setting()
7974 i40e_status i40e_set_npar_bw_setting(struct i40e_pf *pf) in i40e_set_npar_bw_setting() argument
7980 bw_data.pf_valid_bits = cpu_to_le16(BIT(pf->hw.pf_id)); in i40e_set_npar_bw_setting()
7981 bw_data.max_bw[pf->hw.pf_id] = pf->npar_max_bw & I40E_ALT_BW_VALUE_MASK; in i40e_set_npar_bw_setting()
7982 bw_data.min_bw[pf->hw.pf_id] = pf->npar_min_bw & I40E_ALT_BW_VALUE_MASK; in i40e_set_npar_bw_setting()
7985 status = i40e_aq_configure_partition_bw(&pf->hw, &bw_data, NULL); in i40e_set_npar_bw_setting()
7994 i40e_status i40e_commit_npar_bw_setting(struct i40e_pf *pf) in i40e_commit_npar_bw_setting() argument
8001 if (pf->hw.partition_id != 1) { in i40e_commit_npar_bw_setting()
8002 dev_info(&pf->pdev->dev, in i40e_commit_npar_bw_setting()
8004 pf->hw.partition_id); in i40e_commit_npar_bw_setting()
8010 ret = i40e_acquire_nvm(&pf->hw, I40E_RESOURCE_READ); in i40e_commit_npar_bw_setting()
8011 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_npar_bw_setting()
8013 dev_info(&pf->pdev->dev, in i40e_commit_npar_bw_setting()
8015 i40e_stat_str(&pf->hw, ret), in i40e_commit_npar_bw_setting()
8016 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_npar_bw_setting()
8021 ret = i40e_aq_read_nvm(&pf->hw, in i40e_commit_npar_bw_setting()
8028 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_npar_bw_setting()
8029 i40e_release_nvm(&pf->hw); in i40e_commit_npar_bw_setting()
8031 dev_info(&pf->pdev->dev, "NVM read error, err %s aq_err %s\n", in i40e_commit_npar_bw_setting()
8032 i40e_stat_str(&pf->hw, ret), in i40e_commit_npar_bw_setting()
8033 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_npar_bw_setting()
8041 ret = i40e_acquire_nvm(&pf->hw, I40E_RESOURCE_WRITE); in i40e_commit_npar_bw_setting()
8042 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_npar_bw_setting()
8044 dev_info(&pf->pdev->dev, in i40e_commit_npar_bw_setting()
8046 i40e_stat_str(&pf->hw, ret), in i40e_commit_npar_bw_setting()
8047 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_npar_bw_setting()
8054 ret = i40e_aq_update_nvm(&pf->hw, in i40e_commit_npar_bw_setting()
8061 last_aq_status = pf->hw.aq.asq_last_status; in i40e_commit_npar_bw_setting()
8062 i40e_release_nvm(&pf->hw); in i40e_commit_npar_bw_setting()
8064 dev_info(&pf->pdev->dev, in i40e_commit_npar_bw_setting()
8066 i40e_stat_str(&pf->hw, ret), in i40e_commit_npar_bw_setting()
8067 i40e_aq_str(&pf->hw, last_aq_status)); in i40e_commit_npar_bw_setting()
8081 static int i40e_sw_init(struct i40e_pf *pf) in i40e_sw_init() argument
8086 pf->msg_enable = netif_msg_init(I40E_DEFAULT_MSG_ENABLE, in i40e_sw_init()
8088 pf->hw.debug_mask = pf->msg_enable | I40E_DEBUG_DIAG; in i40e_sw_init()
8091 pf->hw.debug_mask = debug; in i40e_sw_init()
8092 pf->msg_enable = netif_msg_init((debug & ~I40E_DEBUG_USER), in i40e_sw_init()
8097 pf->flags = I40E_FLAG_RX_CSUM_ENABLED | in i40e_sw_init()
8103 pf->flags |= I40E_FLAG_RX_PS_ENABLED; in i40e_sw_init()
8105 pf->flags |= I40E_FLAG_RX_1BUF_ENABLED; in i40e_sw_init()
8108 pf->rx_itr_default = I40E_ITR_DYNAMIC | I40E_ITR_RX_DEF; in i40e_sw_init()
8109 pf->tx_itr_default = I40E_ITR_DYNAMIC | I40E_ITR_TX_DEF; in i40e_sw_init()
8114 pf->rss_size_max = BIT(pf->hw.func_caps.rss_table_entry_width); in i40e_sw_init()
8115 pf->rss_size = 1; in i40e_sw_init()
8116 pf->rss_table_size = pf->hw.func_caps.rss_table_size; in i40e_sw_init()
8117 pf->rss_size_max = min_t(int, pf->rss_size_max, in i40e_sw_init()
8118 pf->hw.func_caps.num_tx_qp); in i40e_sw_init()
8119 if (pf->hw.func_caps.rss) { in i40e_sw_init()
8120 pf->flags |= I40E_FLAG_RSS_ENABLED; in i40e_sw_init()
8121 pf->rss_size = min_t(int, pf->rss_size_max, num_online_cpus()); in i40e_sw_init()
8125 if (pf->hw.func_caps.npar_enable || pf->hw.func_caps.flex10_enable) { in i40e_sw_init()
8126 pf->flags |= I40E_FLAG_MFP_ENABLED; in i40e_sw_init()
8127 dev_info(&pf->pdev->dev, "MFP mode Enabled\n"); in i40e_sw_init()
8128 if (i40e_get_npar_bw_setting(pf)) in i40e_sw_init()
8129 dev_warn(&pf->pdev->dev, in i40e_sw_init()
8132 dev_info(&pf->pdev->dev, in i40e_sw_init()
8134 pf->npar_min_bw, pf->npar_max_bw); in i40e_sw_init()
8138 if ((pf->hw.func_caps.fd_filters_guaranteed > 0) || in i40e_sw_init()
8139 (pf->hw.func_caps.fd_filters_best_effort > 0)) { in i40e_sw_init()
8140 pf->flags |= I40E_FLAG_FD_ATR_ENABLED; in i40e_sw_init()
8141 pf->atr_sample_rate = I40E_DEFAULT_ATR_SAMPLE_RATE; in i40e_sw_init()
8142 if (pf->flags & I40E_FLAG_MFP_ENABLED && in i40e_sw_init()
8143 pf->hw.num_partitions > 1) in i40e_sw_init()
8144 dev_info(&pf->pdev->dev, in i40e_sw_init()
8147 pf->flags |= I40E_FLAG_FD_SB_ENABLED; in i40e_sw_init()
8148 pf->fdir_pf_filter_count = in i40e_sw_init()
8149 pf->hw.func_caps.fd_filters_guaranteed; in i40e_sw_init()
8150 pf->hw.fdir_shared_filter_count = in i40e_sw_init()
8151 pf->hw.func_caps.fd_filters_best_effort; in i40e_sw_init()
8154 if (pf->hw.func_caps.vmdq) { in i40e_sw_init()
8155 pf->num_vmdq_vsis = I40E_DEFAULT_NUM_VMDQ_VSI; in i40e_sw_init()
8156 pf->flags |= I40E_FLAG_VMDQ_ENABLED; in i40e_sw_init()
8157 pf->num_vmdq_qps = i40e_default_queues_per_vmdq(pf); in i40e_sw_init()
8161 i40e_init_pf_fcoe(pf); in i40e_sw_init()
8165 if (pf->hw.func_caps.num_vfs && pf->hw.partition_id == 1) { in i40e_sw_init()
8166 pf->num_vf_qps = I40E_DEFAULT_QUEUES_PER_VF; in i40e_sw_init()
8167 pf->flags |= I40E_FLAG_SRIOV_ENABLED; in i40e_sw_init()
8168 pf->num_req_vfs = min_t(int, in i40e_sw_init()
8169 pf->hw.func_caps.num_vfs, in i40e_sw_init()
8173 if (pf->hw.mac.type == I40E_MAC_X722) { in i40e_sw_init()
8174 pf->flags |= I40E_FLAG_RSS_AQ_CAPABLE | in i40e_sw_init()
8181 pf->eeprom_version = 0xDEAD; in i40e_sw_init()
8182 pf->lan_veb = I40E_NO_VEB; in i40e_sw_init()
8183 pf->lan_vsi = I40E_NO_VSI; in i40e_sw_init()
8186 pf->flags &= ~I40E_FLAG_VEB_STATS_ENABLED; in i40e_sw_init()
8190 + (sizeof(u16) * pf->hw.func_caps.num_tx_qp); in i40e_sw_init()
8191 pf->qp_pile = kzalloc(size, GFP_KERNEL); in i40e_sw_init()
8192 if (!pf->qp_pile) { in i40e_sw_init()
8196 pf->qp_pile->num_entries = pf->hw.func_caps.num_tx_qp; in i40e_sw_init()
8197 pf->qp_pile->search_hint = 0; in i40e_sw_init()
8199 pf->tx_timeout_recovery_level = 1; in i40e_sw_init()
8201 mutex_init(&pf->switch_mutex); in i40e_sw_init()
8204 if (pf->hw.func_caps.npar_enable && (!i40e_get_npar_bw_setting(pf))) in i40e_sw_init()
8205 i40e_set_npar_bw_setting(pf); in i40e_sw_init()
8218 bool i40e_set_ntuple(struct i40e_pf *pf, netdev_features_t features) in i40e_set_ntuple() argument
8227 if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED)) in i40e_set_ntuple()
8229 pf->flags |= I40E_FLAG_FD_SB_ENABLED; in i40e_set_ntuple()
8232 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_set_ntuple()
8234 i40e_fdir_filter_exit(pf); in i40e_set_ntuple()
8236 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_set_ntuple()
8237 pf->auto_disable_flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_set_ntuple()
8239 pf->fd_add_err = pf->fd_atr_cnt = pf->fd_tcp_rule = 0; in i40e_set_ntuple()
8240 pf->fdir_pf_active_filters = 0; in i40e_set_ntuple()
8241 pf->flags |= I40E_FLAG_FD_ATR_ENABLED; in i40e_set_ntuple()
8242 if (I40E_DEBUG_FD & pf->hw.debug_mask) in i40e_set_ntuple()
8243 dev_info(&pf->pdev->dev, "ATR re-enabled.\n"); in i40e_set_ntuple()
8245 if ((pf->flags & I40E_FLAG_FD_ATR_ENABLED) && in i40e_set_ntuple()
8246 (pf->auto_disable_flags & I40E_FLAG_FD_ATR_ENABLED)) in i40e_set_ntuple()
8247 pf->auto_disable_flags &= ~I40E_FLAG_FD_ATR_ENABLED; in i40e_set_ntuple()
8262 struct i40e_pf *pf = vsi->back; in i40e_set_features() local
8270 need_reset = i40e_set_ntuple(pf, features); in i40e_set_features()
8273 i40e_do_reset(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED)); in i40e_set_features()
8286 static u8 i40e_get_vxlan_port_idx(struct i40e_pf *pf, __be16 port) in i40e_get_vxlan_port_idx() argument
8291 if (pf->vxlan_ports[i] == port) in i40e_get_vxlan_port_idx()
8309 struct i40e_pf *pf = vsi->back; in i40e_add_vxlan_port() local
8316 idx = i40e_get_vxlan_port_idx(pf, port); in i40e_add_vxlan_port()
8326 next_idx = i40e_get_vxlan_port_idx(pf, 0); in i40e_add_vxlan_port()
8335 pf->vxlan_ports[next_idx] = port; in i40e_add_vxlan_port()
8336 pf->pending_vxlan_bitmap |= BIT_ULL(next_idx); in i40e_add_vxlan_port()
8337 pf->flags |= I40E_FLAG_VXLAN_FILTER_SYNC; in i40e_add_vxlan_port()
8351 struct i40e_pf *pf = vsi->back; in i40e_del_vxlan_port() local
8357 idx = i40e_get_vxlan_port_idx(pf, port); in i40e_del_vxlan_port()
8364 pf->vxlan_ports[idx] = 0; in i40e_del_vxlan_port()
8365 pf->pending_vxlan_bitmap |= BIT_ULL(idx); in i40e_del_vxlan_port()
8366 pf->flags |= I40E_FLAG_VXLAN_FILTER_SYNC; in i40e_del_vxlan_port()
8378 struct i40e_pf *pf = np->vsi->back; in i40e_get_phys_port_id() local
8379 struct i40e_hw *hw = &pf->hw; in i40e_get_phys_port_id()
8381 if (!(pf->flags & I40E_FLAG_PORT_ID_VALID)) in i40e_get_phys_port_id()
8404 struct i40e_pf *pf = np->vsi->back; in i40e_ndo_fdb_add() local
8407 if (!(pf->flags & I40E_FLAG_SRIOV_ENABLED)) in i40e_ndo_fdb_add()
8455 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_setlink() local
8461 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) in i40e_ndo_bridge_setlink()
8466 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_ndo_bridge_setlink()
8467 veb = pf->veb[i]; in i40e_ndo_bridge_setlink()
8485 veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid, in i40e_ndo_bridge_setlink()
8500 pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; in i40e_ndo_bridge_setlink()
8502 pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; in i40e_ndo_bridge_setlink()
8503 i40e_do_reset(pf, BIT_ULL(__I40E_PF_RESET_REQUESTED)); in i40e_ndo_bridge_setlink()
8530 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_getlink() local
8535 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) in i40e_ndo_bridge_getlink()
8540 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_ndo_bridge_getlink()
8541 veb = pf->veb[i]; in i40e_ndo_bridge_getlink()
8618 struct i40e_pf *pf = vsi->back; in i40e_config_netdev() local
8619 struct i40e_hw *hw = &pf->hw; in i40e_config_netdev()
8656 if (!(pf->flags & I40E_FLAG_MFP_ENABLED)) in i40e_config_netdev()
8663 SET_NETDEV_DEV(netdev, &pf->pdev->dev); in i40e_config_netdev()
8679 pf->vsi[pf->lan_vsi]->netdev->name); in i40e_config_netdev()
8738 struct i40e_pf *pf = vsi->back; in i40e_is_vsi_uplink_mode_veb() local
8744 veb = pf->veb[vsi->veb_idx]; in i40e_is_vsi_uplink_mode_veb()
8746 dev_info(&pf->pdev->dev, in i40e_is_vsi_uplink_mode_veb()
8775 struct i40e_pf *pf = vsi->back; in i40e_add_vsi() local
8776 struct i40e_hw *hw = &pf->hw; in i40e_add_vsi()
8791 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
8792 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
8794 ret = i40e_aq_get_vsi_params(&pf->hw, &ctxt, NULL); in i40e_add_vsi()
8797 dev_info(&pf->pdev->dev, in i40e_add_vsi()
8799 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
8800 i40e_aq_str(&pf->hw, in i40e_add_vsi()
8801 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
8810 enabled_tc = i40e_pf_get_tc_map(pf); in i40e_add_vsi()
8813 if ((pf->flags & I40E_FLAG_MFP_ENABLED) && in i40e_add_vsi()
8814 !(pf->hw.func_caps.iscsi)) { /* NIC type PF */ in i40e_add_vsi()
8816 ctxt.seid = pf->main_vsi_seid; in i40e_add_vsi()
8817 ctxt.pf_num = pf->hw.pf_id; in i40e_add_vsi()
8822 dev_info(&pf->pdev->dev, in i40e_add_vsi()
8824 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
8825 i40e_aq_str(&pf->hw, in i40e_add_vsi()
8826 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
8842 dev_info(&pf->pdev->dev, in i40e_add_vsi()
8845 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
8846 i40e_aq_str(&pf->hw, in i40e_add_vsi()
8847 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
8859 if ((pf->flags & I40E_FLAG_VEB_MODE_ENABLED) && in i40e_add_vsi()
8909 if (pf->vf[vsi->vf_id].spoofchk) { in i40e_add_vsi()
8924 dev_info(&pf->pdev->dev, "failed to initialize FCoE VSI\n"); in i40e_add_vsi()
8939 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
8940 i40e_aq_str(&pf->hw, in i40e_add_vsi()
8941 pf->hw.aq.asq_last_status)); in i40e_add_vsi()
8988 pf->flags |= I40E_FLAG_FILTER_SYNC; in i40e_add_vsi()
8994 dev_info(&pf->pdev->dev, in i40e_add_vsi()
8996 i40e_stat_str(&pf->hw, ret), in i40e_add_vsi()
8997 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_vsi()
9016 struct i40e_pf *pf; in i40e_vsi_release() local
9020 pf = vsi->back; in i40e_vsi_release()
9024 dev_info(&pf->pdev->dev, "VSI %d has existing VEB %d\n", in i40e_vsi_release()
9028 if (vsi == pf->vsi[pf->lan_vsi] && in i40e_vsi_release()
9029 !test_bit(__I40E_DOWN, &pf->state)) { in i40e_vsi_release()
9030 dev_info(&pf->pdev->dev, "Can't remove PF VSI\n"); in i40e_vsi_release()
9073 for (n = 0, i = 0; i < pf->num_alloc_vsi; i++) { in i40e_vsi_release()
9074 if (pf->vsi[i] && in i40e_vsi_release()
9075 pf->vsi[i]->uplink_seid == uplink_seid && in i40e_vsi_release()
9076 (pf->vsi[i]->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) { in i40e_vsi_release()
9081 if (!pf->veb[i]) in i40e_vsi_release()
9083 if (pf->veb[i]->uplink_seid == uplink_seid) in i40e_vsi_release()
9085 if (pf->veb[i]->seid == uplink_seid) in i40e_vsi_release()
9086 veb = pf->veb[i]; in i40e_vsi_release()
9107 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_vectors() local
9110 dev_info(&pf->pdev->dev, "VSI %d has existing q_vectors\n", in i40e_vsi_setup_vectors()
9116 dev_info(&pf->pdev->dev, "VSI %d has non-zero base vector %d\n", in i40e_vsi_setup_vectors()
9123 dev_info(&pf->pdev->dev, in i40e_vsi_setup_vectors()
9133 if (!(pf->flags & I40E_FLAG_MSIX_ENABLED)) in i40e_vsi_setup_vectors()
9136 vsi->base_vector = i40e_get_lump(pf, pf->irq_pile, in i40e_vsi_setup_vectors()
9139 dev_info(&pf->pdev->dev, in i40e_vsi_setup_vectors()
9162 struct i40e_pf *pf = vsi->back; in i40e_vsi_reinit_setup() local
9166 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_reinit_setup()
9175 ret = i40e_get_lump(pf, pf->qp_pile, vsi->alloc_queue_pairs, vsi->idx); in i40e_vsi_reinit_setup()
9177 dev_info(&pf->pdev->dev, in i40e_vsi_reinit_setup()
9187 enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc; in i40e_vsi_reinit_setup()
9188 pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0; in i40e_vsi_reinit_setup()
9189 pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid; in i40e_vsi_reinit_setup()
9190 i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc); in i40e_vsi_reinit_setup()
9209 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_reinit_setup()
9228 struct i40e_vsi *i40e_vsi_setup(struct i40e_pf *pf, u8 type, in i40e_vsi_setup() argument
9250 if (pf->veb[i] && pf->veb[i]->seid == uplink_seid) { in i40e_vsi_setup()
9251 veb = pf->veb[i]; in i40e_vsi_setup()
9256 if (!veb && uplink_seid != pf->mac_seid) { in i40e_vsi_setup()
9258 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_vsi_setup()
9259 if (pf->vsi[i] && pf->vsi[i]->seid == uplink_seid) { in i40e_vsi_setup()
9260 vsi = pf->vsi[i]; in i40e_vsi_setup()
9265 dev_info(&pf->pdev->dev, "no such uplink_seid %d\n", in i40e_vsi_setup()
9270 if (vsi->uplink_seid == pf->mac_seid) in i40e_vsi_setup()
9271 veb = i40e_veb_setup(pf, 0, pf->mac_seid, vsi->seid, in i40e_vsi_setup()
9274 veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid, in i40e_vsi_setup()
9277 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) { in i40e_vsi_setup()
9286 if (!(pf->flags & I40E_FLAG_VEB_MODE_ENABLED)) { in i40e_vsi_setup()
9288 pf->flags &= ~I40E_FLAG_VEB_MODE_ENABLED; in i40e_vsi_setup()
9293 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_vsi_setup()
9294 veb = pf->veb[i]; in i40e_vsi_setup()
9297 dev_info(&pf->pdev->dev, "couldn't add VEB\n"); in i40e_vsi_setup()
9306 v_idx = i40e_vsi_mem_alloc(pf, type); in i40e_vsi_setup()
9309 vsi = pf->vsi[v_idx]; in i40e_vsi_setup()
9316 pf->lan_vsi = v_idx; in i40e_vsi_setup()
9320 ret = i40e_get_lump(pf, pf->qp_pile, vsi->alloc_queue_pairs, in i40e_vsi_setup()
9323 dev_info(&pf->pdev->dev, in i40e_vsi_setup()
9376 if ((pf->flags & I40E_FLAG_RSS_AQ_CAPABLE) && in i40e_vsi_setup()
9392 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_setup()
9409 struct i40e_pf *pf = veb->pf; in i40e_veb_get_bw_info() local
9410 struct i40e_hw *hw = &pf->hw; in i40e_veb_get_bw_info()
9418 dev_info(&pf->pdev->dev, in i40e_veb_get_bw_info()
9420 i40e_stat_str(&pf->hw, ret), in i40e_veb_get_bw_info()
9421 i40e_aq_str(&pf->hw, hw->aq.asq_last_status)); in i40e_veb_get_bw_info()
9428 dev_info(&pf->pdev->dev, in i40e_veb_get_bw_info()
9430 i40e_stat_str(&pf->hw, ret), in i40e_veb_get_bw_info()
9431 i40e_aq_str(&pf->hw, hw->aq.asq_last_status)); in i40e_veb_get_bw_info()
9459 static int i40e_veb_mem_alloc(struct i40e_pf *pf) in i40e_veb_mem_alloc() argument
9466 mutex_lock(&pf->switch_mutex); in i40e_veb_mem_alloc()
9475 while ((i < I40E_MAX_VEB) && (pf->veb[i] != NULL)) in i40e_veb_mem_alloc()
9487 veb->pf = pf; in i40e_veb_mem_alloc()
9491 pf->veb[i] = veb; in i40e_veb_mem_alloc()
9494 mutex_unlock(&pf->switch_mutex); in i40e_veb_mem_alloc()
9507 struct i40e_pf *pf = branch->pf; in i40e_switch_branch_release() local
9514 if (!pf->veb[i]) in i40e_switch_branch_release()
9516 if (pf->veb[i]->uplink_seid == branch->seid) in i40e_switch_branch_release()
9517 i40e_switch_branch_release(pf->veb[i]); in i40e_switch_branch_release()
9525 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_switch_branch_release()
9526 if (!pf->vsi[i]) in i40e_switch_branch_release()
9528 if (pf->vsi[i]->uplink_seid == branch_seid && in i40e_switch_branch_release()
9529 (pf->vsi[i]->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) { in i40e_switch_branch_release()
9530 i40e_vsi_release(pf->vsi[i]); in i40e_switch_branch_release()
9539 if (pf->veb[veb_idx]) in i40e_switch_branch_release()
9540 i40e_veb_release(pf->veb[veb_idx]); in i40e_switch_branch_release()
9552 if (veb->pf) { in i40e_veb_clear()
9553 struct i40e_pf *pf = veb->pf; in i40e_veb_clear() local
9555 mutex_lock(&pf->switch_mutex); in i40e_veb_clear()
9556 if (pf->veb[veb->idx] == veb) in i40e_veb_clear()
9557 pf->veb[veb->idx] = NULL; in i40e_veb_clear()
9558 mutex_unlock(&pf->switch_mutex); in i40e_veb_clear()
9571 struct i40e_pf *pf; in i40e_veb_release() local
9574 pf = veb->pf; in i40e_veb_release()
9577 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_veb_release()
9578 if (pf->vsi[i] && pf->vsi[i]->uplink_seid == veb->seid) { in i40e_veb_release()
9580 vsi = pf->vsi[i]; in i40e_veb_release()
9584 dev_info(&pf->pdev->dev, in i40e_veb_release()
9594 if (veb->uplink_seid == pf->mac_seid) in i40e_veb_release()
9600 vsi->uplink_seid = pf->vsi[pf->lan_vsi]->uplink_seid; in i40e_veb_release()
9601 vsi->veb_idx = pf->vsi[pf->lan_vsi]->veb_idx; in i40e_veb_release()
9604 i40e_aq_delete_element(&pf->hw, veb->seid, NULL); in i40e_veb_release()
9615 struct i40e_pf *pf = veb->pf; in i40e_add_veb() local
9616 bool is_default = veb->pf->cur_promisc; in i40e_add_veb()
9621 ret = i40e_aq_add_veb(&pf->hw, veb->uplink_seid, vsi->seid, in i40e_add_veb()
9625 dev_info(&pf->pdev->dev, in i40e_add_veb()
9627 i40e_stat_str(&pf->hw, ret), in i40e_add_veb()
9628 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_veb()
9633 ret = i40e_aq_get_veb_parameters(&pf->hw, veb->seid, NULL, NULL, in i40e_add_veb()
9636 dev_info(&pf->pdev->dev, in i40e_add_veb()
9638 i40e_stat_str(&pf->hw, ret), in i40e_add_veb()
9639 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_veb()
9644 dev_info(&pf->pdev->dev, in i40e_add_veb()
9646 i40e_stat_str(&pf->hw, ret), in i40e_add_veb()
9647 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_add_veb()
9648 i40e_aq_delete_element(&pf->hw, veb->seid, NULL); in i40e_add_veb()
9675 struct i40e_veb *i40e_veb_setup(struct i40e_pf *pf, u16 flags, in i40e_veb_setup() argument
9686 dev_info(&pf->pdev->dev, in i40e_veb_setup()
9693 for (vsi_idx = 0; vsi_idx < pf->num_alloc_vsi; vsi_idx++) in i40e_veb_setup()
9694 if (pf->vsi[vsi_idx] && pf->vsi[vsi_idx]->seid == vsi_seid) in i40e_veb_setup()
9696 if (vsi_idx >= pf->num_alloc_vsi && vsi_seid != 0) { in i40e_veb_setup()
9697 dev_info(&pf->pdev->dev, "vsi seid %d not found\n", in i40e_veb_setup()
9702 if (uplink_seid && uplink_seid != pf->mac_seid) { in i40e_veb_setup()
9704 if (pf->veb[veb_idx] && in i40e_veb_setup()
9705 pf->veb[veb_idx]->seid == uplink_seid) { in i40e_veb_setup()
9706 uplink_veb = pf->veb[veb_idx]; in i40e_veb_setup()
9711 dev_info(&pf->pdev->dev, in i40e_veb_setup()
9718 veb_idx = i40e_veb_mem_alloc(pf); in i40e_veb_setup()
9721 veb = pf->veb[veb_idx]; in i40e_veb_setup()
9728 ret = i40e_add_veb(veb, pf->vsi[vsi_idx]); in i40e_veb_setup()
9731 if (vsi_idx == pf->lan_vsi) in i40e_veb_setup()
9732 pf->lan_veb = veb->idx; in i40e_veb_setup()
9751 static void i40e_setup_pf_switch_element(struct i40e_pf *pf, in i40e_setup_pf_switch_element() argument
9761 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch_element()
9767 pf->mac_seid = seid; in i40e_setup_pf_switch_element()
9771 if (uplink_seid != pf->mac_seid) in i40e_setup_pf_switch_element()
9773 if (pf->lan_veb == I40E_NO_VEB) { in i40e_setup_pf_switch_element()
9778 if (pf->veb[v] && (pf->veb[v]->seid == seid)) { in i40e_setup_pf_switch_element()
9779 pf->lan_veb = v; in i40e_setup_pf_switch_element()
9783 if (pf->lan_veb == I40E_NO_VEB) { in i40e_setup_pf_switch_element()
9784 v = i40e_veb_mem_alloc(pf); in i40e_setup_pf_switch_element()
9787 pf->lan_veb = v; in i40e_setup_pf_switch_element()
9791 pf->veb[pf->lan_veb]->seid = seid; in i40e_setup_pf_switch_element()
9792 pf->veb[pf->lan_veb]->uplink_seid = pf->mac_seid; in i40e_setup_pf_switch_element()
9793 pf->veb[pf->lan_veb]->pf = pf; in i40e_setup_pf_switch_element()
9794 pf->veb[pf->lan_veb]->veb_idx = I40E_NO_VEB; in i40e_setup_pf_switch_element()
9802 pf->mac_seid = uplink_seid; in i40e_setup_pf_switch_element()
9803 pf->pf_seid = downlink_seid; in i40e_setup_pf_switch_element()
9804 pf->main_vsi_seid = seid; in i40e_setup_pf_switch_element()
9806 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch_element()
9808 pf->pf_seid, pf->main_vsi_seid); in i40e_setup_pf_switch_element()
9819 dev_info(&pf->pdev->dev, "unknown element type=%d seid=%d\n", in i40e_setup_pf_switch_element()
9833 int i40e_fetch_switch_configuration(struct i40e_pf *pf, bool printconfig) in i40e_fetch_switch_configuration() argument
9849 ret = i40e_aq_get_switch_config(&pf->hw, sw_config, in i40e_fetch_switch_configuration()
9853 dev_info(&pf->pdev->dev, in i40e_fetch_switch_configuration()
9855 i40e_stat_str(&pf->hw, ret), in i40e_fetch_switch_configuration()
9856 i40e_aq_str(&pf->hw, in i40e_fetch_switch_configuration()
9857 pf->hw.aq.asq_last_status)); in i40e_fetch_switch_configuration()
9866 dev_info(&pf->pdev->dev, in i40e_fetch_switch_configuration()
9874 i40e_setup_pf_switch_element(pf, ele, num_reported, in i40e_fetch_switch_configuration()
9890 static int i40e_setup_pf_switch(struct i40e_pf *pf, bool reinit) in i40e_setup_pf_switch() argument
9895 ret = i40e_fetch_switch_configuration(pf, false); in i40e_setup_pf_switch()
9897 dev_info(&pf->pdev->dev, in i40e_setup_pf_switch()
9899 i40e_stat_str(&pf->hw, ret), in i40e_setup_pf_switch()
9900 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_setup_pf_switch()
9903 i40e_pf_reset_stats(pf); in i40e_setup_pf_switch()
9906 if (pf->lan_vsi == I40E_NO_VSI || reinit) { in i40e_setup_pf_switch()
9913 if (pf->lan_veb != I40E_NO_VEB && pf->veb[pf->lan_veb]) in i40e_setup_pf_switch()
9914 uplink_seid = pf->veb[pf->lan_veb]->seid; in i40e_setup_pf_switch()
9916 uplink_seid = pf->mac_seid; in i40e_setup_pf_switch()
9917 if (pf->lan_vsi == I40E_NO_VSI) in i40e_setup_pf_switch()
9918 vsi = i40e_vsi_setup(pf, I40E_VSI_MAIN, uplink_seid, 0); in i40e_setup_pf_switch()
9920 vsi = i40e_vsi_reinit_setup(pf->vsi[pf->lan_vsi]); in i40e_setup_pf_switch()
9922 dev_info(&pf->pdev->dev, "setup of MAIN VSI failed\n"); in i40e_setup_pf_switch()
9923 i40e_fdir_teardown(pf); in i40e_setup_pf_switch()
9928 u8 enabled_tc = pf->vsi[pf->lan_vsi]->tc_config.enabled_tc; in i40e_setup_pf_switch()
9930 pf->vsi[pf->lan_vsi]->tc_config.enabled_tc = 0; in i40e_setup_pf_switch()
9931 pf->vsi[pf->lan_vsi]->seid = pf->main_vsi_seid; in i40e_setup_pf_switch()
9932 i40e_vsi_config_tc(pf->vsi[pf->lan_vsi], enabled_tc); in i40e_setup_pf_switch()
9934 i40e_vlan_stripping_disable(pf->vsi[pf->lan_vsi]); in i40e_setup_pf_switch()
9936 i40e_fdir_sb_setup(pf); in i40e_setup_pf_switch()
9939 ret = i40e_setup_pf_filter_control(pf); in i40e_setup_pf_switch()
9941 dev_info(&pf->pdev->dev, "setup_pf_filter_control failed: %d\n", in i40e_setup_pf_switch()
9949 if ((pf->flags & I40E_FLAG_RSS_ENABLED)) in i40e_setup_pf_switch()
9950 i40e_config_rss(pf); in i40e_setup_pf_switch()
9953 i40e_update_link_info(&pf->hw); in i40e_setup_pf_switch()
9954 i40e_link_event(pf); in i40e_setup_pf_switch()
9957 pf->fc_autoneg_status = ((pf->hw.phy.link_info.an_info & in i40e_setup_pf_switch()
9960 i40e_ptp_init(pf); in i40e_setup_pf_switch()
9969 static void i40e_determine_queue_usage(struct i40e_pf *pf) in i40e_determine_queue_usage() argument
9973 pf->num_lan_qps = 0; in i40e_determine_queue_usage()
9975 pf->num_fcoe_qps = 0; in i40e_determine_queue_usage()
9982 queues_left = pf->hw.func_caps.num_tx_qp; in i40e_determine_queue_usage()
9985 !(pf->flags & I40E_FLAG_MSIX_ENABLED)) { in i40e_determine_queue_usage()
9988 pf->rss_size = pf->num_lan_qps = 1; in i40e_determine_queue_usage()
9991 pf->flags &= ~(I40E_FLAG_RSS_ENABLED | in i40e_determine_queue_usage()
10000 } else if (!(pf->flags & (I40E_FLAG_RSS_ENABLED | in i40e_determine_queue_usage()
10005 pf->rss_size = pf->num_lan_qps = 1; in i40e_determine_queue_usage()
10006 queues_left -= pf->num_lan_qps; in i40e_determine_queue_usage()
10008 pf->flags &= ~(I40E_FLAG_RSS_ENABLED | in i40e_determine_queue_usage()
10018 if ((pf->flags & I40E_FLAG_DCB_CAPABLE) && in i40e_determine_queue_usage()
10020 pf->flags &= ~I40E_FLAG_DCB_CAPABLE; in i40e_determine_queue_usage()
10021 dev_info(&pf->pdev->dev, "not enough queues for DCB. DCB is disabled.\n"); in i40e_determine_queue_usage()
10023 pf->num_lan_qps = max_t(int, pf->rss_size_max, in i40e_determine_queue_usage()
10025 pf->num_lan_qps = min_t(int, pf->num_lan_qps, in i40e_determine_queue_usage()
10026 pf->hw.func_caps.num_tx_qp); in i40e_determine_queue_usage()
10028 queues_left -= pf->num_lan_qps; in i40e_determine_queue_usage()
10032 if (pf->flags & I40E_FLAG_FCOE_ENABLED) { in i40e_determine_queue_usage()
10034 pf->num_fcoe_qps = I40E_DEFAULT_FCOE; in i40e_determine_queue_usage()
10036 pf->num_fcoe_qps = I40E_MINIMUM_FCOE; in i40e_determine_queue_usage()
10038 pf->num_fcoe_qps = 0; in i40e_determine_queue_usage()
10039 pf->flags &= ~I40E_FLAG_FCOE_ENABLED; in i40e_determine_queue_usage()
10040 dev_info(&pf->pdev->dev, "not enough queues for FCoE. FCoE feature will be disabled\n"); in i40e_determine_queue_usage()
10043 queues_left -= pf->num_fcoe_qps; in i40e_determine_queue_usage()
10047 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_determine_queue_usage()
10051 pf->flags &= ~I40E_FLAG_FD_SB_ENABLED; in i40e_determine_queue_usage()
10052 …dev_info(&pf->pdev->dev, "not enough queues for Flow Director. Flow Director feature is disabled\n… in i40e_determine_queue_usage()
10056 if ((pf->flags & I40E_FLAG_SRIOV_ENABLED) && in i40e_determine_queue_usage()
10057 pf->num_vf_qps && pf->num_req_vfs && queues_left) { in i40e_determine_queue_usage()
10058 pf->num_req_vfs = min_t(int, pf->num_req_vfs, in i40e_determine_queue_usage()
10059 (queues_left / pf->num_vf_qps)); in i40e_determine_queue_usage()
10060 queues_left -= (pf->num_req_vfs * pf->num_vf_qps); in i40e_determine_queue_usage()
10063 if ((pf->flags & I40E_FLAG_VMDQ_ENABLED) && in i40e_determine_queue_usage()
10064 pf->num_vmdq_vsis && pf->num_vmdq_qps && queues_left) { in i40e_determine_queue_usage()
10065 pf->num_vmdq_vsis = min_t(int, pf->num_vmdq_vsis, in i40e_determine_queue_usage()
10066 (queues_left / pf->num_vmdq_qps)); in i40e_determine_queue_usage()
10067 queues_left -= (pf->num_vmdq_vsis * pf->num_vmdq_qps); in i40e_determine_queue_usage()
10070 pf->queues_left = queues_left; in i40e_determine_queue_usage()
10071 dev_dbg(&pf->pdev->dev, in i40e_determine_queue_usage()
10073 pf->hw.func_caps.num_tx_qp, in i40e_determine_queue_usage()
10074 !!(pf->flags & I40E_FLAG_FD_SB_ENABLED), in i40e_determine_queue_usage()
10075 pf->num_lan_qps, pf->rss_size, pf->num_req_vfs, pf->num_vf_qps, in i40e_determine_queue_usage()
10076 pf->num_vmdq_vsis, pf->num_vmdq_qps, queues_left); in i40e_determine_queue_usage()
10078 dev_dbg(&pf->pdev->dev, "fcoe queues = %d\n", pf->num_fcoe_qps); in i40e_determine_queue_usage()
10093 static int i40e_setup_pf_filter_control(struct i40e_pf *pf) in i40e_setup_pf_filter_control() argument
10095 struct i40e_filter_control_settings *settings = &pf->filter_settings; in i40e_setup_pf_filter_control()
10100 if (pf->flags & (I40E_FLAG_FD_SB_ENABLED | I40E_FLAG_FD_ATR_ENABLED)) in i40e_setup_pf_filter_control()
10107 if (i40e_set_filter_control(&pf->hw, settings)) in i40e_setup_pf_filter_control()
10114 static void i40e_print_features(struct i40e_pf *pf) in i40e_print_features() argument
10116 struct i40e_hw *hw = &pf->hw; in i40e_print_features()
10121 dev_err(&pf->pdev->dev, "Features string allocation failed\n"); in i40e_print_features()
10129 buf += sprintf(buf, "VFs: %d ", pf->num_req_vfs); in i40e_print_features()
10132 pf->hw.func_caps.num_vsis, in i40e_print_features()
10133 pf->vsi[pf->lan_vsi]->num_queue_pairs, in i40e_print_features()
10134 pf->flags & I40E_FLAG_RX_PS_ENABLED ? "PS" : "1BUF"); in i40e_print_features()
10136 if (pf->flags & I40E_FLAG_RSS_ENABLED) in i40e_print_features()
10138 if (pf->flags & I40E_FLAG_FD_ATR_ENABLED) in i40e_print_features()
10140 if (pf->flags & I40E_FLAG_FD_SB_ENABLED) { in i40e_print_features()
10144 if (pf->flags & I40E_FLAG_DCB_CAPABLE) in i40e_print_features()
10149 if (pf->flags & I40E_FLAG_PTP) in i40e_print_features()
10152 if (pf->flags & I40E_FLAG_FCOE_ENABLED) in i40e_print_features()
10155 if (pf->flags & I40E_FLAG_VEB_MODE_ENABLED) in i40e_print_features()
10161 dev_info(&pf->pdev->dev, "%s\n", string); in i40e_print_features()
10179 struct i40e_pf *pf; in i40e_probe() local
10221 pf = kzalloc(sizeof(*pf), GFP_KERNEL); in i40e_probe()
10222 if (!pf) { in i40e_probe()
10226 pf->next_vsi = 0; in i40e_probe()
10227 pf->pdev = pdev; in i40e_probe()
10228 set_bit(__I40E_DOWN, &pf->state); in i40e_probe()
10230 hw = &pf->hw; in i40e_probe()
10231 hw->back = pf; in i40e_probe()
10233 pf->ioremap_len = min_t(int, pci_resource_len(pdev, 0), in i40e_probe()
10236 hw->hw_addr = ioremap(pci_resource_start(pdev, 0), pf->ioremap_len); in i40e_probe()
10241 pf->ioremap_len, err); in i40e_probe()
10251 pf->instance = pfs_found; in i40e_probe()
10254 pf->msg_enable = pf->hw.debug_mask; in i40e_probe()
10255 pf->msg_enable = debug; in i40e_probe()
10264 pf->corer_count++; in i40e_probe()
10276 pf->pfr_count++; in i40e_probe()
10282 pf->adminq_work_limit = I40E_AQ_WORK_LIMIT; in i40e_probe()
10284 snprintf(pf->int_name, sizeof(pf->int_name) - 1, in i40e_probe()
10286 dev_driver_string(&pf->pdev->dev), dev_name(&pdev->dev)); in i40e_probe()
10296 pf->hw.fc.requested_mode = I40E_FC_NONE; in i40e_probe()
10327 i40e_verify_eeprom(pf); in i40e_probe()
10334 err = i40e_get_capabilities(pf); in i40e_probe()
10338 err = i40e_sw_init(pf); in i40e_probe()
10346 pf->fcoe_hmc_cntx_num, pf->fcoe_hmc_filt_num); in i40e_probe()
10363 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 3)) || in i40e_probe()
10364 (pf->hw.aq.fw_maj_ver < 4)) { in i40e_probe()
10379 pf->flags |= I40E_FLAG_PORT_ID_VALID; in i40e_probe()
10390 dev_info(&pf->pdev->dev, "SAN MAC: %pM\n", hw->mac.san_addr); in i40e_probe()
10393 pci_set_drvdata(pdev, pf); in i40e_probe()
10396 err = i40e_init_pf_dcb(pf); in i40e_probe()
10399 pf->flags &= ~I40E_FLAG_DCB_CAPABLE; in i40e_probe()
10405 setup_timer(&pf->service_timer, i40e_service_timer, (unsigned long)pf); in i40e_probe()
10406 pf->service_timer_period = HZ; in i40e_probe()
10408 INIT_WORK(&pf->service_task, i40e_service_task); in i40e_probe()
10409 clear_bit(__I40E_SERVICE_SCHED, &pf->state); in i40e_probe()
10410 pf->flags |= I40E_FLAG_NEED_LINK_UPDATE; in i40e_probe()
10415 pf->wol_en = false; in i40e_probe()
10417 pf->wol_en = true; in i40e_probe()
10418 device_set_wakeup_enable(&pf->pdev->dev, pf->wol_en); in i40e_probe()
10421 i40e_determine_queue_usage(pf); in i40e_probe()
10422 err = i40e_init_interrupt_scheme(pf); in i40e_probe()
10431 if (pf->hw.func_caps.num_vsis < I40E_MIN_VSI_ALLOC) in i40e_probe()
10432 pf->num_alloc_vsi = I40E_MIN_VSI_ALLOC; in i40e_probe()
10434 pf->num_alloc_vsi = pf->hw.func_caps.num_vsis; in i40e_probe()
10437 len = sizeof(struct i40e_vsi *) * pf->num_alloc_vsi; in i40e_probe()
10438 pf->vsi = kzalloc(len, GFP_KERNEL); in i40e_probe()
10439 if (!pf->vsi) { in i40e_probe()
10446 if ((pf->flags & I40E_FLAG_SRIOV_ENABLED) && in i40e_probe()
10447 (pf->flags & I40E_FLAG_MSIX_ENABLED) && in i40e_probe()
10448 !test_bit(__I40E_BAD_EEPROM, &pf->state)) { in i40e_probe()
10450 pf->flags |= I40E_FLAG_VEB_MODE_ENABLED; in i40e_probe()
10453 err = i40e_setup_pf_switch(pf, false); in i40e_probe()
10462 dev_dbg(&pf->pdev->dev, in i40e_probe()
10467 dev_dbg(&pf->pdev->dev, in i40e_probe()
10472 dev_dbg(&pf->pdev->dev, in i40e_probe()
10478 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_probe()
10479 if (pf->vsi[i] && pf->vsi[i]->type == I40E_VSI_FDIR) { in i40e_probe()
10480 i40e_vsi_open(pf->vsi[i]); in i40e_probe()
10488 err = i40e_aq_set_phy_int_mask(&pf->hw, in i40e_probe()
10492 dev_info(&pf->pdev->dev, "set phy mask fail, err %s aq_err %s\n", in i40e_probe()
10493 i40e_stat_str(&pf->hw, err), in i40e_probe()
10494 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_probe()
10496 if (((pf->hw.aq.fw_maj_ver == 4) && (pf->hw.aq.fw_min_ver < 33)) || in i40e_probe()
10497 (pf->hw.aq.fw_maj_ver < 4)) { in i40e_probe()
10499 err = i40e_aq_set_link_restart_an(&pf->hw, true, NULL); in i40e_probe()
10501 dev_info(&pf->pdev->dev, "link restart failed, err %s aq_err %s\n", in i40e_probe()
10502 i40e_stat_str(&pf->hw, err), in i40e_probe()
10503 i40e_aq_str(&pf->hw, in i40e_probe()
10504 pf->hw.aq.asq_last_status)); in i40e_probe()
10510 clear_bit(__I40E_DOWN, &pf->state); in i40e_probe()
10517 if (pf->flags & I40E_FLAG_MSIX_ENABLED) { in i40e_probe()
10518 err = i40e_setup_misc_vector(pf); in i40e_probe()
10528 if ((pf->flags & I40E_FLAG_SRIOV_ENABLED) && in i40e_probe()
10529 (pf->flags & I40E_FLAG_MSIX_ENABLED) && in i40e_probe()
10530 !test_bit(__I40E_BAD_EEPROM, &pf->state)) { in i40e_probe()
10542 err = i40e_alloc_vfs(pf, pci_num_vf(pdev)); in i40e_probe()
10553 i40e_dbg_pf_init(pf); in i40e_probe()
10556 i40e_send_version(pf); in i40e_probe()
10559 mod_timer(&pf->service_timer, in i40e_probe()
10560 round_jiffies(jiffies + pf->service_timer_period)); in i40e_probe()
10564 i40e_fcoe_vsi_setup(pf); in i40e_probe()
10573 if (!(pf->flags & I40E_FLAG_NO_PCI_LINK_CHECK)) { in i40e_probe()
10580 pcie_capability_read_word(pf->pdev, PCI_EXP_LNKSTA, in i40e_probe()
10621 dev_dbg(&pf->pdev->dev, "get requested speeds ret = %s last_status = %s\n", in i40e_probe()
10622 i40e_stat_str(&pf->hw, err), in i40e_probe()
10623 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_probe()
10624 pf->hw.phy.link_info.requested_speeds = abilities.link_speed; in i40e_probe()
10629 dev_dbg(&pf->pdev->dev, "get supported phy types ret = %s last_status = %s\n", in i40e_probe()
10630 i40e_stat_str(&pf->hw, err), in i40e_probe()
10631 i40e_aq_str(&pf->hw, pf->hw.aq.asq_last_status)); in i40e_probe()
10632 pf->hw.phy.phy_types = le32_to_cpu(abilities.phy_type); in i40e_probe()
10640 i40e_add_filter_to_drop_tx_flow_control_frames(&pf->hw, in i40e_probe()
10641 pf->main_vsi_seid); in i40e_probe()
10644 i40e_print_features(pf); in i40e_probe()
10650 set_bit(__I40E_DOWN, &pf->state); in i40e_probe()
10651 i40e_clear_interrupt_scheme(pf); in i40e_probe()
10652 kfree(pf->vsi); in i40e_probe()
10654 i40e_reset_interrupt_capability(pf); in i40e_probe()
10655 del_timer_sync(&pf->service_timer); in i40e_probe()
10660 kfree(pf->qp_pile); in i40e_probe()
10667 kfree(pf); in i40e_probe()
10689 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_remove() local
10690 struct i40e_hw *hw = &pf->hw; in i40e_remove()
10694 i40e_dbg_pf_exit(pf); in i40e_remove()
10696 i40e_ptp_stop(pf); in i40e_remove()
10703 set_bit(__I40E_DOWN, &pf->state); in i40e_remove()
10704 del_timer_sync(&pf->service_timer); in i40e_remove()
10705 cancel_work_sync(&pf->service_task); in i40e_remove()
10707 if (pf->flags & I40E_FLAG_SRIOV_ENABLED) { in i40e_remove()
10708 i40e_free_vfs(pf); in i40e_remove()
10709 pf->flags &= ~I40E_FLAG_SRIOV_ENABLED; in i40e_remove()
10712 i40e_fdir_teardown(pf); in i40e_remove()
10718 if (!pf->veb[i]) in i40e_remove()
10721 if (pf->veb[i]->uplink_seid == pf->mac_seid || in i40e_remove()
10722 pf->veb[i]->uplink_seid == 0) in i40e_remove()
10723 i40e_switch_branch_release(pf->veb[i]); in i40e_remove()
10729 if (pf->vsi[pf->lan_vsi]) in i40e_remove()
10730 i40e_vsi_release(pf->vsi[pf->lan_vsi]); in i40e_remove()
10733 if (pf->hw.hmc.hmc_obj) { in i40e_remove()
10734 ret_code = i40e_shutdown_lan_hmc(&pf->hw); in i40e_remove()
10742 ret_code = i40e_shutdown_adminq(&pf->hw); in i40e_remove()
10753 i40e_clear_interrupt_scheme(pf); in i40e_remove()
10754 for (i = 0; i < pf->num_alloc_vsi; i++) { in i40e_remove()
10755 if (pf->vsi[i]) { in i40e_remove()
10756 i40e_vsi_clear_rings(pf->vsi[i]); in i40e_remove()
10757 i40e_vsi_clear(pf->vsi[i]); in i40e_remove()
10758 pf->vsi[i] = NULL; in i40e_remove()
10763 kfree(pf->veb[i]); in i40e_remove()
10764 pf->veb[i] = NULL; in i40e_remove()
10767 kfree(pf->qp_pile); in i40e_remove()
10768 kfree(pf->vsi); in i40e_remove()
10770 iounmap(pf->hw.hw_addr); in i40e_remove()
10771 kfree(pf); in i40e_remove()
10790 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_pci_error_detected() local
10795 if (!test_bit(__I40E_SUSPENDED, &pf->state)) { in i40e_pci_error_detected()
10797 i40e_prep_for_reset(pf); in i40e_pci_error_detected()
10816 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_pci_error_slot_reset() local
10832 reg = rd32(&pf->hw, I40E_GLGEN_RTRIG); in i40e_pci_error_slot_reset()
10859 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_pci_error_resume() local
10862 if (test_bit(__I40E_SUSPENDED, &pf->state)) in i40e_pci_error_resume()
10866 i40e_handle_reset_warning(pf); in i40e_pci_error_resume()
10876 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_shutdown() local
10877 struct i40e_hw *hw = &pf->hw; in i40e_shutdown()
10879 set_bit(__I40E_SUSPENDED, &pf->state); in i40e_shutdown()
10880 set_bit(__I40E_DOWN, &pf->state); in i40e_shutdown()
10882 i40e_prep_for_reset(pf); in i40e_shutdown()
10885 wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_shutdown()
10886 wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_shutdown()
10888 del_timer_sync(&pf->service_timer); in i40e_shutdown()
10889 cancel_work_sync(&pf->service_task); in i40e_shutdown()
10890 i40e_fdir_teardown(pf); in i40e_shutdown()
10893 i40e_prep_for_reset(pf); in i40e_shutdown()
10897 (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_shutdown()
10899 (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_shutdown()
10901 i40e_clear_interrupt_scheme(pf); in i40e_shutdown()
10904 pci_wake_from_d3(pdev, pf->wol_en); in i40e_shutdown()
10916 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_suspend() local
10917 struct i40e_hw *hw = &pf->hw; in i40e_suspend()
10919 set_bit(__I40E_SUSPENDED, &pf->state); in i40e_suspend()
10920 set_bit(__I40E_DOWN, &pf->state); in i40e_suspend()
10923 i40e_prep_for_reset(pf); in i40e_suspend()
10926 wr32(hw, I40E_PFPM_APM, (pf->wol_en ? I40E_PFPM_APM_APME_MASK : 0)); in i40e_suspend()
10927 wr32(hw, I40E_PFPM_WUFC, (pf->wol_en ? I40E_PFPM_WUFC_MAG_MASK : 0)); in i40e_suspend()
10929 pci_wake_from_d3(pdev, pf->wol_en); in i40e_suspend()
10941 struct i40e_pf *pf = pci_get_drvdata(pdev); in i40e_resume() local
10962 if (test_and_clear_bit(__I40E_SUSPENDED, &pf->state)) { in i40e_resume()
10963 clear_bit(__I40E_DOWN, &pf->state); in i40e_resume()
10965 i40e_reset_and_rebuild(pf, false); in i40e_resume()