netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] net: GENET, SYSTEMPORT and DSA netconsole
@ 2015-07-30 19:35 Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 1/4] net: bcmgenet: Add netconsole support Florian Fainelli
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Florian Fainelli @ 2015-07-30 19:35 UTC (permalink / raw)
  To: netdev
  Cc: davem, pgynther, jaedon.shin, Florian Fainelli, vivien.didelot,
	jerome.oufella, linux, andrew, cphealy, mathieu, jonasj76,
	andrey.volkov, Chris.Packham, alexander.h.duyck

Hi all,

This patch series adds support for netconsole in the GENET, SYSTEMPORT and DSA
drivers.

A small refactoring to the DSA transmit path is required to avoid duplicating
the dsa_netpoll_send_skb() into each and every tagging protocol supported.

Testing on e.g: mv643xx_eth and/or e1000e would be much appreciated!

David, this might conflict with my series adding NETIF_F_HW_SWITCH_TAG_{RX,TX},
if so, I will just rebase this one on top of net-next.

Thanks!

Florian Fainelli (4):
  net: bcmgenet: Add netconsole support
  net: systemport: Add netconsole support
  net: dsa: Refactor transmit path
  net: dsa: Add netconsole support

 drivers/net/ethernet/broadcom/bcmsysport.c     | 13 ++++
 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 13 ++++
 net/dsa/dsa_priv.h                             |  8 ++-
 net/dsa/slave.c                                | 83 +++++++++++++++++++++++++-
 net/dsa/tag_brcm.c                             | 15 +----
 net/dsa/tag_dsa.c                              | 12 +---
 net/dsa/tag_edsa.c                             | 12 +---
 net/dsa/tag_trailer.c                          | 12 +---
 8 files changed, 126 insertions(+), 42 deletions(-)

-- 
2.1.0

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH net-next 1/4] net: bcmgenet: Add netconsole support
  2015-07-30 19:35 [PATCH net-next 0/4] net: GENET, SYSTEMPORT and DSA netconsole Florian Fainelli
@ 2015-07-30 19:35 ` Florian Fainelli
       [not found]   ` <CAGXr9JECxcM3gaWh=k4g8c7mNvVyDD_1=80rg_FLXcedC0RHzQ@mail.gmail.com>
  2015-07-30 19:35 ` [PATCH net-next 2/4] net: systemport: " Florian Fainelli
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Florian Fainelli @ 2015-07-30 19:35 UTC (permalink / raw)
  To: netdev
  Cc: davem, pgynther, jaedon.shin, Florian Fainelli, vivien.didelot,
	jerome.oufella, linux, andrew, cphealy, mathieu, jonasj76,
	andrey.volkov, Chris.Packham, alexander.h.duyck

Implement a poll controller for netconsole which invokes the RX
interrupt handler to poll for incoming packets, and cleans up all TX
queues.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index c6f2d396edf0..544160f39c1b 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -2388,6 +2388,16 @@ static irqreturn_t bcmgenet_wol_isr(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void bcmgenet_poll_controller(struct net_device *dev)
+{
+	struct bcmgenet_priv *priv = netdev_priv(dev);
+
+	bcmgenet_isr0(priv->irq0, priv);
+	bcmgenet_tx_reclaim_all(dev);
+}
+#endif
+
 static void bcmgenet_umac_reset(struct bcmgenet_priv *priv)
 {
 	u32 reg;
@@ -2939,6 +2949,9 @@ static const struct net_device_ops bcmgenet_netdev_ops = {
 	.ndo_set_mac_address	= bcmgenet_set_mac_addr,
 	.ndo_do_ioctl		= bcmgenet_ioctl,
 	.ndo_set_features	= bcmgenet_set_features,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	.ndo_poll_controller	= bcmgenet_poll_controller,
+#endif
 };
 
 /* Array of GENET hardware parameters/characteristics */
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 2/4] net: systemport: Add netconsole support
  2015-07-30 19:35 [PATCH net-next 0/4] net: GENET, SYSTEMPORT and DSA netconsole Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 1/4] net: bcmgenet: Add netconsole support Florian Fainelli
@ 2015-07-30 19:35 ` Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 3/4] net: dsa: Refactor transmit path Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 4/4] net: dsa: Add netconsole support Florian Fainelli
  3 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2015-07-30 19:35 UTC (permalink / raw)
  To: netdev
  Cc: davem, pgynther, jaedon.shin, Florian Fainelli, vivien.didelot,
	jerome.oufella, linux, andrew, cphealy, mathieu, jonasj76,
	andrey.volkov, Chris.Packham, alexander.h.duyck

