Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp1034824ybi; Fri, 2 Aug 2019 08:17:12 -0700 (PDT) X-Google-Smtp-Source: APXvYqwAxhqRVimTOQKiZ5nWCaQcGa9JoY9JhettozLciurQQfzcZsYZoVx6k516ok1SyRLp7CL5 X-Received: by 2002:aa7:940c:: with SMTP id x12mr61180027pfo.80.1564759031943; Fri, 02 Aug 2019 08:17:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1564759031; cv=none; d=google.com; s=arc-20160816; b=X/7H4d7d0HXpskNDhxu9nRodAjWsLIsFnEesKwk7X12t928avBj/4yRWwGjhIa3vEs 6HM5LdPqsqUNQehttHTt0eSVrMCtRxEfevmUj5bDh4Ac1dAdVo2fRvgvW0IeD3BZzcwW aOH3QusorQLgzgZR0P3+XMRjnC+sRD5fCTRnxCdmlcAQP1O0gwjobZHLCcUCQBv4wjOS wiA6K20BP8aFJxGRXTjQHFiWLi1NEIA7vEIbQKdAH/d8MRimX9cnTBsVGhC6pn7RJi4y BmOvALFnAbN0N+St5KUG9eSp1Plg3dlGklirAuVCIOoeSux4e9WuignEIJFDS4pcebE3 2L2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=w8Q/O0GhsXUZn0heZRF33Ew5Q3DSRHm59RylE8tteCU=; b=C+60hMN4RLTzsFlFMkSCe+BH4Ls6PKyY7G6O4BZ+g3jM/ygy5hZoa/JROhQTf113zc CMVorHJZbukHeDbDgffPYlfh6mOU4gx/LJiCstOWZ/VHEZ+QwigXkW4lQ94WDVCa1ZzE 15tZA5g7+jKllssFrt8zqzOyjNbYfVGVUxCuuymM9aj8h5sEMhZzA7TY81q6pmzMsh5y hoerdl9gDX4Gs28oj0RvICRe7vTkdjBHkVqBvpGIpYAyL/IejfuRUV+x1C/Bb926Sugt QOLq+iSU/RYxBEyf1KU6233B+mgMU6WKYXHozEgDIQsLsQhe+MaAXoVrJJYnGmv35xxk E8JQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=AUp0PzJj; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b5si40342677pgi.324.2019.08.02.08.16.56; Fri, 02 Aug 2019 08:17:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=AUp0PzJj; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391480AbfHBJeF (ORCPT + 99 others); Fri, 2 Aug 2019 05:34:05 -0400 Received: from mail.kernel.org ([198.145.29.99]:33630 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2390239AbfHBJd7 (ORCPT ); Fri, 2 Aug 2019 05:33:59 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 14EA021773; Fri, 2 Aug 2019 09:33:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1564738438; bh=M/w6pbQZL+fnW24VuEi4Y75ZgS7luQn2ZQs5UJ5lGXE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=AUp0PzJj0mV6HcWe3pZy/l/CErpGPgklg+CVoXIgcVltELIGZexF1GTLGGoOY1OIT g079dhsHq7FNwDbPrtN9bbuahYjFBucVpQWono72snQA/ZsfwXzeHB2VD70UB+WEHM izaIw21AtYhwZUEzeBuYZ8XRXoK0nY7rv+j8Ujcc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Justin Chen , Florian Fainelli , "David S. Miller" Subject: [PATCH 4.4 089/158] net: bcmgenet: use promisc for unsupported filters Date: Fri, 2 Aug 2019 11:28:30 +0200 Message-Id: <20190802092222.458945937@linuxfoundation.org> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190802092203.671944552@linuxfoundation.org> References: <20190802092203.671944552@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Justin Chen [ Upstream commit 35cbef9863640f06107144687bd13151bc2e8ce3 ] Currently we silently ignore filters if we cannot meet the filter requirements. This will lead to the MAC dropping packets that are expected to pass. A better solution would be to set the NIC to promisc mode when the required filters cannot be met. Also correct the number of MDF filters supported. It should be 17, not 16. Signed-off-by: Justin Chen Reviewed-by: Florian Fainelli Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/broadcom/genet/bcmgenet.c | 57 +++++++++++-------------- 1 file changed, 26 insertions(+), 31 deletions(-) --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c @@ -3090,39 +3090,42 @@ static void bcmgenet_timeout(struct net_ netif_tx_wake_all_queues(dev); } -#define MAX_MC_COUNT 16 +#define MAX_MDF_FILTER 17 static inline void bcmgenet_set_mdf_addr(struct bcmgenet_priv *priv, unsigned char *addr, - int *i, - int *mc) + int *i) { - u32 reg; - bcmgenet_umac_writel(priv, addr[0] << 8 | addr[1], UMAC_MDF_ADDR + (*i * 4)); bcmgenet_umac_writel(priv, addr[2] << 24 | addr[3] << 16 | addr[4] << 8 | addr[5], UMAC_MDF_ADDR + ((*i + 1) * 4)); - reg = bcmgenet_umac_readl(priv, UMAC_MDF_CTRL); - reg |= (1 << (MAX_MC_COUNT - *mc)); - bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); *i += 2; - (*mc)++; } static void bcmgenet_set_rx_mode(struct net_device *dev) { struct bcmgenet_priv *priv = netdev_priv(dev); struct netdev_hw_addr *ha; - int i, mc; + int i, nfilter; u32 reg; netif_dbg(priv, hw, dev, "%s: %08X\n", __func__, dev->flags); - /* Promiscuous mode */ + /* Number of filters needed */ + nfilter = netdev_uc_count(dev) + netdev_mc_count(dev) + 2; + + /* + * Turn on promicuous mode for three scenarios + * 1. IFF_PROMISC flag is set + * 2. IFF_ALLMULTI flag is set + * 3. The number of filters needed exceeds the number filters + * supported by the hardware. + */ reg = bcmgenet_umac_readl(priv, UMAC_CMD); - if (dev->flags & IFF_PROMISC) { + if ((dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) || + (nfilter > MAX_MDF_FILTER)) { reg |= CMD_PROMISC; bcmgenet_umac_writel(priv, reg, UMAC_CMD); bcmgenet_umac_writel(priv, 0, UMAC_MDF_CTRL); @@ -3132,32 +3135,24 @@ static void bcmgenet_set_rx_mode(struct bcmgenet_umac_writel(priv, reg, UMAC_CMD); } - /* UniMac doesn't support ALLMULTI */ - if (dev->flags & IFF_ALLMULTI) { - netdev_warn(dev, "ALLMULTI is not supported\n"); - return; - } - /* update MDF filter */ i = 0; - mc = 0; /* Broadcast */ - bcmgenet_set_mdf_addr(priv, dev->broadcast, &i, &mc); + bcmgenet_set_mdf_addr(priv, dev->broadcast, &i); /* my own address.*/ - bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i, &mc); - /* Unicast list*/ - if (netdev_uc_count(dev) > (MAX_MC_COUNT - mc)) - return; + bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i); - if (!netdev_uc_empty(dev)) - netdev_for_each_uc_addr(ha, dev) - bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); - /* Multicast */ - if (netdev_mc_empty(dev) || netdev_mc_count(dev) >= (MAX_MC_COUNT - mc)) - return; + /* Unicast */ + netdev_for_each_uc_addr(ha, dev) + bcmgenet_set_mdf_addr(priv, ha->addr, &i); + /* Multicast */ netdev_for_each_mc_addr(ha, dev) - bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); + bcmgenet_set_mdf_addr(priv, ha->addr, &i); + + /* Enable filters */ + reg = GENMASK(MAX_MDF_FILTER - 1, MAX_MDF_FILTER - nfilter); + bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); } /* Set the hardware MAC address. */