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 Cernaynfb_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 Cernaynfb_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 Cernaynfb_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 Cernaynfb_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 Cernaynfb_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 Cernaynfb_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