linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Florian Fainelli <f.fainelli@gmail.com>
To: netdev@vger.kernel.org
Cc: Florian Fainelli <f.fainelli@gmail.com>,
	Michael Chan <michael.chan@broadcom.com>,
	"David S. Miller" <davem@davemloft.net>,
	Derek Chickles <dchickles@marvell.com>,
	Satanand Burla <sburla@marvell.com>,
	Felix Manlunas <fmanlunas@marvell.com>,
	Saeed Mahameed <saeedm@mellanox.com>,
	Leon Romanovsky <leon@kernel.org>, Jiri Pirko <jiri@mellanox.com>,
	Ido Schimmel <idosch@mellanox.com>,
	Alexandre Belloni <alexandre.belloni@bootlin.com>,
	Microchip Linux Driver Support <UNGLinuxDriver@microchip.com>,
	Jakub Kicinski <jakub.kicinski@netronome.com>,
	Ioana Radulescu <ruxandra.radulescu@nxp.com>,
	Ioana Ciornei <ioana.ciornei@nxp.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Ivan Vecera <ivecera@redhat.com>, Andrew Lunn <andrew@lunn.ch>,
	Vivien Didelot <vivien.didelot@gmail.com>,
	Dirk van der Merwe <dirk.vandermerwe@netronome.com>,
	"Francois H. Theron" <francois.theron@netronome.com>,
	Simon Horman <simon.horman@netronome.com>,
	Quentin Monnet <quentin.monnet@netronome.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Eric Dumazet <edumazet@google.com>,
	John Hurley <john.hurley@netronome.com>,
	Edwin Peer <edwin.peer@netronome.com>,
	linux-kernel@vger.kernel.org (open list),
	linux-rdma@vger.kernel.org (open list:MELLANOX MLX5 core VPI
	driver),
	oss-drivers@netronome.com (open list:NETRONOME ETHERNET DRIVERS),
	devel@driverdev.osuosl.org (open list:STAGING SUBSYSTEM)
Subject: [RFC net-next 08/13] liquidio: Handle SWITCHDEV_PORT_ATTR_GET event
Date: Fri,  1 Feb 2019 14:06:52 -0800	[thread overview]
Message-ID: <20190201220657.30170-9-f.fainelli@gmail.com> (raw)
In-Reply-To: <20190201220657.30170-1-f.fainelli@gmail.com>

Following patches will change the way we communicate getting or setting
a port's attribute and use a blocking notifier to perform those tasks.

Prepare bnxt to support receiving notifier events targeting
SWITCHDEV_PORT_ATTR_GET and simply translate that into the existing
switchdev_ops::switchdev_port_attr_get operation.

We register a single blocking switchdev notifier for the PF part of the
driver, and we register another blocking switchdev notifier, following
what was done with the existing netdevice notifier within the VF
representor driver.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 .../net/ethernet/cavium/liquidio/lio_main.c   | 48 ++++++++++++++++++-
 .../net/ethernet/cavium/liquidio/lio_vf_rep.c | 45 ++++++++++++++++-
 2 files changed, 91 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c
