From patchwork Thu Dec 3 11:12:30 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Pirko X-Patchwork-Id: 552162 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 A6A831402C4 for ; Thu, 3 Dec 2015 22:13:21 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=resnulli-us.20150623.gappssmtp.com header.i=@resnulli-us.20150623.gappssmtp.com header.b=JnQSbMTH; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1759898AbbLCLNQ (ORCPT ); Thu, 3 Dec 2015 06:13:16 -0500 Received: from mail-wm0-f51.google.com ([74.125.82.51]:35465 "EHLO mail-wm0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1760018AbbLCLNM (ORCPT ); Thu, 3 Dec 2015 06:13:12 -0500 Received: by wmuu63 with SMTP id u63so16411339wmu.0 for ; Thu, 03 Dec 2015 03:13:11 -0800 (PST) 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=bjghQSmgI9x/X9WRuDb7gPeebuapapPnciJ7937kFSg=; b=JnQSbMTHsEFUJK5DnFN/DFdcfomdHlPZVI3+7FcafMmqAxLR0WBNiR7cnJUZizhQ9T AQWpBhC9YTtjkytM5OOhENvquo9pWpGqfmwvPCa/JYo6B7QCG1ZKuTymh3VXlDYod2TV KW6pJPFtpIk4zlINQkN2prsWpGE8xDEA6Ox5cwfxOmvLnE/vX8hVDSZq2Dwm4w9kgOZn 8VZ/nCgYaGgGpDXR4vySJco5P9pL3wZtSdT2yhQYUyLu7efzcCFSlrRC4ZC13SmJXjXk zO6UrYT6VpWKAnSx7DJUzLRBTySYWyxeqd52ZkMaxByd9iLMBxgNYUdWdXXDA5njr9Yv qhuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=bjghQSmgI9x/X9WRuDb7gPeebuapapPnciJ7937kFSg=; b=hJkcvVga3+vLIpTvxeysaqv2JzAfI6Xnyf7n//pDEkGW3SRn243TcM3+ObdY1RWSab KS9vs2vJpQngp8r0Auun2GFGaQ/OpP90yXeBY7hrLVcKXGntN6fuaFPib0p056l1U6Rq JP1gnXM3Ihw5rvdvH8r4R4mOuk023J0e4O0/gyRGScg1+fc1DgAq9ycoaxDxu9tkNUQC +xaGAvmCaeTC+XOVDEuW1EcVhn5URWtGrIicV9mJ9E3UY1iUdwNiM3VHJYcwTULbprzC kDpyq55yYnD82dausfSEKmzQjx2bhbhBUpKnTf0liqTAaQE11DvU4yzg63ksYUTAZMaq pv8A== X-Gm-Message-State: ALoCoQlsDH2bbhNYt+XJvFZjASyobfVXsWrRfX2OaZLLP16aHCpnw8uxBDlIFIH9P25JwVclzgBd X-Received: by 10.195.11.101 with SMTP id eh5mr10444229wjd.104.1449141191081; Thu, 03 Dec 2015 03:13:11 -0800 (PST) Received: from localhost (ip-94-113-120-24.net.upcbroadband.cz. [94.113.120.24]) by smtp.gmail.com with ESMTPSA id v4sm7059649wjx.18.2015.12.03.03.13.10 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 03 Dec 2015 03:13:10 -0800 (PST) From: Jiri Pirko To: netdev@vger.kernel.org Cc: davem@davemloft.net, idosch@mellanox.com, eladr@mellanox.com, yotamg@mellanox.com, ogerlitz@mellanox.com, j.vosburgh@gmail.com, vfalico@gmail.com, gospo@cumulusnetworks.com, dsa@cumulusnetworks.com, nikolay@cumulusnetworks.com, pjonnala@broadcom.com, f.fainelli@gmail.com, sfeldma@gmail.com, john.fastabend@gmail.com, roopa@cumulusnetworks.com, andrew@lunn.ch Subject: [patch net-next v3 28/28] mlxsw: spectrum: Implement LAG tx enabled lower state change Date: Thu, 3 Dec 2015 12:12:30 +0100 Message-Id: <1449141150-8172-29-git-send-email-jiri@resnulli.us> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1449141150-8172-1-git-send-email-jiri@resnulli.us> References: <1449141150-8172-1-git-send-email-jiri@resnulli.us> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Jiri Pirko Enabling/disabling TX on a LAG port means enabling/disabling distribution in our HW. Signed-off-by: Jiri Pirko --- drivers/net/ethernet/mellanox/mlxsw/spectrum.c | 81 +++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c index 7d1f0a8..3ec07b9 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c @@ -2108,8 +2108,47 @@ static int mlxsw_sp_port_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port, return 0; } -static int mlxsw_sp_netdevice_port_event(struct net_device *dev, - unsigned long event, void *ptr) +static int mlxsw_sp_lag_dist_port_add(struct mlxsw_sp_port *mlxsw_sp_port, + u16 lag_id) +{ + struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; + char sldr_pl[MLXSW_REG_SLDR_LEN]; + + mlxsw_reg_sldr_lag_add_port_pack(sldr_pl, lag_id, + mlxsw_sp_port->local_port); + return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sldr), sldr_pl); +} + +static int mlxsw_sp_lag_dist_port_remove(struct mlxsw_sp_port *mlxsw_sp_port, + u16 lag_id) +{ + struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; + char sldr_pl[MLXSW_REG_SLDR_LEN]; + + mlxsw_reg_sldr_lag_remove_port_pack(sldr_pl, lag_id, + mlxsw_sp_port->local_port); + return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sldr), sldr_pl); +} + +static int mlxsw_sp_port_lag_tx_en_set(struct mlxsw_sp_port *mlxsw_sp_port, + bool lag_tx_enabled) +{ + if (lag_tx_enabled) + return mlxsw_sp_lag_dist_port_add(mlxsw_sp_port, + mlxsw_sp_port->lag_id); + else + return mlxsw_sp_lag_dist_port_remove(mlxsw_sp_port, + mlxsw_sp_port->lag_id); +} + +static int mlxsw_sp_port_lag_changed(struct mlxsw_sp_port *mlxsw_sp_port, + struct netdev_lag_lower_state_info *info) +{ + return mlxsw_sp_port_lag_tx_en_set(mlxsw_sp_port, info->tx_enabled); +} + +static int mlxsw_sp_netdevice_port_upper_event(struct net_device *dev, + unsigned long event, void *ptr) { struct netdev_notifier_changeupper_info *info; struct mlxsw_sp_port *mlxsw_sp_port; @@ -2176,6 +2215,44 @@ static int mlxsw_sp_netdevice_port_event(struct net_device *dev, return NOTIFY_DONE; } +static int mlxsw_sp_netdevice_port_lower_event(struct net_device *dev, + unsigned long event, void *ptr) +{ + struct netdev_notifier_changelowerstate_info *info; + struct mlxsw_sp_port *mlxsw_sp_port; + int err; + + mlxsw_sp_port = netdev_priv(dev); + info = ptr; + + switch (event) { + case NETDEV_CHANGELOWERSTATE: + if (netif_is_lag_port(dev) && mlxsw_sp_port->lagged) { + err = mlxsw_sp_port_lag_changed(mlxsw_sp_port, + info->lower_state_info); + if (err) + netdev_err(dev, "Failed to reflect link aggregation lower state change\n"); + } + break; + } + + return NOTIFY_DONE; +} + +static int mlxsw_sp_netdevice_port_event(struct net_device *dev, + unsigned long event, void *ptr) +{ + switch (event) { + case NETDEV_PRECHANGEUPPER: + case NETDEV_CHANGEUPPER: + return mlxsw_sp_netdevice_port_upper_event(dev, event, ptr); + case NETDEV_CHANGELOWERSTATE: + return mlxsw_sp_netdevice_port_lower_event(dev, event, ptr); + } + + return NOTIFY_DONE; +} + static int mlxsw_sp_netdevice_lag_event(struct net_device *lag_dev, unsigned long event, void *ptr) {