#define ni_disint() { outb(0, dev->base_addr + NI52_INTDIS); }
#define ni_enaint() { outb(0, dev->base_addr + NI52_INTENA); }
-#define make32(ptr16) (p->memtop + (short) (ptr16))
+#define make32(ptr16) ((void __iomem *)(p->memtop + (short) (ptr16)))
#define make24(ptr32) ((char __iomem *)(ptr32)) - p->base
#define make16(ptr32) ((unsigned short) ((char __iomem *)(ptr32)\
- p->memtop))
udelay(4);
if (i == 16383) {
printk(KERN_ERR "%s: scb_cmd (ruc) timed out: %04x,%04x .. disabling i82586!!\n",
- dev->name, p->scb->cmd_ruc, p->scb->rus);
+ dev->name, readb(&p->scb->cmd_ruc),
+ readb(&p->scb->rus));
if (!p->reset) {
p->reset = 1;
ni_reset586();
return 0; /* most done by init */
}
+static int check_iscp(struct net_device *dev, void __iomem *addr)
+{
+ struct iscp_struct __iomem *iscp = addr;
+ struct priv *p = dev->priv;
+ memset_io(iscp, 0, sizeof(struct iscp_struct));
+
+ writel(make24(iscp), &p->scp->iscp);
+ writeb(1, &iscp->busy);
+
+ ni_reset586();
+ ni_attn586();
+ mdelay(32); /* wait a while... */
+ /* i82586 clears 'busy' after successful init */
+ if (readb(&iscp->busy))
+ return 0;
+ return 1;
+}
+
/**********************************************
* Check to see if there's an 82586 out there.
*/
static int check586(struct net_device *dev, unsigned size)
{
- unsigned long where = dev->mem_start;
- struct priv pb;
- struct priv *p = /* (struct priv *) dev->priv*/ &pb;
- char __iomem *iscp_addrs[2];
+ struct priv *p = dev->priv;
int i;
- p->mapped = (char __iomem *)isa_bus_to_virt(where);
+ p->mapped = ioremap(dev->mem_start, size);
+ if (!p->mapped)
+ return 0;
+
p->base = p->mapped + size - 0x01000000;
p->memtop = p->mapped + size;
p->scp = (struct scp_struct __iomem *)(p->base + SCP_DEFAULT_ADDRESS);
+ p->scb = (struct scb_struct __iomem *) p->mapped;
+ p->iscp = (struct iscp_struct __iomem *)p->scp - 1;
memset_io(p->scp, 0, sizeof(struct scp_struct));
for (i = 0; i < sizeof(struct scp_struct); i++)
/* memory was writeable? */
if (readb((char __iomem *)p->scp + i))
- return 0;
+ goto Enodev;
writeb(SYSBUSVAL, &p->scp->sysbus); /* 1 = 8Bit-Bus, 0 = 16 Bit */
if (readb(&p->scp->sysbus) != SYSBUSVAL)
- return 0;
-
- iscp_addrs[0] = p->mapped;
- iscp_addrs[1] = (char __iomem *)p->scp - sizeof(struct iscp_struct);
+ goto Enodev;
- for (i = 0; i < 2; i++) {
- p->iscp = (struct iscp_struct __iomem *) iscp_addrs[i];
- memset_io(p->iscp, 0, sizeof(struct iscp_struct));
-
- writel(make24(p->iscp), &p->scp->iscp);
- writeb(1, &p->iscp->busy);
-
- ni_reset586();
- ni_attn586();
- mdelay(32); /* wait a while... */
- /* i82586 clears 'busy' after successful init */
- if (readb(&p->iscp->busy))
- return 0;
- }
+ if (!check_iscp(dev, p->mapped))
+ goto Enodev;
+ if (!check_iscp(dev, p->iscp))
+ goto Enodev;
return 1;
+Enodev:
+ iounmap(p->mapped);
+ return 0;
}
/******************************************************************
ni_reset586();
mdelay(32);
- spin_lock_init(&p->spinlock);
-
- p->scp = (struct scp_struct __iomem *) (p->base + SCP_DEFAULT_ADDRESS);
- p->scb = (struct scb_struct __iomem *) isa_bus_to_virt(dev->mem_start);
- p->iscp = (struct iscp_struct __iomem *)
- ((char __iomem *)p->scp - sizeof(struct iscp_struct));
-
memset_io(p->iscp, 0, sizeof(struct iscp_struct));
memset_io(p->scp , 0, sizeof(struct scp_struct));
{
struct net_device *dev = alloc_etherdev(sizeof(struct priv));
static int ports[] = {0x300, 0x280, 0x360 , 0x320 , 0x340, 0};
+ struct priv *p;
int *port;
int err = 0;
if (!dev)
return ERR_PTR(-ENOMEM);
+ p = dev->priv;
+
if (unit >= 0) {
sprintf(dev->name, "eth%d", unit);
netdev_boot_setup_check(dev);
goto out1;
return dev;
out1:
+ iounmap(p->mapped);
release_region(dev->base_addr, NI52_TOTAL_SIZE);
out:
free_netdev(dev);
dev->mem_start = memstart;
dev->mem_end = memend;
+ spin_lock_init(&priv->spinlock);
+
if (!request_region(ioaddr, NI52_TOTAL_SIZE, DRV_NAME))
return -EBUSY;
dev->mem_end = dev->mem_start + size;
#endif
- memset(priv, 0, sizeof(struct priv));
-
- priv->mapped = (char __iomem *)isa_bus_to_virt(dev->mem_start);
- priv->memtop = priv->mapped + size;
- priv->base = priv->mapped + size - 0x01000000;
alloc586(dev);
/* set number of receive-buffs according to memsize */
if (!dev->irq) {
printk("?autoirq, Failed to detect IRQ line!\n");
retval = -EAGAIN;
+ iounmap(priv->mapped);
goto out;
}
printk("IRQ %d (autodetected).\n", dev->irq);
if (num_addrs > len) {
printk(KERN_ERR "%s: switching to promisc. mode\n",
dev->name);
- dev->flags |= IFF_PROMISC;
+ writeb(0x01, &cfg_cmd->promisc);
}
}
if (dev->flags & IFF_PROMISC)
writeb(0x01, &cfg_cmd->promisc);
writeb(0x00, &cfg_cmd->carr_coll);
writew(make16(cfg_cmd), &p->scb->cbl_offset);
- writew(0, &p->scb->cmd_ruc);
+ writeb(0, &p->scb->cmd_ruc);
writeb(CUC_START, &p->scb->cmd_cuc); /* cmd.-unit start */
ni_attn586();
if (readb(&p->scb->rus) & RU_SUSPEND) {
/* special case: RU_SUSPEND */
wait_for_scb_cmd(dev);
- p->scb->cmd_ruc = RUC_RESUME;
+ writeb(RUC_RESUME, &p->scb->cmd_ruc);
ni_attn586();
wait_for_scb_cmd_ruc(dev);
} else {
/* Wait for ack. (ni52_xmt_int can be faster than ack!!) */
wait_for_scb_cmd(dev);
- if (p->scb->cmd_cuc) { /* timed out? */
+ if (readb(&p->scb->cmd_cuc)) { /* timed out? */
printk(KERN_ERR "%s: Acknowledge timed out.\n",
dev->name);
ni_disint();
printk("R");
for (; (status = readb(&p->rfd_top->stat_high)) & RFD_COMPL;) {
- rbd = (struct rbd_struct __iomem *) make32(p->rfd_top->rbd_offset);
+ rbd = make32(readw(&p->rfd_top->rbd_offset));
if (status & RFD_OK) { /* frame received without error? */
totlen = readw(&rbd->status);
if (totlen & RBD_LAST) {
if (skb != NULL) {
skb_reserve(skb, 2);
skb_put(skb, totlen);
- skb_copy_to_linear_data(skb, p->base + (unsigned long) rbd->buffer, totlen);
+ memcpy_fromio(skb->data, p->base + readl(&rbd->buffer), totlen);
skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb);
dev->last_rx = jiffies;
break;
}
writew(0, &rbd->status);
- rbd = (struct rbd_struct __iomem *) make32(readl(&rbd->next));
+ rbd = make32(readw(&rbd->next));
}
totlen += rstat & RBD_MASK;
writew(0, &rbd->status);
writew(0xffff, &p->rfd_top->rbd_offset);
writeb(0, &p->rfd_last->last); /* delete RFD_SUSP */
p->rfd_last = p->rfd_top;
- p->rfd_top = (struct rfd_struct __iomem *) make32(p->rfd_top->next); /* step to next RFD */
+ p->rfd_top = make32(readw(&p->rfd_top->next)); /* step to next RFD */
writew(make16(p->rfd_top), &p->scb->rfa_offset);
if (debuglevel > 0)
/* maybe add a check here, before restarting the RU */
startrecv586(dev); /* restart RU */
- printk(KERN_ERR "%s: Receive-Unit restarted. Status: %04x\n", dev->name, p->scb->rus);
+ printk(KERN_ERR "%s: Receive-Unit restarted. Status: %04x\n",
+ dev->name, readb(&p->scb->rus));
}
netif_stop_queue(dev);
- skb_copy_from_linear_data(skb, (char *)p->xmit_cbuffs[p->xmit_count],
- skb->len);
+ memcpy_toio(p->xmit_cbuffs[p->xmit_count], skb->data, skb->len);
len = skb->len;
if (len < ETH_ZLEN) {
len = ETH_ZLEN;
- memset((char *)p->xmit_cbuffs[p->xmit_count]+skb->len, 0,
+ memset_io(p->xmit_cbuffs[p->xmit_count]+skb->len, 0,
len - skb->len);
}
# ifdef NO_NOPCOMMANDS
#ifdef DEBUG
- if (p->scb->cus & CU_ACTIVE) {
+ if (readb(&p->scb->cus) & CU_ACTIVE) {
printk(KERN_ERR "%s: Hmmm .. CU is still running and we wanna send a new packet.\n", dev->name);
printk(KERN_ERR "%s: stat: %04x %04x\n",
dev->name, readb(&p->scb->cus),
readw(&p->xmit_cmds[0]->cmd_status));
}
#endif
- writew(TBD_LAST | len, &p->xmit_buffs[0]->size);;
+ writew(TBD_LAST | len, &p->xmit_buffs[0]->size);
for (i = 0; i < 16; i++) {
writew(0, &p->xmit_cmds[0]->cmd_status);
wait_for_scb_cmd(dev);
void __exit cleanup_module(void)
{
+ struct priv *p = dev_ni52->priv;
unregister_netdev(dev_ni52);
+ iounmap(p->mapped);
release_region(dev_ni52->base_addr, NI52_TOTAL_SIZE);
free_netdev(dev_ni52);
}