{
kfree(ring->buf);
- if (ring->descs)
- dma_free_coherent(NULL, ring->size * sizeof(*ring->descs),
- ring->descs, ring->descs_dma);
+ if (ring->descs_cpu)
+ dma_free_coherent(NULL, ring->size * sizeof(struct ag71xx_desc),
+ ring->descs_cpu, ring->descs_dma);
}
static int ag71xx_ring_alloc(struct ag71xx_ring *ring, unsigned int size)
{
int err;
+ int i;
- ring->descs = dma_alloc_coherent(NULL, size * sizeof(*ring->descs),
- &ring->descs_dma,
- GFP_ATOMIC);
- if (!ring->descs) {
+ ring->descs_cpu = dma_alloc_coherent(NULL,
+ size * sizeof(struct ag71xx_desc),
+ &ring->descs_dma,
+ GFP_ATOMIC);
+ if (!ring->descs_cpu) {
err = -ENOMEM;
goto err;
}
goto err;
}
+ for (i = 0; i < size; i++) {
+ struct ag71xx_desc *descs = (struct ag71xx_desc *) ring->descs_cpu;
+ ring->buf[i].desc = &descs[i];
+ }
+
return 0;
err:
while (ring->curr != ring->dirty) {
u32 i = ring->dirty % AG71XX_TX_RING_SIZE;
- if (!ag71xx_desc_empty(&ring->descs[i])) {
- ring->descs[i].ctrl = 0;
+ if (!ag71xx_desc_empty(ring->buf[i].desc)) {
+ ring->buf[i].desc->ctrl = 0;
dev->stats.tx_errors++;
}
int i;
for (i = 0; i < AG71XX_TX_RING_SIZE; i++) {
- ring->descs[i].next = (u32) (ring->descs_dma +
- sizeof(*ring->descs) * ((i + 1) % AG71XX_TX_RING_SIZE));
+ ring->buf[i].desc->next = (u32) (ring->descs_dma +
+ sizeof(struct ag71xx_desc) * ((i + 1) % AG71XX_TX_RING_SIZE));
- ring->descs[i].ctrl = DESC_EMPTY;
+ ring->buf[i].desc->ctrl = DESC_EMPTY;
ring->buf[i].skb = NULL;
}
ret = 0;
for (i = 0; i < AG71XX_RX_RING_SIZE; i++)
- ring->descs[i].next = (u32) (ring->descs_dma +
- sizeof(*ring->descs) * ((i + 1) % AG71XX_RX_RING_SIZE));
+ ring->buf[i].desc->next = (u32) (ring->descs_dma +
+ sizeof(struct ag71xx_desc) * ((i + 1) % AG71XX_RX_RING_SIZE));
for (i = 0; i < AG71XX_RX_RING_SIZE; i++) {
struct sk_buff *skb;
skb_reserve(skb, AG71XX_RX_PKT_RESERVE);
ring->buf[i].skb = skb;
- ring->descs[i].data = virt_to_phys(skb->data);
- ring->descs[i].ctrl = DESC_EMPTY;
+ ring->buf[i].desc->data = virt_to_phys(skb->data);
+ ring->buf[i].desc->ctrl = DESC_EMPTY;
}
/* flush descriptors */
skb->dev = ag->dev;
ring->buf[i].skb = skb;
- ring->descs[i].data = virt_to_phys(skb->data);
+ ring->buf[i].desc->data = virt_to_phys(skb->data);
}
- ring->descs[i].ctrl = DESC_EMPTY;
+ ring->buf[i].desc->ctrl = DESC_EMPTY;
count++;
}
int i;
i = ring->curr % AG71XX_TX_RING_SIZE;
- desc = &ring->descs[i];
+ desc = ring->buf[i].desc;
if (!ag71xx_desc_empty(desc))
goto err_drop;
sent = 0;
while (ring->dirty != ring->curr) {
unsigned int i = ring->dirty % AG71XX_TX_RING_SIZE;
- struct ag71xx_desc *desc = &ring->descs[i];
+ struct ag71xx_desc *desc = ring->buf[i].desc;
struct sk_buff *skb = ring->buf[i].skb;
if (!ag71xx_desc_empty(desc))
while (done < limit) {
unsigned int i = ring->curr % AG71XX_RX_RING_SIZE;
- struct ag71xx_desc *desc = &ring->descs[i];
+ struct ag71xx_desc *desc = ring->buf[i].desc;
struct sk_buff *skb;
int pktlen;