From: Hauke Mehrtens Date: Wed, 2 Oct 2013 22:24:01 +0000 (+0000) Subject: kernel: bgmac: move bgmac patches already applied in mainline kernel to generic X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=06c8b90ebf32eacd45ff196c4c58e51ec7321868;p=openwrt%2Fstaging%2Frobimarko.git kernel: bgmac: move bgmac patches already applied in mainline kernel to generic The bgmac driver will be used on the brcm47xx and the bcm53xx target. These are only the patches already applied in current net-next/master branch. Signed-off-by: Hauke Mehrtens SVN-Revision: 38288 --- diff --git a/target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch b/target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch index 6a00cdf0fb..7bf66dfaf4 100644 --- a/target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch +++ b/target/linux/bcm53xx/patches-3.10/203-bgmac-register-phy.patch @@ -1,16 +1,6 @@ ---- a/drivers/net/ethernet/broadcom/Kconfig -+++ b/drivers/net/ethernet/broadcom/Kconfig -@@ -133,6 +133,7 @@ config BNX2X_SRIOV - config BGMAC - tristate "BCMA bus GBit core support" - depends on BCMA_HOST_SOC && HAS_DMA -+ select PHYLIB - ---help--- - This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus. - They can be found on BCM47xx SoCs and provide gigabit ethernet. --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -1205,27 +1205,14 @@ static int bgmac_set_mac_address(struct +@@ -1233,27 +1233,14 @@ static int bgmac_set_mac_address(struct static int bgmac_ioctl(struct net_device *net_dev, struct ifreq *ifr, int cmd) { struct bgmac *bgmac = netdev_priv(net_dev); @@ -45,7 +35,7 @@ } static const struct net_device_ops bgmac_netdev_ops = { -@@ -1247,61 +1234,16 @@ static int bgmac_get_settings(struct net +@@ -1275,61 +1262,16 @@ static int bgmac_get_settings(struct net { struct bgmac *bgmac = netdev_priv(net_dev); @@ -109,7 +99,7 @@ static void bgmac_get_drvinfo(struct net_device *net_dev, struct ethtool_drvinfo *info) -@@ -1312,6 +1254,7 @@ static void bgmac_get_drvinfo(struct net +@@ -1340,6 +1282,7 @@ static void bgmac_get_drvinfo(struct net static const struct ethtool_ops bgmac_ethtool_ops = { .get_settings = bgmac_get_settings, @@ -117,7 +107,7 @@ .get_drvinfo = bgmac_get_drvinfo, }; -@@ -1330,10 +1273,36 @@ static int bgmac_mii_write(struct mii_bu +@@ -1358,10 +1301,36 @@ static int bgmac_mii_write(struct mii_bu return bgmac_phy_write(bus->priv, mii_id, regnum, value); } @@ -154,7 +144,7 @@ mii_bus = mdiobus_alloc(); if (!mii_bus) -@@ -1364,7 +1333,28 @@ static int bgmac_mii_register(struct bgm +@@ -1392,7 +1361,28 @@ static int bgmac_mii_register(struct bgm bgmac->mii_bus = mii_bus; @@ -186,7 +176,7 @@ kfree(mii_bus->irq); --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -399,7 +399,10 @@ struct bgmac { +@@ -401,7 +401,10 @@ struct bgmac { struct bcma_device *cmn; /* Reference to CMN core for BCM4706 */ struct net_device *net_dev; struct napi_struct napi; diff --git a/target/linux/bcm53xx/patches-3.10/204-bgmac-add-supprot-for-BCM4707.patch b/target/linux/bcm53xx/patches-3.10/204-bgmac-add-supprot-for-BCM4707.patch index a14b57c602..63959a9570 100644 --- a/target/linux/bcm53xx/patches-3.10/204-bgmac-add-supprot-for-BCM4707.patch +++ b/target/linux/bcm53xx/patches-3.10/204-bgmac-add-supprot-for-BCM4707.patch @@ -9,7 +9,7 @@ Signed-off-by: Hauke Mehrtens --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -842,6 +842,8 @@ static void bgmac_speed(struct bgmac *bg +@@ -868,6 +868,8 @@ static void bgmac_speed(struct bgmac *bg set |= BGMAC_CMDCFG_ES_100; if (speed & BGMAC_SPEED_1000) set |= BGMAC_CMDCFG_ES_1000; @@ -18,7 +18,7 @@ Signed-off-by: Hauke Mehrtens if (!bgmac->full_duplex) set |= BGMAC_CMDCFG_HD; bgmac_cmdcfg_maskset(bgmac, mask, set, true); -@@ -849,13 +851,28 @@ static void bgmac_speed(struct bgmac *bg +@@ -875,13 +877,28 @@ static void bgmac_speed(struct bgmac *bg static void bgmac_miiconfig(struct bgmac *bgmac) { @@ -53,7 +53,7 @@ Signed-off-by: Hauke Mehrtens } } -@@ -901,7 +918,8 @@ static void bgmac_chip_reset(struct bgma +@@ -927,7 +944,8 @@ static void bgmac_chip_reset(struct bgma bcma_core_enable(core, flags); @@ -63,7 +63,7 @@ Signed-off-by: Hauke Mehrtens bgmac_set(bgmac, BCMA_CLKCTLST, 1 << 8); bgmac_wait_value(bgmac->core, BCMA_CLKCTLST, 1 << 24, 1 << 24, 1000); -@@ -922,10 +940,13 @@ static void bgmac_chip_reset(struct bgma +@@ -948,10 +966,13 @@ static void bgmac_chip_reset(struct bgma et_swtype &= 0x0f; et_swtype <<= 4; sw_type = et_swtype; @@ -80,7 +80,7 @@ Signed-off-by: Hauke Mehrtens sw_type = BGMAC_CHIPCTL_1_IF_TYPE_RGMII | BGMAC_CHIPCTL_1_SW_TYPE_RGMII; } -@@ -1030,12 +1051,15 @@ static void bgmac_enable(struct bgmac *b +@@ -1058,12 +1079,15 @@ static void bgmac_enable(struct bgmac *b break; } diff --git a/target/linux/bcm53xx/patches-3.10/205-bgmac-add-srab-switch.patch b/target/linux/bcm53xx/patches-3.10/205-bgmac-add-srab-switch.patch index 195336b716..cb498154a4 100644 --- a/target/linux/bcm53xx/patches-3.10/205-bgmac-add-srab-switch.patch +++ b/target/linux/bcm53xx/patches-3.10/205-bgmac-add-srab-switch.patch @@ -8,7 +8,7 @@ #ifdef CONFIG_BCM47XX #include #else -@@ -1396,6 +1397,17 @@ static void bgmac_mii_unregister(struct +@@ -1424,6 +1425,17 @@ static void bgmac_mii_unregister(struct mdiobus_free(mii_bus); } @@ -26,7 +26,7 @@ /************************************************** * BCMA bus ops **************************************************/ -@@ -1495,6 +1507,16 @@ static int bgmac_probe(struct bcma_devic +@@ -1523,6 +1535,16 @@ static int bgmac_probe(struct bcma_devic goto err_dma_free; } @@ -43,7 +43,7 @@ err = register_netdev(bgmac->net_dev); if (err) { bgmac_err(bgmac, "Cannot register net device\n"); -@@ -1524,6 +1546,10 @@ static void bgmac_remove(struct bcma_dev +@@ -1552,6 +1574,10 @@ static void bgmac_remove(struct bcma_dev { struct bgmac *bgmac = bcma_get_drvdata(core); @@ -56,7 +56,7 @@ bgmac_mii_unregister(bgmac); --- a/drivers/net/ethernet/broadcom/bgmac.h +++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -428,6 +428,9 @@ struct bgmac { +@@ -430,6 +430,9 @@ struct bgmac { bool has_robosw; bool loopback; diff --git a/target/linux/bcm53xx/patches-3.10/210-bgmac_fix_internal_switch_initialization.patch b/target/linux/bcm53xx/patches-3.10/210-bgmac_fix_internal_switch_initialization.patch deleted file mode 100644 index a5ace95636..0000000000 --- a/target/linux/bcm53xx/patches-3.10/210-bgmac_fix_internal_switch_initialization.patch +++ /dev/null @@ -1,33 +0,0 @@ -bgmac: fix internal switch initialization - -Some devices (BCM4749, BCM5357, BCM53572) have internal switch that -requires initialization. We already have code for this, but because -of the typo in code it was never working. This resulted in network not -working for some routers and possibility of soft-bricking them. - -Use correct bit for switch initialization and fix typo in the define. - -Signed-off-by: Rafał Miłecki - ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -931,7 +931,7 @@ static void bgmac_chip_reset(struct bgma - struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; - u8 et_swtype = 0; - u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | -- BGMAC_CHIPCTL_1_IF_TYPE_RMII; -+ BGMAC_CHIPCTL_1_IF_TYPE_MII; - char buf[2]; - - if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) { ---- a/drivers/net/ethernet/broadcom/bgmac.h -+++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -334,7 +334,7 @@ - - #define BGMAC_CHIPCTL_1_IF_TYPE_MASK 0x00000030 - #define BGMAC_CHIPCTL_1_IF_TYPE_RMII 0x00000000 --#define BGMAC_CHIPCTL_1_IF_TYPE_MI 0x00000010 -+#define BGMAC_CHIPCTL_1_IF_TYPE_MII 0x00000010 - #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII 0x00000020 - #define BGMAC_CHIPCTL_1_SW_TYPE_MASK 0x000000C0 - #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY 0x00000000 diff --git a/target/linux/bcm53xx/patches-3.10/211-bgmac_fix_parsing_of_et_swtype.patch b/target/linux/bcm53xx/patches-3.10/211-bgmac_fix_parsing_of_et_swtype.patch deleted file mode 100644 index 2f79b8d823..0000000000 --- a/target/linux/bcm53xx/patches-3.10/211-bgmac_fix_parsing_of_et_swtype.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -932,9 +932,9 @@ static void bgmac_chip_reset(struct bgma - u8 et_swtype = 0; - u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | - BGMAC_CHIPCTL_1_IF_TYPE_MII; -- char buf[2]; -+ char buf[4]; - -- if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) { -+ if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) { - if (kstrtou8(buf, 0, &et_swtype)) - bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n", - buf); diff --git a/target/linux/bcm53xx/patches-3.10/212-bgmac_implement_unaligned_addressing.patch b/target/linux/bcm53xx/patches-3.10/212-bgmac_implement_unaligned_addressing.patch deleted file mode 100644 index 4987e5e720..0000000000 --- a/target/linux/bcm53xx/patches-3.10/212-bgmac_implement_unaligned_addressing.patch +++ /dev/null @@ -1,140 +0,0 @@ -bgmac: implement unaligned addressing for DMA rings that support it - -This is important patch for new devices that support unaligned -addressing. That devices suffer from the backward-compatibility bug in -DMA engine. In theory we should be able to use old mechanism, but in -practice DMA address seems to be randomly copied into status register -when hardware reaches end of a ring. This breaks reading slot number -from status register and we can't use DMA anymore. - -Signed-off-by: Rafał Miłecki - ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -162,6 +162,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru - if (++ring->end >= BGMAC_TX_RING_SLOTS) - ring->end = 0; - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, -+ ring->index_base + - ring->end * sizeof(struct bgmac_dma_desc)); - - /* Always keep one slot free to allow detecting bugged calls. */ -@@ -186,6 +187,8 @@ static void bgmac_dma_tx_free(struct bgm - /* The last slot that hardware didn't consume yet */ - empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); - empty_slot &= BGMAC_DMA_TX_STATDPTR; -+ empty_slot -= ring->index_base; -+ empty_slot &= BGMAC_DMA_TX_STATDPTR; - empty_slot /= sizeof(struct bgmac_dma_desc); - - while (ring->start != empty_slot) { -@@ -279,6 +282,8 @@ static int bgmac_dma_rx_read(struct bgma - - end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); - end_slot &= BGMAC_DMA_RX_STATDPTR; -+ end_slot -= ring->index_base; -+ end_slot &= BGMAC_DMA_RX_STATDPTR; - end_slot /= sizeof(struct bgmac_dma_desc); - - ring->end = end_slot; -@@ -423,9 +428,6 @@ static int bgmac_dma_alloc(struct bgmac - ring = &bgmac->tx_ring[i]; - ring->num_slots = BGMAC_TX_RING_SLOTS; - ring->mmio_base = ring_base[i]; -- if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX)) -- bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", -- ring->mmio_base); - - /* Alloc ring of descriptors */ - size = ring->num_slots * sizeof(struct bgmac_dma_desc); -@@ -440,6 +442,13 @@ static int bgmac_dma_alloc(struct bgmac - if (ring->dma_base & 0xC0000000) - bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); - -+ ring->unaligned = bgmac_dma_unaligned(bgmac, ring, -+ BGMAC_DMA_RING_TX); -+ if (ring->unaligned) -+ ring->index_base = lower_32_bits(ring->dma_base); -+ else -+ ring->index_base = 0; -+ - /* No need to alloc TX slots yet */ - } - -@@ -449,9 +458,6 @@ static int bgmac_dma_alloc(struct bgmac - ring = &bgmac->rx_ring[i]; - ring->num_slots = BGMAC_RX_RING_SLOTS; - ring->mmio_base = ring_base[i]; -- if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX)) -- bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", -- ring->mmio_base); - - /* Alloc ring of descriptors */ - size = ring->num_slots * sizeof(struct bgmac_dma_desc); -@@ -467,6 +473,13 @@ static int bgmac_dma_alloc(struct bgmac - if (ring->dma_base & 0xC0000000) - bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); - -+ ring->unaligned = bgmac_dma_unaligned(bgmac, ring, -+ BGMAC_DMA_RING_RX); -+ if (ring->unaligned) -+ ring->index_base = lower_32_bits(ring->dma_base); -+ else -+ ring->index_base = 0; -+ - /* Alloc RX slots */ - for (j = 0; j < ring->num_slots; j++) { - err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); -@@ -494,12 +507,14 @@ static void bgmac_dma_init(struct bgmac - for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) { - ring = &bgmac->tx_ring[i]; - -- /* We don't implement unaligned addressing, so enable first */ -- bgmac_dma_tx_enable(bgmac, ring); -+ if (!ring->unaligned) -+ bgmac_dma_tx_enable(bgmac, ring); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, - lower_32_bits(ring->dma_base)); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, - upper_32_bits(ring->dma_base)); -+ if (ring->unaligned) -+ bgmac_dma_tx_enable(bgmac, ring); - - ring->start = 0; - ring->end = 0; /* Points the slot that should *not* be read */ -@@ -510,12 +525,14 @@ static void bgmac_dma_init(struct bgmac - - ring = &bgmac->rx_ring[i]; - -- /* We don't implement unaligned addressing, so enable first */ -- bgmac_dma_rx_enable(bgmac, ring); -+ if (!ring->unaligned) -+ bgmac_dma_rx_enable(bgmac, ring); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, - lower_32_bits(ring->dma_base)); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, - upper_32_bits(ring->dma_base)); -+ if (ring->unaligned) -+ bgmac_dma_rx_enable(bgmac, ring); - - for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots; - j++, dma_desc++) { -@@ -536,6 +553,7 @@ static void bgmac_dma_init(struct bgmac - } - - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, -+ ring->index_base + - ring->num_slots * sizeof(struct bgmac_dma_desc)); - - ring->start = 0; ---- a/drivers/net/ethernet/broadcom/bgmac.h -+++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -386,6 +386,8 @@ struct bgmac_dma_ring { - u16 mmio_base; - struct bgmac_dma_desc *cpu_base; - dma_addr_t dma_base; -+ u32 index_base; /* Used for unaligned rings only, otherwise 0 */ -+ bool unaligned; - - struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS]; - }; diff --git a/target/linux/bcm53xx/patches-3.10/213-bgmac-add-support-for-Byte-Queue-Limits.patch b/target/linux/bcm53xx/patches-3.10/213-bgmac-add-support-for-Byte-Queue-Limits.patch deleted file mode 100644 index 440461ae1e..0000000000 --- a/target/linux/bcm53xx/patches-3.10/213-bgmac-add-support-for-Byte-Queue-Limits.patch +++ /dev/null @@ -1,50 +0,0 @@ -From: Hauke Mehrtens -bgmac: add support for Byte Queue Limits - ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -183,6 +183,7 @@ static void bgmac_dma_tx_free(struct bgm - struct device *dma_dev = bgmac->core->dma_dev; - int empty_slot; - bool freed = false; -+ unsigned bytes_compl = 0, pkts_compl = 0; - - /* The last slot that hardware didn't consume yet */ - empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); -@@ -200,6 +201,9 @@ static void bgmac_dma_tx_free(struct bgm - slot->skb->len, DMA_TO_DEVICE); - slot->dma_addr = 0; - -+ bytes_compl += slot->skb->len; -+ pkts_compl++; -+ - /* Free memory! :) */ - dev_kfree_skb(slot->skb); - slot->skb = NULL; -@@ -213,6 +217,8 @@ static void bgmac_dma_tx_free(struct bgm - freed = true; - } - -+ netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl); -+ - if (freed && netif_queue_stopped(bgmac->net_dev)) - netif_wake_queue(bgmac->net_dev); - } -@@ -1013,6 +1019,8 @@ static void bgmac_chip_reset(struct bgma - bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE); - bgmac_miiconfig(bgmac); - bgmac_phy_init(bgmac); -+ -+ netdev_reset_queue(bgmac->net_dev); - - bgmac->int_status = 0; - } -@@ -1227,6 +1235,8 @@ static netdev_tx_t bgmac_start_xmit(stru - struct bgmac *bgmac = netdev_priv(net_dev); - struct bgmac_dma_ring *ring; - -+ netdev_sent_queue(net_dev, skb->len); -+ - /* No QOS support yet */ - ring = &bgmac->tx_ring[0]; - return bgmac_dma_tx_add(bgmac, ring, skb); diff --git a/target/linux/brcm47xx/patches-3.10/710-bgmac_fix_internal_switch_initialization.patch b/target/linux/brcm47xx/patches-3.10/710-bgmac_fix_internal_switch_initialization.patch deleted file mode 100644 index 8601888498..0000000000 --- a/target/linux/brcm47xx/patches-3.10/710-bgmac_fix_internal_switch_initialization.patch +++ /dev/null @@ -1,33 +0,0 @@ -bgmac: fix internal switch initialization - -Some devices (BCM4749, BCM5357, BCM53572) have internal switch that -requires initialization. We already have code for this, but because -of the typo in code it was never working. This resulted in network not -working for some routers and possibility of soft-bricking them. - -Use correct bit for switch initialization and fix typo in the define. - -Signed-off-by: Rafał Miłecki - ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -908,7 +908,7 @@ static void bgmac_chip_reset(struct bgma - struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; - u8 et_swtype = 0; - u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | -- BGMAC_CHIPCTL_1_IF_TYPE_RMII; -+ BGMAC_CHIPCTL_1_IF_TYPE_MII; - char buf[2]; - - if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) { ---- a/drivers/net/ethernet/broadcom/bgmac.h -+++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -333,7 +333,7 @@ - - #define BGMAC_CHIPCTL_1_IF_TYPE_MASK 0x00000030 - #define BGMAC_CHIPCTL_1_IF_TYPE_RMII 0x00000000 --#define BGMAC_CHIPCTL_1_IF_TYPE_MI 0x00000010 -+#define BGMAC_CHIPCTL_1_IF_TYPE_MII 0x00000010 - #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII 0x00000020 - #define BGMAC_CHIPCTL_1_SW_TYPE_MASK 0x000000C0 - #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY 0x00000000 diff --git a/target/linux/brcm47xx/patches-3.10/711-bgmac_fix_parsing_of_et_swtype.patch b/target/linux/brcm47xx/patches-3.10/711-bgmac_fix_parsing_of_et_swtype.patch deleted file mode 100644 index 21342ffd80..0000000000 --- a/target/linux/brcm47xx/patches-3.10/711-bgmac_fix_parsing_of_et_swtype.patch +++ /dev/null @@ -1,14 +0,0 @@ ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -909,9 +909,9 @@ static void bgmac_chip_reset(struct bgma - u8 et_swtype = 0; - u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | - BGMAC_CHIPCTL_1_IF_TYPE_MII; -- char buf[2]; -+ char buf[4]; - -- if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) { -+ if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) { - if (kstrtou8(buf, 0, &et_swtype)) - bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n", - buf); diff --git a/target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch b/target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch deleted file mode 100644 index 939ae114bb..0000000000 --- a/target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch +++ /dev/null @@ -1,140 +0,0 @@ -bgmac: implement unaligned addressing for DMA rings that support it - -This is important patch for new devices that support unaligned -addressing. That devices suffer from the backward-compatibility bug in -DMA engine. In theory we should be able to use old mechanism, but in -practice DMA address seems to be randomly copied into status register -when hardware reaches end of a ring. This breaks reading slot number -from status register and we can't use DMA anymore. - -Signed-off-by: Rafał Miłecki - ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -157,6 +157,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru - if (++ring->end >= BGMAC_TX_RING_SLOTS) - ring->end = 0; - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, -+ ring->index_base + - ring->end * sizeof(struct bgmac_dma_desc)); - - /* Always keep one slot free to allow detecting bugged calls. */ -@@ -181,6 +182,8 @@ static void bgmac_dma_tx_free(struct bgm - /* The last slot that hardware didn't consume yet */ - empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); - empty_slot &= BGMAC_DMA_TX_STATDPTR; -+ empty_slot -= ring->index_base; -+ empty_slot &= BGMAC_DMA_TX_STATDPTR; - empty_slot /= sizeof(struct bgmac_dma_desc); - - while (ring->start != empty_slot) { -@@ -274,6 +277,8 @@ static int bgmac_dma_rx_read(struct bgma - - end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); - end_slot &= BGMAC_DMA_RX_STATDPTR; -+ end_slot -= ring->index_base; -+ end_slot &= BGMAC_DMA_RX_STATDPTR; - end_slot /= sizeof(struct bgmac_dma_desc); - - ring->end = end_slot; -@@ -418,9 +423,6 @@ static int bgmac_dma_alloc(struct bgmac - ring = &bgmac->tx_ring[i]; - ring->num_slots = BGMAC_TX_RING_SLOTS; - ring->mmio_base = ring_base[i]; -- if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX)) -- bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", -- ring->mmio_base); - - /* Alloc ring of descriptors */ - size = ring->num_slots * sizeof(struct bgmac_dma_desc); -@@ -435,6 +437,13 @@ static int bgmac_dma_alloc(struct bgmac - if (ring->dma_base & 0xC0000000) - bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); - -+ ring->unaligned = bgmac_dma_unaligned(bgmac, ring, -+ BGMAC_DMA_RING_TX); -+ if (ring->unaligned) -+ ring->index_base = lower_32_bits(ring->dma_base); -+ else -+ ring->index_base = 0; -+ - /* No need to alloc TX slots yet */ - } - -@@ -444,9 +453,6 @@ static int bgmac_dma_alloc(struct bgmac - ring = &bgmac->rx_ring[i]; - ring->num_slots = BGMAC_RX_RING_SLOTS; - ring->mmio_base = ring_base[i]; -- if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX)) -- bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", -- ring->mmio_base); - - /* Alloc ring of descriptors */ - size = ring->num_slots * sizeof(struct bgmac_dma_desc); -@@ -462,6 +468,13 @@ static int bgmac_dma_alloc(struct bgmac - if (ring->dma_base & 0xC0000000) - bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); - -+ ring->unaligned = bgmac_dma_unaligned(bgmac, ring, -+ BGMAC_DMA_RING_RX); -+ if (ring->unaligned) -+ ring->index_base = lower_32_bits(ring->dma_base); -+ else -+ ring->index_base = 0; -+ - /* Alloc RX slots */ - for (j = 0; j < ring->num_slots; j++) { - err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); -@@ -489,12 +502,14 @@ static void bgmac_dma_init(struct bgmac - for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) { - ring = &bgmac->tx_ring[i]; - -- /* We don't implement unaligned addressing, so enable first */ -- bgmac_dma_tx_enable(bgmac, ring); -+ if (!ring->unaligned) -+ bgmac_dma_tx_enable(bgmac, ring); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, - lower_32_bits(ring->dma_base)); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, - upper_32_bits(ring->dma_base)); -+ if (ring->unaligned) -+ bgmac_dma_tx_enable(bgmac, ring); - - ring->start = 0; - ring->end = 0; /* Points the slot that should *not* be read */ -@@ -505,12 +520,14 @@ static void bgmac_dma_init(struct bgmac - - ring = &bgmac->rx_ring[i]; - -- /* We don't implement unaligned addressing, so enable first */ -- bgmac_dma_rx_enable(bgmac, ring); -+ if (!ring->unaligned) -+ bgmac_dma_rx_enable(bgmac, ring); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, - lower_32_bits(ring->dma_base)); - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, - upper_32_bits(ring->dma_base)); -+ if (ring->unaligned) -+ bgmac_dma_rx_enable(bgmac, ring); - - for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots; - j++, dma_desc++) { -@@ -531,6 +548,7 @@ static void bgmac_dma_init(struct bgmac - } - - bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, -+ ring->index_base + - ring->num_slots * sizeof(struct bgmac_dma_desc)); - - ring->start = 0; ---- a/drivers/net/ethernet/broadcom/bgmac.h -+++ b/drivers/net/ethernet/broadcom/bgmac.h -@@ -384,6 +384,8 @@ struct bgmac_dma_ring { - u16 mmio_base; - struct bgmac_dma_desc *cpu_base; - dma_addr_t dma_base; -+ u32 index_base; /* Used for unaligned rings only, otherwise 0 */ -+ bool unaligned; - - struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS]; - }; diff --git a/target/linux/brcm47xx/patches-3.10/740-bgmac-add-support-for-Byte-Queue-Limits.patch b/target/linux/brcm47xx/patches-3.10/740-bgmac-add-support-for-Byte-Queue-Limits.patch deleted file mode 100644 index 68d1bc9f6b..0000000000 --- a/target/linux/brcm47xx/patches-3.10/740-bgmac-add-support-for-Byte-Queue-Limits.patch +++ /dev/null @@ -1,50 +0,0 @@ -From: Hauke Mehrtens -bgmac: add support for Byte Queue Limits - ---- a/drivers/net/ethernet/broadcom/bgmac.c -+++ b/drivers/net/ethernet/broadcom/bgmac.c -@@ -178,6 +178,7 @@ static void bgmac_dma_tx_free(struct bgm - struct device *dma_dev = bgmac->core->dma_dev; - int empty_slot; - bool freed = false; -+ unsigned bytes_compl = 0, pkts_compl = 0; - - /* The last slot that hardware didn't consume yet */ - empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); -@@ -195,6 +196,9 @@ static void bgmac_dma_tx_free(struct bgm - slot->skb->len, DMA_TO_DEVICE); - slot->dma_addr = 0; - -+ bytes_compl += slot->skb->len; -+ pkts_compl++; -+ - /* Free memory! :) */ - dev_kfree_skb(slot->skb); - slot->skb = NULL; -@@ -208,6 +212,8 @@ static void bgmac_dma_tx_free(struct bgm - freed = true; - } - -+ netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl); -+ - if (freed && netif_queue_stopped(bgmac->net_dev)) - netif_wake_queue(bgmac->net_dev); - } -@@ -987,6 +993,8 @@ static void bgmac_chip_reset(struct bgma - bgmac_set(bgmac, BGMAC_PHY_CNTL, BGMAC_PC_MTE); - bgmac_miiconfig(bgmac); - bgmac_phy_init(bgmac); -+ -+ netdev_reset_queue(bgmac->net_dev); - - bgmac->int_status = 0; - } -@@ -1198,6 +1206,8 @@ static netdev_tx_t bgmac_start_xmit(stru - struct bgmac *bgmac = netdev_priv(net_dev); - struct bgmac_dma_ring *ring; - -+ netdev_sent_queue(net_dev, skb->len); -+ - /* No QOS support yet */ - ring = &bgmac->tx_ring[0]; - return bgmac_dma_tx_add(bgmac, ring, skb); diff --git a/target/linux/brcm47xx/patches-3.10/770-bgmac-phylib.patch b/target/linux/brcm47xx/patches-3.10/770-bgmac-phylib.patch index 13a7ea5d3a..50aaeaa14d 100644 --- a/target/linux/brcm47xx/patches-3.10/770-bgmac-phylib.patch +++ b/target/linux/brcm47xx/patches-3.10/770-bgmac-phylib.patch @@ -1,13 +1,3 @@ ---- a/drivers/net/ethernet/broadcom/Kconfig -+++ b/drivers/net/ethernet/broadcom/Kconfig -@@ -133,6 +133,7 @@ config BNX2X_SRIOV - config BGMAC - tristate "BCMA bus GBit core support" - depends on BCMA_HOST_SOC && HAS_DMA -+ select PHYLIB - ---help--- - This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus. - They can be found on BCM47xx SoCs and provide gigabit ethernet. --- a/drivers/net/ethernet/broadcom/bgmac.c +++ b/drivers/net/ethernet/broadcom/bgmac.c @@ -1229,27 +1229,14 @@ static int bgmac_set_mac_address(struct diff --git a/target/linux/generic/patches-3.10/770-bgmac-backport.patch b/target/linux/generic/patches-3.10/770-bgmac-backport.patch new file mode 100644 index 0000000000..3651be70cd --- /dev/null +++ b/target/linux/generic/patches-3.10/770-bgmac-backport.patch @@ -0,0 +1,208 @@ +patches for bgmac backported from net-next/master + +--- a/drivers/net/ethernet/broadcom/Kconfig ++++ b/drivers/net/ethernet/broadcom/Kconfig +@@ -132,7 +132,8 @@ config BNX2X_SRIOV + + config BGMAC + tristate "BCMA bus GBit core support" +- depends on BCMA_HOST_SOC && HAS_DMA ++ depends on BCMA_HOST_SOC && HAS_DMA && BCM47XX ++ select PHYLIB + ---help--- + This driver supports GBit MAC and BCM4706 GBit MAC cores on BCMA bus. + They can be found on BCM47xx SoCs and provide gigabit ethernet. +--- a/drivers/net/ethernet/broadcom/bgmac.c ++++ b/drivers/net/ethernet/broadcom/bgmac.c +@@ -149,6 +149,8 @@ static netdev_tx_t bgmac_dma_tx_add(stru + dma_desc->ctl0 = cpu_to_le32(ctl0); + dma_desc->ctl1 = cpu_to_le32(ctl1); + ++ netdev_sent_queue(net_dev, skb->len); ++ + wmb(); + + /* Increase ring->end to point empty slot. We tell hardware the first +@@ -157,6 +159,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru + if (++ring->end >= BGMAC_TX_RING_SLOTS) + ring->end = 0; + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_INDEX, ++ ring->index_base + + ring->end * sizeof(struct bgmac_dma_desc)); + + /* Always keep one slot free to allow detecting bugged calls. */ +@@ -177,10 +180,13 @@ static void bgmac_dma_tx_free(struct bgm + struct device *dma_dev = bgmac->core->dma_dev; + int empty_slot; + bool freed = false; ++ unsigned bytes_compl = 0, pkts_compl = 0; + + /* The last slot that hardware didn't consume yet */ + empty_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_TX_STATUS); + empty_slot &= BGMAC_DMA_TX_STATDPTR; ++ empty_slot -= ring->index_base; ++ empty_slot &= BGMAC_DMA_TX_STATDPTR; + empty_slot /= sizeof(struct bgmac_dma_desc); + + while (ring->start != empty_slot) { +@@ -192,6 +198,9 @@ static void bgmac_dma_tx_free(struct bgm + slot->skb->len, DMA_TO_DEVICE); + slot->dma_addr = 0; + ++ bytes_compl += slot->skb->len; ++ pkts_compl++; ++ + /* Free memory! :) */ + dev_kfree_skb(slot->skb); + slot->skb = NULL; +@@ -205,6 +214,8 @@ static void bgmac_dma_tx_free(struct bgm + freed = true; + } + ++ netdev_completed_queue(bgmac->net_dev, pkts_compl, bytes_compl); ++ + if (freed && netif_queue_stopped(bgmac->net_dev)) + netif_wake_queue(bgmac->net_dev); + } +@@ -274,6 +285,8 @@ static int bgmac_dma_rx_read(struct bgma + + end_slot = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_STATUS); + end_slot &= BGMAC_DMA_RX_STATDPTR; ++ end_slot -= ring->index_base; ++ end_slot &= BGMAC_DMA_RX_STATDPTR; + end_slot /= sizeof(struct bgmac_dma_desc); + + ring->end = end_slot; +@@ -418,9 +431,6 @@ static int bgmac_dma_alloc(struct bgmac + ring = &bgmac->tx_ring[i]; + ring->num_slots = BGMAC_TX_RING_SLOTS; + ring->mmio_base = ring_base[i]; +- if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_TX)) +- bgmac_warn(bgmac, "TX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", +- ring->mmio_base); + + /* Alloc ring of descriptors */ + size = ring->num_slots * sizeof(struct bgmac_dma_desc); +@@ -435,6 +445,13 @@ static int bgmac_dma_alloc(struct bgmac + if (ring->dma_base & 0xC0000000) + bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); + ++ ring->unaligned = bgmac_dma_unaligned(bgmac, ring, ++ BGMAC_DMA_RING_TX); ++ if (ring->unaligned) ++ ring->index_base = lower_32_bits(ring->dma_base); ++ else ++ ring->index_base = 0; ++ + /* No need to alloc TX slots yet */ + } + +@@ -444,9 +461,6 @@ static int bgmac_dma_alloc(struct bgmac + ring = &bgmac->rx_ring[i]; + ring->num_slots = BGMAC_RX_RING_SLOTS; + ring->mmio_base = ring_base[i]; +- if (bgmac_dma_unaligned(bgmac, ring, BGMAC_DMA_RING_RX)) +- bgmac_warn(bgmac, "RX on ring 0x%X supports unaligned addressing but this feature is not implemented\n", +- ring->mmio_base); + + /* Alloc ring of descriptors */ + size = ring->num_slots * sizeof(struct bgmac_dma_desc); +@@ -462,6 +476,13 @@ static int bgmac_dma_alloc(struct bgmac + if (ring->dma_base & 0xC0000000) + bgmac_warn(bgmac, "DMA address using 0xC0000000 bit(s), it may need translation trick\n"); + ++ ring->unaligned = bgmac_dma_unaligned(bgmac, ring, ++ BGMAC_DMA_RING_RX); ++ if (ring->unaligned) ++ ring->index_base = lower_32_bits(ring->dma_base); ++ else ++ ring->index_base = 0; ++ + /* Alloc RX slots */ + for (j = 0; j < ring->num_slots; j++) { + err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]); +@@ -489,12 +510,14 @@ static void bgmac_dma_init(struct bgmac + for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) { + ring = &bgmac->tx_ring[i]; + +- /* We don't implement unaligned addressing, so enable first */ +- bgmac_dma_tx_enable(bgmac, ring); ++ if (!ring->unaligned) ++ bgmac_dma_tx_enable(bgmac, ring); + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGLO, + lower_32_bits(ring->dma_base)); + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_TX_RINGHI, + upper_32_bits(ring->dma_base)); ++ if (ring->unaligned) ++ bgmac_dma_tx_enable(bgmac, ring); + + ring->start = 0; + ring->end = 0; /* Points the slot that should *not* be read */ +@@ -505,12 +528,14 @@ static void bgmac_dma_init(struct bgmac + + ring = &bgmac->rx_ring[i]; + +- /* We don't implement unaligned addressing, so enable first */ +- bgmac_dma_rx_enable(bgmac, ring); ++ if (!ring->unaligned) ++ bgmac_dma_rx_enable(bgmac, ring); + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGLO, + lower_32_bits(ring->dma_base)); + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI, + upper_32_bits(ring->dma_base)); ++ if (ring->unaligned) ++ bgmac_dma_rx_enable(bgmac, ring); + + for (j = 0, dma_desc = ring->cpu_base; j < ring->num_slots; + j++, dma_desc++) { +@@ -531,6 +556,7 @@ static void bgmac_dma_init(struct bgmac + } + + bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, ++ ring->index_base + + ring->num_slots * sizeof(struct bgmac_dma_desc)); + + ring->start = 0; +@@ -908,10 +934,10 @@ static void bgmac_chip_reset(struct bgma + struct bcma_drv_cc *cc = &bgmac->core->bus->drv_cc; + u8 et_swtype = 0; + u8 sw_type = BGMAC_CHIPCTL_1_SW_TYPE_EPHY | +- BGMAC_CHIPCTL_1_IF_TYPE_RMII; +- char buf[2]; ++ BGMAC_CHIPCTL_1_IF_TYPE_MII; ++ char buf[4]; + +- if (bcm47xx_nvram_getenv("et_swtype", buf, 1) > 0) { ++ if (bcm47xx_nvram_getenv("et_swtype", buf, sizeof(buf)) > 0) { + if (kstrtou8(buf, 0, &et_swtype)) + bgmac_err(bgmac, "Failed to parse et_swtype (%s)\n", + buf); +@@ -970,6 +996,8 @@ static void bgmac_chip_reset(struct bgma + bgmac_miiconfig(bgmac); + bgmac_phy_init(bgmac); + ++ netdev_reset_queue(bgmac->net_dev); ++ + bgmac->int_status = 0; + } + +--- a/drivers/net/ethernet/broadcom/bgmac.h ++++ b/drivers/net/ethernet/broadcom/bgmac.h +@@ -333,7 +333,7 @@ + + #define BGMAC_CHIPCTL_1_IF_TYPE_MASK 0x00000030 + #define BGMAC_CHIPCTL_1_IF_TYPE_RMII 0x00000000 +-#define BGMAC_CHIPCTL_1_IF_TYPE_MI 0x00000010 ++#define BGMAC_CHIPCTL_1_IF_TYPE_MII 0x00000010 + #define BGMAC_CHIPCTL_1_IF_TYPE_RGMII 0x00000020 + #define BGMAC_CHIPCTL_1_SW_TYPE_MASK 0x000000C0 + #define BGMAC_CHIPCTL_1_SW_TYPE_EPHY 0x00000000 +@@ -384,6 +384,8 @@ struct bgmac_dma_ring { + u16 mmio_base; + struct bgmac_dma_desc *cpu_base; + dma_addr_t dma_base; ++ u32 index_base; /* Used for unaligned rings only, otherwise 0 */ ++ bool unaligned; + + struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS]; + };