From 1ea4b50804c663085d1031fd61a040f53acf33df Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Thu, 18 Dec 2014 16:25:22 +0000 Subject: kernel: bgmac: fix some problems There are some problems in the napi usage that are fixed now. Signed-off-by: Hauke Mehrtens git-svn-id: svn://svn.openwrt.org/openwrt/trunk@43749 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- ...771-bgmac-register-napi-before-the-device.patch | 43 ++++++++++++++++++++++ ...ate-irqs-only-if-there-is-nothing-to-poll.patch | 29 +++++++++++++++ .../patches-3.14/773-bgmac-add-srab-switch.patch | 4 +- ...771-bgmac-register-napi-before-the-device.patch | 43 ++++++++++++++++++++++ ...ate-irqs-only-if-there-is-nothing-to-poll.patch | 29 +++++++++++++++ .../patches-3.18/773-bgmac-add-srab-switch.patch | 4 +- 6 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 target/linux/generic/patches-3.14/771-bgmac-register-napi-before-the-device.patch create mode 100644 target/linux/generic/patches-3.14/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch create mode 100644 target/linux/generic/patches-3.18/771-bgmac-register-napi-before-the-device.patch create mode 100644 target/linux/generic/patches-3.18/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch (limited to 'target') diff --git a/target/linux/generic/patches-3.14/771-bgmac-register-napi-before-the-device.patch b/target/linux/generic/patches-3.14/771-bgmac-register-napi-before-the-device.patch new file mode 100644 index 0000000000..56248c6720 --- /dev/null +++ b/target/linux/generic/patches-3.14/771-bgmac-register-napi-before-the-device.patch @@ -0,0 +1,43 @@ +From d5b4e70e8c205a67e2e246908b259367ab9ccecf Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Mon, 8 Dec 2014 08:27:23 +0100 +Subject: [PATCH 2/4] bgmac: register napi before the device + +napi should get registered before the netdev and not after. + +Signed-off-by: Hauke Mehrtens +--- + drivers/net/ethernet/broadcom/bgmac.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -1515,6 +1515,8 @@ static int bgmac_probe(struct bcma_devic + if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM) + bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n"); + ++ netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); ++ + err = bgmac_mii_register(bgmac); + if (err) { + bgmac_err(bgmac, "Cannot register MDIO\n"); +@@ -1529,8 +1531,6 @@ static int bgmac_probe(struct bcma_devic + + netif_carrier_off(net_dev); + +- netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); +- + return 0; + + err_mii_unregister: +@@ -1549,9 +1549,9 @@ static void bgmac_remove(struct bcma_dev + { + struct bgmac *bgmac = bcma_get_drvdata(core); + +- netif_napi_del(&bgmac->napi); + unregister_netdev(bgmac->net_dev); + bgmac_mii_unregister(bgmac); ++ netif_napi_del(&bgmac->napi); + bgmac_dma_free(bgmac); + bcma_set_drvdata(core, NULL); + free_netdev(bgmac->net_dev); diff --git a/target/linux/generic/patches-3.14/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch b/target/linux/generic/patches-3.14/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch new file mode 100644 index 0000000000..b494998be3 --- /dev/null +++ b/target/linux/generic/patches-3.14/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch @@ -0,0 +1,29 @@ +From fbd3b188fbaa861165a074c454d8f8dcf15343a0 Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Mon, 8 Dec 2014 08:47:10 +0100 +Subject: [PATCH 3/4] bgmac: activate irqs only if there is nothing to poll + +IRQs should only get activated when there is nothing to poll in the +queue any more and to after every poll. + +Signed-off-by: Hauke Mehrtens +--- + drivers/net/ethernet/broadcom/bgmac.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -1167,10 +1167,10 @@ static int bgmac_poll(struct napi_struct + bgmac->int_status = 0; + } + +- if (handled < weight) ++ if (handled < weight) { + napi_complete(napi); +- +- bgmac_chip_intrs_on(bgmac); ++ bgmac_chip_intrs_on(bgmac); ++ } + + return handled; + } diff --git a/target/linux/generic/patches-3.14/773-bgmac-add-srab-switch.patch b/target/linux/generic/patches-3.14/773-bgmac-add-srab-switch.patch index fe52ccc33e..bf3ab93830 100644 --- a/target/linux/generic/patches-3.14/773-bgmac-add-srab-switch.patch +++ b/target/linux/generic/patches-3.14/773-bgmac-add-srab-switch.patch @@ -30,7 +30,7 @@ Signed-off-by: Hauke Mehrtens /************************************************** * BCMA bus ops **************************************************/ -@@ -1521,6 +1533,16 @@ static int bgmac_probe(struct bcma_devic +@@ -1523,6 +1535,16 @@ static int bgmac_probe(struct bcma_devic goto err_dma_free; } @@ -55,9 +55,9 @@ Signed-off-by: Hauke Mehrtens + platform_device_unregister(&bgmac_b53_dev); + bgmac->b53_device = NULL; + - netif_napi_del(&bgmac->napi); unregister_netdev(bgmac->net_dev); bgmac_mii_unregister(bgmac); + netif_napi_del(&bgmac->napi); --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h @@ -457,6 +457,9 @@ struct bgmac { diff --git a/target/linux/generic/patches-3.18/771-bgmac-register-napi-before-the-device.patch b/target/linux/generic/patches-3.18/771-bgmac-register-napi-before-the-device.patch new file mode 100644 index 0000000000..56248c6720 --- /dev/null +++ b/target/linux/generic/patches-3.18/771-bgmac-register-napi-before-the-device.patch @@ -0,0 +1,43 @@ +From d5b4e70e8c205a67e2e246908b259367ab9ccecf Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Mon, 8 Dec 2014 08:27:23 +0100 +Subject: [PATCH 2/4] bgmac: register napi before the device + +napi should get registered before the netdev and not after. + +Signed-off-by: Hauke Mehrtens +--- + drivers/net/ethernet/broadcom/bgmac.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -1515,6 +1515,8 @@ static int bgmac_probe(struct bcma_devic + if (core->bus->sprom.boardflags_lo & BGMAC_BFL_ENETADM) + bgmac_warn(bgmac, "Support for ADMtek ethernet switch not implemented\n"); + ++ netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); ++ + err = bgmac_mii_register(bgmac); + if (err) { + bgmac_err(bgmac, "Cannot register MDIO\n"); +@@ -1529,8 +1531,6 @@ static int bgmac_probe(struct bcma_devic + + netif_carrier_off(net_dev); + +- netif_napi_add(net_dev, &bgmac->napi, bgmac_poll, BGMAC_WEIGHT); +- + return 0; + + err_mii_unregister: +@@ -1549,9 +1549,9 @@ static void bgmac_remove(struct bcma_dev + { + struct bgmac *bgmac = bcma_get_drvdata(core); + +- netif_napi_del(&bgmac->napi); + unregister_netdev(bgmac->net_dev); + bgmac_mii_unregister(bgmac); ++ netif_napi_del(&bgmac->napi); + bgmac_dma_free(bgmac); + bcma_set_drvdata(core, NULL); + free_netdev(bgmac->net_dev); diff --git a/target/linux/generic/patches-3.18/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch b/target/linux/generic/patches-3.18/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch new file mode 100644 index 0000000000..b494998be3 --- /dev/null +++ b/target/linux/generic/patches-3.18/772-bgmac-activate-irqs-only-if-there-is-nothing-to-poll.patch @@ -0,0 +1,29 @@ +From fbd3b188fbaa861165a074c454d8f8dcf15343a0 Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Mon, 8 Dec 2014 08:47:10 +0100 +Subject: [PATCH 3/4] bgmac: activate irqs only if there is nothing to poll + +IRQs should only get activated when there is nothing to poll in the +queue any more and to after every poll. + +Signed-off-by: Hauke Mehrtens +--- + drivers/net/ethernet/broadcom/bgmac.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -1167,10 +1167,10 @@ static int bgmac_poll(struct napi_struct + bgmac->int_status = 0; + } + +- if (handled < weight) ++ if (handled < weight) { + napi_complete(napi); +- +- bgmac_chip_intrs_on(bgmac); ++ bgmac_chip_intrs_on(bgmac); ++ } + + return handled; + } diff --git a/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch b/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch index fe52ccc33e..bf3ab93830 100644 --- a/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch +++ b/target/linux/generic/patches-3.18/773-bgmac-add-srab-switch.patch @@ -30,7 +30,7 @@ Signed-off-by: Hauke Mehrtens /************************************************** * BCMA bus ops **************************************************/ -@@ -1521,6 +1533,16 @@ static int bgmac_probe(struct bcma_devic +@@ -1523,6 +1535,16 @@ static int bgmac_probe(struct bcma_devic goto err_dma_free; } @@ -55,9 +55,9 @@ Signed-off-by: Hauke Mehrtens + platform_device_unregister(&bgmac_b53_dev); + bgmac->b53_device = NULL; + - netif_napi_del(&bgmac->napi); unregister_netdev(bgmac->net_dev); bgmac_mii_unregister(bgmac); + netif_napi_del(&bgmac->napi); --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h @@ -457,6 +457,9 @@ struct bgmac { -- cgit v1.2.3