Lines Matching refs:vsi
50 static void i40e_vsi_reinit_locked(struct i40e_vsi *vsi);
52 static int i40e_add_vsi(struct i40e_vsi *vsi);
53 static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi);
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()
303 struct i40e_vsi *vsi = np->vsi; in i40e_tx_timeout() local
304 struct i40e_pf *pf = vsi->back; in i40e_tx_timeout()
330 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_tx_timeout()
331 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) { in i40e_tx_timeout()
333 vsi->tx_rings[i]->queue_index) { in i40e_tx_timeout()
334 tx_ring = vsi->tx_rings[i]; in i40e_tx_timeout()
353 tx_ring->vsi->base_vector - 1)); in i40e_tx_timeout()
358 vsi->seid, hung_queue, tx_ring->next_to_clean, in i40e_tx_timeout()
411 struct rtnl_link_stats64 *i40e_get_vsi_stats_struct(struct i40e_vsi *vsi) in i40e_get_vsi_stats_struct() argument
413 return &vsi->net_stats; in i40e_get_vsi_stats_struct()
435 struct i40e_vsi *vsi = np->vsi; in i40e_get_netdev_stats_struct() local
436 struct rtnl_link_stats64 *vsi_stats = i40e_get_vsi_stats_struct(vsi); in i40e_get_netdev_stats_struct()
439 if (test_bit(__I40E_DOWN, &vsi->state)) in i40e_get_netdev_stats_struct()
442 if (!vsi->tx_rings) in i40e_get_netdev_stats_struct()
446 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_get_netdev_stats_struct()
450 tx_ring = ACCESS_ONCE(vsi->tx_rings[i]); in i40e_get_netdev_stats_struct()
491 void i40e_vsi_reset_stats(struct i40e_vsi *vsi) in i40e_vsi_reset_stats() argument
496 if (!vsi) in i40e_vsi_reset_stats()
499 ns = i40e_get_vsi_stats_struct(vsi); in i40e_vsi_reset_stats()
501 memset(&vsi->net_stats_offsets, 0, sizeof(vsi->net_stats_offsets)); in i40e_vsi_reset_stats()
502 memset(&vsi->eth_stats, 0, sizeof(vsi->eth_stats)); in i40e_vsi_reset_stats()
503 memset(&vsi->eth_stats_offsets, 0, sizeof(vsi->eth_stats_offsets)); in i40e_vsi_reset_stats()
504 if (vsi->rx_rings && vsi->rx_rings[0]) { in i40e_vsi_reset_stats()
505 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_reset_stats()
506 memset(&vsi->rx_rings[i]->stats, 0, in i40e_vsi_reset_stats()
507 sizeof(vsi->rx_rings[i]->stats)); in i40e_vsi_reset_stats()
508 memset(&vsi->rx_rings[i]->rx_stats, 0, in i40e_vsi_reset_stats()
509 sizeof(vsi->rx_rings[i]->rx_stats)); in i40e_vsi_reset_stats()
510 memset(&vsi->tx_rings[i]->stats, 0, in i40e_vsi_reset_stats()
511 sizeof(vsi->tx_rings[i]->stats)); in i40e_vsi_reset_stats()
512 memset(&vsi->tx_rings[i]->tx_stats, 0, in i40e_vsi_reset_stats()
513 sizeof(vsi->tx_rings[i]->tx_stats)); in i40e_vsi_reset_stats()
516 vsi->stat_offsets_loaded = false; in i40e_vsi_reset_stats()
603 void i40e_update_eth_stats(struct i40e_vsi *vsi) in i40e_update_eth_stats() argument
605 int stat_idx = le16_to_cpu(vsi->info.stat_counter_idx); in i40e_update_eth_stats()
606 struct i40e_pf *pf = vsi->back; in i40e_update_eth_stats()
611 es = &vsi->eth_stats; in i40e_update_eth_stats()
612 oes = &vsi->eth_stats_offsets; in i40e_update_eth_stats()
616 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
619 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
622 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
625 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
630 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
634 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
638 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
642 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
647 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
651 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
655 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
659 vsi->stat_offsets_loaded, in i40e_update_eth_stats()
661 vsi->stat_offsets_loaded = true; in i40e_update_eth_stats()
748 static void i40e_update_fcoe_stats(struct i40e_vsi *vsi) in i40e_update_fcoe_stats() argument
750 struct i40e_pf *pf = vsi->back; in i40e_update_fcoe_stats()
756 if (vsi->type != I40E_VSI_FCOE) in i40e_update_fcoe_stats()
760 fs = &vsi->fcoe_stats; in i40e_update_fcoe_stats()
761 ofs = &vsi->fcoe_stats_offsets; in i40e_update_fcoe_stats()
764 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
767 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
770 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
773 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
776 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
779 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
782 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
785 vsi->fcoe_stat_offsets_loaded, in i40e_update_fcoe_stats()
788 vsi->fcoe_stat_offsets_loaded = true; in i40e_update_fcoe_stats()
871 static void i40e_update_vsi_stats(struct i40e_vsi *vsi) in i40e_update_vsi_stats() argument
873 struct i40e_pf *pf = vsi->back; in i40e_update_vsi_stats()
888 if (test_bit(__I40E_DOWN, &vsi->state) || in i40e_update_vsi_stats()
892 ns = i40e_get_vsi_stats_struct(vsi); in i40e_update_vsi_stats()
893 ons = &vsi->net_stats_offsets; in i40e_update_vsi_stats()
894 es = &vsi->eth_stats; in i40e_update_vsi_stats()
895 oes = &vsi->eth_stats_offsets; in i40e_update_vsi_stats()
906 for (q = 0; q < vsi->num_queue_pairs; q++) { in i40e_update_vsi_stats()
908 p = ACCESS_ONCE(vsi->tx_rings[q]); in i40e_update_vsi_stats()
934 vsi->tx_restart = tx_restart; in i40e_update_vsi_stats()
935 vsi->tx_busy = tx_busy; in i40e_update_vsi_stats()
936 vsi->tx_linearize = tx_linearize; in i40e_update_vsi_stats()
937 vsi->rx_page_failed = rx_page; in i40e_update_vsi_stats()
938 vsi->rx_buf_failed = rx_buf; in i40e_update_vsi_stats()
946 i40e_update_eth_stats(vsi); in i40e_update_vsi_stats()
957 if (vsi == pf->vsi[pf->lan_vsi]) { in i40e_update_vsi_stats()
1197 void i40e_update_stats(struct i40e_vsi *vsi) in i40e_update_stats() argument
1199 struct i40e_pf *pf = vsi->back; in i40e_update_stats()
1201 if (vsi == pf->vsi[pf->lan_vsi]) in i40e_update_stats()
1204 i40e_update_vsi_stats(vsi); in i40e_update_stats()
1206 i40e_update_fcoe_stats(vsi); in i40e_update_stats()
1220 static struct i40e_mac_filter *i40e_find_filter(struct i40e_vsi *vsi, in i40e_find_filter() argument
1226 if (!vsi || !macaddr) in i40e_find_filter()
1229 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_find_filter()
1249 struct i40e_mac_filter *i40e_find_mac(struct i40e_vsi *vsi, u8 *macaddr, in i40e_find_mac() argument
1254 if (!vsi || !macaddr) in i40e_find_mac()
1257 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_find_mac()
1272 bool i40e_is_vsi_in_vlan(struct i40e_vsi *vsi) in i40e_is_vsi_in_vlan() argument
1279 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_is_vsi_in_vlan()
1280 if (f->vlan >= 0 || vsi->info.pvid) in i40e_is_vsi_in_vlan()
1299 struct i40e_mac_filter *i40e_put_mac_in_vlan(struct i40e_vsi *vsi, u8 *macaddr, in i40e_put_mac_in_vlan() argument
1304 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_put_mac_in_vlan()
1305 if (vsi->info.pvid) in i40e_put_mac_in_vlan()
1306 f->vlan = le16_to_cpu(vsi->info.pvid); in i40e_put_mac_in_vlan()
1307 if (!i40e_find_filter(vsi, macaddr, f->vlan, in i40e_put_mac_in_vlan()
1309 if (!i40e_add_filter(vsi, macaddr, f->vlan, in i40e_put_mac_in_vlan()
1315 return list_first_entry_or_null(&vsi->mac_filter_list, in i40e_put_mac_in_vlan()
1327 static int i40e_rm_default_mac_filter(struct i40e_vsi *vsi, u8 *macaddr) in i40e_rm_default_mac_filter() argument
1330 struct i40e_pf *pf = vsi->back; in i40e_rm_default_mac_filter()
1334 if (vsi->type != I40E_VSI_MAIN) in i40e_rm_default_mac_filter()
1342 ret = i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_rm_default_mac_filter()
1362 struct i40e_mac_filter *i40e_add_filter(struct i40e_vsi *vsi, in i40e_add_filter() argument
1368 if (!vsi || !macaddr) in i40e_add_filter()
1371 f = i40e_find_filter(vsi, macaddr, vlan, is_vf, is_netdev); in i40e_add_filter()
1382 list_add(&f->list, &vsi->mac_filter_list); in i40e_add_filter()
1404 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_add_filter()
1405 vsi->back->flags |= I40E_FLAG_FILTER_SYNC; in i40e_add_filter()
1423 void i40e_del_filter(struct i40e_vsi *vsi, in i40e_del_filter() argument
1429 if (!vsi || !macaddr) in i40e_del_filter()
1432 f = i40e_find_filter(vsi, macaddr, vlan, is_vf, is_netdev); in i40e_del_filter()
1462 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_del_filter()
1463 vsi->back->flags |= I40E_FLAG_FILTER_SYNC; in i40e_del_filter()
1481 struct i40e_vsi *vsi = np->vsi; in i40e_set_mac() local
1482 struct i40e_pf *pf = vsi->back; in i40e_set_mac()
1496 if (test_bit(__I40E_DOWN, &vsi->back->state) || in i40e_set_mac()
1497 test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state)) in i40e_set_mac()
1506 if (vsi->type == I40E_VSI_MAIN) { in i40e_set_mac()
1509 ret = i40e_aq_mac_address_write(&vsi->back->hw, in i40e_set_mac()
1526 i40e_aq_remove_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_set_mac()
1528 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_set_mac()
1529 i40e_del_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, in i40e_set_mac()
1531 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_set_mac()
1540 i40e_aq_add_macvlan(&pf->hw, vsi->seid, &element, 1, NULL); in i40e_set_mac()
1542 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_set_mac()
1543 f = i40e_add_filter(vsi, addr->sa_data, I40E_VLAN_ANY, in i40e_set_mac()
1547 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_set_mac()
1550 i40e_sync_vsi_filters(vsi, false); in i40e_set_mac()
1566 void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi, in i40e_vsi_setup_queue_map() argument
1571 static void i40e_vsi_setup_queue_map(struct i40e_vsi *vsi, in i40e_vsi_setup_queue_map()
1577 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_queue_map()
1590 if (enabled_tc && (vsi->back->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_vsi_setup_queue_map()
1605 vsi->tc_config.numtc = numtc; in i40e_vsi_setup_queue_map()
1606 vsi->tc_config.enabled_tc = enabled_tc ? enabled_tc : 1; 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()
1615 qcount = vsi->alloc_queue_pairs; in i40e_vsi_setup_queue_map()
1622 if (vsi->tc_config.enabled_tc & BIT_ULL(i)) { in i40e_vsi_setup_queue_map()
1626 switch (vsi->type) { in i40e_vsi_setup_queue_map()
1643 vsi->tc_config.tc_info[i].qoffset = offset; in i40e_vsi_setup_queue_map()
1644 vsi->tc_config.tc_info[i].qcount = qcount; in i40e_vsi_setup_queue_map()
1654 vsi->tc_config.tc_info[i].netdev_tc = netdev_tc++; in i40e_vsi_setup_queue_map()
1665 vsi->tc_config.tc_info[i].qoffset = 0; in i40e_vsi_setup_queue_map()
1666 vsi->tc_config.tc_info[i].qcount = 1; in i40e_vsi_setup_queue_map()
1667 vsi->tc_config.tc_info[i].netdev_tc = 0; in i40e_vsi_setup_queue_map()
1675 vsi->num_queue_pairs = offset; in i40e_vsi_setup_queue_map()
1676 if ((vsi->type == I40E_VSI_MAIN) && (numtc == 1)) { in i40e_vsi_setup_queue_map()
1677 if (vsi->req_queue_pairs > 0) in i40e_vsi_setup_queue_map()
1678 vsi->num_queue_pairs = vsi->req_queue_pairs; in i40e_vsi_setup_queue_map()
1680 vsi->num_queue_pairs = pf->num_lan_msix; in i40e_vsi_setup_queue_map()
1689 if (vsi->type == I40E_VSI_SRIOV) { in i40e_vsi_setup_queue_map()
1692 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_setup_queue_map()
1694 cpu_to_le16(vsi->base_queue + i); in i40e_vsi_setup_queue_map()
1698 ctxt->info.queue_mapping[0] = cpu_to_le16(vsi->base_queue); in i40e_vsi_setup_queue_map()
1715 struct i40e_vsi *vsi = np->vsi; in i40e_set_rx_mode() local
1720 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_set_rx_mode()
1724 if (!i40e_find_mac(vsi, uca->addr, false, true)) { in i40e_set_rx_mode()
1725 if (i40e_is_vsi_in_vlan(vsi)) in i40e_set_rx_mode()
1726 i40e_put_mac_in_vlan(vsi, uca->addr, in i40e_set_rx_mode()
1729 i40e_add_filter(vsi, uca->addr, I40E_VLAN_ANY, in i40e_set_rx_mode()
1735 if (!i40e_find_mac(vsi, mca->addr, false, true)) { in i40e_set_rx_mode()
1736 if (i40e_is_vsi_in_vlan(vsi)) in i40e_set_rx_mode()
1737 i40e_put_mac_in_vlan(vsi, mca->addr, in i40e_set_rx_mode()
1740 i40e_add_filter(vsi, mca->addr, I40E_VLAN_ANY, in i40e_set_rx_mode()
1746 list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) { in i40e_set_rx_mode()
1764 i40e_del_filter(vsi, f->macaddr, I40E_VLAN_ANY, false, true); in i40e_set_rx_mode()
1769 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_set_rx_mode()
1772 if (vsi->current_netdev_flags != vsi->netdev->flags) { in i40e_set_rx_mode()
1773 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_set_rx_mode()
1774 vsi->back->flags |= I40E_FLAG_FILTER_SYNC; in i40e_set_rx_mode()
1808 static void i40e_undo_del_filter_entries(struct i40e_vsi *vsi, in i40e_undo_del_filter_entries() argument
1816 list_move_tail(&f->list, &vsi->mac_filter_list); in i40e_undo_del_filter_entries()
1826 static void i40e_undo_add_filter_entries(struct i40e_vsi *vsi) in i40e_undo_add_filter_entries() argument
1830 list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) { in i40e_undo_add_filter_entries()
1860 int i40e_sync_vsi_filters(struct i40e_vsi *vsi, bool grab_rtnl) in i40e_sync_vsi_filters() argument
1880 while (test_and_set_bit(__I40E_CONFIG_BUSY, &vsi->state)) in i40e_sync_vsi_filters()
1882 pf = vsi->back; in i40e_sync_vsi_filters()
1884 if (vsi->netdev) { in i40e_sync_vsi_filters()
1885 changed_flags = vsi->current_netdev_flags ^ vsi->netdev->flags; in i40e_sync_vsi_filters()
1886 vsi->current_netdev_flags = vsi->netdev->flags; in i40e_sync_vsi_filters()
1892 if (vsi->flags & I40E_VSI_FLAG_FILTER_CHANGED) { in i40e_sync_vsi_filters()
1893 vsi->flags &= ~I40E_VSI_FLAG_FILTER_CHANGED; in i40e_sync_vsi_filters()
1895 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_sync_vsi_filters()
1896 list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) { in i40e_sync_vsi_filters()
1908 list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) { in i40e_sync_vsi_filters()
1927 i40e_undo_del_filter_entries(vsi, &tmp_del_list); in i40e_sync_vsi_filters()
1928 i40e_undo_add_filter_entries(vsi); in i40e_sync_vsi_filters()
1930 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_sync_vsi_filters()
1947 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_sync_vsi_filters()
1948 i40e_undo_del_filter_entries(vsi, &tmp_del_list); in i40e_sync_vsi_filters()
1949 i40e_undo_add_filter_entries(vsi); in i40e_sync_vsi_filters()
1950 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_sync_vsi_filters()
1970 vsi->seid, del_list, num_del, in i40e_sync_vsi_filters()
1990 ret = i40e_aq_remove_macvlan(&pf->hw, vsi->seid, in i40e_sync_vsi_filters()
2019 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_sync_vsi_filters()
2020 i40e_undo_add_filter_entries(vsi); in i40e_sync_vsi_filters()
2021 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_sync_vsi_filters()
2043 ret = i40e_aq_add_macvlan(&pf->hw, vsi->seid, in i40e_sync_vsi_filters()
2061 ret = i40e_aq_add_macvlan(&pf->hw, vsi->seid, in i40e_sync_vsi_filters()
2076 &vsi->state)) { in i40e_sync_vsi_filters()
2079 &vsi->state); in i40e_sync_vsi_filters()
2089 cur_multipromisc = !!(vsi->current_netdev_flags & IFF_ALLMULTI); in i40e_sync_vsi_filters()
2090 ret = i40e_aq_set_vsi_multicast_promiscuous(&vsi->back->hw, in i40e_sync_vsi_filters()
2091 vsi->seid, in i40e_sync_vsi_filters()
2104 cur_promisc = (!!(vsi->current_netdev_flags & IFF_PROMISC) || in i40e_sync_vsi_filters()
2106 &vsi->state)); in i40e_sync_vsi_filters()
2107 if (vsi->type == I40E_VSI_MAIN && pf->lan_veb != I40E_NO_VEB) { in i40e_sync_vsi_filters()
2124 &vsi->back->hw, in i40e_sync_vsi_filters()
2125 vsi->seid, in i40e_sync_vsi_filters()
2132 &vsi->back->hw, in i40e_sync_vsi_filters()
2133 vsi->seid, in i40e_sync_vsi_filters()
2140 ret = i40e_aq_set_vsi_broadcast(&vsi->back->hw, in i40e_sync_vsi_filters()
2141 vsi->seid, in i40e_sync_vsi_filters()
2151 clear_bit(__I40E_CONFIG_BUSY, &vsi->state); in i40e_sync_vsi_filters()
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()
2185 struct i40e_vsi *vsi = np->vsi; in i40e_change_mtu() local
2195 i40e_vsi_reinit_locked(vsi); in i40e_change_mtu()
2209 struct i40e_pf *pf = np->vsi->back; in i40e_ioctl()
2225 void i40e_vlan_stripping_enable(struct i40e_vsi *vsi) in i40e_vlan_stripping_enable() argument
2230 if ((vsi->info.valid_sections & in i40e_vlan_stripping_enable()
2232 ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_MODE_MASK) == 0)) in i40e_vlan_stripping_enable()
2235 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vlan_stripping_enable()
2236 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL | in i40e_vlan_stripping_enable()
2239 ctxt.seid = vsi->seid; in i40e_vlan_stripping_enable()
2240 ctxt.info = vsi->info; in i40e_vlan_stripping_enable()
2241 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vlan_stripping_enable()
2243 dev_info(&vsi->back->pdev->dev, in i40e_vlan_stripping_enable()
2245 i40e_stat_str(&vsi->back->hw, ret), in i40e_vlan_stripping_enable()
2246 i40e_aq_str(&vsi->back->hw, in i40e_vlan_stripping_enable()
2247 vsi->back->hw.aq.asq_last_status)); in i40e_vlan_stripping_enable()
2255 void i40e_vlan_stripping_disable(struct i40e_vsi *vsi) in i40e_vlan_stripping_disable() argument
2260 if ((vsi->info.valid_sections & in i40e_vlan_stripping_disable()
2262 ((vsi->info.port_vlan_flags & I40E_AQ_VSI_PVLAN_EMOD_MASK) == in i40e_vlan_stripping_disable()
2266 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vlan_stripping_disable()
2267 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL | in i40e_vlan_stripping_disable()
2270 ctxt.seid = vsi->seid; in i40e_vlan_stripping_disable()
2271 ctxt.info = vsi->info; in i40e_vlan_stripping_disable()
2272 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vlan_stripping_disable()
2274 dev_info(&vsi->back->pdev->dev, in i40e_vlan_stripping_disable()
2276 i40e_stat_str(&vsi->back->hw, ret), in i40e_vlan_stripping_disable()
2277 i40e_aq_str(&vsi->back->hw, in i40e_vlan_stripping_disable()
2278 vsi->back->hw.aq.asq_last_status)); in i40e_vlan_stripping_disable()
2290 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_register() local
2293 i40e_vlan_stripping_enable(vsi); in i40e_vlan_rx_register()
2295 i40e_vlan_stripping_disable(vsi); in i40e_vlan_rx_register()
2303 int i40e_vsi_add_vlan(struct i40e_vsi *vsi, s16 vid) in i40e_vsi_add_vlan() argument
2308 is_vf = (vsi->type == I40E_VSI_SRIOV); in i40e_vsi_add_vlan()
2309 is_netdev = !!(vsi->netdev); in i40e_vsi_add_vlan()
2312 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_add_vlan()
2315 add_f = i40e_add_filter(vsi, vsi->netdev->dev_addr, vid, in i40e_vsi_add_vlan()
2318 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_vlan()
2320 vid, vsi->netdev->dev_addr); in i40e_vsi_add_vlan()
2321 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_add_vlan()
2326 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_vsi_add_vlan()
2327 add_f = i40e_add_filter(vsi, f->macaddr, vid, is_vf, is_netdev); in i40e_vsi_add_vlan()
2329 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_vlan()
2332 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_add_vlan()
2343 if (is_netdev && i40e_find_filter(vsi, vsi->netdev->dev_addr, in i40e_vsi_add_vlan()
2346 i40e_del_filter(vsi, vsi->netdev->dev_addr, in i40e_vsi_add_vlan()
2348 add_f = i40e_add_filter(vsi, vsi->netdev->dev_addr, 0, in i40e_vsi_add_vlan()
2351 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_vlan()
2353 vsi->netdev->dev_addr); in i40e_vsi_add_vlan()
2354 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_add_vlan()
2361 if (vid > 0 && !vsi->info.pvid) { in i40e_vsi_add_vlan()
2362 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_vsi_add_vlan()
2363 if (!i40e_find_filter(vsi, f->macaddr, I40E_VLAN_ANY, in i40e_vsi_add_vlan()
2366 i40e_del_filter(vsi, f->macaddr, I40E_VLAN_ANY, in i40e_vsi_add_vlan()
2368 add_f = i40e_add_filter(vsi, f->macaddr, in i40e_vsi_add_vlan()
2371 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_vlan()
2374 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_add_vlan()
2383 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_add_vlan()
2385 if (test_bit(__I40E_DOWN, &vsi->back->state) || in i40e_vsi_add_vlan()
2386 test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state)) in i40e_vsi_add_vlan()
2389 return i40e_sync_vsi_filters(vsi, false); in i40e_vsi_add_vlan()
2399 int i40e_vsi_kill_vlan(struct i40e_vsi *vsi, s16 vid) in i40e_vsi_kill_vlan() argument
2401 struct net_device *netdev = vsi->netdev; in i40e_vsi_kill_vlan()
2406 is_vf = (vsi->type == I40E_VSI_SRIOV); in i40e_vsi_kill_vlan()
2410 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_kill_vlan()
2413 i40e_del_filter(vsi, netdev->dev_addr, vid, is_vf, is_netdev); in i40e_vsi_kill_vlan()
2415 list_for_each_entry(f, &vsi->mac_filter_list, list) in i40e_vsi_kill_vlan()
2416 i40e_del_filter(vsi, f->macaddr, vid, is_vf, is_netdev); in i40e_vsi_kill_vlan()
2423 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_vsi_kill_vlan()
2435 i40e_del_filter(vsi, netdev->dev_addr, 0, is_vf, is_netdev); in i40e_vsi_kill_vlan()
2436 f = i40e_add_filter(vsi, netdev->dev_addr, I40E_VLAN_ANY, in i40e_vsi_kill_vlan()
2439 dev_info(&vsi->back->pdev->dev, in i40e_vsi_kill_vlan()
2442 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_kill_vlan()
2448 list_for_each_entry(f, &vsi->mac_filter_list, list) { in i40e_vsi_kill_vlan()
2449 i40e_del_filter(vsi, f->macaddr, 0, is_vf, is_netdev); in i40e_vsi_kill_vlan()
2450 add_f = i40e_add_filter(vsi, f->macaddr, I40E_VLAN_ANY, in i40e_vsi_kill_vlan()
2453 dev_info(&vsi->back->pdev->dev, in i40e_vsi_kill_vlan()
2456 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_kill_vlan()
2465 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_kill_vlan()
2467 if (test_bit(__I40E_DOWN, &vsi->back->state) || in i40e_vsi_kill_vlan()
2468 test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state)) in i40e_vsi_kill_vlan()
2471 return i40e_sync_vsi_filters(vsi, false); in i40e_vsi_kill_vlan()
2490 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_add_vid() local
2505 ret = i40e_vsi_add_vlan(vsi, vid); in i40e_vlan_rx_add_vid()
2508 set_bit(vid, vsi->active_vlans); in i40e_vlan_rx_add_vid()
2529 struct i40e_vsi *vsi = np->vsi; in i40e_vlan_rx_kill_vid() local
2537 i40e_vsi_kill_vlan(vsi, vid); in i40e_vlan_rx_kill_vid()
2539 clear_bit(vid, vsi->active_vlans); in i40e_vlan_rx_kill_vid()
2548 static void i40e_restore_vlan(struct i40e_vsi *vsi) in i40e_restore_vlan() argument
2552 if (!vsi->netdev) in i40e_restore_vlan()
2555 i40e_vlan_rx_register(vsi->netdev, vsi->netdev->features); in i40e_restore_vlan()
2557 for_each_set_bit(vid, vsi->active_vlans, VLAN_N_VID) in i40e_restore_vlan()
2558 i40e_vlan_rx_add_vid(vsi->netdev, htons(ETH_P_8021Q), in i40e_restore_vlan()
2567 int i40e_vsi_add_pvid(struct i40e_vsi *vsi, u16 vid) in i40e_vsi_add_pvid() argument
2572 vsi->info.valid_sections = cpu_to_le16(I40E_AQ_VSI_PROP_VLAN_VALID); in i40e_vsi_add_pvid()
2573 vsi->info.pvid = cpu_to_le16(vid); in i40e_vsi_add_pvid()
2574 vsi->info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_TAGGED | in i40e_vsi_add_pvid()
2578 ctxt.seid = vsi->seid; in i40e_vsi_add_pvid()
2579 ctxt.info = vsi->info; in i40e_vsi_add_pvid()
2580 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vsi_add_pvid()
2582 dev_info(&vsi->back->pdev->dev, in i40e_vsi_add_pvid()
2584 i40e_stat_str(&vsi->back->hw, ret), in i40e_vsi_add_pvid()
2585 i40e_aq_str(&vsi->back->hw, in i40e_vsi_add_pvid()
2586 vsi->back->hw.aq.asq_last_status)); in i40e_vsi_add_pvid()
2599 void i40e_vsi_remove_pvid(struct i40e_vsi *vsi) in i40e_vsi_remove_pvid() argument
2601 i40e_vlan_stripping_disable(vsi); in i40e_vsi_remove_pvid()
2603 vsi->info.pvid = 0; in i40e_vsi_remove_pvid()
2616 static int i40e_vsi_setup_tx_resources(struct i40e_vsi *vsi) in i40e_vsi_setup_tx_resources() argument
2620 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_tx_resources()
2621 err = i40e_setup_tx_descriptors(vsi->tx_rings[i]); in i40e_vsi_setup_tx_resources()
2632 static void i40e_vsi_free_tx_resources(struct i40e_vsi *vsi) in i40e_vsi_free_tx_resources() argument
2636 if (!vsi->tx_rings) in i40e_vsi_free_tx_resources()
2639 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_tx_resources()
2640 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) in i40e_vsi_free_tx_resources()
2641 i40e_free_tx_resources(vsi->tx_rings[i]); in i40e_vsi_free_tx_resources()
2654 static int i40e_vsi_setup_rx_resources(struct i40e_vsi *vsi) in i40e_vsi_setup_rx_resources() argument
2658 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_setup_rx_resources()
2659 err = i40e_setup_rx_descriptors(vsi->rx_rings[i]); in i40e_vsi_setup_rx_resources()
2661 i40e_fcoe_setup_ddp_resources(vsi); in i40e_vsi_setup_rx_resources()
2672 static void i40e_vsi_free_rx_resources(struct i40e_vsi *vsi) in i40e_vsi_free_rx_resources() argument
2676 if (!vsi->rx_rings) in i40e_vsi_free_rx_resources()
2679 for (i = 0; i < vsi->num_queue_pairs; i++) in i40e_vsi_free_rx_resources()
2680 if (vsi->rx_rings[i] && vsi->rx_rings[i]->desc) in i40e_vsi_free_rx_resources()
2681 i40e_free_rx_resources(vsi->rx_rings[i]); in i40e_vsi_free_rx_resources()
2683 i40e_fcoe_free_ddp_resources(vsi); in i40e_vsi_free_rx_resources()
2696 struct i40e_vsi *vsi = ring->vsi; in i40e_config_xps_tx_ring() local
2703 if (vsi->tc_config.numtc <= 1) { in i40e_config_xps_tx_ring()
2724 struct i40e_vsi *vsi = ring->vsi; in i40e_configure_tx_ring() local
2725 u16 pf_q = vsi->base_queue + ring->queue_index; in i40e_configure_tx_ring()
2726 struct i40e_hw *hw = &vsi->back->hw; in i40e_configure_tx_ring()
2732 if (vsi->back->flags & I40E_FLAG_FD_ATR_ENABLED) { in i40e_configure_tx_ring()
2733 ring->atr_sample_rate = vsi->back->atr_sample_rate; in i40e_configure_tx_ring()
2748 tx_ctx.fd_ena = !!(vsi->back->flags & (I40E_FLAG_FD_SB_ENABLED | in i40e_configure_tx_ring()
2751 tx_ctx.fc_ena = (vsi->type == I40E_VSI_FCOE); in i40e_configure_tx_ring()
2753 tx_ctx.timesync_ena = !!(vsi->back->flags & I40E_FLAG_PTP); in i40e_configure_tx_ring()
2755 if (vsi->type != I40E_VSI_FDIR) in i40e_configure_tx_ring()
2770 tx_ctx.rdylist = le16_to_cpu(vsi->info.qs_handle[ring->dcb_tc]); in i40e_configure_tx_ring()
2776 dev_info(&vsi->back->pdev->dev, in i40e_configure_tx_ring()
2785 dev_info(&vsi->back->pdev->dev, in i40e_configure_tx_ring()
2792 if (vsi->type == I40E_VSI_VMDQ2) { in i40e_configure_tx_ring()
2794 qtx_ctl |= ((vsi->id) << I40E_QTX_CTL_VFVM_INDX_SHIFT) & in i40e_configure_tx_ring()
2819 struct i40e_vsi *vsi = ring->vsi; in i40e_configure_rx_ring() local
2820 u32 chain_len = vsi->back->hw.func_caps.rx_buf_chain_len; in i40e_configure_rx_ring()
2821 u16 pf_q = vsi->base_queue + ring->queue_index; in i40e_configure_rx_ring()
2822 struct i40e_hw *hw = &vsi->back->hw; in i40e_configure_rx_ring()
2831 ring->rx_buf_len = vsi->rx_buf_len; in i40e_configure_rx_ring()
2832 ring->rx_hdr_len = vsi->rx_hdr_len; in i40e_configure_rx_ring()
2840 if (vsi->back->flags & I40E_FLAG_16BYTE_RX_DESC_ENABLED) { in i40e_configure_rx_ring()
2847 rx_ctx.dtype = vsi->dtype; in i40e_configure_rx_ring()
2848 if (vsi->dtype) { in i40e_configure_rx_ring()
2858 rx_ctx.rxmax = min_t(u16, vsi->max_frame, in i40e_configure_rx_ring()
2869 rx_ctx.fc_ena = (vsi->type == I40E_VSI_FCOE); in i40e_configure_rx_ring()
2877 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
2886 dev_info(&vsi->back->pdev->dev, in i40e_configure_rx_ring()
2912 static int i40e_vsi_configure_tx(struct i40e_vsi *vsi) in i40e_vsi_configure_tx() argument
2917 for (i = 0; (i < vsi->num_queue_pairs) && !err; i++) in i40e_vsi_configure_tx()
2918 err = i40e_configure_tx_ring(vsi->tx_rings[i]); in i40e_vsi_configure_tx()
2929 static int i40e_vsi_configure_rx(struct i40e_vsi *vsi) in i40e_vsi_configure_rx() argument
2934 if (vsi->netdev && (vsi->netdev->mtu > ETH_DATA_LEN)) in i40e_vsi_configure_rx()
2935 vsi->max_frame = vsi->netdev->mtu + ETH_HLEN in i40e_vsi_configure_rx()
2938 vsi->max_frame = I40E_RXBUFFER_2048; in i40e_vsi_configure_rx()
2941 switch (vsi->back->flags & (I40E_FLAG_RX_1BUF_ENABLED | in i40e_vsi_configure_rx()
2944 vsi->rx_hdr_len = 0; in i40e_vsi_configure_rx()
2945 vsi->rx_buf_len = vsi->max_frame; in i40e_vsi_configure_rx()
2946 vsi->dtype = I40E_RX_DTYPE_NO_SPLIT; in i40e_vsi_configure_rx()
2949 vsi->rx_hdr_len = I40E_RX_HDR_SIZE; in i40e_vsi_configure_rx()
2950 vsi->rx_buf_len = I40E_RXBUFFER_2048; in i40e_vsi_configure_rx()
2951 vsi->dtype = I40E_RX_DTYPE_HEADER_SPLIT; in i40e_vsi_configure_rx()
2954 vsi->rx_hdr_len = I40E_RX_HDR_SIZE; in i40e_vsi_configure_rx()
2955 vsi->rx_buf_len = I40E_RXBUFFER_2048; in i40e_vsi_configure_rx()
2956 vsi->dtype = I40E_RX_DTYPE_SPLIT_ALWAYS; in i40e_vsi_configure_rx()
2962 if ((vsi->type == I40E_VSI_FCOE) && in i40e_vsi_configure_rx()
2963 (vsi->back->flags & I40E_FLAG_FCOE_ENABLED)) { in i40e_vsi_configure_rx()
2964 vsi->rx_hdr_len = 0; in i40e_vsi_configure_rx()
2965 vsi->rx_buf_len = I40E_RXBUFFER_3072; in i40e_vsi_configure_rx()
2966 vsi->max_frame = I40E_RXBUFFER_3072; in i40e_vsi_configure_rx()
2967 vsi->dtype = I40E_RX_DTYPE_NO_SPLIT; in i40e_vsi_configure_rx()
2972 vsi->rx_hdr_len = ALIGN(vsi->rx_hdr_len, in i40e_vsi_configure_rx()
2974 vsi->rx_buf_len = ALIGN(vsi->rx_buf_len, in i40e_vsi_configure_rx()
2978 for (i = 0; i < vsi->num_queue_pairs && !err; i++) in i40e_vsi_configure_rx()
2979 err = i40e_configure_rx_ring(vsi->rx_rings[i]); in i40e_vsi_configure_rx()
2988 static void i40e_vsi_config_dcb_rings(struct i40e_vsi *vsi) in i40e_vsi_config_dcb_rings() argument
2994 if (!(vsi->back->flags & I40E_FLAG_DCB_ENABLED)) { in i40e_vsi_config_dcb_rings()
2996 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_config_dcb_rings()
2997 rx_ring = vsi->rx_rings[i]; in i40e_vsi_config_dcb_rings()
2998 tx_ring = vsi->tx_rings[i]; in i40e_vsi_config_dcb_rings()
3005 if (!(vsi->tc_config.enabled_tc & BIT_ULL(n))) in i40e_vsi_config_dcb_rings()
3008 qoffset = vsi->tc_config.tc_info[n].qoffset; in i40e_vsi_config_dcb_rings()
3009 qcount = vsi->tc_config.tc_info[n].qcount; in i40e_vsi_config_dcb_rings()
3011 rx_ring = vsi->rx_rings[i]; in i40e_vsi_config_dcb_rings()
3012 tx_ring = vsi->tx_rings[i]; in i40e_vsi_config_dcb_rings()
3023 static void i40e_set_vsi_rx_mode(struct i40e_vsi *vsi) in i40e_set_vsi_rx_mode() argument
3025 if (vsi->netdev) in i40e_set_vsi_rx_mode()
3026 i40e_set_rx_mode(vsi->netdev); in i40e_set_vsi_rx_mode()
3036 static void i40e_fdir_filter_restore(struct i40e_vsi *vsi) in i40e_fdir_filter_restore() argument
3039 struct i40e_pf *pf = vsi->back; in i40e_fdir_filter_restore()
3047 i40e_add_del_fdir(vsi, filter, true); in i40e_fdir_filter_restore()
3055 static int i40e_vsi_configure(struct i40e_vsi *vsi) in i40e_vsi_configure() argument
3059 i40e_set_vsi_rx_mode(vsi); in i40e_vsi_configure()
3060 i40e_restore_vlan(vsi); in i40e_vsi_configure()
3061 i40e_vsi_config_dcb_rings(vsi); in i40e_vsi_configure()
3062 err = i40e_vsi_configure_tx(vsi); in i40e_vsi_configure()
3064 err = i40e_vsi_configure_rx(vsi); in i40e_vsi_configure()
3073 static void i40e_vsi_configure_msix(struct i40e_vsi *vsi) in i40e_vsi_configure_msix() argument
3075 struct i40e_pf *pf = vsi->back; in i40e_vsi_configure_msix()
3085 qp = vsi->base_queue; in i40e_vsi_configure_msix()
3086 vector = vsi->base_vector; in i40e_vsi_configure_msix()
3087 for (i = 0; i < vsi->num_q_vectors; i++, vector++) { in i40e_vsi_configure_msix()
3088 struct i40e_q_vector *q_vector = vsi->q_vectors[i]; in i40e_vsi_configure_msix()
3091 q_vector->rx.itr = ITR_TO_REG(vsi->rx_itr_setting); in i40e_vsi_configure_msix()
3095 q_vector->tx.itr = ITR_TO_REG(vsi->tx_itr_setting); in i40e_vsi_configure_msix()
3100 INTRL_USEC_TO_REG(vsi->int_rate_limit)); in i40e_vsi_configure_msix()
3178 static void i40e_configure_msi_and_legacy(struct i40e_vsi *vsi) in i40e_configure_msi_and_legacy() argument
3180 struct i40e_q_vector *q_vector = vsi->q_vectors[0]; in i40e_configure_msi_and_legacy()
3181 struct i40e_pf *pf = vsi->back; in i40e_configure_msi_and_legacy()
3187 q_vector->rx.itr = ITR_TO_REG(vsi->rx_itr_setting); in i40e_configure_msi_and_legacy()
3190 q_vector->tx.itr = ITR_TO_REG(vsi->tx_itr_setting); in i40e_configure_msi_and_legacy()
3249 void i40e_irq_dynamic_disable(struct i40e_vsi *vsi, int vector) in i40e_irq_dynamic_disable() argument
3251 struct i40e_pf *pf = vsi->back; in i40e_irq_dynamic_disable()
3284 static int i40e_vsi_request_irq_msix(struct i40e_vsi *vsi, char *basename) in i40e_vsi_request_irq_msix() argument
3286 int q_vectors = vsi->num_q_vectors; in i40e_vsi_request_irq_msix()
3287 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq_msix()
3288 int base = vsi->base_vector; in i40e_vsi_request_irq_msix()
3294 struct i40e_q_vector *q_vector = vsi->q_vectors[vector]; in i40e_vsi_request_irq_msix()
3311 vsi->irq_handler, in i40e_vsi_request_irq_msix()
3325 vsi->irqs_ready = true; in i40e_vsi_request_irq_msix()
3334 &(vsi->q_vectors[vector])); in i40e_vsi_request_irq_msix()
3343 static void i40e_vsi_disable_irq(struct i40e_vsi *vsi) in i40e_vsi_disable_irq() argument
3345 struct i40e_pf *pf = vsi->back; in i40e_vsi_disable_irq()
3347 int base = vsi->base_vector; in i40e_vsi_disable_irq()
3350 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_vsi_disable_irq()
3351 wr32(hw, I40E_QINT_TQCTL(vsi->tx_rings[i]->reg_idx), 0); in i40e_vsi_disable_irq()
3352 wr32(hw, I40E_QINT_RQCTL(vsi->rx_rings[i]->reg_idx), 0); in i40e_vsi_disable_irq()
3356 for (i = vsi->base_vector; in i40e_vsi_disable_irq()
3357 i < (vsi->num_q_vectors + vsi->base_vector); i++) in i40e_vsi_disable_irq()
3361 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_vsi_disable_irq()
3376 static int i40e_vsi_enable_irq(struct i40e_vsi *vsi) in i40e_vsi_enable_irq() argument
3378 struct i40e_pf *pf = vsi->back; in i40e_vsi_enable_irq()
3382 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_vsi_enable_irq()
3383 i40e_irq_dynamic_enable(vsi, i); in i40e_vsi_enable_irq()
3441 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_intr() local
3442 struct i40e_q_vector *q_vector = vsi->q_vectors[0]; in i40e_intr()
3546 struct i40e_vsi *vsi = tx_ring->vsi; in i40e_clean_fdir_tx_irq() local
3616 if (vsi->back->flags & I40E_FLAG_MSIX_ENABLED) in i40e_clean_fdir_tx_irq()
3617 i40e_irq_dynamic_enable(vsi, tx_ring->q_vector->v_idx); in i40e_clean_fdir_tx_irq()
3630 struct i40e_vsi *vsi; in i40e_fdir_clean_ring() local
3635 vsi = q_vector->tx.ring->vsi; in i40e_fdir_clean_ring()
3636 i40e_clean_fdir_tx_irq(q_vector->tx.ring, vsi->work_limit); in i40e_fdir_clean_ring()
3647 static void i40e_map_vector_to_qp(struct i40e_vsi *vsi, int v_idx, int qp_idx) in i40e_map_vector_to_qp() argument
3649 struct i40e_q_vector *q_vector = vsi->q_vectors[v_idx]; in i40e_map_vector_to_qp()
3650 struct i40e_ring *tx_ring = vsi->tx_rings[qp_idx]; in i40e_map_vector_to_qp()
3651 struct i40e_ring *rx_ring = vsi->rx_rings[qp_idx]; in i40e_map_vector_to_qp()
3673 static void i40e_vsi_map_rings_to_vectors(struct i40e_vsi *vsi) in i40e_vsi_map_rings_to_vectors() argument
3675 int qp_remaining = vsi->num_queue_pairs; in i40e_vsi_map_rings_to_vectors()
3676 int q_vectors = vsi->num_q_vectors; in i40e_vsi_map_rings_to_vectors()
3689 struct i40e_q_vector *q_vector = vsi->q_vectors[v_start]; in i40e_vsi_map_rings_to_vectors()
3701 i40e_map_vector_to_qp(vsi, v_start, qp_idx); in i40e_vsi_map_rings_to_vectors()
3713 static int i40e_vsi_request_irq(struct i40e_vsi *vsi, char *basename) in i40e_vsi_request_irq() argument
3715 struct i40e_pf *pf = vsi->back; in i40e_vsi_request_irq()
3719 err = i40e_vsi_request_irq_msix(vsi, basename); in i40e_vsi_request_irq()
3748 struct i40e_vsi *vsi = np->vsi; in i40e_netpoll() local
3749 struct i40e_pf *pf = vsi->back; in i40e_netpoll()
3753 if (test_bit(__I40E_DOWN, &vsi->state)) in i40e_netpoll()
3757 for (i = 0; i < vsi->num_q_vectors; i++) in i40e_netpoll()
3758 i40e_msix_clean_rings(0, vsi->q_vectors[i]); in i40e_netpoll()
3799 static int i40e_vsi_control_tx(struct i40e_vsi *vsi, bool enable) in i40e_vsi_control_tx() argument
3801 struct i40e_pf *pf = vsi->back; in i40e_vsi_control_tx()
3806 pf_q = vsi->base_queue; in i40e_vsi_control_tx()
3807 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_control_tx()
3843 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_vsi_control_tx()
3887 static int i40e_vsi_control_rx(struct i40e_vsi *vsi, bool enable) in i40e_vsi_control_rx() argument
3889 struct i40e_pf *pf = vsi->back; in i40e_vsi_control_rx()
3894 pf_q = vsi->base_queue; in i40e_vsi_control_rx()
3895 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_control_rx()
3920 vsi->seid, pf_q, (enable ? "en" : "dis")); in i40e_vsi_control_rx()
3933 int i40e_vsi_control_rings(struct i40e_vsi *vsi, bool request) in i40e_vsi_control_rings() argument
3939 ret = i40e_vsi_control_rx(vsi, request); in i40e_vsi_control_rings()
3942 ret = i40e_vsi_control_tx(vsi, request); in i40e_vsi_control_rings()
3945 i40e_vsi_control_tx(vsi, request); in i40e_vsi_control_rings()
3946 i40e_vsi_control_rx(vsi, request); in i40e_vsi_control_rings()
3956 static void i40e_vsi_free_irq(struct i40e_vsi *vsi) in i40e_vsi_free_irq() argument
3958 struct i40e_pf *pf = vsi->back; in i40e_vsi_free_irq()
3960 int base = vsi->base_vector; in i40e_vsi_free_irq()
3965 if (!vsi->q_vectors) in i40e_vsi_free_irq()
3968 if (!vsi->irqs_ready) in i40e_vsi_free_irq()
3971 vsi->irqs_ready = false; in i40e_vsi_free_irq()
3972 for (i = 0; i < vsi->num_q_vectors; i++) { in i40e_vsi_free_irq()
3976 if (!vsi->q_vectors[i] || in i40e_vsi_free_irq()
3977 !vsi->q_vectors[i]->num_ringpairs) in i40e_vsi_free_irq()
3984 vsi->q_vectors[i]); in i40e_vsi_free_irq()
4076 static void i40e_free_q_vector(struct i40e_vsi *vsi, int v_idx) in i40e_free_q_vector() argument
4078 struct i40e_q_vector *q_vector = vsi->q_vectors[v_idx]; in i40e_free_q_vector()
4092 if (vsi->netdev) in i40e_free_q_vector()
4095 vsi->q_vectors[v_idx] = NULL; in i40e_free_q_vector()
4107 static void i40e_vsi_free_q_vectors(struct i40e_vsi *vsi) in i40e_vsi_free_q_vectors() argument
4111 for (v_idx = 0; v_idx < vsi->num_q_vectors; v_idx++) in i40e_vsi_free_q_vectors()
4112 i40e_free_q_vector(vsi, v_idx); in i40e_vsi_free_q_vectors()
4153 if (pf->vsi[i]) in i40e_clear_interrupt_scheme()
4154 i40e_vsi_free_q_vectors(pf->vsi[i]); in i40e_clear_interrupt_scheme()
4162 static void i40e_napi_enable_all(struct i40e_vsi *vsi) in i40e_napi_enable_all() argument
4166 if (!vsi->netdev) in i40e_napi_enable_all()
4169 for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) in i40e_napi_enable_all()
4170 napi_enable(&vsi->q_vectors[q_idx]->napi); in i40e_napi_enable_all()
4177 static void i40e_napi_disable_all(struct i40e_vsi *vsi) in i40e_napi_disable_all() argument
4181 if (!vsi->netdev) in i40e_napi_disable_all()
4184 for (q_idx = 0; q_idx < vsi->num_q_vectors; q_idx++) in i40e_napi_disable_all()
4185 napi_disable(&vsi->q_vectors[q_idx]->napi); in i40e_napi_disable_all()
4192 static void i40e_vsi_close(struct i40e_vsi *vsi) in i40e_vsi_close() argument
4194 if (!test_and_set_bit(__I40E_DOWN, &vsi->state)) in i40e_vsi_close()
4195 i40e_down(vsi); in i40e_vsi_close()
4196 i40e_vsi_free_irq(vsi); in i40e_vsi_close()
4197 i40e_vsi_free_tx_resources(vsi); in i40e_vsi_close()
4198 i40e_vsi_free_rx_resources(vsi); in i40e_vsi_close()
4199 vsi->current_netdev_flags = 0; in i40e_vsi_close()
4206 static void i40e_quiesce_vsi(struct i40e_vsi *vsi) in i40e_quiesce_vsi() argument
4208 if (test_bit(__I40E_DOWN, &vsi->state)) in i40e_quiesce_vsi()
4212 if ((test_bit(__I40E_PORT_TX_SUSPENDED, &vsi->back->state)) && in i40e_quiesce_vsi()
4213 vsi->type == I40E_VSI_FCOE) { in i40e_quiesce_vsi()
4214 dev_dbg(&vsi->back->pdev->dev, in i40e_quiesce_vsi()
4215 "VSI seid %d skipping FCoE VSI disable\n", vsi->seid); in i40e_quiesce_vsi()
4219 set_bit(__I40E_NEEDS_RESTART, &vsi->state); in i40e_quiesce_vsi()
4220 if (vsi->netdev && netif_running(vsi->netdev)) in i40e_quiesce_vsi()
4221 vsi->netdev->netdev_ops->ndo_stop(vsi->netdev); in i40e_quiesce_vsi()
4223 i40e_vsi_close(vsi); in i40e_quiesce_vsi()
4230 static void i40e_unquiesce_vsi(struct i40e_vsi *vsi) in i40e_unquiesce_vsi() argument
4232 if (!test_bit(__I40E_NEEDS_RESTART, &vsi->state)) in i40e_unquiesce_vsi()
4235 clear_bit(__I40E_NEEDS_RESTART, &vsi->state); in i40e_unquiesce_vsi()
4236 if (vsi->netdev && netif_running(vsi->netdev)) in i40e_unquiesce_vsi()
4237 vsi->netdev->netdev_ops->ndo_open(vsi->netdev); in i40e_unquiesce_vsi()
4239 i40e_vsi_open(vsi); /* this clears the DOWN bit */ in i40e_unquiesce_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()
4265 if (pf->vsi[v]) in i40e_pf_unquiesce_all_vsi()
4266 i40e_unquiesce_vsi(pf->vsi[v]); in i40e_pf_unquiesce_all_vsi()
4277 static int i40e_vsi_wait_txq_disabled(struct i40e_vsi *vsi) in i40e_vsi_wait_txq_disabled() argument
4279 struct i40e_pf *pf = vsi->back; in i40e_vsi_wait_txq_disabled()
4282 pf_q = vsi->base_queue; in i40e_vsi_wait_txq_disabled()
4283 for (i = 0; i < vsi->num_queue_pairs; i++, pf_q++) { in i40e_vsi_wait_txq_disabled()
4289 vsi->seid, pf_q); in i40e_vsi_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()
4333 static void i40e_detect_recover_hung_queue(int q_idx, struct i40e_vsi *vsi) in i40e_detect_recover_hung_queue() argument
4340 pf = vsi->back; in i40e_detect_recover_hung_queue()
4343 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_detect_recover_hung_queue()
4344 if (vsi->tx_rings[i] && vsi->tx_rings[i]->desc) { in i40e_detect_recover_hung_queue()
4345 if (q_idx == vsi->tx_rings[i]->queue_index) { in i40e_detect_recover_hung_queue()
4346 tx_ring = vsi->tx_rings[i]; in i40e_detect_recover_hung_queue()
4359 tx_ring->vsi->base_vector - 1)); in i40e_detect_recover_hung_queue()
4373 i40e_force_wb(vsi, tx_ring->q_vector); in i40e_detect_recover_hung_queue()
4387 struct i40e_vsi *vsi; in i40e_detect_recover_hung() local
4391 vsi = pf->vsi[pf->lan_vsi]; in i40e_detect_recover_hung()
4393 if (!vsi) in i40e_detect_recover_hung()
4397 if (test_bit(__I40E_DOWN, &vsi->back->state) || in i40e_detect_recover_hung()
4398 test_bit(__I40E_RESET_RECOVERY_PENDING, &vsi->back->state)) in i40e_detect_recover_hung()
4402 if (vsi->type != I40E_VSI_MAIN) in i40e_detect_recover_hung()
4405 netdev = vsi->netdev; in i40e_detect_recover_hung()
4419 i40e_detect_recover_hung_queue(i, vsi); in i40e_detect_recover_hung()
4586 static int i40e_vsi_get_bw_info(struct i40e_vsi *vsi) in i40e_vsi_get_bw_info() argument
4590 struct i40e_pf *pf = vsi->back; in i40e_vsi_get_bw_info()
4597 ret = i40e_aq_query_vsi_bw_config(hw, vsi->seid, &bw_config, NULL); in i40e_vsi_get_bw_info()
4607 ret = i40e_aq_query_vsi_ets_sla_config(hw, vsi->seid, &bw_ets_config, in i40e_vsi_get_bw_info()
4625 vsi->bw_limit = le16_to_cpu(bw_config.port_bw_limit); in i40e_vsi_get_bw_info()
4626 vsi->bw_max_quanta = bw_config.max_bw; in i40e_vsi_get_bw_info()
4630 vsi->bw_ets_share_credits[i] = bw_ets_config.share_credits[i]; in i40e_vsi_get_bw_info()
4631 vsi->bw_ets_limit_credits[i] = in i40e_vsi_get_bw_info()
4634 vsi->bw_ets_max_quanta[i] = (u8)((tc_bw_max >> (i*4)) & 0x7); in i40e_vsi_get_bw_info()
4648 static int i40e_vsi_configure_bw_alloc(struct i40e_vsi *vsi, u8 enabled_tc, in i40e_vsi_configure_bw_alloc() argument
4659 ret = i40e_aq_config_vsi_tc_bw(&vsi->back->hw, vsi->seid, &bw_data, in i40e_vsi_configure_bw_alloc()
4662 dev_info(&vsi->back->pdev->dev, in i40e_vsi_configure_bw_alloc()
4664 vsi->back->hw.aq.asq_last_status); in i40e_vsi_configure_bw_alloc()
4669 vsi->info.qs_handle[i] = bw_data.qs_handles[i]; in i40e_vsi_configure_bw_alloc()
4680 static void i40e_vsi_config_netdev_tc(struct i40e_vsi *vsi, u8 enabled_tc) in i40e_vsi_config_netdev_tc() argument
4682 struct net_device *netdev = vsi->netdev; in i40e_vsi_config_netdev_tc()
4683 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_netdev_tc()
4698 if (netdev_set_num_tc(netdev, vsi->tc_config.numtc)) in i40e_vsi_config_netdev_tc()
4710 if (vsi->tc_config.enabled_tc & BIT_ULL(i)) in i40e_vsi_config_netdev_tc()
4712 vsi->tc_config.tc_info[i].netdev_tc, in i40e_vsi_config_netdev_tc()
4713 vsi->tc_config.tc_info[i].qcount, in i40e_vsi_config_netdev_tc()
4714 vsi->tc_config.tc_info[i].qoffset); in i40e_vsi_config_netdev_tc()
4722 netdev_tc = vsi->tc_config.tc_info[ets_tc].netdev_tc; in i40e_vsi_config_netdev_tc()
4732 static void i40e_vsi_update_queue_map(struct i40e_vsi *vsi, in i40e_vsi_update_queue_map() argument
4739 vsi->info.mapping_flags = ctxt->info.mapping_flags; in i40e_vsi_update_queue_map()
4740 memcpy(&vsi->info.queue_mapping, in i40e_vsi_update_queue_map()
4741 &ctxt->info.queue_mapping, sizeof(vsi->info.queue_mapping)); in i40e_vsi_update_queue_map()
4742 memcpy(&vsi->info.tc_mapping, ctxt->info.tc_mapping, in i40e_vsi_update_queue_map()
4743 sizeof(vsi->info.tc_mapping)); in i40e_vsi_update_queue_map()
4759 static int i40e_vsi_config_tc(struct i40e_vsi *vsi, u8 enabled_tc) in i40e_vsi_config_tc() argument
4767 if (vsi->tc_config.enabled_tc == enabled_tc) in i40e_vsi_config_tc()
4776 ret = i40e_vsi_configure_bw_alloc(vsi, enabled_tc, bw_share); in i40e_vsi_config_tc()
4778 dev_info(&vsi->back->pdev->dev, in i40e_vsi_config_tc()
4780 enabled_tc, vsi->seid); in i40e_vsi_config_tc()
4785 ctxt.seid = vsi->seid; in i40e_vsi_config_tc()
4786 ctxt.pf_num = vsi->back->hw.pf_id; in i40e_vsi_config_tc()
4788 ctxt.uplink_seid = vsi->uplink_seid; in i40e_vsi_config_tc()
4789 ctxt.info = vsi->info; in i40e_vsi_config_tc()
4790 i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, false); in i40e_vsi_config_tc()
4793 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_vsi_config_tc()
4795 dev_info(&vsi->back->pdev->dev, in i40e_vsi_config_tc()
4797 i40e_stat_str(&vsi->back->hw, ret), in i40e_vsi_config_tc()
4798 i40e_aq_str(&vsi->back->hw, in i40e_vsi_config_tc()
4799 vsi->back->hw.aq.asq_last_status)); in i40e_vsi_config_tc()
4803 i40e_vsi_update_queue_map(vsi, &ctxt); in i40e_vsi_config_tc()
4804 vsi->info.valid_sections = 0; in i40e_vsi_config_tc()
4807 ret = i40e_vsi_get_bw_info(vsi); in i40e_vsi_config_tc()
4809 dev_info(&vsi->back->pdev->dev, in i40e_vsi_config_tc()
4811 i40e_stat_str(&vsi->back->hw, ret), in i40e_vsi_config_tc()
4812 i40e_aq_str(&vsi->back->hw, in i40e_vsi_config_tc()
4813 vsi->back->hw.aq.asq_last_status)); in i40e_vsi_config_tc()
4818 i40e_vsi_config_netdev_tc(vsi, enabled_tc); in i40e_vsi_config_tc()
4904 if (!pf->vsi[v]) in i40e_dcb_reconfigure()
4919 if (pf->vsi[v]->type == I40E_VSI_FCOE) in i40e_dcb_reconfigure()
4923 ret = i40e_vsi_config_tc(pf->vsi[v], tc_map); 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()
5022 void i40e_print_link_message(struct i40e_vsi *vsi, bool isup) in i40e_print_link_message() argument
5027 if (vsi->current_isup == isup) in i40e_print_link_message()
5029 vsi->current_isup = isup; in i40e_print_link_message()
5031 netdev_info(vsi->netdev, "NIC Link is Down\n"); in i40e_print_link_message()
5038 if (vsi->back->hw.func_caps.npar_enable && in i40e_print_link_message()
5039 (vsi->back->hw.phy.link_info.link_speed == I40E_LINK_SPEED_1GB || in i40e_print_link_message()
5040 vsi->back->hw.phy.link_info.link_speed == I40E_LINK_SPEED_100MB)) in i40e_print_link_message()
5041 netdev_warn(vsi->netdev, in i40e_print_link_message()
5044 switch (vsi->back->hw.phy.link_info.link_speed) { in i40e_print_link_message()
5064 switch (vsi->back->hw.fc.current_mode) { in i40e_print_link_message()
5079 netdev_info(vsi->netdev, "NIC Link is Up %sbps Full Duplex, Flow Control: %s\n", in i40e_print_link_message()
5087 static int i40e_up_complete(struct i40e_vsi *vsi) in i40e_up_complete() argument
5089 struct i40e_pf *pf = vsi->back; in i40e_up_complete()
5093 i40e_vsi_configure_msix(vsi); in i40e_up_complete()
5095 i40e_configure_msi_and_legacy(vsi); in i40e_up_complete()
5098 err = i40e_vsi_control_rings(vsi, true); in i40e_up_complete()
5102 clear_bit(__I40E_DOWN, &vsi->state); in i40e_up_complete()
5103 i40e_napi_enable_all(vsi); in i40e_up_complete()
5104 i40e_vsi_enable_irq(vsi); in i40e_up_complete()
5107 (vsi->netdev)) { in i40e_up_complete()
5108 i40e_print_link_message(vsi, true); in i40e_up_complete()
5109 netif_tx_start_all_queues(vsi->netdev); in i40e_up_complete()
5110 netif_carrier_on(vsi->netdev); in i40e_up_complete()
5111 } else if (vsi->netdev) { in i40e_up_complete()
5112 i40e_print_link_message(vsi, false); in i40e_up_complete()
5118 netdev_err(vsi->netdev, in i40e_up_complete()
5123 if (vsi->type == I40E_VSI_FDIR) { in i40e_up_complete()
5132 i40e_fdir_filter_restore(vsi); in i40e_up_complete()
5146 static void i40e_vsi_reinit_locked(struct i40e_vsi *vsi) in i40e_vsi_reinit_locked() argument
5148 struct i40e_pf *pf = vsi->back; in i40e_vsi_reinit_locked()
5153 i40e_down(vsi); in i40e_vsi_reinit_locked()
5159 if (vsi->type == I40E_VSI_SRIOV) in i40e_vsi_reinit_locked()
5161 i40e_up(vsi); in i40e_vsi_reinit_locked()
5169 int i40e_up(struct i40e_vsi *vsi) in i40e_up() argument
5173 err = i40e_vsi_configure(vsi); in i40e_up()
5175 err = i40e_up_complete(vsi); in i40e_up()
5184 void i40e_down(struct i40e_vsi *vsi) in i40e_down() argument
5191 if (vsi->netdev) { in i40e_down()
5192 netif_carrier_off(vsi->netdev); in i40e_down()
5193 netif_tx_disable(vsi->netdev); in i40e_down()
5195 i40e_vsi_disable_irq(vsi); in i40e_down()
5196 i40e_vsi_control_rings(vsi, false); in i40e_down()
5197 i40e_napi_disable_all(vsi); in i40e_down()
5199 for (i = 0; i < vsi->num_queue_pairs; i++) { in i40e_down()
5200 i40e_clean_tx_ring(vsi->tx_rings[i]); in i40e_down()
5201 i40e_clean_rx_ring(vsi->rx_rings[i]); in i40e_down()
5217 struct i40e_vsi *vsi = np->vsi; in i40e_setup_tc() local
5218 struct i40e_pf *pf = vsi->back; in i40e_setup_tc()
5246 if (enabled_tc == vsi->tc_config.enabled_tc) in i40e_setup_tc()
5250 i40e_quiesce_vsi(vsi); in i40e_setup_tc()
5253 ret = i40e_vsi_config_tc(vsi, enabled_tc); in i40e_setup_tc()
5256 vsi->seid); in i40e_setup_tc()
5261 i40e_unquiesce_vsi(vsi); in i40e_setup_tc()
5282 struct i40e_vsi *vsi = np->vsi; in i40e_open() local
5283 struct i40e_pf *pf = vsi->back; in i40e_open()
5293 err = i40e_vsi_open(vsi); in i40e_open()
5320 int i40e_vsi_open(struct i40e_vsi *vsi) in i40e_vsi_open() argument
5322 struct i40e_pf *pf = vsi->back; in i40e_vsi_open()
5327 err = i40e_vsi_setup_tx_resources(vsi); in i40e_vsi_open()
5330 err = i40e_vsi_setup_rx_resources(vsi); in i40e_vsi_open()
5334 err = i40e_vsi_configure(vsi); in i40e_vsi_open()
5338 if (vsi->netdev) { in i40e_vsi_open()
5340 dev_driver_string(&pf->pdev->dev), vsi->netdev->name); in i40e_vsi_open()
5341 err = i40e_vsi_request_irq(vsi, int_name); in i40e_vsi_open()
5346 err = netif_set_real_num_tx_queues(vsi->netdev, in i40e_vsi_open()
5347 vsi->num_queue_pairs); in i40e_vsi_open()
5351 err = netif_set_real_num_rx_queues(vsi->netdev, in i40e_vsi_open()
5352 vsi->num_queue_pairs); in i40e_vsi_open()
5356 } else if (vsi->type == I40E_VSI_FDIR) { in i40e_vsi_open()
5360 err = i40e_vsi_request_irq(vsi, int_name); in i40e_vsi_open()
5367 err = i40e_up_complete(vsi); in i40e_vsi_open()
5374 i40e_down(vsi); in i40e_vsi_open()
5376 i40e_vsi_free_irq(vsi); in i40e_vsi_open()
5378 i40e_vsi_free_rx_resources(vsi); in i40e_vsi_open()
5380 i40e_vsi_free_tx_resources(vsi); in i40e_vsi_open()
5381 if (vsi == pf->vsi[pf->lan_vsi]) in i40e_vsi_open()
5424 struct i40e_vsi *vsi = np->vsi; in i40e_close() local
5426 i40e_vsi_close(vsi); in i40e_close()
5497 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_do_reset() local
5499 if (vsi != NULL && in i40e_do_reset()
5500 test_bit(__I40E_REINIT_REQUESTED, &vsi->state)) { in i40e_do_reset()
5501 i40e_vsi_reinit_locked(pf->vsi[v]); in i40e_do_reset()
5502 clear_bit(__I40E_REINIT_REQUESTED, &vsi->state); in i40e_do_reset()
5511 struct i40e_vsi *vsi = pf->vsi[v]; in i40e_do_reset() local
5513 if (vsi != NULL && in i40e_do_reset()
5514 test_bit(__I40E_DOWN_REQUESTED, &vsi->state)) { in i40e_do_reset()
5515 set_bit(__I40E_DOWN, &vsi->state); in i40e_do_reset()
5516 i40e_down(vsi); in i40e_do_reset()
5517 clear_bit(__I40E_DOWN_REQUESTED, &vsi->state); in i40e_do_reset()
5896 i40e_fdir_filter_restore(pf->vsi[pf->lan_vsi]); in i40e_fdir_flush_and_replay()
5948 static void i40e_vsi_link_event(struct i40e_vsi *vsi, bool link_up) in i40e_vsi_link_event() argument
5950 if (!vsi || test_bit(__I40E_DOWN, &vsi->state)) in i40e_vsi_link_event()
5953 switch (vsi->type) { in i40e_vsi_link_event()
5958 if (!vsi->netdev || !vsi->netdev_registered) in i40e_vsi_link_event()
5962 netif_carrier_on(vsi->netdev); in i40e_vsi_link_event()
5963 netif_tx_wake_all_queues(vsi->netdev); in i40e_vsi_link_event()
5965 netif_carrier_off(vsi->netdev); in i40e_vsi_link_event()
5966 netif_tx_stop_all_queues(vsi->netdev); in i40e_vsi_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()
6011 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_link_event() local
6033 (test_bit(__I40E_DOWN, &vsi->state) || in i40e_link_event()
6034 new_link == netif_carrier_ok(vsi->netdev))) in i40e_link_event()
6037 if (!test_bit(__I40E_DOWN, &vsi->state)) in i40e_link_event()
6038 i40e_print_link_message(vsi, new_link); in i40e_link_event()
6046 i40e_vsi_link_event(vsi, new_link); in i40e_link_event()
6081 if (pf->vsi[i] && pf->vsi[i]->netdev) in i40e_watchdog_subtask()
6082 i40e_update_stats(pf->vsi[i]); in i40e_watchdog_subtask()
6091 i40e_ptp_rx_hang(pf->vsi[pf->lan_vsi]); in i40e_watchdog_subtask()
6324 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_enable_pf_switch_lb() local
6343 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_enable_pf_switch_lb()
6360 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_disable_pf_switch_lb() local
6379 ret = i40e_aq_update_vsi_params(&vsi->back->hw, &ctxt, NULL); in i40e_disable_pf_switch_lb()
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()
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()
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() local
6470 vsi->uplink_seid = veb->seid; in i40e_reconstitute_veb()
6471 ret = i40e_add_vsi(vsi); in i40e_reconstitute_veb()
6478 i40e_vsi_reset_stats(vsi); in i40e_reconstitute_veb()
6557 static int i40e_vsi_clear(struct i40e_vsi *vsi);
6565 struct i40e_vsi *vsi; in i40e_fdir_sb_setup() local
6586 vsi = NULL; 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()
6595 if (!vsi) { 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()
6598 if (!vsi) { in i40e_fdir_sb_setup()
6605 i40e_vsi_setup_irqhandler(vsi, i40e_fdir_clean_ring); in i40e_fdir_sb_setup()
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()
6647 if (pf->vsi[v]) in i40e_prep_for_reset()
6648 pf->vsi[v]->seid = 0; in i40e_prep_for_reset()
6779 if (pf->vsi[pf->lan_vsi]->uplink_seid != pf->mac_seid) { in i40e_reset_and_rebuild()
6803 pf->vsi[pf->lan_vsi]->uplink_seid in i40e_reset_and_rebuild()
6815 if (pf->vsi[pf->lan_vsi]->uplink_seid == pf->mac_seid) { in i40e_reset_and_rebuild()
6818 ret = i40e_add_vsi(pf->vsi[pf->lan_vsi]); in i40e_reset_and_rebuild()
7089 static int i40e_set_num_rings_in_vsi(struct i40e_vsi *vsi) in i40e_set_num_rings_in_vsi() argument
7091 struct i40e_pf *pf = vsi->back; in i40e_set_num_rings_in_vsi()
7093 switch (vsi->type) { in i40e_set_num_rings_in_vsi()
7095 vsi->alloc_queue_pairs = pf->num_lan_qps; in i40e_set_num_rings_in_vsi()
7096 vsi->num_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
7099 vsi->num_q_vectors = pf->num_lan_msix; in i40e_set_num_rings_in_vsi()
7101 vsi->num_q_vectors = 1; in i40e_set_num_rings_in_vsi()
7106 vsi->alloc_queue_pairs = 1; in i40e_set_num_rings_in_vsi()
7107 vsi->num_desc = ALIGN(I40E_FDIR_RING_COUNT, in i40e_set_num_rings_in_vsi()
7109 vsi->num_q_vectors = 1; in i40e_set_num_rings_in_vsi()
7113 vsi->alloc_queue_pairs = pf->num_vmdq_qps; in i40e_set_num_rings_in_vsi()
7114 vsi->num_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, 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()
7121 vsi->num_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
7127 vsi->alloc_queue_pairs = pf->num_fcoe_qps; in i40e_set_num_rings_in_vsi()
7128 vsi->num_desc = ALIGN(I40E_DEFAULT_NUM_DESCRIPTORS, in i40e_set_num_rings_in_vsi()
7130 vsi->num_q_vectors = pf->num_fcoe_msix; in i40e_set_num_rings_in_vsi()
7150 static int i40e_vsi_alloc_arrays(struct i40e_vsi *vsi, bool alloc_qvectors) in i40e_vsi_alloc_arrays() argument
7156 size = sizeof(struct i40e_ring *) * vsi->alloc_queue_pairs * 2; in i40e_vsi_alloc_arrays()
7157 vsi->tx_rings = kzalloc(size, GFP_KERNEL); in i40e_vsi_alloc_arrays()
7158 if (!vsi->tx_rings) in i40e_vsi_alloc_arrays()
7160 vsi->rx_rings = &vsi->tx_rings[vsi->alloc_queue_pairs]; in i40e_vsi_alloc_arrays()
7164 size = sizeof(struct i40e_q_vector *) * vsi->num_q_vectors; in i40e_vsi_alloc_arrays()
7165 vsi->q_vectors = kzalloc(size, GFP_KERNEL); in i40e_vsi_alloc_arrays()
7166 if (!vsi->q_vectors) { in i40e_vsi_alloc_arrays()
7174 kfree(vsi->tx_rings); in i40e_vsi_alloc_arrays()
7189 struct i40e_vsi *vsi; in i40e_vsi_mem_alloc() local
7203 while (i < pf->num_alloc_vsi && pf->vsi[i]) 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()
7219 vsi = kzalloc(sizeof(*vsi), GFP_KERNEL); in i40e_vsi_mem_alloc()
7220 if (!vsi) { in i40e_vsi_mem_alloc()
7224 vsi->type = type; in i40e_vsi_mem_alloc()
7225 vsi->back = pf; in i40e_vsi_mem_alloc()
7226 set_bit(__I40E_DOWN, &vsi->state); in i40e_vsi_mem_alloc()
7227 vsi->flags = 0; in i40e_vsi_mem_alloc()
7228 vsi->idx = vsi_idx; 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()
7231 vsi->int_rate_limit = 0; in i40e_vsi_mem_alloc()
7232 vsi->rss_table_size = (vsi->type == I40E_VSI_MAIN) ? in i40e_vsi_mem_alloc()
7234 vsi->netdev_registered = false; in i40e_vsi_mem_alloc()
7235 vsi->work_limit = I40E_DEFAULT_IRQ_WORK; in i40e_vsi_mem_alloc()
7236 INIT_LIST_HEAD(&vsi->mac_filter_list); in i40e_vsi_mem_alloc()
7237 vsi->irqs_ready = false; in i40e_vsi_mem_alloc()
7239 ret = i40e_set_num_rings_in_vsi(vsi); in i40e_vsi_mem_alloc()
7243 ret = i40e_vsi_alloc_arrays(vsi, true); in i40e_vsi_mem_alloc()
7248 i40e_vsi_setup_irqhandler(vsi, i40e_msix_clean_rings); in i40e_vsi_mem_alloc()
7251 spin_lock_init(&vsi->mac_filter_list_lock); in i40e_vsi_mem_alloc()
7252 pf->vsi[vsi_idx] = vsi; in i40e_vsi_mem_alloc()
7258 kfree(vsi); in i40e_vsi_mem_alloc()
7272 static void i40e_vsi_free_arrays(struct i40e_vsi *vsi, bool free_qvectors) in i40e_vsi_free_arrays() argument
7276 kfree(vsi->q_vectors); in i40e_vsi_free_arrays()
7277 vsi->q_vectors = NULL; in i40e_vsi_free_arrays()
7279 kfree(vsi->tx_rings); in i40e_vsi_free_arrays()
7280 vsi->tx_rings = NULL; in i40e_vsi_free_arrays()
7281 vsi->rx_rings = NULL; in i40e_vsi_free_arrays()
7288 static int i40e_vsi_clear(struct i40e_vsi *vsi) in i40e_vsi_clear() argument
7292 if (!vsi) in i40e_vsi_clear()
7295 if (!vsi->back) in i40e_vsi_clear()
7297 pf = vsi->back; in i40e_vsi_clear()
7300 if (!pf->vsi[vsi->idx]) { in i40e_vsi_clear()
7302 vsi->idx, vsi->idx, vsi, vsi->type); in i40e_vsi_clear()
7306 if (pf->vsi[vsi->idx] != vsi) { 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()
7312 vsi->idx, vsi, vsi->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()
7320 i40e_vsi_free_arrays(vsi, true); 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()
7329 kfree(vsi); in i40e_vsi_clear()
7338 static void i40e_vsi_clear_rings(struct i40e_vsi *vsi) in i40e_vsi_clear_rings() argument
7342 if (vsi->tx_rings && vsi->tx_rings[0]) { in i40e_vsi_clear_rings()
7343 for (i = 0; i < vsi->alloc_queue_pairs; i++) { in i40e_vsi_clear_rings()
7344 kfree_rcu(vsi->tx_rings[i], rcu); in i40e_vsi_clear_rings()
7345 vsi->tx_rings[i] = NULL; in i40e_vsi_clear_rings()
7346 vsi->rx_rings[i] = NULL; in i40e_vsi_clear_rings()
7355 static int i40e_alloc_rings(struct i40e_vsi *vsi) in i40e_alloc_rings() argument
7358 struct i40e_pf *pf = vsi->back; in i40e_alloc_rings()
7362 for (i = 0; i < vsi->alloc_queue_pairs; i++) { in i40e_alloc_rings()
7369 tx_ring->reg_idx = vsi->base_queue + i; in i40e_alloc_rings()
7371 tx_ring->vsi = vsi; in i40e_alloc_rings()
7372 tx_ring->netdev = vsi->netdev; in i40e_alloc_rings()
7374 tx_ring->count = vsi->num_desc; in i40e_alloc_rings()
7377 if (vsi->back->flags & I40E_FLAG_WB_ON_ITR_CAPABLE) in i40e_alloc_rings()
7379 if (vsi->back->flags & I40E_FLAG_OUTER_UDP_CSUM_CAPABLE) in i40e_alloc_rings()
7381 vsi->tx_rings[i] = tx_ring; in i40e_alloc_rings()
7385 rx_ring->reg_idx = vsi->base_queue + i; in i40e_alloc_rings()
7387 rx_ring->vsi = vsi; in i40e_alloc_rings()
7388 rx_ring->netdev = vsi->netdev; in i40e_alloc_rings()
7390 rx_ring->count = vsi->num_desc; in i40e_alloc_rings()
7397 vsi->rx_rings[i] = rx_ring; in i40e_alloc_rings()
7403 i40e_vsi_clear_rings(vsi); in i40e_alloc_rings()
7618 static int i40e_vsi_alloc_q_vector(struct i40e_vsi *vsi, int v_idx) in i40e_vsi_alloc_q_vector() argument
7627 q_vector->vsi = vsi; in i40e_vsi_alloc_q_vector()
7630 if (vsi->netdev) in i40e_vsi_alloc_q_vector()
7631 netif_napi_add(vsi->netdev, &q_vector->napi, in i40e_vsi_alloc_q_vector()
7638 vsi->q_vectors[v_idx] = q_vector; in i40e_vsi_alloc_q_vector()
7650 static int i40e_vsi_alloc_q_vectors(struct i40e_vsi *vsi) in i40e_vsi_alloc_q_vectors() argument
7652 struct i40e_pf *pf = vsi->back; in i40e_vsi_alloc_q_vectors()
7658 num_q_vectors = vsi->num_q_vectors; in i40e_vsi_alloc_q_vectors()
7659 else if (vsi == pf->vsi[pf->lan_vsi]) in i40e_vsi_alloc_q_vectors()
7665 err = i40e_vsi_alloc_q_vector(vsi, v_idx); in i40e_vsi_alloc_q_vectors()
7674 i40e_free_q_vector(vsi, v_idx); in i40e_vsi_alloc_q_vectors()
7783 static int i40e_config_rss_aq(struct i40e_vsi *vsi, const u8 *seed) in i40e_config_rss_aq() argument
7786 struct i40e_pf *pf = vsi->back; in i40e_config_rss_aq()
7800 for (i = 0; i < vsi->rss_table_size; i++) in i40e_config_rss_aq()
7801 rss_lut[i] = i % vsi->rss_size; in i40e_config_rss_aq()
7803 ret = i40e_aq_set_rss_key(hw, vsi->id, &rss_key); in i40e_config_rss_aq()
7812 if (vsi->type == I40E_VSI_MAIN) in i40e_config_rss_aq()
7815 ret = i40e_aq_set_rss_lut(hw, vsi->id, pf_lut, rss_lut, in i40e_config_rss_aq()
7816 vsi->rss_table_size); in i40e_config_rss_aq()
7832 static int i40e_vsi_config_rss(struct i40e_vsi *vsi) in i40e_vsi_config_rss() argument
7835 struct i40e_pf *pf = vsi->back; in i40e_vsi_config_rss()
7838 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs); in i40e_vsi_config_rss()
7841 return i40e_config_rss_aq(vsi, seed); in i40e_vsi_config_rss()
7853 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_config_rss_reg() local
7867 if (current_queue == vsi->rss_size) in i40e_config_rss_reg()
7885 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_config_rss() local
7901 vsi->rss_size = min_t(int, pf->rss_size, vsi->num_queue_pairs); in i40e_config_rss()
7911 return i40e_config_rss_aq(pf->vsi[pf->lan_vsi], seed); in i40e_config_rss()
7926 struct i40e_vsi *vsi = pf->vsi[pf->lan_vsi]; in i40e_reconfig_rss_queues() local
7934 if (queue_count != vsi->num_queue_pairs) { in i40e_reconfig_rss_queues()
7935 vsi->req_queue_pairs = queue_count; in i40e_reconfig_rss_queues()
8261 struct i40e_vsi *vsi = np->vsi; in i40e_set_features() local
8262 struct i40e_pf *pf = vsi->back; in i40e_set_features()
8266 i40e_vlan_stripping_enable(vsi); in i40e_set_features()
8268 i40e_vlan_stripping_disable(vsi); in i40e_set_features()
8308 struct i40e_vsi *vsi = np->vsi; in i40e_add_vxlan_port() local
8309 struct i40e_pf *pf = vsi->back; in i40e_add_vxlan_port()
8350 struct i40e_vsi *vsi = np->vsi; in i40e_del_vxlan_port() local
8351 struct i40e_pf *pf = vsi->back; in i40e_del_vxlan_port()
8378 struct i40e_pf *pf = np->vsi->back; in i40e_get_phys_port_id()
8404 struct i40e_pf *pf = np->vsi->back; in i40e_ndo_fdb_add()
8454 struct i40e_vsi *vsi = np->vsi; in i40e_ndo_bridge_setlink() local
8455 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_setlink()
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()
8485 veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid, in i40e_ndo_bridge_setlink()
8486 vsi->tc_config.enabled_tc); in i40e_ndo_bridge_setlink()
8529 struct i40e_vsi *vsi = np->vsi; in i40e_ndo_bridge_getlink() local
8530 struct i40e_pf *pf = vsi->back; in i40e_ndo_bridge_getlink()
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()
8615 static int i40e_config_netdev(struct i40e_vsi *vsi) in i40e_config_netdev() argument
8618 struct i40e_pf *pf = vsi->back; in i40e_config_netdev()
8626 netdev = alloc_etherdev_mq(etherdev_size, vsi->alloc_queue_pairs); in i40e_config_netdev()
8630 vsi->netdev = netdev; in i40e_config_netdev()
8632 np->vsi = vsi; in i40e_config_netdev()
8662 if (vsi->type == I40E_VSI_MAIN) { in i40e_config_netdev()
8670 if (!i40e_rm_default_mac_filter(vsi, mac_addr)) { in i40e_config_netdev()
8671 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_config_netdev()
8672 i40e_add_filter(vsi, mac_addr, in i40e_config_netdev()
8674 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_config_netdev()
8679 pf->vsi[pf->lan_vsi]->netdev->name); in i40e_config_netdev()
8682 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_config_netdev()
8683 i40e_add_filter(vsi, mac_addr, I40E_VLAN_ANY, false, false); in i40e_config_netdev()
8684 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_config_netdev()
8687 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_config_netdev()
8688 i40e_add_filter(vsi, brdcast, I40E_VLAN_ANY, false, false); in i40e_config_netdev()
8689 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_config_netdev()
8702 i40e_vsi_config_netdev_tc(vsi, vsi->tc_config.enabled_tc); in i40e_config_netdev()
8708 i40e_fcoe_config_netdev(netdev, vsi); in i40e_config_netdev()
8720 static void i40e_vsi_delete(struct i40e_vsi *vsi) in i40e_vsi_delete() argument
8723 if (vsi == vsi->back->vsi[vsi->back->lan_vsi]) in i40e_vsi_delete()
8726 i40e_aq_delete_element(&vsi->back->hw, vsi->seid, NULL); in i40e_vsi_delete()
8735 int i40e_is_vsi_uplink_mode_veb(struct i40e_vsi *vsi) in i40e_is_vsi_uplink_mode_veb() argument
8738 struct i40e_pf *pf = vsi->back; in i40e_is_vsi_uplink_mode_veb()
8741 if (vsi->veb_idx == I40E_NO_VEB) in i40e_is_vsi_uplink_mode_veb()
8744 veb = pf->veb[vsi->veb_idx]; in i40e_is_vsi_uplink_mode_veb()
8770 static int i40e_add_vsi(struct i40e_vsi *vsi) in i40e_add_vsi() argument
8775 struct i40e_pf *pf = vsi->back; in i40e_add_vsi()
8784 switch (vsi->type) { in i40e_add_vsi()
8804 vsi->info = ctxt.info; in i40e_add_vsi()
8805 vsi->info.valid_sections = 0; in i40e_add_vsi()
8807 vsi->seid = ctxt.seid; in i40e_add_vsi()
8808 vsi->id = ctxt.vsi_number; in i40e_add_vsi()
8819 i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, false); in i40e_add_vsi()
8831 i40e_vsi_update_queue_map(vsi, &ctxt); in i40e_add_vsi()
8832 vsi->info.valid_sections = 0; in i40e_add_vsi()
8840 ret = i40e_vsi_config_tc(vsi, enabled_tc); in i40e_add_vsi()
8856 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
8860 (i40e_is_vsi_uplink_mode_veb(vsi))) { in i40e_add_vsi()
8866 i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true); in i40e_add_vsi()
8872 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
8879 if (i40e_is_vsi_uplink_mode_veb(vsi)) { in i40e_add_vsi()
8887 i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true); in i40e_add_vsi()
8892 ctxt.vf_num = vsi->vf_id + hw->func_caps.vf_base_id; in i40e_add_vsi()
8893 ctxt.uplink_seid = vsi->uplink_seid; in i40e_add_vsi()
8900 if (i40e_is_vsi_uplink_mode_veb(vsi)) { in i40e_add_vsi()
8909 if (pf->vf[vsi->vf_id].spoofchk) { in i40e_add_vsi()
8917 i40e_vsi_setup_queue_map(vsi, &ctxt, enabled_tc, true); in i40e_add_vsi()
8922 ret = i40e_fcoe_vsi_init(vsi, &ctxt); in i40e_add_vsi()
8934 if (vsi->type != I40E_VSI_MAIN) { in i40e_add_vsi()
8937 dev_info(&vsi->back->pdev->dev, in i40e_add_vsi()
8945 vsi->info = ctxt.info; in i40e_add_vsi()
8946 vsi->info.valid_sections = 0; in i40e_add_vsi()
8947 vsi->seid = ctxt.seid; in i40e_add_vsi()
8948 vsi->id = ctxt.vsi_number; in i40e_add_vsi()
8951 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_add_vsi()
8953 list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) { in i40e_add_vsi()
8958 if (f->is_laa && vsi->type == I40E_VSI_MAIN) { in i40e_add_vsi()
8963 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_add_vsi()
8971 ret = i40e_aq_remove_macvlan(hw, vsi->seid, in i40e_add_vsi()
8977 i40e_aq_remove_macvlan(hw, vsi->seid, in i40e_add_vsi()
8987 vsi->flags |= I40E_VSI_FLAG_FILTER_CHANGED; in i40e_add_vsi()
8992 ret = i40e_vsi_get_bw_info(vsi); in i40e_add_vsi()
9012 int i40e_vsi_release(struct i40e_vsi *vsi) in i40e_vsi_release() argument
9020 pf = vsi->back; in i40e_vsi_release()
9023 if (vsi->flags & I40E_VSI_FLAG_VEB_OWNER) { in i40e_vsi_release()
9025 vsi->seid, vsi->uplink_seid); in i40e_vsi_release()
9028 if (vsi == pf->vsi[pf->lan_vsi] && in i40e_vsi_release()
9034 uplink_seid = vsi->uplink_seid; in i40e_vsi_release()
9035 if (vsi->type != I40E_VSI_SRIOV) { in i40e_vsi_release()
9036 if (vsi->netdev_registered) { in i40e_vsi_release()
9037 vsi->netdev_registered = false; in i40e_vsi_release()
9038 if (vsi->netdev) { in i40e_vsi_release()
9040 unregister_netdev(vsi->netdev); in i40e_vsi_release()
9043 i40e_vsi_close(vsi); in i40e_vsi_release()
9045 i40e_vsi_disable_irq(vsi); in i40e_vsi_release()
9048 spin_lock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_release()
9049 list_for_each_entry_safe(f, ftmp, &vsi->mac_filter_list, list) in i40e_vsi_release()
9050 i40e_del_filter(vsi, f->macaddr, f->vlan, in i40e_vsi_release()
9052 spin_unlock_bh(&vsi->mac_filter_list_lock); in i40e_vsi_release()
9054 i40e_sync_vsi_filters(vsi, false); in i40e_vsi_release()
9056 i40e_vsi_delete(vsi); in i40e_vsi_release()
9057 i40e_vsi_free_q_vectors(vsi); in i40e_vsi_release()
9058 if (vsi->netdev) { in i40e_vsi_release()
9059 free_netdev(vsi->netdev); in i40e_vsi_release()
9060 vsi->netdev = NULL; in i40e_vsi_release()
9062 i40e_vsi_clear_rings(vsi); in i40e_vsi_release()
9063 i40e_vsi_clear(vsi); 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()
9104 static int i40e_vsi_setup_vectors(struct i40e_vsi *vsi) in i40e_vsi_setup_vectors() argument
9107 struct i40e_pf *pf = vsi->back; in i40e_vsi_setup_vectors()
9109 if (vsi->q_vectors[0]) { in i40e_vsi_setup_vectors()
9111 vsi->seid); in i40e_vsi_setup_vectors()
9115 if (vsi->base_vector) { in i40e_vsi_setup_vectors()
9117 vsi->seid, vsi->base_vector); in i40e_vsi_setup_vectors()
9121 ret = i40e_vsi_alloc_q_vectors(vsi); in i40e_vsi_setup_vectors()
9125 vsi->num_q_vectors, vsi->seid, ret); in i40e_vsi_setup_vectors()
9126 vsi->num_q_vectors = 0; in i40e_vsi_setup_vectors()
9135 if (vsi->num_q_vectors) in i40e_vsi_setup_vectors()
9136 vsi->base_vector = i40e_get_lump(pf, pf->irq_pile, in i40e_vsi_setup_vectors()
9137 vsi->num_q_vectors, vsi->idx); in i40e_vsi_setup_vectors()
9138 if (vsi->base_vector < 0) { in i40e_vsi_setup_vectors()
9141 vsi->num_q_vectors, vsi->seid, vsi->base_vector); in i40e_vsi_setup_vectors()
9142 i40e_vsi_free_q_vectors(vsi); in i40e_vsi_setup_vectors()
9160 static struct i40e_vsi *i40e_vsi_reinit_setup(struct i40e_vsi *vsi) in i40e_vsi_reinit_setup() argument
9162 struct i40e_pf *pf = vsi->back; in i40e_vsi_reinit_setup()
9166 i40e_put_lump(pf->qp_pile, vsi->base_queue, vsi->idx); in i40e_vsi_reinit_setup()
9167 i40e_vsi_clear_rings(vsi); in i40e_vsi_reinit_setup()
9169 i40e_vsi_free_arrays(vsi, false); in i40e_vsi_reinit_setup()
9170 i40e_set_num_rings_in_vsi(vsi); in i40e_vsi_reinit_setup()
9171 ret = i40e_vsi_alloc_arrays(vsi, false); 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()
9179 vsi->alloc_queue_pairs, vsi->seid, ret); in i40e_vsi_reinit_setup()
9182 vsi->base_queue = ret; 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()
9193 ret = i40e_alloc_rings(vsi); in i40e_vsi_reinit_setup()
9198 i40e_vsi_map_rings_to_vectors(vsi); in i40e_vsi_reinit_setup()
9199 return vsi; in i40e_vsi_reinit_setup()
9202 i40e_vsi_free_q_vectors(vsi); in i40e_vsi_reinit_setup()
9203 if (vsi->netdev_registered) { in i40e_vsi_reinit_setup()
9204 vsi->netdev_registered = false; in i40e_vsi_reinit_setup()
9205 unregister_netdev(vsi->netdev); in i40e_vsi_reinit_setup()
9206 free_netdev(vsi->netdev); in i40e_vsi_reinit_setup()
9207 vsi->netdev = NULL; in i40e_vsi_reinit_setup()
9209 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_reinit_setup()
9211 i40e_vsi_clear(vsi); in i40e_vsi_reinit_setup()
9231 struct i40e_vsi *vsi = NULL; in i40e_vsi_setup() local
9259 if (pf->vsi[i] && pf->vsi[i]->seid == uplink_seid) { in i40e_vsi_setup()
9260 vsi = pf->vsi[i]; in i40e_vsi_setup()
9264 if (!vsi) { 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()
9272 vsi->tc_config.enabled_tc); in i40e_vsi_setup()
9273 else if ((vsi->flags & I40E_VSI_FLAG_VEB_OWNER) == 0) in i40e_vsi_setup()
9274 veb = i40e_veb_setup(pf, 0, vsi->uplink_seid, vsi->seid, in i40e_vsi_setup()
9275 vsi->tc_config.enabled_tc); in i40e_vsi_setup()
9277 if (vsi->seid != pf->vsi[pf->lan_vsi]->seid) { in i40e_vsi_setup()
9278 dev_info(&vsi->back->pdev->dev, in i40e_vsi_setup()
9293 if (pf->veb[i] && pf->veb[i]->seid == vsi->uplink_seid) in i40e_vsi_setup()
9301 vsi->flags |= I40E_VSI_FLAG_VEB_OWNER; in i40e_vsi_setup()
9309 vsi = pf->vsi[v_idx]; in i40e_vsi_setup()
9310 if (!vsi) in i40e_vsi_setup()
9312 vsi->type = type; in i40e_vsi_setup()
9313 vsi->veb_idx = (veb ? veb->idx : I40E_NO_VEB); in i40e_vsi_setup()
9318 vsi->vf_id = param1; in i40e_vsi_setup()
9320 ret = i40e_get_lump(pf, pf->qp_pile, vsi->alloc_queue_pairs, in i40e_vsi_setup()
9321 vsi->idx); in i40e_vsi_setup()
9325 vsi->alloc_queue_pairs, vsi->seid, ret); in i40e_vsi_setup()
9328 vsi->base_queue = ret; in i40e_vsi_setup()
9331 vsi->uplink_seid = uplink_seid; in i40e_vsi_setup()
9332 ret = i40e_add_vsi(vsi); in i40e_vsi_setup()
9336 switch (vsi->type) { in i40e_vsi_setup()
9341 ret = i40e_config_netdev(vsi); in i40e_vsi_setup()
9344 ret = register_netdev(vsi->netdev); in i40e_vsi_setup()
9347 vsi->netdev_registered = true; in i40e_vsi_setup()
9348 netif_carrier_off(vsi->netdev); in i40e_vsi_setup()
9351 i40e_dcbnl_setup(vsi); in i40e_vsi_setup()
9357 ret = i40e_vsi_setup_vectors(vsi); in i40e_vsi_setup()
9361 ret = i40e_alloc_rings(vsi); in i40e_vsi_setup()
9366 i40e_vsi_map_rings_to_vectors(vsi); in i40e_vsi_setup()
9368 i40e_vsi_reset_stats(vsi); in i40e_vsi_setup()
9377 (vsi->type == I40E_VSI_VMDQ2)) { in i40e_vsi_setup()
9378 ret = i40e_vsi_config_rss(vsi); in i40e_vsi_setup()
9380 return vsi; in i40e_vsi_setup()
9383 i40e_vsi_free_q_vectors(vsi); in i40e_vsi_setup()
9385 if (vsi->netdev_registered) { in i40e_vsi_setup()
9386 vsi->netdev_registered = false; in i40e_vsi_setup()
9387 unregister_netdev(vsi->netdev); in i40e_vsi_setup()
9388 free_netdev(vsi->netdev); in i40e_vsi_setup()
9389 vsi->netdev = NULL; in i40e_vsi_setup()
9392 i40e_aq_delete_element(&pf->hw, vsi->seid, NULL); in i40e_vsi_setup()
9394 i40e_vsi_clear(vsi); in i40e_vsi_setup()
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()
9570 struct i40e_vsi *vsi = NULL; in i40e_veb_release() local
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()
9591 vsi->flags &= ~I40E_VSI_FLAG_VEB_OWNER; in i40e_veb_release()
9593 vsi->uplink_seid = veb->uplink_seid; in i40e_veb_release()
9595 vsi->veb_idx = I40E_NO_VEB; in i40e_veb_release()
9597 vsi->veb_idx = veb->veb_idx; 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()
9613 static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi) in i40e_add_veb() argument
9621 ret = i40e_aq_add_veb(&pf->hw, veb->uplink_seid, vsi->seid, in i40e_add_veb()
9652 vsi->uplink_seid = veb->seid; in i40e_add_veb()
9653 vsi->veb_idx = veb->idx; in i40e_add_veb()
9654 vsi->flags |= I40E_VSI_FLAG_VEB_OWNER; in i40e_add_veb()
9694 if (pf->vsi[vsi_idx] && pf->vsi[vsi_idx]->seid == vsi_seid) in i40e_veb_setup()
9728 ret = i40e_add_veb(veb, pf->vsi[vsi_idx]); in i40e_veb_setup()
9907 struct i40e_vsi *vsi = NULL; in i40e_setup_pf_switch() local
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()
9921 if (!vsi) { 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()
10133 pf->vsi[pf->lan_vsi]->num_queue_pairs, in i40e_print_features()
10438 pf->vsi = kzalloc(len, GFP_KERNEL); in i40e_probe()
10439 if (!pf->vsi) { 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()
10652 kfree(pf->vsi); in i40e_probe()
10729 if (pf->vsi[pf->lan_vsi]) in i40e_remove()
10730 i40e_vsi_release(pf->vsi[pf->lan_vsi]); 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()
10768 kfree(pf->vsi); in i40e_remove()