All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <514895C5.40706@free-electrons.com>

diff --git a/a/1.txt b/N1/1.txt
index a47be1e..0ae4a8f 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -41,11 +41,3 @@ Gregory Clement, Free Electrons
 Kernel, drivers, real-time and embedded Linux
 development, consulting, training and support.
 http://free-electrons.com
-
--------------- next part --------------
-A non-text attachment was scrubbed...
-Name: 0001-net-mvneta-convert-to-local-interrupt.patch
-Type: text/x-diff
-Size: 3140 bytes
-Desc: not available
-URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130319/46ad8983/attachment.bin>
diff --git a/N1/2.hdr b/N1/2.hdr
new file mode 100644
index 0000000..56ca90d
--- /dev/null
+++ b/N1/2.hdr
@@ -0,0 +1,5 @@
+Content-Type: text/x-diff;
+ name="0001-net-mvneta-convert-to-local-interrupt.patch"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: attachment;
+ filename="0001-net-mvneta-convert-to-local-interrupt.patch"
diff --git a/N1/2.txt b/N1/2.txt
new file mode 100644
index 0000000..5438f71
--- /dev/null
+++ b/N1/2.txt
@@ -0,0 +1,101 @@
+>From a82800cbd4f2ff34a4a03c8caa688149b8770ab7 Mon Sep 17 00:00:00 2001
+From: Gregory CLEMENT <gregory.clement@free-electrons.com>
+Date: Tue, 19 Mar 2013 15:11:48 +0100
+Subject: [PATCH] net: mvneta: convert to local interrupt
+
+Since commit 3a6f08a37 "arm: mvebu: Add support for local interrupt",
+the mvneta interrupt is now managed as a local interrupt. That means
+that the driver have to use the request_percpu_irq() function instead
+of request_irq().
+
+Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>
+---
+ drivers/net/ethernet/marvell/mvneta.c |   26 ++++++++++++++++++++++----
+ 1 file changed, 22 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
+index cd345b8..ad64a50 100644
+--- a/drivers/net/ethernet/marvell/mvneta.c
++++ b/drivers/net/ethernet/marvell/mvneta.c
+@@ -256,6 +256,8 @@ struct mvneta_port {
+ 	unsigned int link;
+ 	unsigned int duplex;
+ 	unsigned int speed;
++
++	struct mvneta_port __percpu **percpu_pp;
+ };
+ 
+ /* The mvneta_tx_desc and mvneta_rx_desc structures describe the
+@@ -1799,7 +1801,7 @@ static void mvneta_set_rx_mode(struct net_device *dev)
+ /* Interrupt handling - the callback for request_irq() */
+ static irqreturn_t mvneta_isr(int irq, void *dev_id)
+ {
+-	struct mvneta_port *pp = (struct mvneta_port *)dev_id;
++	struct mvneta_port *pp = *(struct mvneta_port **)dev_id;
+ 
+ 	/* Mask all interrupts */
+ 	mvreg_write(pp, MVNETA_INTR_NEW_MASK, 0);
+@@ -2371,8 +2373,19 @@ static void mvneta_mdio_remove(struct mvneta_port *pp)
+ static int mvneta_open(struct net_device *dev)
+ {
+ 	struct mvneta_port *pp = netdev_priv(dev);
++
+ 	int ret;
+ 
++	/* As the mvneta interrupts are locals, we need to create a
++	 * percpu variable
++	 */
++	pp->percpu_pp = alloc_percpu(struct mvneta_port *);
++	if (!pp) {
++		ret = -ENOMEM;
++		goto err_percpu_alloc;
++	}
++	*__this_cpu_ptr(pp->percpu_pp) = pp;
++
+ 	mvneta_mac_addr_set(pp, dev->dev_addr, rxq_def);
+ 
+ 	pp->pkt_size = MVNETA_RX_PKT_SIZE(pp->dev->mtu);
+@@ -2385,13 +2398,15 @@ static int mvneta_open(struct net_device *dev)
+ 	if (ret)
+ 		goto err_cleanup_rxqs;
+ 
++
+ 	/* Connect to port interrupt line */
+-	ret = request_irq(pp->dev->irq, mvneta_isr, 0,
+-			  MVNETA_DRIVER_NAME, pp);
++	ret = request_percpu_irq(pp->dev->irq, mvneta_isr,
++				MVNETA_DRIVER_NAME, pp->percpu_pp);
+ 	if (ret) {
+ 		netdev_err(pp->dev, "cannot request irq %d\n", pp->dev->irq);
+ 		goto err_cleanup_txqs;
+ 	}
++	enable_percpu_irq(pp->dev->irq, 0);
+ 
+ 	/* In default link is down */
+ 	netif_carrier_off(pp->dev);
+@@ -2407,11 +2422,13 @@ static int mvneta_open(struct net_device *dev)
+ 	return 0;
+ 
+ err_free_irq:
++	free_percpu(pp->percpu_pp);
+ 	free_irq(pp->dev->irq, pp);
+ err_cleanup_txqs:
+ 	mvneta_cleanup_txqs(pp);
+ err_cleanup_rxqs:
+ 	mvneta_cleanup_rxqs(pp);
++err_percpu_alloc:
+ 	return ret;
+ }
+ 
+@@ -2422,7 +2439,8 @@ static int mvneta_stop(struct net_device *dev)
+ 
+ 	mvneta_stop_dev(pp);
+ 	mvneta_mdio_remove(pp);
+-	free_irq(dev->irq, pp);
++	free_percpu(pp->percpu_pp);
++	free_percpu_irq(dev->irq, pp);
+ 	mvneta_cleanup_rxqs(pp);
+ 	mvneta_cleanup_txqs(pp);
+ 	del_timer(&pp->tx_done_timer);
+-- 
+1.7.9.5
diff --git a/a/content_digest b/N1/content_digest
index 06dff8d..a4fb269 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,11 +1,19 @@
  "ref\051486445.8040506@hitachi.com\0"
  "ref\020130319133928.GE3137@localhost\0"
  "ref\0514873FB.5050202@hitachi.com\0"
- "From\0gregory.clement@free-electrons.com (Gregory CLEMENT)\0"
- "Subject\0[BUG][mvebu] mvneta: cannot request irq 25 on openblocks-ax3\0"
+ "From\0Gregory CLEMENT <gregory.clement@free-electrons.com>\0"
+ "Subject\0Re: [BUG][mvebu] mvneta: cannot request irq 25 on openblocks-ax3\0"
  "Date\0Tue, 19 Mar 2013 17:43:49 +0100\0"
- "To\0linux-arm-kernel@lists.infradead.org\0"
- "\00:1\0"
+ "To\0Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>\0"
+ "Cc\0Ezequiel Garcia <ezequiel.garcia@free-electrons.com>"
+  linux-arm-kernel@lists.infradead.org
+  thomas.petazzoni@free-electrons.com
+  Jason Cooper <jason@lakedaemon.net>
+  netdev@vger.kernel.org
+  linux-kernel@vger.kernel.org
+  yrl.pp-manager.tt@hitachi.com <yrl.pp-manager.tt@hitachi.com>
+ " Florian Fainelli <florian@openwrt.org>\0"
+ "\01:1\0"
  "b\0"
  "On 03/19/2013 03:19 PM, Masami Hiramatsu wrote:\n"
  "> Hi Ezequiel,\n"
@@ -49,14 +57,110 @@
  "Gregory Clement, Free Electrons\n"
  "Kernel, drivers, real-time and embedded Linux\n"
  "development, consulting, training and support.\n"
- "http://free-electrons.com\n"
+ http://free-electrons.com
+ "\01:2\0"
+ "fn\00001-net-mvneta-convert-to-local-interrupt.patch\0"
+ "b\0"
+ ">From a82800cbd4f2ff34a4a03c8caa688149b8770ab7 Mon Sep 17 00:00:00 2001\n"
+ "From: Gregory CLEMENT <gregory.clement@free-electrons.com>\n"
+ "Date: Tue, 19 Mar 2013 15:11:48 +0100\n"
+ "Subject: [PATCH] net: mvneta: convert to local interrupt\n"
+ "\n"
+ "Since commit 3a6f08a37 \"arm: mvebu: Add support for local interrupt\",\n"
+ "the mvneta interrupt is now managed as a local interrupt. That means\n"
+ "that the driver have to use the request_percpu_irq() function instead\n"
+ "of request_irq().\n"
  "\n"
- "-------------- next part --------------\n"
- "A non-text attachment was scrubbed...\n"
- "Name: 0001-net-mvneta-convert-to-local-interrupt.patch\n"
- "Type: text/x-diff\n"
- "Size: 3140 bytes\n"
- "Desc: not available\n"
- URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20130319/46ad8983/attachment.bin>
+ "Signed-off-by: Gregory CLEMENT <gregory.clement@free-electrons.com>\n"
+ "---\n"
+ " drivers/net/ethernet/marvell/mvneta.c |   26 ++++++++++++++++++++++----\n"
+ " 1 file changed, 22 insertions(+), 4 deletions(-)\n"
+ "\n"
+ "diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c\n"
+ "index cd345b8..ad64a50 100644\n"
+ "--- a/drivers/net/ethernet/marvell/mvneta.c\n"
+ "+++ b/drivers/net/ethernet/marvell/mvneta.c\n"
+ "@@ -256,6 +256,8 @@ struct mvneta_port {\n"
+ " \tunsigned int link;\n"
+ " \tunsigned int duplex;\n"
+ " \tunsigned int speed;\n"
+ "+\n"
+ "+\tstruct mvneta_port __percpu **percpu_pp;\n"
+ " };\n"
+ " \n"
+ " /* The mvneta_tx_desc and mvneta_rx_desc structures describe the\n"
+ "@@ -1799,7 +1801,7 @@ static void mvneta_set_rx_mode(struct net_device *dev)\n"
+ " /* Interrupt handling - the callback for request_irq() */\n"
+ " static irqreturn_t mvneta_isr(int irq, void *dev_id)\n"
+ " {\n"
+ "-\tstruct mvneta_port *pp = (struct mvneta_port *)dev_id;\n"
+ "+\tstruct mvneta_port *pp = *(struct mvneta_port **)dev_id;\n"
+ " \n"
+ " \t/* Mask all interrupts */\n"
+ " \tmvreg_write(pp, MVNETA_INTR_NEW_MASK, 0);\n"
+ "@@ -2371,8 +2373,19 @@ static void mvneta_mdio_remove(struct mvneta_port *pp)\n"
+ " static int mvneta_open(struct net_device *dev)\n"
+ " {\n"
+ " \tstruct mvneta_port *pp = netdev_priv(dev);\n"
+ "+\n"
+ " \tint ret;\n"
+ " \n"
+ "+\t/* As the mvneta interrupts are locals, we need to create a\n"
+ "+\t * percpu variable\n"
+ "+\t */\n"
+ "+\tpp->percpu_pp = alloc_percpu(struct mvneta_port *);\n"
+ "+\tif (!pp) {\n"
+ "+\t\tret = -ENOMEM;\n"
+ "+\t\tgoto err_percpu_alloc;\n"
+ "+\t}\n"
+ "+\t*__this_cpu_ptr(pp->percpu_pp) = pp;\n"
+ "+\n"
+ " \tmvneta_mac_addr_set(pp, dev->dev_addr, rxq_def);\n"
+ " \n"
+ " \tpp->pkt_size = MVNETA_RX_PKT_SIZE(pp->dev->mtu);\n"
+ "@@ -2385,13 +2398,15 @@ static int mvneta_open(struct net_device *dev)\n"
+ " \tif (ret)\n"
+ " \t\tgoto err_cleanup_rxqs;\n"
+ " \n"
+ "+\n"
+ " \t/* Connect to port interrupt line */\n"
+ "-\tret = request_irq(pp->dev->irq, mvneta_isr, 0,\n"
+ "-\t\t\t  MVNETA_DRIVER_NAME, pp);\n"
+ "+\tret = request_percpu_irq(pp->dev->irq, mvneta_isr,\n"
+ "+\t\t\t\tMVNETA_DRIVER_NAME, pp->percpu_pp);\n"
+ " \tif (ret) {\n"
+ " \t\tnetdev_err(pp->dev, \"cannot request irq %d\\n\", pp->dev->irq);\n"
+ " \t\tgoto err_cleanup_txqs;\n"
+ " \t}\n"
+ "+\tenable_percpu_irq(pp->dev->irq, 0);\n"
+ " \n"
+ " \t/* In default link is down */\n"
+ " \tnetif_carrier_off(pp->dev);\n"
+ "@@ -2407,11 +2422,13 @@ static int mvneta_open(struct net_device *dev)\n"
+ " \treturn 0;\n"
+ " \n"
+ " err_free_irq:\n"
+ "+\tfree_percpu(pp->percpu_pp);\n"
+ " \tfree_irq(pp->dev->irq, pp);\n"
+ " err_cleanup_txqs:\n"
+ " \tmvneta_cleanup_txqs(pp);\n"
+ " err_cleanup_rxqs:\n"
+ " \tmvneta_cleanup_rxqs(pp);\n"
+ "+err_percpu_alloc:\n"
+ " \treturn ret;\n"
+ " }\n"
+ " \n"
+ "@@ -2422,7 +2439,8 @@ static int mvneta_stop(struct net_device *dev)\n"
+ " \n"
+ " \tmvneta_stop_dev(pp);\n"
+ " \tmvneta_mdio_remove(pp);\n"
+ "-\tfree_irq(dev->irq, pp);\n"
+ "+\tfree_percpu(pp->percpu_pp);\n"
+ "+\tfree_percpu_irq(dev->irq, pp);\n"
+ " \tmvneta_cleanup_rxqs(pp);\n"
+ " \tmvneta_cleanup_txqs(pp);\n"
+ " \tdel_timer(&pp->tx_done_timer);\n"
+ "-- \n"
+ 1.7.9.5
 
-9121c6e9b3da7ea0a6f6792d988e78a59b4bf00110b4e21998cda296ace9d1ea
+984547f72214d8674d4157e8754f02584a12ef6c72fe62124e0cf069bafebcd7

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.