xref: /dpdk/drivers/net/nfb/nfb_rxmode.c (revision 6685343c4805fcae80bad449903d848409193bd8)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019 Cesnet
3  * Copyright(c) 2019 Netcope Technologies, a.s. <info@netcope.com>
4  * All rights reserved.
5  */
6 
7 #include "nfb_rxmode.h"
8 #include "nfb.h"
9 
10 int
nfb_eth_promiscuous_enable(struct rte_eth_dev * dev)11 nfb_eth_promiscuous_enable(struct rte_eth_dev *dev)
12 {
13 	struct pmd_internals *internals = (struct pmd_internals *)
14 		dev->data->dev_private;
15 	uint16_t i;
16 
17 	for (i = 0; i < internals->max_rxmac; ++i) {
18 		nc_rxmac_mac_filter_enable(internals->rxmac[i],
19 			RXMAC_MAC_FILTER_PROMISCUOUS);
20 	}
21 
22 	return 0;
23 }
24 
25 int
nfb_eth_promiscuous_disable(struct rte_eth_dev * dev)26 nfb_eth_promiscuous_disable(struct rte_eth_dev *dev)
27 {
28 	struct pmd_internals *internals = (struct pmd_internals *)
29 		dev->data->dev_private;
30 	uint16_t i;
31 	enum nc_rxmac_mac_filter filter = RXMAC_MAC_FILTER_TABLE_BCAST;
32 
33 	if (dev->data->all_multicast)
34 		filter = RXMAC_MAC_FILTER_TABLE_BCAST_MCAST;
35 
36 	for (i = 0; i < internals->max_rxmac; ++i) {
37 		nc_rxmac_mac_filter_enable(internals->rxmac[i], filter);
38 	}
39 
40 	return 0;
41 }
42 
43 int
nfb_eth_promiscuous_get(struct rte_eth_dev * dev)44 nfb_eth_promiscuous_get(struct rte_eth_dev *dev)
45 {
46 	struct pmd_internals *internals = (struct pmd_internals *)
47 		dev->data->dev_private;
48 
49 	struct nc_rxmac_status status;
50 	status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
51 
52 	if (internals->max_rxmac > 0)
53 		nc_rxmac_read_status(internals->rxmac[0], &status);
54 
55 	return (status.mac_filter == RXMAC_MAC_FILTER_PROMISCUOUS);
56 }
57 
58 int
nfb_eth_allmulticast_enable(struct rte_eth_dev * dev)59 nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
60 {
61 	struct pmd_internals *internals = (struct pmd_internals *)
62 		dev->data->dev_private;
63 
64 	uint16_t i;
65 	if (dev->data->promiscuous)
66 		return 0;
67 	for (i = 0; i < internals->max_rxmac; ++i) {
68 		nc_rxmac_mac_filter_enable(internals->rxmac[i],
69 			RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
70 	}
71 
72 	return 0;
73 }
74 
75 int
nfb_eth_allmulticast_disable(struct rte_eth_dev * dev)76 nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
77 {
78 	struct pmd_internals *internals = (struct pmd_internals *)
79 		dev->data->dev_private;
80 
81 	uint16_t i;
82 
83 	if (dev->data->promiscuous)
84 		return 0;
85 
86 	for (i = 0; i < internals->max_rxmac; ++i) {
87 		nc_rxmac_mac_filter_enable(internals->rxmac[i],
88 			RXMAC_MAC_FILTER_TABLE_BCAST);
89 	}
90 
91 	return 0;
92 }
93 
94 int
nfb_eth_allmulticast_get(struct rte_eth_dev * dev)95 nfb_eth_allmulticast_get(struct rte_eth_dev *dev)
96 {
97 	struct pmd_internals *internals = (struct pmd_internals *)
98 		dev->data->dev_private;
99 
100 	struct nc_rxmac_status status;
101 	status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
102 
103 	if (internals->max_rxmac > 0)
104 		nc_rxmac_read_status(internals->rxmac[0], &status);
105 
106 	return (status.mac_filter == RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
107 }
108