Implement a poll controller for netconsole which invokes the RX
interrupt handler to poll for incoming packets, and cleans up all TX
queues.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 drivers/net/ethernet/broadcom/bcmsysport.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index 4566cdf0bc39..3685924708f6 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -933,6 +933,16 @@ static irqreturn_t bcm_sysport_wol_isr(int irq, void *dev_id)
 	return IRQ_HANDLED;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void bcm_sysport_poll_controller(struct net_device *dev)
+{
+	struct bcm_sysport_priv *priv = netdev_priv(dev);
+
+	bcm_sysport_rx_isr(priv->irq0, priv);
+	bcm_sysport_tx_reclaim_all(priv);
+}
+#endif
+
 static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb,
 					      struct net_device *dev)
 {
@@ -1723,6 +1733,9 @@ static const struct net_device_ops bcm_sysport_netdev_ops = {
 	.ndo_set_features	= bcm_sysport_set_features,
 	.ndo_set_rx_mode	= bcm_sysport_set_rx_mode,
 	.ndo_set_mac_address	= bcm_sysport_change_mac,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	.ndo_poll_controller	= bcm_sysport_poll_controller,
+#endif
 };
 
 #define REV_FMT	"v%2x.%02x"
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 3/4] net: dsa: Refactor transmit path
  2015-07-30 19:35 [PATCH net-next 0/4] net: GENET, SYSTEMPORT and DSA netconsole Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 1/4] net: bcmgenet: Add netconsole support Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 2/4] net: systemport: " Florian Fainelli