index 3d24133e5e49..b9d48e4181fc 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c
@@ -162,6 +162,8 @@ static int liquidio_set_vf_link_state(struct net_device *netdev, int vfidx,
 
 static struct handshake handshake[MAX_OCTEON_DEVICES];
 static struct completion first_stage;
+static int liquidio_switchdev_blocking_event(struct notifier_block *nb,
+					     unsigned long event, void *ptr);
 
 static void octeon_droq_bh(unsigned long pdev)
 {
@@ -469,12 +471,25 @@ static struct pci_driver liquidio_pci_driver = {
 #endif
 };
 
+static struct notifier_block liquidio_blocking_nb = {
+	.notifier_call = liquidio_switchdev_blocking_event,
+};
+
 /**
  * \brief register PCI driver
  */
 static int liquidio_init_pci(void)
 {
-	return pci_register_driver(&liquidio_pci_driver);
+	int rc;
+
+	rc = register_switchdev_blocking_notifier(&liquidio_blocking_nb);
+	if (rc)
+		return rc;
+	rc = pci_register_driver(&liquidio_pci_driver);
+	if (rc)
+		unregister_switchdev_blocking_notifier(&liquidio_blocking_nb);
+
+	return rc;
 }
 
 /**
@@ -483,6 +498,7 @@ static int liquidio_init_pci(void)
 static void liquidio_deinit_pci(void)
 {
 	pci_unregister_driver(&liquidio_pci_driver);
+	unregister_switchdev_blocking_notifier(&liquidio_blocking_nb);
 }
 
 /**
@@ -3261,6 +3277,36 @@ static const struct net_device_ops lionetdevops = {
 	.ndo_get_vf_stats	= liquidio_get_vf_stats,
 };
 
+static int lio_pf_attr_event(unsigned long event, struct net_device *dev,
+		struct switchdev_notifier_port_attr_info *port_attr_info)
+{
+	int rc;
+
+	if (event != SWITCHDEV_PORT_ATTR_GET)
+		return NOTIFY_DONE;
+
+	rc = lio_pf_switchdev_attr_get(dev, port_attr_info->attr);
+
+	port_attr_info->handled = true;
+	return notifier_from_errno(rc);
+}
+
+static int liquidio_switchdev_blocking_event(struct notifier_block *nb,
+					     unsigned long event, void *ptr)
+{
+	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
+
+	if (dev->netdev_ops != &lionetdevops)
+		return NOTIFY_DONE;
+
+	switch (event) {
+	case SWITCHDEV_PORT_ATTR_GET:
+		return lio_pf_attr_event(event, dev, ptr);
+	}
+
+	return NOTIFY_DONE;
+}
+
 /** \brief Entry point for the liquidio module
  */
 static int __init liquidio_init(void)
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
index de61060721c4..d396c004c1be 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
@@ -468,6 +468,21 @@ static const struct switchdev_ops lio_vf_rep_switchdev_ops = {
 	.switchdev_port_attr_get        = lio_vf_rep_attr_get,
 };
 
+static int lio_vf_rep_swdev_port_attr_event(unsigned long event,
+		struct net_device *dev,
+		struct switchdev_notifier_port_attr_info *port_attr_info)
+{
+	int rc;
+
+	if (event != SWITCHDEV_PORT_ATTR_GET)
+		return NOTIFY_DONE;
+
+	rc = lio_vf_rep_attr_get(dev, port_attr_info->attr);
+	port_attr_info->handled = true;
+
+	return notifier_from_errno(rc);
+}
+
 static void
 lio_vf_rep_fetch_stats(struct work_struct *work)
 {
@@ -538,7 +553,6 @@ lio_vf_rep_create(struct octeon_device *oct)
 
 		if (register_netdev(ndev)) {
 			dev_err(&oct->pci_dev->dev, "VF rep nerdev registration failed\n");
-
 			free_netdev(ndev);
 			goto cleanup;
 		}
@@ -664,20 +678,49 @@ static struct notifier_block lio_vf_rep_netdev_notifier = {
 	.notifier_call = lio_vf_rep_netdev_event,
 };
 
+static int lio_vf_rep_swdev_event(struct notifier_block *nb,
+				  unsigned long event, void *ptr)
+{
+	struct net_device *ndev = switchdev_notifier_info_to_dev(ptr);
+
+	if (ndev->netdev_ops != &lio_vf_rep_ndev_ops)
+		return NOTIFY_DONE;
+
+	switch (event) {
+	case SWITCHDEV_PORT_ATTR_GET:
+		return lio_vf_rep_swdev_port_attr_event(event, ndev, ptr);
+	}
+
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block lio_vf_rep_swdev_nb = {
+	.notifier_call = lio_vf_rep_swdev_event,
+};
+
 int
 lio_vf_rep_modinit(void)
 {
+	int rc;
+
 	if (register_netdevice_notifier(&lio_vf_rep_netdev_notifier)) {
 		pr_err("netdev notifier registration failed\n");
 		return -EFAULT;
 	}
 
+	rc = register_switchdev_blocking_notifier(&lio_vf_rep_swdev_nb);
+	if (rc) {
+		unregister_netdevice_notifier(&lio_vf_rep_netdev_notifier);
+		return rc;
+	}
+
 	return 0;
 }
 
 void
 lio_vf_rep_modexit(void)
 {
+	unregister_switchdev_blocking_notifier(&lio_vf_rep_swdev_nb);
 	if (unregister_netdevice_notifier(&lio_vf_rep_netdev_notifier))
 		pr_err("netdev notifier unregister failed\n");
 }
-- 
2.17.1


  parent reply	other threads:[~2019-02-01 22:08 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-01 22:06 [RFC net-next 00/13] Get rid of switchdev_ops Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 01/13] switchdev: Add SWITCHDEV_PORT_ATTR_SET, SWITCHDEV_PORT_ATTR_GET Florian Fainelli
2019-02-02 15:48   ` Jiri Pirko
2019-02-01 22:06 ` [RFC net-next 02/13] rocker: Handle SWITCHDEV_PORT_ATTR_GET/SET Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 03/13] net: dsa: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 04/13] mlxsw: spectrum_switchdev: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 05/13] net: mscc: ocelot: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 06/13] staging: fsl-dpaa2: ethsw: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 07/13] bnxt: Handle SWITCHDEV_PORT_ATTR_GET event Florian Fainelli
2019-02-01 22:06 ` Florian Fainelli [this message]
2019-02-01 22:06 ` [RFC net-next 09/13] mlxsw: switchx2: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 10/13] net/mlx5e: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 11/13] nfp: " Florian Fainelli
2019-02-02  3:45   ` Jakub Kicinski
2019-02-02  4:22     ` Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 12/13] netdevsim: " Florian Fainelli
2019-02-01 22:06 ` [RFC net-next 13/13] net: switchdev: Replace port attr get/set SDO with a notification Florian Fainelli
2019-02-02 15:52 ` [RFC net-next 00/13] Get rid of switchdev_ops Jiri Pirko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190201220657.30170-9-f.fainelli@gmail.com \
    --to=f.fainelli@gmail.com \
    --cc=UNGLinuxDriver@microchip.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=andrew@lunn.ch \
    --cc=daniel@iogearbox.net \
    --cc=davem@davemloft.net \
    --cc=dchickles@marvell.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=dirk.vandermerwe@netronome.com \
    --cc=edumazet@google.com \
    --cc=edwin.peer@netronome.com \
    --cc=fmanlunas@marvell.com \
    --cc=francois.theron@netronome.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=idosch@mellanox.com \
    --cc=ioana.ciornei@nxp.com \
    --cc=ivecera@redhat.com \
    --cc=jakub.kicinski@netronome.com \
    --cc=jiri@mellanox.com \
    --cc=john.hurley@netronome.com \
    --cc=leon@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=michael.chan@broadcom.com \
    --cc=netdev@vger.kernel.org \
    --cc=oss-drivers@netronome.com \
    --cc=quentin.monnet@netronome.com \
    --cc=ruxandra.radulescu@nxp.com \
    --cc=saeedm@mellanox.com \
    --cc=sburla@marvell.com \
    --cc=simon.horman@netronome.com \
    --cc=vivien.didelot@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).