From patchwork Fri Oct 20 21:39:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Fainelli X-Patchwork-Id: 828824 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="CzZsWnNA"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3yJfN80FHbz9t3C for ; Sat, 21 Oct 2017 08:40:08 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753002AbdJTVkF (ORCPT ); Fri, 20 Oct 2017 17:40:05 -0400 Received: from mail-qk0-f195.google.com ([209.85.220.195]:43024 "EHLO mail-qk0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752915AbdJTVkC (ORCPT ); Fri, 20 Oct 2017 17:40:02 -0400 Received: by mail-qk0-f195.google.com with SMTP id w134so16003031qkb.0 for ; Fri, 20 Oct 2017 14:40:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=k7L5MZyW1vFtvSPDnKO6fRsDxiv/R7OJbou4NwkfAzc=; b=CzZsWnNAGZNcl+kCnfindrWn2Dt2xAdHrK/UjXZda9fGhh4TrEtUqXDuyaLno1Un/1 pHGz/d2iWmMVNxd8T8WbQwhfJ+piiRsRDzUGJbmVkXZksZUQMCVTOULsi2B2uvEeb8m2 /i1dVMUXEV3oZN52UpE566ZaI927Fnt3jlyJG7OGu1BS6DzJbBfxUgLUGKTmrfF4pHKO nvw11WPCltchInzRludngg9+fCecYELpOJzaWLXaxD6tlIWUO4pF5ROO6QEgJmpTxdaj 1DzjUpWPgYdyoaC2RLFnXI6FoeCdvXSmi7FC3C1cMFm6/BJL+hJd4U5Yv5eC4g1VNwnH lFjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=k7L5MZyW1vFtvSPDnKO6fRsDxiv/R7OJbou4NwkfAzc=; b=BF4062k4xPyz3C4phNX0K0inEtldKXTvK+u//uhdKzU9uH3FUEy5nSr68cXu7+6PC2 sYvh3AGqWxIecZMOFSzGrix7BAWSV+Hab22VOwLB/MO2oX/mc1uxSnjOK2sZ5kcw7Y7c /xPxqdzLaeRx6mUwgOVyN/hvnGnVgsc+63GL9+Nw2p5Wsq+0JsWnwwTarjUtguAIMK76 woc8TN6My3VbzXcXGmdY6aWqH/6FRf6DeNW25V+lNhUWMiyLdJx68ZWGYmQcyul7XPHP qznQO9oo7ujKzQoAOkaGxbCnSkh06nc53qKbZaWFh9eWXugij+571Vp1CM0ri/MSBAk6 yAzg== X-Gm-Message-State: AMCzsaXs3hVTTUAMpjZuiYYxGpa77OFpYGUEIqH1g67AYbVN34H3RiC+ fur567XapIDVeEUtSm3hBRpOAC/6 X-Google-Smtp-Source: ABhQp+RCDejnHymN3N0IIkDf4wyRcgtr3UomOTnwNqIyFOYtKW/GyJ2wl+pyNa48JWek3XedFNrTfg== X-Received: by 10.55.92.195 with SMTP id q186mr8433435qkb.154.1508535601409; Fri, 20 Oct 2017 14:40:01 -0700 (PDT) Received: from stb-bld-03.irv.broadcom.com ([192.19.255.250]) by smtp.gmail.com with ESMTPSA id d193sm1176956qkg.88.2017.10.20.14.39.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 20 Oct 2017 14:40:00 -0700 (PDT) From: Florian Fainelli To: netdev@vger.kernel.org Cc: andrew@lunn.ch, vivien.didelot@savoirfairelinux.com, davem@davemloft.net, Florian Fainelli Subject: [PATCH net-next v2 4/7] net: dsa: bcm_sf2: Simplify bcm_sf2_cfp_rule_get_all() Date: Fri, 20 Oct 2017 14:39:46 -0700 Message-Id: <20171020213949.16485-5-f.fainelli@gmail.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171020213949.16485-1-f.fainelli@gmail.com> References: <20171020213949.16485-1-f.fainelli@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org There is no need to do a HW search of the TCAMs which is something slow and expensive. Since we already maintain a bitmask of active CFP rules, just iterate over those, starting from bit 1 (after the reserved entry) to get a count and index position to store the rule later on. As a result we can remove the code in bcm_sf2_cfp_rule_get() which acted on the "search" argument, and remove that argument. Signed-off-by: Florian Fainelli --- drivers/net/dsa/bcm_sf2_cfp.c | 68 +++++++++---------------------------------- 1 file changed, 14 insertions(+), 54 deletions(-) diff --git a/drivers/net/dsa/bcm_sf2_cfp.c b/drivers/net/dsa/bcm_sf2_cfp.c index d033fc6440c4..9c8299580795 100644 --- a/drivers/net/dsa/bcm_sf2_cfp.c +++ b/drivers/net/dsa/bcm_sf2_cfp.c @@ -491,28 +491,24 @@ static int bcm_sf2_cfp_ipv4_rule_get(struct bcm_sf2_priv *priv, int port, } static int bcm_sf2_cfp_rule_get(struct bcm_sf2_priv *priv, int port, - struct ethtool_rxnfc *nfc, bool search) + struct ethtool_rxnfc *nfc) { struct ethtool_tcpip4_spec *v4_spec = NULL, *v4_m_spec; unsigned int queue_num; u32 reg; int ret; - if (!search) { - bcm_sf2_cfp_rule_addr_set(priv, nfc->fs.location); + bcm_sf2_cfp_rule_addr_set(priv, nfc->fs.location); - ret = bcm_sf2_cfp_op(priv, OP_SEL_READ | ACT_POL_RAM); - if (ret) - return ret; + ret = bcm_sf2_cfp_op(priv, OP_SEL_READ | ACT_POL_RAM); + if (ret) + return ret; - reg = core_readl(priv, CORE_ACT_POL_DATA0); + reg = core_readl(priv, CORE_ACT_POL_DATA0); - ret = bcm_sf2_cfp_op(priv, OP_SEL_READ | TCAM_SEL); - if (ret) - return ret; - } else { - reg = core_readl(priv, CORE_ACT_POL_DATA0); - } + ret = bcm_sf2_cfp_op(priv, OP_SEL_READ | TCAM_SEL); + if (ret) + return ret; /* Extract the destination port */ nfc->fs.ring_cookie = fls((reg >> DST_MAP_IB_SHIFT) & @@ -541,9 +537,6 @@ static int bcm_sf2_cfp_rule_get(struct bcm_sf2_priv *priv, int port, v4_m_spec = &nfc->fs.m_u.udp_ip4_spec; break; default: - /* Clear to exit the search process */ - if (search) - core_readl(priv, CORE_CFP_DATA_PORT(7)); return -EINVAL; } @@ -577,44 +570,11 @@ static int bcm_sf2_cfp_rule_get_all(struct bcm_sf2_priv *priv, u32 *rule_locs) { unsigned int index = 1, rules_cnt = 0; - int ret; - u32 reg; - /* Do not poll on OP_STR_DONE to be self-clearing for search - * operations, we cannot use bcm_sf2_cfp_op here because it completes - * on clearing OP_STR_DONE which won't clear until the entire search - * operation is over. - */ - reg = core_readl(priv, CORE_CFP_ACC); - reg &= ~(XCESS_ADDR_MASK << XCESS_ADDR_SHIFT); - reg |= index << XCESS_ADDR_SHIFT; - reg &= ~(OP_SEL_MASK | RAM_SEL_MASK); - reg |= OP_SEL_SEARCH | TCAM_SEL | OP_STR_DONE; - core_writel(priv, reg, CORE_CFP_ACC); - - do { - /* Wait for results to be ready */ - reg = core_readl(priv, CORE_CFP_ACC); - - /* Extract the address we are searching */ - index = reg >> XCESS_ADDR_SHIFT; - index &= XCESS_ADDR_MASK; - - /* We have a valid search result, so flag it accordingly */ - if (reg & SEARCH_STS) { - ret = bcm_sf2_cfp_rule_get(priv, port, nfc, true); - if (ret) - continue; - - rule_locs[rules_cnt] = index; - rules_cnt++; - } - - /* Search is over break out */ - if (!(reg & OP_STR_DONE)) - break; - - } while (index < priv->num_cfp_rules); + for_each_set_bit_from(index, priv->cfp.used, priv->num_cfp_rules) { + rule_locs[rules_cnt] = index; + rules_cnt++; + } /* Put the TCAM size here */ nfc->data = bcm_sf2_cfp_rule_size(priv); @@ -640,7 +600,7 @@ int bcm_sf2_get_rxnfc(struct dsa_switch *ds, int port, nfc->data |= RX_CLS_LOC_SPECIAL; break; case ETHTOOL_GRXCLSRULE: - ret = bcm_sf2_cfp_rule_get(priv, port, nfc, false); + ret = bcm_sf2_cfp_rule_get(priv, port, nfc); break; case ETHTOOL_GRXCLSRLALL: ret = bcm_sf2_cfp_rule_get_all(priv, port, nfc, rule_locs);