@ 2015-07-30 19:35 ` Florian Fainelli
  2015-07-30 19:40   ` Florian Fainelli
  2015-07-30 19:35 ` [PATCH net-next 4/4] net: dsa: Add netconsole support Florian Fainelli
  3 siblings, 1 reply; 7+ messages in thread
From: Florian Fainelli @ 2015-07-30 19:35 UTC (permalink / raw)
  To: netdev
  Cc: davem, pgynther, jaedon.shin, Florian Fainelli, vivien.didelot,
	jerome.oufella, linux, andrew, cphealy, mathieu, jonasj76,
	andrey.volkov, Chris.Packham, alexander.h.duyck

All tagging protocols do the same thing: increment device statistics,
make room for the tag to be inserted, create the tag, invoke the parent
network device transmit function.

In order to prepare for adding netpoll support, which requires the tag
creation, but not using the parent network device transmit function, do
some little refactoring which eliminates duplication between the 4
tagging protocols supported.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 net/dsa/dsa_priv.h    |  4 ++--
 net/dsa/slave.c       | 16 +++++++++++++++-
 net/dsa/tag_brcm.c    | 15 +++------------
 net/dsa/tag_dsa.c     | 12 +++---------
 net/dsa/tag_edsa.c    | 12 +++---------
 net/dsa/tag_trailer.c | 12 +++---------
 6 files changed, 29 insertions(+), 42 deletions(-)

diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h
index d5f1f9b862ea..92ec9d839348 100644
--- a/net/dsa/dsa_priv.h
+++ b/net/dsa/dsa_priv.h
@@ -15,7 +15,7 @@
 #include <linux/netdevice.h>
 
 struct dsa_device_ops {
-	netdev_tx_t (*xmit)(struct sk_buff *skb, struct net_device *dev);
+	int (*xmit)(struct sk_buff *skb, struct net_device *dev);
 	int (*rcv)(struct sk_buff *skb, struct net_device *dev,
 		   struct packet_type *pt, struct net_device *orig_dev);
 };
@@ -26,7 +26,7 @@ struct dsa_slave_priv {
 	 * switch port.
 	 */
 	struct net_device	*dev;
-	netdev_tx_t		(*xmit)(struct sk_buff *skb,
+	int			(*xmit)(struct sk_buff *skb,
 					struct net_device *dev);
 
 	/*
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 0917123790ea..5495c23765ea 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -421,8 +421,22 @@ static int dsa_slave_port_attr_get(struct net_device *dev,
 static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
+	int ret;
+
+	dev->stats.tx_packets++;
+	dev->stats.tx_bytes += skb->len;
 
-	return p->xmit(skb, dev);
+	ret = p->xmit(skb, dev);
+	if (ret)
+		return NETDEV_TX_OK;
+
+	/* Queue the SKB for transmission on the parent interface, but
+	 * do not modify its EtherType
+	 */
+	skb->dev = p->parent->dst->master_netdev;
+	dev_queue_xmit(skb);
+
+	return NETDEV_TX_OK;
 }
 
 static netdev_tx_t dsa_slave_notag_xmit(struct sk_buff *skb,
diff --git a/net/dsa/tag_brcm.c b/net/dsa/tag_brcm.c
index 83d3572cdb20..db16d281e7a4 100644
--- a/net/dsa/tag_brcm.c
+++ b/net/dsa/tag_brcm.c
@@ -58,14 +58,11 @@
 #define BRCM_EG_TC_MASK		0x7
 #define BRCM_EG_PID_MASK	0x1f
 
-static netdev_tx_t brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev)
+static int brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	u8 *brcm_tag;
 
-	dev->stats.tx_packets++;
-	dev->stats.tx_bytes += skb->len;
-
 	if (skb_cow_head(skb, BRCM_TAG_LEN) < 0)
 		goto out_free;
 
@@ -87,17 +84,11 @@ static netdev_tx_t brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev)
 		brcm_tag[2] = BRCM_IG_DSTMAP2_MASK;
 	brcm_tag[3] = (1 << p->port) & BRCM_IG_DSTMAP1_MASK;
 
-	/* Queue the SKB for transmission on the parent interface, but
-	 * do not modify its EtherType
-	 */
-	skb->dev = p->parent->dst->master_netdev;
-	dev_queue_xmit(skb);
-
-	return NETDEV_TX_OK;
+	return 0;
 
 out_free:
 	kfree_skb(skb);
-	return NETDEV_TX_OK;
+	return -ENOMEM;
 }
 
 static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c
index 2dab27063273..e6bd18542a51 100644
--- a/net/dsa/tag_dsa.c
+++ b/net/dsa/tag_dsa.c
@@ -15,14 +15,11 @@
 
 #define DSA_HLEN	4
 
-static netdev_tx_t dsa_xmit(struct sk_buff *skb, struct net_device *dev)
+static int dsa_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	u8 *dsa_header;
 
-	dev->stats.tx_packets++;
-	dev->stats.tx_bytes += skb->len;
-
 	/*
 	 * Convert the outermost 802.1q tag to a DSA tag for tagged
 	 * packets, or insert a DSA tag between the addresses and
@@ -63,14 +60,11 @@ static netdev_tx_t dsa_xmit(struct sk_buff *skb, struct net_device *dev)
 		dsa_header[3] = 0x00;
 	}
 
-	skb->dev = p->parent->dst->master_netdev;
-	dev_queue_xmit(skb);
-
-	return NETDEV_TX_OK;
+	return 0;
 
 out_free:
 	kfree_skb(skb);
-	return NETDEV_TX_OK;
+	return -ENOMEM;
 }
 
 static int dsa_rcv(struct sk_buff *skb, struct net_device *dev,
diff --git a/net/dsa/tag_edsa.c b/net/dsa/tag_edsa.c
index 9aeda596f7ec..2b22d9fc55df 100644
--- a/net/dsa/tag_edsa.c
+++ b/net/dsa/tag_edsa.c
@@ -16,14 +16,11 @@
 #define DSA_HLEN	4
 #define EDSA_HLEN	8
 
-static netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev)
+static int edsa_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	u8 *edsa_header;
 
-	dev->stats.tx_packets++;
-	dev->stats.tx_bytes += skb->len;
-
 	/*
 	 * Convert the outermost 802.1q tag to a DSA tag and prepend
 	 * a DSA ethertype field is the packet is tagged, or insert
@@ -76,14 +73,11 @@ static netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev)
 		edsa_header[7] = 0x00;
 	}
 
-	skb->dev = p->parent->dst->master_netdev;
-	dev_queue_xmit(skb);
-
-	return NETDEV_TX_OK;
+	return 0;
 
 out_free:
 	kfree_skb(skb);
-	return NETDEV_TX_OK;
+	return -ENOMEM;
 }
 
 static int edsa_rcv(struct sk_buff *skb, struct net_device *dev,
diff --git a/net/dsa/tag_trailer.c b/net/dsa/tag_trailer.c
index e268f9db8893..1e90db207f13 100644
--- a/net/dsa/tag_trailer.c
+++ b/net/dsa/tag_trailer.c
@@ -13,16 +13,13 @@
 #include <linux/slab.h>
 #include "dsa_priv.h"
 
-static netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev)
+static int trailer_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 	struct sk_buff *nskb;
 	int padlen;
 	u8 *trailer;
 
-	dev->stats.tx_packets++;
-	dev->stats.tx_bytes += skb->len;
-
 	/*
 	 * We have to make sure that the trailer ends up as the very
 	 * last 4 bytes of the packet.  This means that we have to pad
@@ -36,7 +33,7 @@ static netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev)
 	nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC);
 	if (nskb == NULL) {
 		kfree_skb(skb);
-		return NETDEV_TX_OK;
+		return -ENOMEM;
 	}
 	skb_reserve(nskb, NET_IP_ALIGN);
 
@@ -57,10 +54,7 @@ static netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev)
 	trailer[2] = 0x10;
 	trailer[3] = 0x00;
 
-	nskb->dev = p->parent->dst->master_netdev;
-	dev_queue_xmit(nskb);
-
-	return NETDEV_TX_OK;
+	return 0;
 }
 
 static int trailer_rcv(struct sk_buff *skb, struct net_device *dev,
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH net-next 4/4] net: dsa: Add netconsole support
  2015-07-30 19:35 [PATCH net-next 0/4] net: GENET, SYSTEMPORT and DSA netconsole Florian Fainelli
                   ` (2 preceding siblings ...)
  2015-07-30 19:35 ` [PATCH net-next 3/4] net: dsa: Refactor transmit path Florian Fainelli
@ 2015-07-30 19:35 ` Florian Fainelli
  3 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2015-07-30 19:35 UTC (permalink / raw)
  To: netdev
  Cc: davem, pgynther, jaedon.shin, Florian Fainelli, vivien.didelot,
	jerome.oufella, linux, andrew, cphealy, mathieu, jonasj76,
	andrey.volkov, Chris.Packham, alexander.h.duyck

