summaryrefslogtreecommitdiffstats
path: root/target/linux/ramips
diff options
context:
space:
mode:
authorjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-02-11 15:12:02 +0000
committerjuhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-02-11 15:12:02 +0000
commit606588b4e908a214dd957b0754e260958aacd93f (patch)
tree2f1f4e59d10a43db4b3f92ff7b7bd023b0a5987e /target/linux/ramips
parentbbc71f5154e32a12b6abe851521fcba655d76d96 (diff)
ramips: raeth: add rx_dma array to store the DMA address of the rx packets
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@30445 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/ramips')
-rw-r--r--target/linux/ramips/files/drivers/net/ramips.c26
-rw-r--r--target/linux/ramips/files/drivers/net/ramips_eth.h1
2 files changed, 17 insertions, 10 deletions
diff --git a/target/linux/ramips/files/drivers/net/ramips.c b/target/linux/ramips/files/drivers/net/ramips.c
index 606685215..c9eecc224 100644
--- a/target/linux/ramips/files/drivers/net/ramips.c
+++ b/target/linux/ramips/files/drivers/net/ramips.c
@@ -172,6 +172,7 @@ ramips_alloc_dma(struct raeth_priv *re)
memset(re->rx, 0, sizeof(struct ramips_rx_dma) * NUM_RX_DESC);
for (i = 0; i < NUM_RX_DESC; i++) {
+ dma_addr_t dma_addr;
struct sk_buff *new_skb = dev_alloc_skb(MAX_RX_LENGTH +
NET_IP_ALIGN);
@@ -179,10 +180,11 @@ ramips_alloc_dma(struct raeth_priv *re)
goto err_cleanup;
skb_reserve(new_skb, NET_IP_ALIGN);
- re->rx[i].rxd1 = dma_map_single(NULL,
- new_skb->data,
- MAX_RX_LENGTH,
- DMA_FROM_DEVICE);
+
+ dma_addr = dma_map_single(NULL, new_skb->data,
+ MAX_RX_LENGTH, DMA_FROM_DEVICE);
+ re->rx_dma[i] = dma_addr;
+ re->rx[i].rxd1 = (unsigned int) re->rx_dma[i];
re->rx[i].rxd2 |= RX_DMA_LSO;
re->rx_skb[i] = new_skb;
}
@@ -282,8 +284,9 @@ ramips_eth_rx_hw(unsigned long ptr)
new_skb = netdev_alloc_skb(dev, MAX_RX_LENGTH + NET_IP_ALIGN);
/* Reuse the buffer on allocation failures */
if (new_skb) {
- /* TODO: convert to use dma_addr_t */
- dma_unmap_single(NULL, priv->rx[rx].rxd1, MAX_RX_LENGTH,
+ dma_addr_t dma_addr;
+
+ dma_unmap_single(NULL, priv->rx_dma[rx], MAX_RX_LENGTH,
DMA_FROM_DEVICE);
skb_put(rx_skb, pktlen);
@@ -296,10 +299,13 @@ ramips_eth_rx_hw(unsigned long ptr)
priv->rx_skb[rx] = new_skb;
skb_reserve(new_skb, NET_IP_ALIGN);
- priv->rx[rx].rxd1 = dma_map_single(NULL,
- new_skb->data,
- MAX_RX_LENGTH,
- DMA_FROM_DEVICE);
+
+ dma_addr = dma_map_single(NULL,
+ new_skb->data,
+ MAX_RX_LENGTH,
+ DMA_FROM_DEVICE);
+ priv->rx_dma[rx] = dma_addr;
+ priv->rx[rx].rxd1 = (unsigned int) dma_addr;
} else {
dev->stats.rx_dropped++;
}
diff --git a/target/linux/ramips/files/drivers/net/ramips_eth.h b/target/linux/ramips/files/drivers/net/ramips_eth.h
index a69754b77..7d5296b21 100644
--- a/target/linux/ramips/files/drivers/net/ramips_eth.h
+++ b/target/linux/ramips/files/drivers/net/ramips_eth.h
@@ -219,6 +219,7 @@ struct raeth_priv
struct tasklet_struct rx_tasklet;
struct ramips_rx_dma *rx;
struct sk_buff *rx_skb[NUM_RX_DESC];
+ dma_addr_t rx_dma[NUM_RX_DESC];
dma_addr_t tx_desc_dma;
struct tasklet_struct tx_housekeeping_tasklet;