xref: /dpdk/drivers/net/nfb/nfb_rxmode.c (revision 6685343c4805fcae80bad449903d848409193bd8)
16435f9a0SRastislav Cernay /* SPDX-License-Identifier: BSD-3-Clause
26435f9a0SRastislav Cernay  * Copyright(c) 2019 Cesnet
36435f9a0SRastislav Cernay  * Copyright(c) 2019 Netcope Technologies, a.s. <info@netcope.com>
46435f9a0SRastislav Cernay  * All rights reserved.
56435f9a0SRastislav Cernay  */
66435f9a0SRastislav Cernay 
76435f9a0SRastislav Cernay #include "nfb_rxmode.h"
86435f9a0SRastislav Cernay #include "nfb.h"
96435f9a0SRastislav Cernay 
109039c812SAndrew Rybchenko int
nfb_eth_promiscuous_enable(struct rte_eth_dev * dev)116435f9a0SRastislav Cernay nfb_eth_promiscuous_enable(struct rte_eth_dev *dev)
126435f9a0SRastislav Cernay {
136435f9a0SRastislav Cernay 	struct pmd_internals *internals = (struct pmd_internals *)
146435f9a0SRastislav Cernay 		dev->data->dev_private;
156435f9a0SRastislav Cernay 	uint16_t i;
166435f9a0SRastislav Cernay 
176435f9a0SRastislav Cernay 	for (i = 0; i < internals->max_rxmac; ++i) {
186435f9a0SRastislav Cernay 		nc_rxmac_mac_filter_enable(internals->rxmac[i],
196435f9a0SRastislav Cernay 			RXMAC_MAC_FILTER_PROMISCUOUS);
206435f9a0SRastislav Cernay 	}
219039c812SAndrew Rybchenko 
229039c812SAndrew Rybchenko 	return 0;
236435f9a0SRastislav Cernay }
246435f9a0SRastislav Cernay 
259039c812SAndrew Rybchenko int
nfb_eth_promiscuous_disable(struct rte_eth_dev * dev)266435f9a0SRastislav Cernay nfb_eth_promiscuous_disable(struct rte_eth_dev *dev)
276435f9a0SRastislav Cernay {
286435f9a0SRastislav Cernay 	struct pmd_internals *internals = (struct pmd_internals *)
296435f9a0SRastislav Cernay 		dev->data->dev_private;
306435f9a0SRastislav Cernay 	uint16_t i;
31*6685343cSMartin Spinler 	enum nc_rxmac_mac_filter filter = RXMAC_MAC_FILTER_TABLE_BCAST;
326435f9a0SRastislav Cernay 
33*6685343cSMartin Spinler 	if (dev->data->all_multicast)
34*6685343cSMartin Spinler 		filter = RXMAC_MAC_FILTER_TABLE_BCAST_MCAST;
356435f9a0SRastislav Cernay 
366435f9a0SRastislav Cernay 	for (i = 0; i < internals->max_rxmac; ++i) {
37*6685343cSMartin Spinler 		nc_rxmac_mac_filter_enable(internals->rxmac[i], filter);
386435f9a0SRastislav Cernay 	}
399039c812SAndrew Rybchenko 
409039c812SAndrew Rybchenko 	return 0;
416435f9a0SRastislav Cernay }
426435f9a0SRastislav Cernay 
436435f9a0SRastislav Cernay int
nfb_eth_promiscuous_get(struct rte_eth_dev * dev)446435f9a0SRastislav Cernay nfb_eth_promiscuous_get(struct rte_eth_dev *dev)
456435f9a0SRastislav Cernay {
466435f9a0SRastislav Cernay 	struct pmd_internals *internals = (struct pmd_internals *)
476435f9a0SRastislav Cernay 		dev->data->dev_private;
486435f9a0SRastislav Cernay 
496435f9a0SRastislav Cernay 	struct nc_rxmac_status status;
506435f9a0SRastislav Cernay 	status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
516435f9a0SRastislav Cernay 
52dc7920c7SMartin Spinler 	if (internals->max_rxmac > 0)
536435f9a0SRastislav Cernay 		nc_rxmac_read_status(internals->rxmac[0], &status);
546435f9a0SRastislav Cernay 
556435f9a0SRastislav Cernay 	return (status.mac_filter == RXMAC_MAC_FILTER_PROMISCUOUS);
566435f9a0SRastislav Cernay }
576435f9a0SRastislav Cernay 
58ca041cd4SIvan Ilchenko int
nfb_eth_allmulticast_enable(struct rte_eth_dev * dev)596435f9a0SRastislav Cernay nfb_eth_allmulticast_enable(struct rte_eth_dev *dev)
606435f9a0SRastislav Cernay {
616435f9a0SRastislav Cernay 	struct pmd_internals *internals = (struct pmd_internals *)
626435f9a0SRastislav Cernay 		dev->data->dev_private;
636435f9a0SRastislav Cernay 
646435f9a0SRastislav Cernay 	uint16_t i;
65*6685343cSMartin Spinler 	if (dev->data->promiscuous)
66*6685343cSMartin Spinler 		return 0;
676435f9a0SRastislav Cernay 	for (i = 0; i < internals->max_rxmac; ++i) {
686435f9a0SRastislav Cernay 		nc_rxmac_mac_filter_enable(internals->rxmac[i],
696435f9a0SRastislav Cernay 			RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
706435f9a0SRastislav Cernay 	}
71ca041cd4SIvan Ilchenko 
72ca041cd4SIvan Ilchenko 	return 0;
736435f9a0SRastislav Cernay }
746435f9a0SRastislav Cernay 
75ca041cd4SIvan Ilchenko int
nfb_eth_allmulticast_disable(struct rte_eth_dev * dev)766435f9a0SRastislav Cernay nfb_eth_allmulticast_disable(struct rte_eth_dev *dev)
776435f9a0SRastislav Cernay {
786435f9a0SRastislav Cernay 	struct pmd_internals *internals = (struct pmd_internals *)
796435f9a0SRastislav Cernay 		dev->data->dev_private;
806435f9a0SRastislav Cernay 
816435f9a0SRastislav Cernay 	uint16_t i;
826435f9a0SRastislav Cernay 
83*6685343cSMartin Spinler 	if (dev->data->promiscuous)
84ca041cd4SIvan Ilchenko 		return 0;
856435f9a0SRastislav Cernay 
866435f9a0SRastislav Cernay 	for (i = 0; i < internals->max_rxmac; ++i) {
876435f9a0SRastislav Cernay 		nc_rxmac_mac_filter_enable(internals->rxmac[i],
88*6685343cSMartin Spinler 			RXMAC_MAC_FILTER_TABLE_BCAST);
896435f9a0SRastislav Cernay 	}
90ca041cd4SIvan Ilchenko 
91ca041cd4SIvan Ilchenko 	return 0;
926435f9a0SRastislav Cernay }
936435f9a0SRastislav Cernay 
946435f9a0SRastislav Cernay int
nfb_eth_allmulticast_get(struct rte_eth_dev * dev)956435f9a0SRastislav Cernay nfb_eth_allmulticast_get(struct rte_eth_dev *dev)
966435f9a0SRastislav Cernay {
976435f9a0SRastislav Cernay 	struct pmd_internals *internals = (struct pmd_internals *)
986435f9a0SRastislav Cernay 		dev->data->dev_private;
996435f9a0SRastislav Cernay 
1006435f9a0SRastislav Cernay 	struct nc_rxmac_status status;
1016435f9a0SRastislav Cernay 	status.mac_filter = RXMAC_MAC_FILTER_PROMISCUOUS;
102dc7920c7SMartin Spinler 
103dc7920c7SMartin Spinler 	if (internals->max_rxmac > 0)
1046435f9a0SRastislav Cernay 		nc_rxmac_read_status(internals->rxmac[0], &status);
1056435f9a0SRastislav Cernay 
1066435f9a0SRastislav Cernay 	return (status.mac_filter == RXMAC_MAC_FILTER_TABLE_BCAST_MCAST);
1076435f9a0SRastislav Cernay }
108