aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2015-04-12 22:10:40 +0000
committerFelix Fietkau <nbd@openwrt.org>2015-04-12 22:10:40 +0000
commitafafbc0d7454cb3271477698782cdf3197d06295 (patch)
tree0cf5aeb23108f087330c144a02e97f0aa48d2bae /target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch
parent09722d0bdcce6a021ec20bdefc158878ce49b8dc (diff)
downloadupstream-afafbc0d7454cb3271477698782cdf3197d06295.tar.gz
upstream-afafbc0d7454cb3271477698782cdf3197d06295.tar.bz2
upstream-afafbc0d7454cb3271477698782cdf3197d06295.zip
kernel: bgmac: add more DMA related fixes
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 45407
Diffstat (limited to 'target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch')
-rw-r--r--target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch132
1 files changed, 132 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch b/target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch
new file mode 100644
index 0000000000..7525b63d6a
--- /dev/null
+++ b/target/linux/generic/patches-3.18/077-12-bgmac-drop-ring-num_slots.patch
@@ -0,0 +1,132 @@
+From: Felix Fietkau <nbd@openwrt.org>
+Date: Sun, 12 Apr 2015 23:28:38 +0200
+Subject: [PATCH] bgmac: drop ring->num_slots
+
+The ring size is always known at compile time, so make the code a bit
+more efficient
+
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+---
+
+--- a/drivers/net/ethernet/broadcom/bgmac.c
++++ b/drivers/net/ethernet/broadcom/bgmac.c
+@@ -123,7 +123,7 @@ bgmac_dma_tx_add_buf(struct bgmac *bgmac
+ struct bgmac_dma_desc *dma_desc;
+ u32 ctl1;
+
+- if (i == ring->num_slots - 1)
++ if (i == BGMAC_TX_RING_SLOTS - 1)
+ ctl0 |= BGMAC_DESC_CTL0_EOT;
+
+ ctl1 = len & BGMAC_DESC_CTL1_LEN;
+@@ -378,7 +378,7 @@ static void bgmac_dma_rx_setup_desc(stru
+ struct bgmac_dma_desc *dma_desc = ring->cpu_base + desc_idx;
+ u32 ctl0 = 0, ctl1 = 0;
+
+- if (desc_idx == ring->num_slots - 1)
++ if (desc_idx == BGMAC_RX_RING_SLOTS - 1)
+ ctl0 |= BGMAC_DESC_CTL0_EOT;
+ ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
+ /* Is there any BGMAC device that requires extension? */
+@@ -508,7 +508,7 @@ static void bgmac_dma_tx_ring_free(struc
+ struct bgmac_slot_info *slot;
+ int i;
+
+- for (i = 0; i < ring->num_slots; i++) {
++ for (i = 0; i < BGMAC_TX_RING_SLOTS; i++) {
+ int len = dma_desc[i].ctl1 & BGMAC_DESC_CTL1_LEN;
+
+ slot = &ring->slots[i];
+@@ -533,7 +533,7 @@ static void bgmac_dma_rx_ring_free(struc
+ struct bgmac_slot_info *slot;
+ int i;
+
+- for (i = 0; i < ring->num_slots; i++) {
++ for (i = 0; i < BGMAC_RX_RING_SLOTS; i++) {
+ slot = &ring->slots[i];
+ if (!slot->buf)
+ continue;
+@@ -547,7 +547,8 @@ static void bgmac_dma_rx_ring_free(struc
+ }
+
+ static void bgmac_dma_ring_desc_free(struct bgmac *bgmac,
+- struct bgmac_dma_ring *ring)
++ struct bgmac_dma_ring *ring,
++ int num_slots)
+ {
+ struct device *dma_dev = bgmac->core->dma_dev;
+ int size;
+@@ -556,7 +557,7 @@ static void bgmac_dma_ring_desc_free(str
+ return;
+
+ /* Free ring of descriptors */
+- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
++ size = num_slots * sizeof(struct bgmac_dma_desc);
+ dma_free_coherent(dma_dev, size, ring->cpu_base,
+ ring->dma_base);
+ }
+@@ -577,10 +578,12 @@ static void bgmac_dma_free(struct bgmac
+ int i;
+
+ for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
+- bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i]);
++ bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i],
++ BGMAC_TX_RING_SLOTS);
+
+ for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
+- bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i]);
++ bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i],
++ BGMAC_RX_RING_SLOTS);
+ }
+
+ static int bgmac_dma_alloc(struct bgmac *bgmac)
+@@ -603,11 +606,10 @@ static int bgmac_dma_alloc(struct bgmac
+
+ for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
+ ring = &bgmac->tx_ring[i];
+- ring->num_slots = BGMAC_TX_RING_SLOTS;
+ ring->mmio_base = ring_base[i];
+
+ /* Alloc ring of descriptors */
+- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
++ size = BGMAC_TX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
+ ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
+ &ring->dma_base,
+ GFP_KERNEL);
+@@ -629,11 +631,10 @@ static int bgmac_dma_alloc(struct bgmac
+
+ for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
+ ring = &bgmac->rx_ring[i];
+- ring->num_slots = BGMAC_RX_RING_SLOTS;
+ ring->mmio_base = ring_base[i];
+
+ /* Alloc ring of descriptors */
+- size = ring->num_slots * sizeof(struct bgmac_dma_desc);
++ size = BGMAC_RX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
+ ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
+ &ring->dma_base,
+ GFP_KERNEL);
+@@ -696,7 +697,7 @@ static int bgmac_dma_init(struct bgmac *
+
+ ring->start = 0;
+ ring->end = 0;
+- for (j = 0; j < ring->num_slots; j++) {
++ for (j = 0; j < BGMAC_RX_RING_SLOTS; j++) {
+ err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
+ if (err)
+ return err;
+--- a/drivers/net/ethernet/broadcom/bgmac.h
++++ b/drivers/net/ethernet/broadcom/bgmac.h
+@@ -419,11 +419,10 @@ struct bgmac_dma_ring {
+ u32 start;
+ u32 end;
+
+- u16 num_slots;
+- u16 mmio_base;
+ struct bgmac_dma_desc *cpu_base;
+ dma_addr_t dma_base;
+ u32 index_base; /* Used for unaligned rings only, otherwise 0 */
++ u16 mmio_base;
+ bool unaligned;
+
+ struct bgmac_slot_info slots[BGMAC_RX_RING_SLOTS];