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/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/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch b/target/linux/generic/patches-3.10/770-bgmac-backport.patch similarity index 57% rename from target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch rename to target/linux/generic/patches-3.10/770-bgmac-backport.patch index 939ae114bb..3651be70cd 100644 --- a/target/linux/brcm47xx/patches-3.10/712-bgmac_implement_unaligned_addressing.patch +++ b/target/linux/generic/patches-3.10/770-bgmac-backport.patch @@ -1,17 +1,29 @@ -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 +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 -@@ -157,6 +157,7 @@ static netdev_tx_t bgmac_dma_tx_add(stru +@@ -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, @@ -19,7 +31,12 @@ Signed-off-by: Rafał Miłecki 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 +@@ -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; @@ -28,7 +45,26 @@ Signed-off-by: Rafał Miłecki empty_slot /= sizeof(struct bgmac_dma_desc); while (ring->start != empty_slot) { -@@ -274,6 +277,8 @@ static int bgmac_dma_rx_read(struct bgma +@@ -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; @@ -37,7 +73,7 @@ Signed-off-by: Rafał Miłecki end_slot /= sizeof(struct bgmac_dma_desc); ring->end = end_slot; -@@ -418,9 +423,6 @@ static int bgmac_dma_alloc(struct bgmac +@@ -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]; @@ -47,7 +83,7 @@ Signed-off-by: Rafał Miłecki /* Alloc ring of descriptors */ size = ring->num_slots * sizeof(struct bgmac_dma_desc); -@@ -435,6 +437,13 @@ static int bgmac_dma_alloc(struct bgmac +@@ -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"); @@ -61,7 +97,7 @@ Signed-off-by: Rafał Miłecki /* No need to alloc TX slots yet */ } -@@ -444,9 +453,6 @@ static int bgmac_dma_alloc(struct bgmac +@@ -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]; @@ -71,7 +107,7 @@ Signed-off-by: Rafał Miłecki /* Alloc ring of descriptors */ size = ring->num_slots * sizeof(struct bgmac_dma_desc); -@@ -462,6 +468,13 @@ static int bgmac_dma_alloc(struct bgmac +@@ -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"); @@ -85,7 +121,7 @@ Signed-off-by: Rafał Miłecki /* 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 +@@ -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]; @@ -102,7 +138,7 @@ Signed-off-by: Rafał Miłecki 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 +@@ -505,12 +528,14 @@ static void bgmac_dma_init(struct bgmac ring = &bgmac->rx_ring[i]; @@ -119,7 +155,7 @@ Signed-off-by: Rafał Miłecki 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 +@@ -531,6 +556,7 @@ static void bgmac_dma_init(struct bgmac } bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_INDEX, @@ -127,8 +163,40 @@ Signed-off-by: Rafał Miłecki 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;