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.