From patchwork Fri May 26 06:37:34 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 767262 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3wYxLL1xR5z9s7h for ; Fri, 26 May 2017 16:39:06 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b="vBHLnVoE"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S970587AbdEZGjE (ORCPT ); Fri, 26 May 2017 02:39:04 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:35586 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S970581AbdEZGiA (ORCPT ); Fri, 26 May 2017 02:38:00 -0400 Received: by mail-wm0-f65.google.com with SMTP id g15so1684481wmc.2 for ; Thu, 25 May 2017 23:38:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=resnulli-us.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=l8uq9T/aHcefZvSkuDuRLbd41F1ITpphZutsFjIXhrM=; b=vBHLnVoEAQhLGlp1gVaqKVr/hq/3idOxGNJJEWZw/E/vJjQbFnnW2fi36IeVVeOfUl 3ro4AIh4IzUnCOunQ5QKJ4QJ732zca6msS1EL38oRrCriozpeCiAwFKzZ6ZGZrTgSnSj M3mPIAkml3Ij+ViwNFOyrruKZ4MR/fqDo5UnH9IvGYaGtnbOw1/tcxL0o7eM5BlyQDNP QXLtoHrADcqtNL2cYEBnBZ9+DS6rtDn9Zh13DzhwqKGvicANY4MgB8pN4ds95UOJW9Xi ku+YiR9O2uIk9RrgxZeCFIs58uHy0cLcXX37vumtbV5Loa7xmhQjMxxzUjH6gpcowDSA hVdA== 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=l8uq9T/aHcefZvSkuDuRLbd41F1ITpphZutsFjIXhrM=; b=SgL0v/7DbIIqfa7ruqV/ql6Zkl3pFP5P01l4CdjzynKrQhSQo+RQwpB+Vdu/xwHpc9 E2QW095+WvgX9cqBAAs4zJTMYIxZLBj/ki7FSwZdx/HEDAeGMwUTC1Dn/cOJ2dKT0ztb qcIKFTq3uDJgfFAXw5Zp822p75d13dq9echIO8JsleN3fFVbHeH6mDcBa/Ee9PITarzl gcwtckzT2wd6s6Ln481XaK7BkRqBO6zOcoeAm6/2m1m6RLaQiWHU0M/H/FtO2WK75peu DQh0JDGgSpfsQG/GDRFe7A+xGnEvku8iQgNOKke4S0Sor79g2b8ICYDSC4iRvwmVRL0s w/pA== X-Gm-Message-State: AODbwcA39QW+GvEazJ4R/CxA1P8VA61Vr9+i2WR+2HGMO5TucZ2T5d8B vbIiSz8ByRCFFpdNH9s= X-Received: by 10.28.165.210 with SMTP id o201mr11523387wme.8.1495780679033; Thu, 25 May 2017 23:37:59 -0700 (PDT) Received: from localhost (ip-78-45-162-3.net.upcbroadband.cz. [78.45.162.3]) by smtp.gmail.com with ESMTPSA id q77sm932130wmb.4.2017.05.25.23.37.58 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 25 May 2017 23:37:58 -0700 (PDT) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, idosch@mellanox.com, mlxsw@mellanox.com, stephen@networkplumber.org, nikolay@cumulusnetworks.com Subject: [patch net-next 12/18] mlxsw: spectrum_router: Extend the RIF struct Date: Fri, 26 May 2017 08:37:34 +0200 Message-Id: <20170526063740.8909-13-jiri@resnulli.us> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170526063740.8909-1-jiri@resnulli.us> References: <20170526063740.8909-1-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Ido Schimmel Currently, when a Subport RIF is configured, the LAG status and VLAN of the underlying port are read from the port itself. This is problematic, as we would like to have common code to configure all types of RIFs, which aren't necessarily bound to a port. Instead, embed the RIF in a struct specific to the Subport type, which contains all the necessary information. Signed-off-by: Ido Schimmel Signed-off-by: Jiri Pirko --- .../net/ethernet/mellanox/mlxsw/spectrum_router.c | 31 +++++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c index e81d45c..28ba5d3 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c @@ -97,6 +97,16 @@ struct mlxsw_sp_rif { bool counter_egress_valid; }; +struct mlxsw_sp_rif_subport { + struct mlxsw_sp_rif common; + union { + u16 system_port; + u16 lag_id; + }; + u16 vid; + bool lag; +}; + static unsigned int * mlxsw_sp_rif_p_counter_get(struct mlxsw_sp_rif *rif, enum mlxsw_sp_rif_counter_dir dir) @@ -2965,11 +2975,13 @@ mlxsw_sp_rfid_alloc(u16 fid, struct net_device *l3_dev) static struct mlxsw_sp_rif * mlxsw_sp_rif_alloc(u16 rif_index, u16 vr_id, struct net_device *l3_dev, - struct mlxsw_sp_fid *f) + struct mlxsw_sp_fid *f, bool is_subport) { + size_t size = is_subport ? sizeof(struct mlxsw_sp_rif_subport) : + sizeof(struct mlxsw_sp_rif); struct mlxsw_sp_rif *rif; - rif = kzalloc(sizeof(*rif), GFP_KERNEL); + rif = kzalloc(size, GFP_KERNEL); if (!rif) return NULL; @@ -3007,6 +3019,7 @@ mlxsw_sp_port_vlan_rif_sp_create(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan, { struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port; struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; + struct mlxsw_sp_rif_subport *rif_subport; u32 tb_id = l3mdev_fib_table(l3_dev); struct mlxsw_sp_vr *vr; struct mlxsw_sp_fid *f; @@ -3029,12 +3042,22 @@ mlxsw_sp_port_vlan_rif_sp_create(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan, goto err_vr_get; } - rif = mlxsw_sp_rif_alloc(rif_index, vr->id, l3_dev, f); + rif = mlxsw_sp_rif_alloc(rif_index, vr->id, l3_dev, f, true); if (!rif) { err = -ENOMEM; goto err_rif_alloc; } + rif_subport = container_of(rif, struct mlxsw_sp_rif_subport, common); + rif_subport->vid = mlxsw_sp_port_vlan->vid; + if (mlxsw_sp_port->lagged) { + rif_subport->lag = true; + rif_subport->lag_id = mlxsw_sp_port->lag_id; + } else { + rif_subport->lag = false; + rif_subport->system_port = mlxsw_sp_port->local_port; + } + err = mlxsw_sp_port_vlan_rif_sp_op(mlxsw_sp_port_vlan, vr->id, l3_dev, rif_index, true); if (err) @@ -3341,7 +3364,7 @@ static int mlxsw_sp_rif_bridge_create(struct mlxsw_sp *mlxsw_sp, if (err) goto err_port_flood_set; - rif = mlxsw_sp_rif_alloc(rif_index, vr->id, l3_dev, f); + rif = mlxsw_sp_rif_alloc(rif_index, vr->id, l3_dev, f, false); if (!rif) { err = -ENOMEM; goto err_rif_alloc;