Lines Matching refs:pfvf
33 static void otx2_clear_ntuple_flow_info(struct otx2_nic *pfvf, struct otx2_flow_config *flow_cfg) in otx2_clear_ntuple_flow_info() argument
35 devm_kfree(pfvf->dev, flow_cfg->flow_ent); in otx2_clear_ntuple_flow_info()
40 static int otx2_free_ntuple_mcam_entries(struct otx2_nic *pfvf) in otx2_free_ntuple_mcam_entries() argument
42 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_free_ntuple_mcam_entries()
49 mutex_lock(&pfvf->mbox.lock); in otx2_free_ntuple_mcam_entries()
51 req = otx2_mbox_alloc_msg_npc_mcam_free_entry(&pfvf->mbox); in otx2_free_ntuple_mcam_entries()
58 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_free_ntuple_mcam_entries()
62 mutex_unlock(&pfvf->mbox.lock); in otx2_free_ntuple_mcam_entries()
63 otx2_clear_ntuple_flow_info(pfvf, flow_cfg); in otx2_free_ntuple_mcam_entries()
67 int otx2_alloc_mcam_entries(struct otx2_nic *pfvf, u16 count) in otx2_alloc_mcam_entries() argument
69 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_alloc_mcam_entries()
75 otx2_free_ntuple_mcam_entries(pfvf); in otx2_alloc_mcam_entries()
80 flow_cfg->flow_ent = devm_kmalloc_array(pfvf->dev, count, in otx2_alloc_mcam_entries()
83 netdev_err(pfvf->netdev, in otx2_alloc_mcam_entries()
89 mutex_lock(&pfvf->mbox.lock); in otx2_alloc_mcam_entries()
95 req = otx2_mbox_alloc_msg_npc_mcam_alloc_entry(&pfvf->mbox); in otx2_alloc_mcam_entries()
106 if (!is_otx2_vf(pfvf->pcifunc)) { in otx2_alloc_mcam_entries()
112 if (otx2_sync_mbox_msg(&pfvf->mbox)) in otx2_alloc_mcam_entries()
116 (&pfvf->mbox.mbox, 0, &req->hdr); in otx2_alloc_mcam_entries()
142 mutex_unlock(&pfvf->mbox.lock); in otx2_alloc_mcam_entries()
147 pfvf->flags |= OTX2_FLAG_MCAM_ENTRIES_ALLOC; in otx2_alloc_mcam_entries()
148 pfvf->flags |= OTX2_FLAG_NTUPLE_SUPPORT; in otx2_alloc_mcam_entries()
152 netdev_info(pfvf->netdev, in otx2_alloc_mcam_entries()
159 int otx2_mcam_entry_init(struct otx2_nic *pfvf) in otx2_mcam_entry_init() argument
161 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_mcam_entry_init()
169 vf_vlan_max_flows = pfvf->total_vfs * OTX2_PER_VF_VLAN_FLOWS; in otx2_mcam_entry_init()
173 flow_cfg->def_ent = devm_kmalloc_array(pfvf->dev, count, in otx2_mcam_entry_init()
178 mutex_lock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
180 req = otx2_mbox_alloc_msg_npc_mcam_alloc_entry(&pfvf->mbox); in otx2_mcam_entry_init()
182 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
190 if (otx2_sync_mbox_msg(&pfvf->mbox)) { in otx2_mcam_entry_init()
191 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
196 (&pfvf->mbox.mbox, 0, &req->hdr); in otx2_mcam_entry_init()
198 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
203 netdev_info(pfvf->netdev, in otx2_mcam_entry_init()
205 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
206 devm_kfree(pfvf->dev, flow_cfg->def_ent); in otx2_mcam_entry_init()
217 pfvf->flags |= OTX2_FLAG_UCAST_FLTR_SUPPORT; in otx2_mcam_entry_init()
222 freq = otx2_mbox_alloc_msg_npc_get_field_status(&pfvf->mbox); in otx2_mcam_entry_init()
224 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
229 if (otx2_sync_mbox_msg(&pfvf->mbox)) { in otx2_mcam_entry_init()
230 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
235 (&pfvf->mbox.mbox, 0, &freq->hdr); in otx2_mcam_entry_init()
237 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
242 pfvf->flags |= OTX2_FLAG_RX_VLAN_SUPPORT; in otx2_mcam_entry_init()
243 pfvf->flags |= OTX2_FLAG_VF_VLAN_SUPPORT; in otx2_mcam_entry_init()
246 pfvf->flags |= OTX2_FLAG_MCAM_ENTRIES_ALLOC; in otx2_mcam_entry_init()
247 mutex_unlock(&pfvf->mbox.lock); in otx2_mcam_entry_init()
250 count = otx2_alloc_mcam_entries(pfvf, OTX2_DEFAULT_FLOWCOUNT); in otx2_mcam_entry_init()
252 otx2_clear_ntuple_flow_info(pfvf, flow_cfg); in otx2_mcam_entry_init()
256 pfvf->flags |= OTX2_FLAG_TC_FLOWER_SUPPORT; in otx2_mcam_entry_init()
266 int otx2vf_mcam_flow_init(struct otx2_nic *pfvf) in otx2vf_mcam_flow_init() argument
270 pfvf->flow_cfg = devm_kzalloc(pfvf->dev, in otx2vf_mcam_flow_init()
273 if (!pfvf->flow_cfg) in otx2vf_mcam_flow_init()
276 pfvf->flow_cfg->dmacflt_bmap = devm_kcalloc(pfvf->dev, in otx2vf_mcam_flow_init()
279 if (!pfvf->flow_cfg->dmacflt_bmap) in otx2vf_mcam_flow_init()
282 flow_cfg = pfvf->flow_cfg; in otx2vf_mcam_flow_init()
456 static struct otx2_flow *otx2_find_flow(struct otx2_nic *pfvf, u32 location) in otx2_find_flow() argument
460 list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) { in otx2_find_flow()
468 static void otx2_add_flow_to_list(struct otx2_nic *pfvf, struct otx2_flow *flow) in otx2_add_flow_to_list() argument
470 struct list_head *head = &pfvf->flow_cfg->flow_list; in otx2_add_flow_to_list()
473 list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) { in otx2_add_flow_to_list()
496 int otx2_get_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc, in otx2_get_flow() argument
501 if (location >= otx2_get_maxflows(pfvf->flow_cfg)) in otx2_get_flow()
504 list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) { in otx2_get_flow()
515 int otx2_get_all_flows(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc, in otx2_get_all_flows() argument
523 nfc->data = otx2_get_maxflows(pfvf->flow_cfg); in otx2_get_all_flows()
525 err = otx2_get_flow(pfvf, nfc, location); in otx2_get_all_flows()
947 static int otx2_is_flow_rule_dmacfilter(struct otx2_nic *pfvf, in otx2_is_flow_rule_dmacfilter() argument
955 if (!(pfvf->flags & OTX2_FLAG_DMACFLTR_SUPPORT)) in otx2_is_flow_rule_dmacfilter()
973 static int otx2_add_flow_msg(struct otx2_nic *pfvf, struct otx2_flow *flow) in otx2_add_flow_msg() argument
982 mutex_lock(&pfvf->mbox.lock); in otx2_add_flow_msg()
983 req = otx2_mbox_alloc_msg_npc_install_flow(&pfvf->mbox); in otx2_add_flow_msg()
985 mutex_unlock(&pfvf->mbox.lock); in otx2_add_flow_msg()
992 otx2_mbox_reset(&pfvf->mbox.mbox, 0); in otx2_add_flow_msg()
993 mutex_unlock(&pfvf->mbox.lock); in otx2_add_flow_msg()
1000 req->channel = pfvf->hw.rx_chan_base; in otx2_add_flow_msg()
1010 req->flow_key_alg = pfvf->hw.flowkey_alg_idx; in otx2_add_flow_msg()
1016 if (vf > pci_num_vf(pfvf->pdev)) { in otx2_add_flow_msg()
1017 mutex_unlock(&pfvf->mbox.lock); in otx2_add_flow_msg()
1024 pfvf->pfc_en && req->op != NIX_RX_ACTIONOP_RSS) { in otx2_add_flow_msg()
1032 if (pfvf->pfc_en & BIT(vlan_prio)) { in otx2_add_flow_msg()
1048 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_add_flow_msg()
1052 otx2_update_bpid_in_rqctx(pfvf, vlan_prio, qidx, true); in otx2_add_flow_msg()
1055 mutex_unlock(&pfvf->mbox.lock); in otx2_add_flow_msg()
1059 static int otx2_add_flow_with_pfmac(struct otx2_nic *pfvf, in otx2_add_flow_with_pfmac() argument
1071 pf_mac->location = pfvf->flow_cfg->max_flows; in otx2_add_flow_with_pfmac()
1078 ether_addr_copy(eth_hdr->h_dest, pfvf->netdev->dev_addr); in otx2_add_flow_with_pfmac()
1081 otx2_dmacflt_add(pfvf, eth_hdr->h_dest, 0); in otx2_add_flow_with_pfmac()
1083 otx2_add_flow_to_list(pfvf, pf_mac); in otx2_add_flow_with_pfmac()
1084 pfvf->flow_cfg->nr_flows++; in otx2_add_flow_with_pfmac()
1085 set_bit(0, pfvf->flow_cfg->dmacflt_bmap); in otx2_add_flow_with_pfmac()
1090 int otx2_add_flow(struct otx2_nic *pfvf, struct ethtool_rxnfc *nfc) in otx2_add_flow() argument
1092 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_add_flow()
1102 netdev_err(pfvf->netdev, in otx2_add_flow()
1108 if (!(pfvf->flags & OTX2_FLAG_NTUPLE_SUPPORT)) in otx2_add_flow()
1124 if (!is_otx2_vf(pfvf->pcifunc) && !vf_num && in otx2_add_flow()
1125 ring >= pfvf->hw.rx_queues && fsp->ring_cookie != RX_CLS_FLOW_DISC) in otx2_add_flow()
1131 flow = otx2_find_flow(pfvf, fsp->location); in otx2_add_flow()
1146 if (otx2_is_flow_rule_dmacfilter(pfvf, &flow->flow_spec)) { in otx2_add_flow()
1151 return otx2_dmacflt_update(pfvf, eth_hdr->h_dest, in otx2_add_flow()
1156 netdev_warn(pfvf->netdev, in otx2_add_flow()
1169 otx2_add_flow_with_pfmac(pfvf, flow); in otx2_add_flow()
1179 otx2_dmacflt_add(pfvf, eth_hdr->h_dest, flow->entry); in otx2_add_flow()
1182 if (flow->location >= pfvf->flow_cfg->max_flows) { in otx2_add_flow()
1183 netdev_warn(pfvf->netdev, in otx2_add_flow()
1189 err = otx2_add_flow_msg(pfvf, flow); in otx2_add_flow()
1203 otx2_add_flow_to_list(pfvf, flow); in otx2_add_flow()
1208 netdev_info(pfvf->netdev, in otx2_add_flow()
1213 static int otx2_remove_flow_msg(struct otx2_nic *pfvf, u16 entry, bool all) in otx2_remove_flow_msg() argument
1218 mutex_lock(&pfvf->mbox.lock); in otx2_remove_flow_msg()
1219 req = otx2_mbox_alloc_msg_npc_delete_flow(&pfvf->mbox); in otx2_remove_flow_msg()
1221 mutex_unlock(&pfvf->mbox.lock); in otx2_remove_flow_msg()
1230 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_remove_flow_msg()
1231 mutex_unlock(&pfvf->mbox.lock); in otx2_remove_flow_msg()
1235 static void otx2_update_rem_pfmac(struct otx2_nic *pfvf, int req) in otx2_update_rem_pfmac() argument
1241 list_for_each_entry(iter, &pfvf->flow_cfg->flow_list, list) { in otx2_update_rem_pfmac()
1245 otx2_dmacflt_remove(pfvf, eth_hdr->h_dest, in otx2_update_rem_pfmac()
1247 clear_bit(0, pfvf->flow_cfg->dmacflt_bmap); in otx2_update_rem_pfmac()
1251 pfvf->netdev->dev_addr); in otx2_update_rem_pfmac()
1253 otx2_dmacflt_update(pfvf, eth_hdr->h_dest, 0); in otx2_update_rem_pfmac()
1262 pfvf->flow_cfg->nr_flows--; in otx2_update_rem_pfmac()
1266 int otx2_remove_flow(struct otx2_nic *pfvf, u32 location) in otx2_remove_flow() argument
1268 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_remove_flow()
1275 flow = otx2_find_flow(pfvf, location); in otx2_remove_flow()
1283 if (ether_addr_equal(pfvf->netdev->dev_addr, eth_hdr->h_dest)) in otx2_remove_flow()
1286 err = otx2_dmacflt_remove(pfvf, eth_hdr->h_dest, in otx2_remove_flow()
1295 otx2_update_rem_pfmac(pfvf, DMAC_ADDR_DEL); in otx2_remove_flow()
1299 otx2_update_bpid_in_rqctx(pfvf, 0, in otx2_remove_flow()
1304 err = otx2_remove_flow_msg(pfvf, flow->entry, false); in otx2_remove_flow()
1317 void otx2_rss_ctx_flow_del(struct otx2_nic *pfvf, int ctx_id) in otx2_rss_ctx_flow_del() argument
1322 list_for_each_entry_safe(flow, tmp, &pfvf->flow_cfg->flow_list, list) { in otx2_rss_ctx_flow_del()
1325 err = otx2_remove_flow(pfvf, flow->location); in otx2_rss_ctx_flow_del()
1327 netdev_warn(pfvf->netdev, in otx2_rss_ctx_flow_del()
1333 int otx2_destroy_ntuple_flows(struct otx2_nic *pfvf) in otx2_destroy_ntuple_flows() argument
1335 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_destroy_ntuple_flows()
1340 if (!(pfvf->flags & OTX2_FLAG_NTUPLE_SUPPORT)) in otx2_destroy_ntuple_flows()
1346 mutex_lock(&pfvf->mbox.lock); in otx2_destroy_ntuple_flows()
1347 req = otx2_mbox_alloc_msg_npc_delete_flow(&pfvf->mbox); in otx2_destroy_ntuple_flows()
1349 mutex_unlock(&pfvf->mbox.lock); in otx2_destroy_ntuple_flows()
1355 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_destroy_ntuple_flows()
1356 mutex_unlock(&pfvf->mbox.lock); in otx2_destroy_ntuple_flows()
1366 int otx2_destroy_mcam_flows(struct otx2_nic *pfvf) in otx2_destroy_mcam_flows() argument
1368 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_destroy_mcam_flows()
1373 if (!(pfvf->flags & OTX2_FLAG_MCAM_ENTRIES_ALLOC)) in otx2_destroy_mcam_flows()
1377 err = otx2_remove_flow_msg(pfvf, 0, true); in otx2_destroy_mcam_flows()
1387 mutex_lock(&pfvf->mbox.lock); in otx2_destroy_mcam_flows()
1388 req = otx2_mbox_alloc_msg_npc_mcam_free_entry(&pfvf->mbox); in otx2_destroy_mcam_flows()
1390 mutex_unlock(&pfvf->mbox.lock); in otx2_destroy_mcam_flows()
1396 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_destroy_mcam_flows()
1398 mutex_unlock(&pfvf->mbox.lock); in otx2_destroy_mcam_flows()
1402 pfvf->flags &= ~OTX2_FLAG_MCAM_ENTRIES_ALLOC; in otx2_destroy_mcam_flows()
1404 mutex_unlock(&pfvf->mbox.lock); in otx2_destroy_mcam_flows()
1409 int otx2_install_rxvlan_offload_flow(struct otx2_nic *pfvf) in otx2_install_rxvlan_offload_flow() argument
1411 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_install_rxvlan_offload_flow()
1415 mutex_lock(&pfvf->mbox.lock); in otx2_install_rxvlan_offload_flow()
1416 req = otx2_mbox_alloc_msg_npc_install_flow(&pfvf->mbox); in otx2_install_rxvlan_offload_flow()
1418 mutex_unlock(&pfvf->mbox.lock); in otx2_install_rxvlan_offload_flow()
1424 ether_addr_copy(req->packet.dmac, pfvf->netdev->dev_addr); in otx2_install_rxvlan_offload_flow()
1426 req->channel = pfvf->hw.rx_chan_base; in otx2_install_rxvlan_offload_flow()
1433 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_install_rxvlan_offload_flow()
1434 mutex_unlock(&pfvf->mbox.lock); in otx2_install_rxvlan_offload_flow()
1438 static int otx2_delete_rxvlan_offload_flow(struct otx2_nic *pfvf) in otx2_delete_rxvlan_offload_flow() argument
1440 struct otx2_flow_config *flow_cfg = pfvf->flow_cfg; in otx2_delete_rxvlan_offload_flow()
1444 mutex_lock(&pfvf->mbox.lock); in otx2_delete_rxvlan_offload_flow()
1445 req = otx2_mbox_alloc_msg_npc_delete_flow(&pfvf->mbox); in otx2_delete_rxvlan_offload_flow()
1447 mutex_unlock(&pfvf->mbox.lock); in otx2_delete_rxvlan_offload_flow()
1453 err = otx2_sync_mbox_msg(&pfvf->mbox); in otx2_delete_rxvlan_offload_flow()
1454 mutex_unlock(&pfvf->mbox.lock); in otx2_delete_rxvlan_offload_flow()
1522 void otx2_dmacflt_update_pfmac_flow(struct otx2_nic *pfvf) in otx2_dmacflt_update_pfmac_flow() argument
1524 otx2_update_rem_pfmac(pfvf, DMAC_ADDR_UPDATE); in otx2_dmacflt_update_pfmac_flow()