Add support for using DSA slave network devices with netconsole, which
requires us to allocate and free custom netpoll instances and invoke the
parent network device poll controller callback.

In order for netconsole to work, we need to construct the DSA tag, but
not queue the skb for transmission on the master network device xmit
function.

Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
---
 net/dsa/dsa_priv.h |  4 ++++
 net/dsa/slave.c    | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 71 insertions(+)

diff --git a/net/dsa/dsa_priv.h b/net/dsa/dsa_priv.h
index 92ec9d839348..070210ad7f39 100644
--- a/net/dsa/dsa_priv.h
+++ b/net/dsa/dsa_priv.h
@@ -13,6 +13,7 @@
 
 #include <linux/phy.h>
 #include <linux/netdevice.h>
+#include <linux/netpoll.h>
 
 struct dsa_device_ops {
 	int (*xmit)(struct sk_buff *skb, struct net_device *dev);
@@ -47,6 +48,9 @@ struct dsa_slave_priv {
 	int			old_duplex;
 
 	struct net_device	*bridge_dev;
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	struct netpoll		*netpoll;
+#endif
 };
 
 /* dsa.c */
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 5495c23765ea..360d381c3c56 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -18,6 +18,7 @@
 #include <net/rtnetlink.h>
 #include <net/switchdev.h>
 #include <linux/if_bridge.h>
+#include <linux/netpoll.h>
 #include "dsa_priv.h"
 
 /* slave mii_bus handling ***************************************************/
@@ -418,6 +419,18 @@ static int dsa_slave_port_attr_get(struct net_device *dev,
 	return 0;
 }
 
+static inline netdev_tx_t dsa_netpoll_send_skb(struct dsa_slave_priv *p,
+					       struct sk_buff *skb)
+{
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	if (p->netpoll)
+		netpoll_send_skb(p->netpoll, skb);
+#else
+	BUG();
+#endif
+	return NETDEV_TX_OK;
+}
+
 static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
@@ -430,6 +443,9 @@ static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev)
 	if (ret)
 		return NETDEV_TX_OK;
 
