X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_ethdev.c;h=6b3c49a284bcc8991edf10b8d33a4fb294face9b;hb=a3147ae9aff9d7fd8644083d7d9f87ba9cabc524;hp=fc6a9800e6a2275be5e472833f6ad30daaf7adb7;hpb=9970a9ad07db7745ca6bc441819b287940ae86ea;p=dpdk.git diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index fc6a9800e6..6b3c49a284 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause * - * Copyright (c) 2016-2018 Solarflare Communications Inc. - * All rights reserved. + * Copyright(c) 2019-2020 Xilinx, Inc. + * Copyright(c) 2016-2019 Solarflare Communications Inc. * * This software was jointly developed between OKTET Labs (under contract * for Solarflare) and Solarflare Communications, Inc. @@ -393,8 +393,16 @@ sfc_dev_filter_set(struct rte_eth_dev *dev, enum sfc_dev_filter_mode mode, } else if ((sa->state == SFC_ADAPTER_STARTED) && ((rc = sfc_set_rx_mode(sa)) != 0)) { *toggle = !(enabled); - sfc_warn(sa, "Failed to %s %s mode", - ((enabled) ? "enable" : "disable"), desc); + sfc_warn(sa, "Failed to %s %s mode, rc = %d", + ((enabled) ? "enable" : "disable"), desc, rc); + + /* + * For promiscuous and all-multicast filters a + * permission failure should be reported as an + * unsupported filter. + */ + if (rc == EPERM) + rc = ENOTSUP; } } @@ -405,25 +413,37 @@ sfc_dev_filter_set(struct rte_eth_dev *dev, enum sfc_dev_filter_mode mode, static int sfc_dev_promisc_enable(struct rte_eth_dev *dev) { - return sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_PROMISC, B_TRUE); + int rc = sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_PROMISC, B_TRUE); + + SFC_ASSERT(rc >= 0); + return -rc; } static int sfc_dev_promisc_disable(struct rte_eth_dev *dev) { - return sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_PROMISC, B_FALSE); + int rc = sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_PROMISC, B_FALSE); + + SFC_ASSERT(rc >= 0); + return -rc; } -static void +static int sfc_dev_allmulti_enable(struct rte_eth_dev *dev) { - sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_TRUE); + int rc = sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_TRUE); + + SFC_ASSERT(rc >= 0); + return -rc; } -static void +static int sfc_dev_allmulti_disable(struct rte_eth_dev *dev) { - sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_FALSE); + int rc = sfc_dev_filter_set(dev, SFC_DEV_FILTER_MODE_ALLMULTI, B_FALSE); + + SFC_ASSERT(rc >= 0); + return -rc; } static int @@ -1048,12 +1068,12 @@ sfc_mac_addr_set(struct rte_eth_dev *dev, struct rte_ether_addr *mac_addr) * has no effect on received traffic, therefore * we also need to update unicast filters */ - rc = sfc_set_rx_mode(sa); + rc = sfc_set_rx_mode_unchecked(sa); if (rc != 0) { sfc_err(sa, "cannot set filter (rc = %u)", rc); /* Rollback the old address */ (void)efx_mac_addr_set(sa->nic, old_addr->addr_bytes); - (void)sfc_set_rx_mode(sa); + (void)sfc_set_rx_mode_unchecked(sa); } } else { sfc_warn(sa, "cannot set MAC address with filters installed"); @@ -1520,7 +1540,7 @@ sfc_dev_rss_hash_update(struct rte_eth_dev *dev, if ((rss_conf->rss_key != NULL) && (rss_conf->rss_key_len != sizeof(rss->key))) { - sfc_err(sa, "RSS key size is wrong (should be %lu)", + sfc_err(sa, "RSS key size is wrong (should be %zu)", sizeof(rss->key)); return -EINVAL; }