* by the Free Software Foundation.
*/
+#include <linux/cache.h>
#include "ag71xx.h"
#define AG71XX_DEFAULT_MSG_ENABLE \
| NETIF_MSG_RX_ERR \
| NETIF_MSG_TX_ERR )
-static int ag71xx_debug = -1;
+static int ag71xx_msg_level = -1;
-module_param(ag71xx_debug, int, 0);
-MODULE_PARM_DESC(ag71xx_debug, "Debug level (-1=defaults,0=none,...,16=all)");
+module_param_named(msg_level, ag71xx_msg_level, int, 0);
+MODULE_PARM_DESC(msg_level, "Message level (-1=defaults,0=none,...,16=all)");
static void ag71xx_dump_dma_regs(struct ag71xx *ag)
{
kfree(ring->buf);
if (ring->descs_cpu)
- dma_free_coherent(NULL, ring->size * sizeof(struct ag71xx_desc),
+ dma_free_coherent(NULL, ring->size * ring->desc_size,
ring->descs_cpu, ring->descs_dma);
}
int err;
int i;
- ring->descs_cpu = dma_alloc_coherent(NULL,
- size * sizeof(struct ag71xx_desc),
- &ring->descs_dma,
- GFP_ATOMIC);
+ ring->desc_size = sizeof(struct ag71xx_desc);
+ if (ring->desc_size % cache_line_size()) {
+ DBG("ag71xx: ring %p, desc size %u rounded to %u\n",
+ ring, ring->desc_size,
+ roundup(ring->desc_size, cache_line_size()));
+ ring->desc_size = roundup(ring->desc_size, cache_line_size());
+ }
+
+ ring->descs_cpu = dma_alloc_coherent(NULL, size * ring->desc_size,
+ &ring->descs_dma, GFP_ATOMIC);
if (!ring->descs_cpu) {
err = -ENOMEM;
goto err;
}
for (i = 0; i < size; i++) {
- struct ag71xx_desc *descs = (struct ag71xx_desc *) ring->descs_cpu;
- ring->buf[i].desc = &descs[i];
+ ring->buf[i].desc = (struct ag71xx_desc *)&ring->descs_cpu[i * ring->desc_size];
+ DBG("ag71xx: ring %p, desc %d at %p\n",
+ ring, i, ring->buf[i].desc);
}
return 0;
for (i = 0; i < AG71XX_TX_RING_SIZE; i++) {
ring->buf[i].desc->next = (u32) (ring->descs_dma +
- sizeof(struct ag71xx_desc) * ((i + 1) % AG71XX_TX_RING_SIZE));
+ ring->desc_size * ((i + 1) % AG71XX_TX_RING_SIZE));
ring->buf[i].desc->ctrl = DESC_EMPTY;
ring->buf[i].skb = NULL;
int ret;
ret = 0;
- for (i = 0; i < AG71XX_RX_RING_SIZE; i++)
+ for (i = 0; i < AG71XX_RX_RING_SIZE; i++) {
ring->buf[i].desc->next = (u32) (ring->descs_dma +
- sizeof(struct ag71xx_desc) * ((i + 1) % AG71XX_RX_RING_SIZE));
+ ring->desc_size * ((i + 1) % AG71XX_RX_RING_SIZE));
+
+ DBG("ag71xx: RX desc at %p, next is %08x\n",
+ ring->buf[i].desc,
+ ring->buf[i].desc->next);
+ }
for (i = 0; i < AG71XX_RX_RING_SIZE; i++) {
struct sk_buff *skb;
ag->pdev = pdev;
ag->dev = dev;
ag->mii_bus = ag71xx_mdio_bus->mii_bus;
- ag->msg_enable = netif_msg_init(ag71xx_debug,
+ ag->msg_enable = netif_msg_init(ag71xx_msg_level,
AG71XX_DEFAULT_MSG_ENABLE);
spin_lock_init(&ag->lock);