+	if (unlikely(netpoll_tx_running(dev)))
+		return dsa_netpoll_send_skb(p, skb);
+
 	/* Queue the SKB for transmission on the parent interface, but
 	 * do not modify its EtherType
 	 */
@@ -444,6 +460,9 @@ static netdev_tx_t dsa_slave_notag_xmit(struct sk_buff *skb,
 {
 	struct dsa_slave_priv *p = netdev_priv(dev);
 
+	if (unlikely(netpoll_tx_running(dev)))
+		return dsa_netpoll_send_skb(p, skb);
+
 	skb->dev = p->parent->dst->master_netdev;
 	dev_queue_xmit(skb);
 
@@ -679,6 +698,49 @@ static int dsa_slave_get_eee(struct net_device *dev, struct ethtool_eee *e)
 	return ret;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static int dsa_slave_netpoll_setup(struct net_device *dev,
+				   struct netpoll_info *ni)
+{
+	struct dsa_slave_priv *p = netdev_priv(dev);
+	struct dsa_switch *ds = p->parent;
+	struct net_device *master = ds->dst->master_netdev;
+	struct netpoll *netpoll;
+	int err = 0;
+
+	netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL);
+	if (!netpoll)
+		return -ENOMEM;
+
+	err = __netpoll_setup(netpoll, master);
+	if (err) {
+		kfree(netpoll);
+		goto out;
+	}
+
+	p->netpoll = netpoll;
+out:
+	return err;
+}
+
+static void dsa_slave_netpoll_cleanup(struct net_device *dev)
+{
+	struct dsa_slave_priv *p = netdev_priv(dev);
+	struct netpoll *netpoll = p->netpoll;
+
+	if (!netpoll)
+		return;
+
+	p->netpoll = NULL;
+
+	__netpoll_free_async(netpoll);
+}
+
+static void dsa_slave_poll_controller(struct net_device *dev)
+{
+}
+#endif
+
 static const struct ethtool_ops dsa_slave_ethtool_ops = {
 	.get_settings		= dsa_slave_get_settings,
 	.set_settings		= dsa_slave_set_settings,
@@ -711,6 +773,11 @@ static const struct net_device_ops dsa_slave_netdev_ops = {
 	.ndo_fdb_dump		= dsa_slave_fdb_dump,
 	.ndo_do_ioctl		= dsa_slave_ioctl,
 	.ndo_get_iflink		= dsa_slave_get_iflink,
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	.ndo_netpoll_setup	= dsa_slave_netpoll_setup,
+	.ndo_netpoll_cleanup	= dsa_slave_netpoll_cleanup,
+	.ndo_poll_controller	= dsa_slave_poll_controller,
+#endif
 };
 
 static const struct switchdev_ops dsa_slave_switchdev_ops = {
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 3/4] net: dsa: Refactor transmit path
  2015-07-30 19:35 ` [PATCH net-next 3/4] net: dsa: Refactor transmit path Florian Fainelli
@ 2015-07-30 19:40   ` Florian Fainelli
  0 siblings, 0 replies; 7+ messages in thread
From: Florian Fainelli @ 2015-07-30 19:40 UTC (permalink / raw)
  To: netdev
  Cc: davem, pgynther, jaedon.shin, vivien.didelot, jerome.oufella,
	linux, andrew, cphealy, mathieu, jonasj76, andrey.volkov,
	Chris.Packham, alexander.h.duyck

On 30/07/15 12:35, Florian Fainelli wrote:
> All tagging protocols do the same thing: increment device statistics,
> make room for the tag to be inserted, create the tag, invoke the parent
> network device transmit function.
> 
> In order to prepare for adding netpoll support, which requires the tag
> creation, but not using the parent network device transmit function, do
> some little refactoring which eliminates duplication between the 4
> tagging protocols supported.
> 
> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
> ---
[snip]

>  	/*
>  	 * We have to make sure that the trailer ends up as the very
>  	 * last 4 bytes of the packet.  This means that we have to pad
> @@ -36,7 +33,7 @@ static netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev)
>  	nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC);
>  	if (nskb == NULL) {
>  		kfree_skb(skb);
> -		return NETDEV_TX_OK;
> +		return -ENOMEM;

I just spotted this, this won't work since we allocated a new SKB, but
the transmit code will attempt to submit skb, not nskb, I will respin
this patch series, sorry for not noticing this earlier...

David, please discard this.
-- 
Florian

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH net-next 1/4] net: bcmgenet: Add netconsole support
       [not found]   ` <CAGXr9JECxcM3gaWh=k4g8c7mNvVyDD_1=80rg_FLXcedC0RHzQ@mail.gmail.com>
@ 2015-07-30 22:43     ` Petri Gynther
  0 siblings, 0 replies; 7+ messages in thread
From: Petri Gynther @ 2015-07-30 22:43 UTC (permalink / raw)
  To: Florian Fainelli
  Cc: netdev, David Miller, Jaedon Shin, vivien.didelot,
	jerome.oufella, linux, andrew, cphealy, mathieu, jonasj76,
	andrey.volkov, Chris.Packham, alexander.h.duyck

On Thu, Jul 30, 2015 at 2:04 PM, Petri Gynther <pgynther@google.com> wrote:
> On Thu, Jul 30, 2015 at 12:35 PM, Florian Fainelli <f.fainelli@gmail.com>
> wrote:
>>
>> Implement a poll controller for netconsole which invokes the RX
>> interrupt handler to poll for incoming packets, and cleans up all TX
>> queues.
>>
>> Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
>> ---
>>  drivers/net/ethernet/broadcom/genet/bcmgenet.c | 13 +++++++++++++
>>  1 file changed, 13 insertions(+)
>>
>> diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
>> b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
>> index c6f2d396edf0..544160f39c1b 100644
>> --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
>> +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
>> @@ -2388,6 +2388,16 @@ static irqreturn_t bcmgenet_wol_isr(int irq, void
>> *dev_id)
>>         return IRQ_HANDLED;
>>  }
>>
>> +#ifdef CONFIG_NET_POLL_CONTROLLER
>> +static void bcmgenet_poll_controller(struct net_device *dev)
>> +{
>> +       struct bcmgenet_priv *priv = netdev_priv(dev);
>> +
>> +       bcmgenet_isr0(priv->irq0, priv);
>
>
> Need to add here:
>     bcmgenet_isr1(priv->irq1, priv);
>
> for handling Rx + Tx priority queues.
>
>>
>> +       bcmgenet_tx_reclaim_all(dev);

Do you need the above call to bcmgenet_tx_reclaim_all()?

bcmgenet_isr0() and bcmgenet_isr1() will schedule NAPI handlers for
all Rx and Tx queues that need it.

>> +}
>> +#endif
>> +
>>  static void bcmgenet_umac_reset(struct bcmgenet_priv *priv)
>>  {
>>         u32 reg;
>> @@ -2939,6 +2949,9 @@ static const struct net_device_ops
>> bcmgenet_netdev_ops = {
>>         .ndo_set_mac_address    = bcmgenet_set_mac_addr,
>>         .ndo_do_ioctl           = bcmgenet_ioctl,
>>         .ndo_set_features       = bcmgenet_set_features,
>> +#ifdef CONFIG_NET_POLL_CONTROLLER
>> +       .ndo_poll_controller    = bcmgenet_poll_controller,
>> +#endif
>>  };
>>
>>  /* Array of GENET hardware parameters/characteristics */
>> --
>> 2.1.0
>>
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-07-30 22:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-30 19:35 [PATCH net-next 0/4] net: GENET, SYSTEMPORT and DSA netconsole Florian Fainelli
2015-07-30 19:35 ` [PATCH net-next 1/4] net: bcmgenet: Add netconsole support Florian Fainelli
     [not found]   ` <CAGXr9JECxcM3gaWh=k4g8c7mNvVyDD_1=80rg_FLXcedC0RHzQ@mail.gmail.com>
2015-07-30 22:43     ` Petri Gynther
2015-07-30 19:35 ` [PATCH net-next 2/4] net: systemport: " Florian Fainelli
2015-07-30 19:35 ` [PATCH net-next 3/4] net: dsa: Refactor transmit path Florian Fainelli
2015-07-30 19:40   ` Florian Fainelli
2015-07-30 19:35 ` [PATCH net-next 4/4] net: dsa: Add netconsole support Florian Fainelli

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).