mirror of https://github.com/hak5/openwrt.git
ramips: raeth: add rx_dma array to store the DMA address of the rx packets
SVN-Revision: 30445lede-17.01
parent
647af823d9
commit
7bd7ddcf4e
|
@ -172,6 +172,7 @@ ramips_alloc_dma(struct raeth_priv *re)
|
||||||
|
|
||||||
memset(re->rx, 0, sizeof(struct ramips_rx_dma) * NUM_RX_DESC);
|
memset(re->rx, 0, sizeof(struct ramips_rx_dma) * NUM_RX_DESC);
|
||||||
for (i = 0; i < NUM_RX_DESC; i++) {
|
for (i = 0; i < NUM_RX_DESC; i++) {
|
||||||
|
dma_addr_t dma_addr;
|
||||||
struct sk_buff *new_skb = dev_alloc_skb(MAX_RX_LENGTH +
|
struct sk_buff *new_skb = dev_alloc_skb(MAX_RX_LENGTH +
|
||||||
NET_IP_ALIGN);
|
NET_IP_ALIGN);
|
||||||
|
|
||||||
|
@ -179,10 +180,11 @@ ramips_alloc_dma(struct raeth_priv *re)
|
||||||
goto err_cleanup;
|
goto err_cleanup;
|
||||||
|
|
||||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||||
re->rx[i].rxd1 = dma_map_single(NULL,
|
|
||||||
new_skb->data,
|
dma_addr = dma_map_single(NULL, new_skb->data,
|
||||||
MAX_RX_LENGTH,
|
MAX_RX_LENGTH, DMA_FROM_DEVICE);
|
||||||
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[i].rxd2 |= RX_DMA_LSO;
|
||||||
re->rx_skb[i] = new_skb;
|
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);
|
new_skb = netdev_alloc_skb(dev, MAX_RX_LENGTH + NET_IP_ALIGN);
|
||||||
/* Reuse the buffer on allocation failures */
|
/* Reuse the buffer on allocation failures */
|
||||||
if (new_skb) {
|
if (new_skb) {
|
||||||
/* TODO: convert to use dma_addr_t */
|
dma_addr_t dma_addr;
|
||||||
dma_unmap_single(NULL, priv->rx[rx].rxd1, MAX_RX_LENGTH,
|
|
||||||
|
dma_unmap_single(NULL, priv->rx_dma[rx], MAX_RX_LENGTH,
|
||||||
DMA_FROM_DEVICE);
|
DMA_FROM_DEVICE);
|
||||||
|
|
||||||
skb_put(rx_skb, pktlen);
|
skb_put(rx_skb, pktlen);
|
||||||
|
@ -296,10 +299,13 @@ ramips_eth_rx_hw(unsigned long ptr)
|
||||||
|
|
||||||
priv->rx_skb[rx] = new_skb;
|
priv->rx_skb[rx] = new_skb;
|
||||||
skb_reserve(new_skb, NET_IP_ALIGN);
|
skb_reserve(new_skb, NET_IP_ALIGN);
|
||||||
priv->rx[rx].rxd1 = dma_map_single(NULL,
|
|
||||||
|
dma_addr = dma_map_single(NULL,
|
||||||
new_skb->data,
|
new_skb->data,
|
||||||
MAX_RX_LENGTH,
|
MAX_RX_LENGTH,
|
||||||
DMA_FROM_DEVICE);
|
DMA_FROM_DEVICE);
|
||||||
|
priv->rx_dma[rx] = dma_addr;
|
||||||
|
priv->rx[rx].rxd1 = (unsigned int) dma_addr;
|
||||||
} else {
|
} else {
|
||||||
dev->stats.rx_dropped++;
|
dev->stats.rx_dropped++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,6 +219,7 @@ struct raeth_priv
|
||||||
struct tasklet_struct rx_tasklet;
|
struct tasklet_struct rx_tasklet;
|
||||||
struct ramips_rx_dma *rx;
|
struct ramips_rx_dma *rx;
|
||||||
struct sk_buff *rx_skb[NUM_RX_DESC];
|
struct sk_buff *rx_skb[NUM_RX_DESC];
|
||||||
|
dma_addr_t rx_dma[NUM_RX_DESC];
|
||||||
|
|
||||||
dma_addr_t tx_desc_dma;
|
dma_addr_t tx_desc_dma;
|
||||||
struct tasklet_struct tx_housekeeping_tasklet;
|
struct tasklet_struct tx_housekeeping_tasklet;
|
||||||
|
|
Loading…
Reference in New Issue