Commit 4c2ca1d7 authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

[PATCH] 2.5 cleanup + 2.4 merge of depca

Yes this is big but 2.4 has been indented, updated and there wasnt a
sane way to deal with it
parent e0209017
...@@ -267,8 +267,7 @@ ...@@ -267,8 +267,7 @@
#include "depca.h" #include "depca.h"
static char version[] __initdata = static char version[] __initdata = "depca.c:v0.53 2001/1/12 davies@maniac.ultranet.com\n";
"depca.c:v0.53 2001/1/12 davies@maniac.ultranet.com\n";
#ifdef DEPCA_DEBUG #ifdef DEPCA_DEBUG
static int depca_debug = DEPCA_DEBUG; static int depca_debug = DEPCA_DEBUG;
...@@ -340,12 +339,12 @@ static enum { ...@@ -340,12 +339,12 @@ static enum {
/* /*
** Memory Alignment. Each descriptor is 4 longwords long. To force a ** Memory Alignment. Each descriptor is 4 longwords long. To force a
** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and ** particular alignment on the TX descriptor, adjust DESC_SKIP_LEN and
** DESC_ALIGN. ALIGN aligns the start address of the private memory area ** DESC_ALIGN. DEPCA_ALIGN aligns the start address of the private memory area
** and hence the RX descriptor ring's first entry. ** and hence the RX descriptor ring's first entry.
*/ */
#define ALIGN4 ((u_long)4 - 1) /* 1 longword align */ #define DEPCA_ALIGN4 ((u_long)4 - 1) /* 1 longword align */
#define ALIGN8 ((u_long)8 - 1) /* 2 longword (quadword) align */ #define DEPCA_ALIGN8 ((u_long)8 - 1) /* 2 longword (quadword) align */
#define ALIGN ALIGN8 /* Keep the LANCE happy... */ #define DEPCA_ALIGN DEPCA_ALIGN8 /* Keep the LANCE happy... */
/* /*
** The DEPCA Rx and Tx ring descriptors. ** The DEPCA Rx and Tx ring descriptors.
...@@ -381,10 +380,10 @@ struct depca_init { ...@@ -381,10 +380,10 @@ struct depca_init {
increase DEPCA_PKT_STAT_SZ */ increase DEPCA_PKT_STAT_SZ */
struct depca_private { struct depca_private {
char devname[DEPCA_STRLEN]; /* Device Product String */ char devname[DEPCA_STRLEN]; /* Device Product String */
char adapter_name[DEPCA_STRLEN];/* /proc/ioports string */ char adapter_name[DEPCA_STRLEN]; /* /proc/ioports string */
char adapter; /* Adapter type */ char adapter; /* Adapter type */
char mca_slot; /* MCA slot, if MCA else -1 */ char mca_slot; /* MCA slot, if MCA else -1 */
struct depca_init init_block;/* Shadow Initialization block */ struct depca_init init_block; /* Shadow Initialization block */
/* CPU address space fields */ /* CPU address space fields */
struct depca_rx_desc *rx_ring; /* Pointer to start of RX descriptor ring */ struct depca_rx_desc *rx_ring; /* Pointer to start of RX descriptor ring */
struct depca_tx_desc *tx_ring; /* Pointer to start of TX descriptor ring */ struct depca_tx_desc *tx_ring; /* Pointer to start of TX descriptor ring */
...@@ -436,7 +435,7 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev); ...@@ -436,7 +435,7 @@ static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev);
static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs); static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static int depca_close(struct net_device *dev); static int depca_close(struct net_device *dev);
static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static void depca_tx_timeout (struct net_device *dev); static void depca_tx_timeout(struct net_device *dev);
static struct net_device_stats *depca_get_stats(struct net_device *dev); static struct net_device_stats *depca_get_stats(struct net_device *dev);
static void set_multicast_list(struct net_device *dev); static void set_multicast_list(struct net_device *dev);
...@@ -462,7 +461,7 @@ static void mca_probe(struct net_device *dev, u_long iobase); ...@@ -462,7 +461,7 @@ static void mca_probe(struct net_device *dev, u_long iobase);
#endif #endif
static struct net_device *alloc_device(struct net_device *dev, u_long iobase); static struct net_device *alloc_device(struct net_device *dev, u_long iobase);
static int depca_dev_index(char *s); static int depca_dev_index(char *s);
static struct net_device *insert_device(struct net_device *dev, u_long iobase, int (*init)(struct net_device *)); static struct net_device *insert_device(struct net_device *dev, u_long iobase, int (*init) (struct net_device *));
static int load_packet(struct net_device *dev, struct sk_buff *skb); static int load_packet(struct net_device *dev, struct sk_buff *skb);
static void depca_dbg_open(struct net_device *dev); static void depca_dbg_open(struct net_device *dev);
...@@ -471,9 +470,9 @@ int init_module(void); ...@@ -471,9 +470,9 @@ int init_module(void);
void cleanup_module(void); void cleanup_module(void);
static int autoprobed = 1, loading_module = 1; static int autoprobed = 1, loading_module = 1;
# else # else
static u_char de1xx_irq[] __initdata = {2,3,4,5,7,9,0}; static u_char de1xx_irq[] __initdata = { 2, 3, 4, 5, 7, 9, 0 };
static u_char de2xx_irq[] __initdata = {5,9,10,11,15,0}; static u_char de2xx_irq[] __initdata = { 5, 9, 10, 11, 15, 0 };
static u_char de422_irq[] __initdata = {5,9,10,11,0}; static u_char de422_irq[] __initdata = { 5, 9, 10, 11, 0 };
static u_char *depca_irq; static u_char *depca_irq;
static int autoprobed, loading_module; static int autoprobed, loading_module;
#endif /* MODULE */ #endif /* MODULE */
...@@ -493,15 +492,14 @@ static char *adapter_name; /* = '\0'; If no PROM when loadable module ...@@ -493,15 +492,14 @@ static char *adapter_name; /* = '\0'; If no PROM when loadable module
outw(CSR0, DEPCA_ADDR);\ outw(CSR0, DEPCA_ADDR);\
outw(STOP, DEPCA_DATA) outw(STOP, DEPCA_DATA)
int __init int __init depca_probe(struct net_device *dev)
depca_probe(struct net_device *dev)
{ {
int tmp = num_depcas, status = -ENODEV; int tmp = num_depcas, status = -ENODEV;
u_long iobase = dev->base_addr; u_long iobase = dev->base_addr;
SET_MODULE_OWNER(dev); SET_MODULE_OWNER(dev);
if ((iobase == 0) && loading_module){ if ((iobase == 0) && loading_module) {
printk("Autoprobing is not supported when loading a module based driver.\n"); printk("Autoprobing is not supported when loading a module based driver.\n");
status = -EIO; status = -EIO;
} else { } else {
...@@ -512,8 +510,7 @@ depca_probe(struct net_device *dev) ...@@ -512,8 +510,7 @@ depca_probe(struct net_device *dev)
eisa_probe(dev, iobase); eisa_probe(dev, iobase);
if ((tmp == num_depcas) && (iobase != 0) && loading_module) { if ((tmp == num_depcas) && (iobase != 0) && loading_module) {
printk("%s: depca_probe() cannot find device at 0x%04lx.\n", dev->name, printk("%s: depca_probe() cannot find device at 0x%04lx.\n", dev->name, iobase);
iobase);
} }
/* /*
...@@ -522,20 +519,21 @@ depca_probe(struct net_device *dev) ...@@ -522,20 +519,21 @@ depca_probe(struct net_device *dev)
*/ */
for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next); for (; (dev->priv == NULL) && (dev->next != NULL); dev = dev->next);
if (dev->priv) status = 0; if (dev->priv)
if (iobase == 0) autoprobed = 1; status = 0;
if (iobase == 0)
autoprobed = 1;
} }
return status; return status;
} }
static int __init static int __init depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
{ {
struct depca_private *lp; struct depca_private *lp;
int i, j, offset, netRAM, mem_len, status=0; int i, j, offset, netRAM, mem_len, status = 0;
s16 nicsr; s16 nicsr;
u_long mem_start=0, mem_base[] = DEPCA_RAM_BASE_ADDRESSES; u_long mem_start = 0, mem_base[] = DEPCA_RAM_BASE_ADDRESSES;
STOP_DEPCA; STOP_DEPCA;
...@@ -560,11 +558,9 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -560,11 +558,9 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
dev->base_addr = ioaddr; dev->base_addr = ioaddr;
if (mca_slot != -1) { if (mca_slot != -1) {
printk("%s: %s at 0x%04lx (MCA slot %d)", dev->name, name, printk("%s: %s at 0x%04lx (MCA slot %d)", dev->name, name, ioaddr, mca_slot);
ioaddr, mca_slot);
} else if ((ioaddr & 0x0fff) == DEPCA_EISA_IO_PORTS) { /* EISA slot address */ } else if ((ioaddr & 0x0fff) == DEPCA_EISA_IO_PORTS) { /* EISA slot address */
printk("%s: %s at 0x%04lx (EISA slot %d)", printk("%s: %s at 0x%04lx (EISA slot %d)", dev->name, name, ioaddr, (int) ((ioaddr >> 12) & 0x0f));
dev->name, name, ioaddr, (int)((ioaddr>>12)&0x0f));
} else { /* ISA port address */ } else { /* ISA port address */
printk("%s: %s at 0x%04lx", dev->name, name, ioaddr); printk("%s: %s at 0x%04lx", dev->name, name, ioaddr);
} }
...@@ -575,7 +571,7 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -575,7 +571,7 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
printk(" which has an Ethernet PROM CRC error.\n"); printk(" which has an Ethernet PROM CRC error.\n");
return -ENXIO; return -ENXIO;
} }
for (i=0; i<ETH_ALEN - 1; i++) { /* get the ethernet address */ for (i = 0; i < ETH_ALEN - 1; i++) { /* get the ethernet address */
printk("%2.2x:", dev->dev_addr[i]); printk("%2.2x:", dev->dev_addr[i]);
} }
printk("%2.2x", dev->dev_addr[i]); printk("%2.2x", dev->dev_addr[i]);
...@@ -588,17 +584,14 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -588,17 +584,14 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
/* Shared Memory Base Address */ /* Shared Memory Base Address */
if (nicsr & BUF) { if (nicsr & BUF) {
offset = 0x8000; /* 32kbyte RAM offset*/ offset = 0x8000; /* 32kbyte RAM offset */
nicsr &= ~BS; /* DEPCA RAM in top 32k */ nicsr &= ~BS; /* DEPCA RAM in top 32k */
netRAM -= 32; netRAM -= 32;
} }
mem_start += offset; /* (E)ISA start address */ mem_start += offset; /* (E)ISA start address */
if ((mem_len = (NUM_RX_DESC*(sizeof(struct depca_rx_desc)+RX_BUFF_SZ) + if ((mem_len = (NUM_RX_DESC * (sizeof(struct depca_rx_desc) + RX_BUFF_SZ) + NUM_TX_DESC * (sizeof(struct depca_tx_desc) + TX_BUFF_SZ) + sizeof(struct depca_init)))
NUM_TX_DESC*(sizeof(struct depca_tx_desc)+TX_BUFF_SZ) + > (netRAM << 10)) {
sizeof(struct depca_init))) printk(",\n requests %dkB RAM: only %dkB is available!\n", (mem_len >> 10), netRAM);
> (netRAM<<10)) {
printk(",\n requests %dkB RAM: only %dkB is available!\n",
(mem_len >> 10), netRAM);
return -ENXIO; return -ENXIO;
} }
...@@ -614,16 +607,15 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -614,16 +607,15 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
dev->priv = (void *) kmalloc(sizeof(struct depca_private), GFP_KERNEL); dev->priv = (void *) kmalloc(sizeof(struct depca_private), GFP_KERNEL);
if (dev->priv == NULL) if (dev->priv == NULL)
return -ENOMEM; return -ENOMEM;
lp = (struct depca_private *)dev->priv; lp = (struct depca_private *) dev->priv;
memset((char *)dev->priv, 0, sizeof(struct depca_private)); memset((char *) dev->priv, 0, sizeof(struct depca_private));
lp->adapter = adapter; lp->adapter = adapter;
lp->mca_slot = mca_slot; lp->mca_slot = mca_slot;
lp->lock = SPIN_LOCK_UNLOCKED; lp->lock = SPIN_LOCK_UNLOCKED;
sprintf(lp->adapter_name,"%s (%s)", name, dev->name); sprintf(lp->adapter_name, "%s (%s)", name, dev->name);
status = -EBUSY; status = -EBUSY;
if (!request_region(ioaddr, DEPCA_TOTAL_SIZE, lp->adapter_name)) { if (!request_region(ioaddr, DEPCA_TOTAL_SIZE, lp->adapter_name)) {
printk(KERN_ERR "depca: I/O resource 0x%x @ 0x%lx busy\n", printk(KERN_ERR "depca: I/O resource 0x%x @ 0x%lx busy\n", DEPCA_TOTAL_SIZE, ioaddr);
DEPCA_TOTAL_SIZE, ioaddr);
goto out_priv; goto out_priv;
} }
...@@ -640,12 +632,12 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -640,12 +632,12 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
offset += sizeof(struct depca_init); offset += sizeof(struct depca_init);
/* Tx & Rx descriptors (aligned to a quadword boundary) */ /* Tx & Rx descriptors (aligned to a quadword boundary) */
offset = (offset + ALIGN) & ~ALIGN; offset = (offset + DEPCA_ALIGN) & ~DEPCA_ALIGN;
lp->rx_ring = (struct depca_rx_desc *)(lp->sh_mem + offset); lp->rx_ring = (struct depca_rx_desc *) (lp->sh_mem + offset);
lp->rx_ring_offset = offset; lp->rx_ring_offset = offset;
offset += (sizeof(struct depca_rx_desc) * NUM_RX_DESC); offset += (sizeof(struct depca_rx_desc) * NUM_RX_DESC);
lp->tx_ring = (struct depca_tx_desc *)(lp->sh_mem + offset); lp->tx_ring = (struct depca_tx_desc *) (lp->sh_mem + offset);
lp->tx_ring_offset = offset; lp->tx_ring_offset = offset;
offset += (sizeof(struct depca_tx_desc) * NUM_TX_DESC); offset += (sizeof(struct depca_tx_desc) * NUM_TX_DESC);
...@@ -657,14 +649,14 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -657,14 +649,14 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
lp->txRingMask = NUM_TX_DESC - 1; lp->txRingMask = NUM_TX_DESC - 1;
/* Calculate Tx/Rx RLEN size for the descriptors. */ /* Calculate Tx/Rx RLEN size for the descriptors. */
for (i=0, j = lp->rxRingMask; j>0; i++) { for (i = 0, j = lp->rxRingMask; j > 0; i++) {
j >>= 1; j >>= 1;
} }
lp->rx_rlen = (s32)(i << 29); lp->rx_rlen = (s32) (i << 29);
for (i=0, j = lp->txRingMask; j>0; i++) { for (i = 0, j = lp->txRingMask; j > 0; i++) {
j >>= 1; j >>= 1;
} }
lp->tx_rlen = (s32)(i << 29); lp->tx_rlen = (s32) (i << 29);
/* Load the initialisation block */ /* Load the initialisation block */
depca_init_ring(dev); depca_init_ring(dev);
...@@ -673,7 +665,7 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -673,7 +665,7 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
LoadCSRs(dev); LoadCSRs(dev);
/* Enable DEPCA board interrupts for autoprobing */ /* Enable DEPCA board interrupts for autoprobing */
nicsr = ((nicsr & ~IM)|IEN); nicsr = ((nicsr & ~IM) | IEN);
outb(nicsr, DEPCA_NICSR); outb(nicsr, DEPCA_NICSR);
/* To auto-IRQ we enable the initialization-done and DMA err, /* To auto-IRQ we enable the initialization-done and DMA err,
...@@ -708,7 +700,8 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -708,7 +700,8 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
outw(INEA | INIT, DEPCA_DATA); outw(INEA | INIT, DEPCA_DATA);
delay = jiffies + HZ/50; delay = jiffies + HZ/50;
while (time_before(jiffies, delay)) ; while (time_before(jiffies, delay))
yield();
irqnum = probe_irq_off(irq_mask); irqnum = probe_irq_off(irq_mask);
status = -ENXIO; status = -ENXIO;
...@@ -716,7 +709,7 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -716,7 +709,7 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
printk(" and failed to detect IRQ line.\n"); printk(" and failed to detect IRQ line.\n");
goto out_region; goto out_region;
} else { } else {
for (dev->irq=0,i=0; (depca_irq[i]) && (!dev->irq); i++) for (dev->irq = 0, i = 0; (depca_irq[i]) && (!dev->irq); i++)
if (irqnum == depca_irq[i]) { if (irqnum == depca_irq[i]) {
dev->irq = irqnum; dev->irq = irqnum;
printk(" and uses IRQ%d.\n", dev->irq); printk(" and uses IRQ%d.\n", dev->irq);
...@@ -752,19 +745,18 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot) ...@@ -752,19 +745,18 @@ depca_hw_init(struct net_device *dev, u_long ioaddr, int mca_slot)
/* Fill in the generic field of the device structure. */ /* Fill in the generic field of the device structure. */
ether_setup(dev); ether_setup(dev);
return 0; return 0;
out_region: out_region:
release_region(ioaddr, DEPCA_TOTAL_SIZE); release_region(ioaddr, DEPCA_TOTAL_SIZE);
out_priv: out_priv:
kfree(dev->priv); kfree(dev->priv);
dev->priv = NULL; dev->priv = NULL;
return status; return status;
} }
static int
depca_open(struct net_device *dev) static int depca_open(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
s16 nicsr; s16 nicsr;
int status = 0; int status = 0;
...@@ -785,32 +777,31 @@ depca_open(struct net_device *dev) ...@@ -785,32 +777,31 @@ depca_open(struct net_device *dev)
depca_dbg_open(dev); depca_dbg_open(dev);
if (request_irq(dev->irq, &depca_interrupt, 0, lp->adapter_name, dev)) { if (request_irq(dev->irq, &depca_interrupt, 0, lp->adapter_name, dev)) {
printk("depca_open(): Requested IRQ%d is busy\n",dev->irq); printk("depca_open(): Requested IRQ%d is busy\n", dev->irq);
status = -EAGAIN; status = -EAGAIN;
} else { } else {
/* Enable DEPCA board interrupts and turn off LED */ /* Enable DEPCA board interrupts and turn off LED */
nicsr = ((nicsr & ~IM & ~LED)|IEN); nicsr = ((nicsr & ~IM & ~LED) | IEN);
outb(nicsr, DEPCA_NICSR); outb(nicsr, DEPCA_NICSR);
outw(CSR0,DEPCA_ADDR); outw(CSR0, DEPCA_ADDR);
netif_start_queue(dev); netif_start_queue(dev);
status = InitRestartDepca(dev); status = InitRestartDepca(dev);
if (depca_debug > 1){ if (depca_debug > 1) {
printk("CSR0: 0x%4.4x\n",inw(DEPCA_DATA)); printk("CSR0: 0x%4.4x\n", inw(DEPCA_DATA));
printk("nicsr: 0x%02x\n",inb(DEPCA_NICSR)); printk("nicsr: 0x%02x\n", inb(DEPCA_NICSR));
} }
} }
return status; return status;
} }
/* Initialize the lance Rx and Tx descriptor rings. */ /* Initialize the lance Rx and Tx descriptor rings. */
static void static void depca_init_ring(struct net_device *dev)
depca_init_ring(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_int i; u_int i;
u_long offset; u_long offset;
...@@ -822,17 +813,15 @@ depca_init_ring(struct net_device *dev) ...@@ -822,17 +813,15 @@ depca_init_ring(struct net_device *dev)
/* Initialize the base address and length of each buffer in the ring */ /* Initialize the base address and length of each buffer in the ring */
for (i = 0; i <= lp->rxRingMask; i++) { for (i = 0; i <= lp->rxRingMask; i++) {
offset = lp->buffs_offset + i*RX_BUFF_SZ; offset = lp->buffs_offset + i * RX_BUFF_SZ;
writel((lp->device_ram_start + offset) | R_OWN, writel((lp->device_ram_start + offset) | R_OWN, &lp->rx_ring[i].base);
&lp->rx_ring[i].base);
writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length); writew(-RX_BUFF_SZ, &lp->rx_ring[i].buf_length);
lp->rx_buff[i] = lp->sh_mem + offset; lp->rx_buff[i] = lp->sh_mem + offset;
} }
for (i = 0; i <= lp->txRingMask; i++) { for (i = 0; i <= lp->txRingMask; i++) {
offset = lp->buffs_offset + (i + lp->rxRingMask+1)*TX_BUFF_SZ; offset = lp->buffs_offset + (i + lp->rxRingMask + 1) * TX_BUFF_SZ;
writel((lp->device_ram_start + offset) & 0x00ffffff, writel((lp->device_ram_start + offset) & 0x00ffffff, &lp->tx_ring[i].base);
&lp->tx_ring[i].base);
lp->tx_buff[i] = lp->sh_mem + offset; lp->tx_buff[i] = lp->sh_mem + offset;
} }
...@@ -850,26 +839,25 @@ depca_init_ring(struct net_device *dev) ...@@ -850,26 +839,25 @@ depca_init_ring(struct net_device *dev)
} }
static void depca_tx_timeout (struct net_device *dev) static void depca_tx_timeout(struct net_device *dev)
{ {
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
printk ("%s: transmit timed out, status %04x, resetting.\n", printk("%s: transmit timed out, status %04x, resetting.\n", dev->name, inw(DEPCA_DATA));
dev->name, inw (DEPCA_DATA));
STOP_DEPCA; STOP_DEPCA;
depca_init_ring (dev); depca_init_ring(dev);
LoadCSRs (dev); LoadCSRs(dev);
dev->trans_start = jiffies; dev->trans_start = jiffies;
netif_wake_queue (dev); netif_wake_queue(dev);
InitRestartDepca (dev); InitRestartDepca(dev);
} }
/* /*
** Writes a socket buffer to TX descriptor ring and starts transmission ** Writes a socket buffer to TX descriptor ring and starts transmission
*/ */
static int depca_start_xmit (struct sk_buff *skb, struct net_device *dev) static int depca_start_xmit(struct sk_buff *skb, struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *) dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
...@@ -879,32 +867,32 @@ static int depca_start_xmit (struct sk_buff *skb, struct net_device *dev) ...@@ -879,32 +867,32 @@ static int depca_start_xmit (struct sk_buff *skb, struct net_device *dev)
if (skb->len < 1) if (skb->len < 1)
goto out; goto out;
netif_stop_queue (dev); netif_stop_queue(dev);
if (TX_BUFFS_AVAIL) { /* Fill in a Tx ring entry */ if (TX_BUFFS_AVAIL) { /* Fill in a Tx ring entry */
status = load_packet (dev, skb); status = load_packet(dev, skb);
if (!status) { if (!status) {
/* Trigger an immediate send demand. */ /* Trigger an immediate send demand. */
outw (CSR0, DEPCA_ADDR); outw(CSR0, DEPCA_ADDR);
outw (INEA | TDMD, DEPCA_DATA); outw(INEA | TDMD, DEPCA_DATA);
dev->trans_start = jiffies; dev->trans_start = jiffies;
dev_kfree_skb (skb); dev_kfree_skb(skb);
} }
if (TX_BUFFS_AVAIL) if (TX_BUFFS_AVAIL)
netif_start_queue (dev); netif_start_queue(dev);
} else } else
status = -1; status = -1;
out: out:
return status; return status;
} }
/* /*
** The DEPCA interrupt handler. ** The DEPCA interrupt handler.
*/ */
static void depca_interrupt (int irq, void *dev_id, struct pt_regs *regs) static void depca_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{ {
struct net_device *dev = dev_id; struct net_device *dev = dev_id;
struct depca_private *lp; struct depca_private *lp;
...@@ -912,80 +900,81 @@ static void depca_interrupt (int irq, void *dev_id, struct pt_regs *regs) ...@@ -912,80 +900,81 @@ static void depca_interrupt (int irq, void *dev_id, struct pt_regs *regs)
u_long ioaddr; u_long ioaddr;
if (dev == NULL) { if (dev == NULL) {
printk ("depca_interrupt(): irq %d for unknown device.\n", irq); printk("depca_interrupt(): irq %d for unknown device.\n", irq);
return; return;
} }
lp = (struct depca_private *) dev->priv; lp = (struct depca_private *) dev->priv;
ioaddr = dev->base_addr; ioaddr = dev->base_addr;
spin_lock (&lp->lock); spin_lock(&lp->lock);
/* mask the DEPCA board interrupts and turn on the LED */ /* mask the DEPCA board interrupts and turn on the LED */
nicsr = inb (DEPCA_NICSR); nicsr = inb(DEPCA_NICSR);
nicsr |= (IM | LED); nicsr |= (IM | LED);
outb (nicsr, DEPCA_NICSR); outb(nicsr, DEPCA_NICSR);
outw (CSR0, DEPCA_ADDR); outw(CSR0, DEPCA_ADDR);
csr0 = inw (DEPCA_DATA); csr0 = inw(DEPCA_DATA);
/* Acknowledge all of the current interrupt sources ASAP. */ /* Acknowledge all of the current interrupt sources ASAP. */
outw (csr0 & INTE, DEPCA_DATA); outw(csr0 & INTE, DEPCA_DATA);
if (csr0 & RINT) /* Rx interrupt (packet arrived) */ if (csr0 & RINT) /* Rx interrupt (packet arrived) */
depca_rx (dev); depca_rx(dev);
if (csr0 & TINT) /* Tx interrupt (packet sent) */ if (csr0 & TINT) /* Tx interrupt (packet sent) */
depca_tx (dev); depca_tx(dev);
/* Any resources available? */ /* Any resources available? */
if ((TX_BUFFS_AVAIL >= 0) && netif_queue_stopped(dev)) { if ((TX_BUFFS_AVAIL >= 0) && netif_queue_stopped(dev)) {
netif_wake_queue (dev); netif_wake_queue(dev);
} }
/* Unmask the DEPCA board interrupts and turn off the LED */ /* Unmask the DEPCA board interrupts and turn off the LED */
nicsr = (nicsr & ~IM & ~LED); nicsr = (nicsr & ~IM & ~LED);
outb (nicsr, DEPCA_NICSR); outb(nicsr, DEPCA_NICSR);
spin_unlock (&lp->lock); spin_unlock(&lp->lock);
} }
static int static int depca_rx(struct net_device *dev)
depca_rx(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
int i, entry; int i, entry;
s32 status; s32 status;
for (entry=lp->rx_new; for (entry = lp->rx_new; !(readl(&lp->rx_ring[entry].base) & R_OWN); entry = lp->rx_new) {
!(readl(&lp->rx_ring[entry].base) & R_OWN); status = readl(&lp->rx_ring[entry].base) >> 16;
entry=lp->rx_new){
status = readl(&lp->rx_ring[entry].base) >> 16 ;
if (status & R_STP) { /* Remember start of frame */ if (status & R_STP) { /* Remember start of frame */
lp->rx_old = entry; lp->rx_old = entry;
} }
if (status & R_ENP) { /* Valid frame status */ if (status & R_ENP) { /* Valid frame status */
if (status & R_ERR) { /* There was an error. */ if (status & R_ERR) { /* There was an error. */
lp->stats.rx_errors++; /* Update the error stats. */ lp->stats.rx_errors++; /* Update the error stats. */
if (status & R_FRAM) lp->stats.rx_frame_errors++; if (status & R_FRAM)
if (status & R_OFLO) lp->stats.rx_over_errors++; lp->stats.rx_frame_errors++;
if (status & R_CRC) lp->stats.rx_crc_errors++; if (status & R_OFLO)
if (status & R_BUFF) lp->stats.rx_fifo_errors++; lp->stats.rx_over_errors++;
if (status & R_CRC)
lp->stats.rx_crc_errors++;
if (status & R_BUFF)
lp->stats.rx_fifo_errors++;
} else { } else {
short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4; short len, pkt_len = readw(&lp->rx_ring[entry].msg_length) - 4;
struct sk_buff *skb; struct sk_buff *skb;
skb = dev_alloc_skb(pkt_len+2); skb = dev_alloc_skb(pkt_len + 2);
if (skb != NULL) { if (skb != NULL) {
unsigned char *buf; unsigned char *buf;
skb_reserve(skb,2); /* 16 byte align the IP header */ skb_reserve(skb, 2); /* 16 byte align the IP header */
buf = skb_put(skb,pkt_len); buf = skb_put(skb, pkt_len);
skb->dev = dev; skb->dev = dev;
if (entry < lp->rx_old) { /* Wrapped buffer */ if (entry < lp->rx_old) { /* Wrapped buffer */
len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ; len = (lp->rxRingMask - lp->rx_old + 1) * RX_BUFF_SZ;
memcpy_fromio(buf, lp->rx_buff[lp->rx_old], len); memcpy_fromio(buf, lp->rx_buff[lp->rx_old], len);
memcpy_fromio(buf + len, lp->rx_buff[0], pkt_len-len); memcpy_fromio(buf + len, lp->rx_buff[0], pkt_len - len);
} else { /* Linear buffer */ } else { /* Linear buffer */
memcpy_fromio(buf, lp->rx_buff[lp->rx_old], pkt_len); memcpy_fromio(buf, lp->rx_buff[lp->rx_old], pkt_len);
} }
...@@ -994,7 +983,7 @@ depca_rx(struct net_device *dev) ...@@ -994,7 +983,7 @@ depca_rx(struct net_device *dev)
** Notify the upper protocol layers that there is another ** Notify the upper protocol layers that there is another
** packet to handle ** packet to handle
*/ */
skb->protocol=eth_type_trans(skb,dev); skb->protocol = eth_type_trans(skb, dev);
netif_rx(skb); netif_rx(skb);
/* /*
...@@ -1003,29 +992,25 @@ depca_rx(struct net_device *dev) ...@@ -1003,29 +992,25 @@ depca_rx(struct net_device *dev)
dev->last_rx = jiffies; dev->last_rx = jiffies;
lp->stats.rx_packets++; lp->stats.rx_packets++;
lp->stats.rx_bytes += pkt_len; lp->stats.rx_bytes += pkt_len;
for (i=1; i<DEPCA_PKT_STAT_SZ-1; i++) { for (i = 1; i < DEPCA_PKT_STAT_SZ - 1; i++) {
if (pkt_len < (i*DEPCA_PKT_BIN_SZ)) { if (pkt_len < (i * DEPCA_PKT_BIN_SZ)) {
lp->pktStats.bins[i]++; lp->pktStats.bins[i]++;
i = DEPCA_PKT_STAT_SZ; i = DEPCA_PKT_STAT_SZ;
} }
} }
if (buf[0] & 0x01) { /* Multicast/Broadcast */ if (buf[0] & 0x01) { /* Multicast/Broadcast */
if ((*(s16 *)&buf[0] == -1) && if ((*(s16 *) & buf[0] == -1) && (*(s16 *) & buf[2] == -1) && (*(s16 *) & buf[4] == -1)) {
(*(s16 *)&buf[2] == -1) &&
(*(s16 *)&buf[4] == -1)) {
lp->pktStats.broadcast++; lp->pktStats.broadcast++;
} else { } else {
lp->pktStats.multicast++; lp->pktStats.multicast++;
} }
} else if ((*(s16 *)&buf[0] == *(s16 *)&dev->dev_addr[0]) && } else if ((*(s16 *) & buf[0] == *(s16 *) & dev->dev_addr[0]) && (*(s16 *) & buf[2] == *(s16 *) & dev->dev_addr[2]) && (*(s16 *) & buf[4] == *(s16 *) & dev->dev_addr[4])) {
(*(s16 *)&buf[2] == *(s16 *)&dev->dev_addr[2]) &&
(*(s16 *)&buf[4] == *(s16 *)&dev->dev_addr[4])) {
lp->pktStats.unicast++; lp->pktStats.unicast++;
} }
lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */ lp->pktStats.bins[0]++; /* Duplicates stats.rx_packets */
if (lp->pktStats.bins[0] == 0) { /* Reset counters */ if (lp->pktStats.bins[0] == 0) { /* Reset counters */
memset((char *)&lp->pktStats, 0, sizeof(lp->pktStats)); memset((char *) &lp->pktStats, 0, sizeof(lp->pktStats));
} }
} else { } else {
printk("%s: Memory squeeze, deferring packet.\n", dev->name); printk("%s: Memory squeeze, deferring packet.\n", dev->name);
...@@ -1034,9 +1019,8 @@ depca_rx(struct net_device *dev) ...@@ -1034,9 +1019,8 @@ depca_rx(struct net_device *dev)
} }
} }
/* Change buffer ownership for this last frame, back to the adapter */ /* Change buffer ownership for this last frame, back to the adapter */
for (; lp->rx_old!=entry; lp->rx_old=(++lp->rx_old)&lp->rxRingMask) { for (; lp->rx_old != entry; lp->rx_old = (++lp->rx_old) & lp->rxRingMask) {
writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, writel(readl(&lp->rx_ring[lp->rx_old].base) | R_OWN, &lp->rx_ring[lp->rx_old].base);
&lp->rx_ring[lp->rx_old].base);
} }
writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base); writel(readl(&lp->rx_ring[entry].base) | R_OWN, &lp->rx_ring[entry].base);
} }
...@@ -1053,26 +1037,29 @@ depca_rx(struct net_device *dev) ...@@ -1053,26 +1037,29 @@ depca_rx(struct net_device *dev)
/* /*
** Buffer sent - check for buffer errors. ** Buffer sent - check for buffer errors.
*/ */
static int static int depca_tx(struct net_device *dev)
depca_tx(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
int entry; int entry;
s32 status; s32 status;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) { for (entry = lp->tx_old; entry != lp->tx_new; entry = lp->tx_old) {
status = readl(&lp->tx_ring[entry].base) >> 16 ; status = readl(&lp->tx_ring[entry].base) >> 16;
if (status < 0) { /* Packet not yet sent! */ if (status < 0) { /* Packet not yet sent! */
break; break;
} else if (status & T_ERR) { /* An error occurred. */ } else if (status & T_ERR) { /* An error occurred. */
status = readl(&lp->tx_ring[entry].misc); status = readl(&lp->tx_ring[entry].misc);
lp->stats.tx_errors++; lp->stats.tx_errors++;
if (status & TMD3_RTRY) lp->stats.tx_aborted_errors++; if (status & TMD3_RTRY)
if (status & TMD3_LCAR) lp->stats.tx_carrier_errors++; lp->stats.tx_aborted_errors++;
if (status & TMD3_LCOL) lp->stats.tx_window_errors++; if (status & TMD3_LCAR)
if (status & TMD3_UFLO) lp->stats.tx_fifo_errors++; lp->stats.tx_carrier_errors++;
if (status & TMD3_LCOL)
lp->stats.tx_window_errors++;
if (status & TMD3_UFLO)
lp->stats.tx_fifo_errors++;
if (status & (TMD3_BUFF | TMD3_UFLO)) { if (status & (TMD3_BUFF | TMD3_UFLO)) {
/* Trigger an immediate send demand. */ /* Trigger an immediate send demand. */
outw(CSR0, DEPCA_ADDR); outw(CSR0, DEPCA_ADDR);
...@@ -1091,10 +1078,9 @@ depca_tx(struct net_device *dev) ...@@ -1091,10 +1078,9 @@ depca_tx(struct net_device *dev)
return 0; return 0;
} }
static int static int depca_close(struct net_device *dev)
depca_close(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
s16 nicsr; s16 nicsr;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
...@@ -1103,8 +1089,7 @@ depca_close(struct net_device *dev) ...@@ -1103,8 +1089,7 @@ depca_close(struct net_device *dev)
outw(CSR0, DEPCA_ADDR); outw(CSR0, DEPCA_ADDR);
if (depca_debug > 1) { if (depca_debug > 1) {
printk("%s: Shutting down ethercard, status was %2.2x.\n", printk("%s: Shutting down ethercard, status was %2.2x.\n", dev->name, inw(DEPCA_DATA));
dev->name, inw(DEPCA_DATA));
} }
/* /*
...@@ -1131,13 +1116,13 @@ depca_close(struct net_device *dev) ...@@ -1131,13 +1116,13 @@ depca_close(struct net_device *dev)
static void LoadCSRs(struct net_device *dev) static void LoadCSRs(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */ outw(CSR1, DEPCA_ADDR); /* initialisation block address LSW */
outw((u16)lp->device_ram_start, DEPCA_DATA); outw((u16) lp->device_ram_start, DEPCA_DATA);
outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */ outw(CSR2, DEPCA_ADDR); /* initialisation block address MSW */
outw((u16)(lp->device_ram_start >> 16), DEPCA_DATA); outw((u16) (lp->device_ram_start >> 16), DEPCA_DATA);
outw(CSR3, DEPCA_ADDR); /* ALE control */ outw(CSR3, DEPCA_ADDR); /* ALE control */
outw(ACON, DEPCA_DATA); outw(ACON, DEPCA_DATA);
...@@ -1148,9 +1133,9 @@ static void LoadCSRs(struct net_device *dev) ...@@ -1148,9 +1133,9 @@ static void LoadCSRs(struct net_device *dev)
static int InitRestartDepca(struct net_device *dev) static int InitRestartDepca(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
int i, status=0; int i, status = 0;
/* Copy the shadow init_block to shared memory */ /* Copy the shadow init_block to shared memory */
memcpy_toio(lp->sh_mem, &lp->init_block, sizeof(struct depca_init)); memcpy_toio(lp->sh_mem, &lp->init_block, sizeof(struct depca_init));
...@@ -1159,28 +1144,25 @@ static int InitRestartDepca(struct net_device *dev) ...@@ -1159,28 +1144,25 @@ static int InitRestartDepca(struct net_device *dev)
outw(INIT, DEPCA_DATA); /* initialize DEPCA */ outw(INIT, DEPCA_DATA); /* initialize DEPCA */
/* wait for lance to complete initialisation */ /* wait for lance to complete initialisation */
for (i=0;(i<100) && !(inw(DEPCA_DATA) & IDON); i++); for (i = 0; (i < 100) && !(inw(DEPCA_DATA) & IDON); i++);
if (i!=100) { if (i != 100) {
/* clear IDON by writing a "1", enable interrupts and start lance */ /* clear IDON by writing a "1", enable interrupts and start lance */
outw(IDON | INEA | STRT, DEPCA_DATA); outw(IDON | INEA | STRT, DEPCA_DATA);
if (depca_debug > 2) { if (depca_debug > 2) {
printk("%s: DEPCA open after %d ticks, init block 0x%08lx csr0 %4.4x.\n", printk("%s: DEPCA open after %d ticks, init block 0x%08lx csr0 %4.4x.\n", dev->name, i, virt_to_phys(lp->sh_mem), inw(DEPCA_DATA));
dev->name, i, virt_to_phys(lp->sh_mem), inw(DEPCA_DATA));
} }
} else { } else {
printk("%s: DEPCA unopen after %d ticks, init block 0x%08lx csr0 %4.4x.\n", printk("%s: DEPCA unopen after %d ticks, init block 0x%08lx csr0 %4.4x.\n", dev->name, i, virt_to_phys(lp->sh_mem), inw(DEPCA_DATA));
dev->name, i, virt_to_phys(lp->sh_mem), inw(DEPCA_DATA));
status = -1; status = -1;
} }
return status; return status;
} }
static struct net_device_stats * static struct net_device_stats *depca_get_stats(struct net_device *dev)
depca_get_stats(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
/* Null body since there is no framing error counter */ /* Null body since there is no framing error counter */
...@@ -1190,15 +1172,14 @@ depca_get_stats(struct net_device *dev) ...@@ -1190,15 +1172,14 @@ depca_get_stats(struct net_device *dev)
/* /*
** Set or clear the multicast filter for this adaptor. ** Set or clear the multicast filter for this adaptor.
*/ */
static void static void set_multicast_list(struct net_device *dev)
set_multicast_list(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
if (dev) { if (dev) {
netif_stop_queue(dev); netif_stop_queue(dev);
while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */ while (lp->tx_old != lp->tx_new); /* Wait for the ring to empty */
STOP_DEPCA; /* Temporarily stop the depca. */ STOP_DEPCA; /* Temporarily stop the depca. */
depca_init_ring(dev); /* Initialize the descriptor rings */ depca_init_ring(dev); /* Initialize the descriptor rings */
...@@ -1224,30 +1205,30 @@ set_multicast_list(struct net_device *dev) ...@@ -1224,30 +1205,30 @@ set_multicast_list(struct net_device *dev)
*/ */
static void SetMulticastFilter(struct net_device *dev) static void SetMulticastFilter(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
struct dev_mc_list *dmi=dev->mc_list; struct dev_mc_list *dmi = dev->mc_list;
char *addrs; char *addrs;
int i, j, bit, byte; int i, j, bit, byte;
u16 hashcode; u16 hashcode;
u32 crc; u32 crc;
if (dev->flags & IFF_ALLMULTI) { /* Set all multicast bits */ if (dev->flags & IFF_ALLMULTI) { /* Set all multicast bits */
for (i=0; i<(HASH_TABLE_LEN>>3); i++) { for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) {
lp->init_block.mcast_table[i] = (char)0xff; lp->init_block.mcast_table[i] = (char) 0xff;
} }
} else { } else {
for (i=0; i<(HASH_TABLE_LEN>>3); i++){ /* Clear the multicast table */ for (i = 0; i < (HASH_TABLE_LEN >> 3); i++) { /* Clear the multicast table */
lp->init_block.mcast_table[i]=0; lp->init_block.mcast_table[i] = 0;
} }
/* Add multicast addresses */ /* Add multicast addresses */
for (i=0;i<dev->mc_count;i++) { /* for each address in the list */ for (i = 0; i < dev->mc_count; i++) { /* for each address in the list */
addrs=dmi->dmi_addr; addrs = dmi->dmi_addr;
dmi=dmi->next; dmi = dmi->next;
if ((*addrs & 0x01) == 1) { /* multicast address? */ if ((*addrs & 0x01) == 1) { /* multicast address? */
crc = ether_crc(ETH_ALEN, addrs); crc = ether_crc(ETH_ALEN, addrs);
hashcode = (crc & 1); /* hashcode is 6 LSb of CRC ... */ hashcode = (crc & 1); /* hashcode is 6 LSb of CRC ... */
for (j=0;j<5;j++) { /* ... in reverse order. */ for (j = 0; j < 5; j++) { /* ... in reverse order. */
hashcode = (hashcode << 1) | ((crc>>=1) & 1); hashcode = (hashcode << 1) | ((crc >>= 1) & 1);
} }
...@@ -1265,8 +1246,7 @@ static void SetMulticastFilter(struct net_device *dev) ...@@ -1265,8 +1246,7 @@ static void SetMulticastFilter(struct net_device *dev)
/* /*
** Microchannel bus I/O device probe ** Microchannel bus I/O device probe
*/ */
static void __init static void __init mca_probe(struct net_device *dev, u_long ioaddr)
mca_probe(struct net_device *dev, u_long ioaddr)
{ {
unsigned char pos[2]; unsigned char pos[2];
unsigned char where; unsigned char where;
...@@ -1277,7 +1257,8 @@ mca_probe(struct net_device *dev, u_long ioaddr) ...@@ -1277,7 +1257,8 @@ mca_probe(struct net_device *dev, u_long ioaddr)
/* /*
** See if we've been here before. ** See if we've been here before.
*/ */
if ((!ioaddr && autoprobed) || (ioaddr && !loading_module)) return; if ((!ioaddr && autoprobed) || (ioaddr && !loading_module))
return;
if (MCA_bus) { if (MCA_bus) {
/* /*
...@@ -1285,8 +1266,7 @@ mca_probe(struct net_device *dev, u_long ioaddr) ...@@ -1285,8 +1266,7 @@ mca_probe(struct net_device *dev, u_long ioaddr)
** specifically for the card at that address. Otherwise find the ** specifically for the card at that address. Otherwise find the
** first card in the system. ** first card in the system.
*/ */
while ((dev!=NULL) && while ((dev != NULL) && ((slot = mca_find_adapter(DE212_ID, slot)) != MCA_NOTFOUND)) {
((slot=mca_find_adapter(DE212_ID, slot)) != MCA_NOTFOUND)) {
pos[0] = mca_read_stored_pos(slot, 2); pos[0] = mca_read_stored_pos(slot, 2);
pos[1] = mca_read_stored_pos(slot, 3); pos[1] = mca_read_stored_pos(slot, 3);
...@@ -1324,9 +1304,9 @@ mca_probe(struct net_device *dev, u_long ioaddr) ...@@ -1324,9 +1304,9 @@ mca_probe(struct net_device *dev, u_long ioaddr)
** 0 0 0 1 9 ** 0 0 0 1 9
** 0 1 0 0 10 ** 0 1 0 0 10
** 1 0 0 0 11 ** 1 0 0 0 11
**/ * */
where = pos[1] & 0x0f; where = pos[1] & 0x0f;
switch(where) { switch (where) {
case 1: case 1:
irq = 9; irq = 9;
break; break;
...@@ -1372,8 +1352,7 @@ mca_probe(struct net_device *dev, u_long ioaddr) ...@@ -1372,8 +1352,7 @@ mca_probe(struct net_device *dev, u_long ioaddr)
** If the MCA configuration says the card should be here, ** If the MCA configuration says the card should be here,
** it really should be here. ** it really should be here.
*/ */
printk(KERN_ERR "%s: MCA reports card at 0x%lx but it is not printk(KERN_ERR "%s: MCA reports card at 0x%lx but it is not responding.\n", dev->name, iobase);
responding.\n", dev->name, iobase);
} }
if (check_region(iobase, DEPCA_TOTAL_SIZE) == 0) { if (check_region(iobase, DEPCA_TOTAL_SIZE) == 0) {
...@@ -1398,7 +1377,8 @@ responding.\n", dev->name, iobase); ...@@ -1398,7 +1377,8 @@ responding.\n", dev->name, iobase);
** If this is a probe by a module, return after setting up the ** If this is a probe by a module, return after setting up the
** given card. ** given card.
*/ */
if (ioaddr) return; if (ioaddr)
return;
/* /*
** Set up to check the next slot and loop. ** Set up to check the next slot and loop.
...@@ -1414,15 +1394,17 @@ responding.\n", dev->name, iobase); ...@@ -1414,15 +1394,17 @@ responding.\n", dev->name, iobase);
/* /*
** ISA bus I/O device probe ** ISA bus I/O device probe
*/ */
static void __init static void __init isa_probe(struct net_device *dev, u_long ioaddr)
isa_probe(struct net_device *dev, u_long ioaddr)
{ {
int i = num_depcas, maxSlots; int i = num_depcas, maxSlots;
s32 ports[] = DEPCA_IO_PORTS; s32 ports[] = DEPCA_IO_PORTS;
if (!ioaddr && autoprobed) return ; /* Been here before ! */ if (!ioaddr && autoprobed)
if (ioaddr > 0x400) return; /* EISA Address */ return; /* Been here before ! */
if (i >= MAX_NUM_DEPCAS) return; /* Too many ISA adapters */ if (ioaddr > 0x400)
return; /* EISA Address */
if (i >= MAX_NUM_DEPCAS)
return; /* Too many ISA adapters */
if (ioaddr == 0) { /* Autoprobing */ if (ioaddr == 0) { /* Autoprobing */
maxSlots = MAX_NUM_DEPCAS; maxSlots = MAX_NUM_DEPCAS;
...@@ -1431,7 +1413,7 @@ isa_probe(struct net_device *dev, u_long ioaddr) ...@@ -1431,7 +1413,7 @@ isa_probe(struct net_device *dev, u_long ioaddr)
maxSlots = i + 1; maxSlots = i + 1;
} }
for (; (i<maxSlots) && (dev!=NULL) && ports[i]; i++) { for (; (i < maxSlots) && (dev != NULL) && ports[i]; i++) {
if (check_region(ports[i], DEPCA_TOTAL_SIZE) == 0) { if (check_region(ports[i], DEPCA_TOTAL_SIZE) == 0) {
if (DevicePresent(ports[i]) == 0) { if (DevicePresent(ports[i]) == 0) {
if ((dev = alloc_device(dev, ports[i])) != NULL) { if ((dev = alloc_device(dev, ports[i])) != NULL) {
...@@ -1453,15 +1435,16 @@ isa_probe(struct net_device *dev, u_long ioaddr) ...@@ -1453,15 +1435,16 @@ isa_probe(struct net_device *dev, u_long ioaddr)
** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually ** EISA bus I/O device probe. Probe from slot 1 since slot 0 is usually
** the motherboard. Upto 15 EISA devices are supported. ** the motherboard. Upto 15 EISA devices are supported.
*/ */
static void __init static void __init eisa_probe(struct net_device *dev, u_long ioaddr)
eisa_probe(struct net_device *dev, u_long ioaddr)
{ {
int i, maxSlots; int i, maxSlots;
u_long iobase; u_long iobase;
char name[DEPCA_STRLEN]; char name[DEPCA_STRLEN];
if (!ioaddr && autoprobed) return ; /* Been here before ! */ if (!ioaddr && autoprobed)
if ((ioaddr < 0x400) && (ioaddr > 0)) return; /* ISA Address */ return; /* Been here before ! */
if ((ioaddr < 0x400) && (ioaddr > 0))
return; /* ISA Address */
if (ioaddr == 0) { /* Autoprobing */ if (ioaddr == 0) { /* Autoprobing */
iobase = EISA_SLOT_INC; /* Get the first slot address */ iobase = EISA_SLOT_INC; /* Get the first slot address */
...@@ -1472,9 +1455,10 @@ eisa_probe(struct net_device *dev, u_long ioaddr) ...@@ -1472,9 +1455,10 @@ eisa_probe(struct net_device *dev, u_long ioaddr)
i = (ioaddr >> 12); i = (ioaddr >> 12);
maxSlots = i + 1; maxSlots = i + 1;
} }
if ((iobase & 0x0fff) == 0) iobase += DEPCA_EISA_IO_PORTS; if ((iobase & 0x0fff) == 0)
iobase += DEPCA_EISA_IO_PORTS;
for (; (i<maxSlots) && (dev!=NULL); i++, iobase+=EISA_SLOT_INC) { for (; (i < maxSlots) && (dev != NULL); i++, iobase += EISA_SLOT_INC) {
if (check_region(iobase, DEPCA_TOTAL_SIZE) == 0) { if (check_region(iobase, DEPCA_TOTAL_SIZE) == 0) {
if (EISA_signature(name, EISA_ID)) { if (EISA_signature(name, EISA_ID)) {
if (DevicePresent(iobase) == 0) { if (DevicePresent(iobase) == 0) {
...@@ -1500,19 +1484,19 @@ eisa_probe(struct net_device *dev, u_long ioaddr) ...@@ -1500,19 +1484,19 @@ eisa_probe(struct net_device *dev, u_long ioaddr)
** are not available then insert a new device structure at the end of ** are not available then insert a new device structure at the end of
** the current list. ** the current list.
*/ */
static struct net_device * __init static struct net_device *__init alloc_device(struct net_device *dev, u_long iobase)
alloc_device(struct net_device *dev, u_long iobase)
{ {
struct net_device *adev = NULL; struct net_device *adev = NULL;
int fixed = 0, new_dev = 0; int fixed = 0, new_dev = 0;
num_eth = depca_dev_index(dev->name); num_eth = depca_dev_index(dev->name);
if (loading_module) return dev; if (loading_module)
return dev;
while (1) { while (1) {
if (((dev->base_addr == DEPCA_NDA) || (dev->base_addr==0)) && !adev) { if (((dev->base_addr == DEPCA_NDA) || (dev->base_addr == 0)) && !adev) {
adev=dev; adev = dev;
} else if ((dev->priv == NULL) && (dev->base_addr==iobase)) { } else if ((dev->priv == NULL) && (dev->base_addr == iobase)) {
fixed = 1; fixed = 1;
} else { } else {
if (dev->next == NULL) { if (dev->next == NULL) {
...@@ -1521,7 +1505,8 @@ alloc_device(struct net_device *dev, u_long iobase) ...@@ -1521,7 +1505,8 @@ alloc_device(struct net_device *dev, u_long iobase)
new_dev = 1; new_dev = 1;
} }
} }
if ((dev->next == NULL) || new_dev || fixed) break; if ((dev->next == NULL) || new_dev || fixed)
break;
dev = dev->next; dev = dev->next;
num_eth++; num_eth++;
} }
...@@ -1531,9 +1516,7 @@ alloc_device(struct net_device *dev, u_long iobase) ...@@ -1531,9 +1516,7 @@ alloc_device(struct net_device *dev, u_long iobase)
new_dev = 0; new_dev = 0;
} }
if (((dev->next == NULL) && if (((dev->next == NULL) && ((dev->base_addr != DEPCA_NDA) && (dev->base_addr != 0)) && !fixed) || new_dev) {
((dev->base_addr != DEPCA_NDA) && (dev->base_addr != 0)) && !fixed) ||
new_dev) {
num_eth++; /* New device */ num_eth++; /* New device */
dev = insert_device(dev, iobase, depca_probe); dev = insert_device(dev, iobase, depca_probe);
} }
...@@ -1545,23 +1528,22 @@ alloc_device(struct net_device *dev, u_long iobase) ...@@ -1545,23 +1528,22 @@ alloc_device(struct net_device *dev, u_long iobase)
** If at end of eth device list and can't use current entry, malloc ** If at end of eth device list and can't use current entry, malloc
** one up. If memory could not be allocated, print an error message. ** one up. If memory could not be allocated, print an error message.
*/ */
static struct net_device * __init static struct net_device *__init insert_device(struct net_device *dev, u_long iobase, int (*init) (struct net_device *))
insert_device(struct net_device *dev, u_long iobase, int (*init)(struct net_device *))
{ {
struct net_device *new; struct net_device *new;
new = (struct net_device *)kmalloc(sizeof(struct net_device), GFP_KERNEL); new = (struct net_device *) kmalloc(sizeof(struct net_device), GFP_KERNEL);
if (new == NULL) { if (new == NULL) {
printk("eth%d: Device not initialised, insufficient memory\n",num_eth); printk("eth%d: Device not initialised, insufficient memory\n", num_eth);
return NULL; return NULL;
} else { } else {
new->next = dev->next; new->next = dev->next;
dev->next = new; dev->next = new;
dev = dev->next; /* point to the new device */ dev = dev->next; /* point to the new device */
if (num_eth > 9999) { if (num_eth > 9999) {
sprintf(dev->name,"eth????");/* New device name */ sprintf(dev->name, "eth????"); /* New device name */
} else { } else {
sprintf(dev->name,"eth%d", num_eth);/* New device name */ sprintf(dev->name, "eth%d", num_eth); /* New device name */
} }
dev->base_addr = iobase; /* assign the io address */ dev->base_addr = iobase; /* assign the io address */
dev->init = init; /* initialisation routine */ dev->init = init; /* initialisation routine */
...@@ -1570,16 +1552,16 @@ insert_device(struct net_device *dev, u_long iobase, int (*init)(struct net_devi ...@@ -1570,16 +1552,16 @@ insert_device(struct net_device *dev, u_long iobase, int (*init)(struct net_devi
return dev; return dev;
} }
static int __init static int __init depca_dev_index(char *s)
depca_dev_index(char *s)
{ {
int i=0, j=0; int i = 0, j = 0;
for (;*s; s++) { for (; *s; s++) {
if (isdigit(*s)) { if (isdigit(*s)) {
j=1; j = 1;
i = (i * 10) + (*s - '0'); i = (i * 10) + (*s - '0');
} else if (j) break; } else if (j)
break;
} }
return i; return i;
...@@ -1590,10 +1572,9 @@ depca_dev_index(char *s) ...@@ -1590,10 +1572,9 @@ depca_dev_index(char *s)
** and Boot (readb) ROM. This will also give us a clue to the network RAM ** and Boot (readb) ROM. This will also give us a clue to the network RAM
** base address. ** base address.
*/ */
static void __init static void __init DepcaSignature(char *name, u_long paddr)
DepcaSignature(char *name, u_long paddr)
{ {
u_int i,j,k; u_int i, j, k;
const char *signatures[] = DEPCA_SIGNATURE; const char *signatures[] = DEPCA_SIGNATURE;
void *ptr; void *ptr;
char tmpstr[16]; char tmpstr[16];
...@@ -1601,36 +1582,38 @@ DepcaSignature(char *name, u_long paddr) ...@@ -1601,36 +1582,38 @@ DepcaSignature(char *name, u_long paddr)
/* Copy the first 16 bytes of ROM */ /* Copy the first 16 bytes of ROM */
ptr = ioremap(paddr + 0xc000, 16); ptr = ioremap(paddr + 0xc000, 16);
if (ptr == NULL) { if (ptr == NULL) {
printk(KERN_ERR "depca: I/O remap failed at %lx\n", paddr+0xc000); printk(KERN_ERR "depca: I/O remap failed at %lx\n", paddr + 0xc000);
adapter = unknown; adapter = unknown;
return; return;
} }
for (i=0;i<16;i++) { for (i = 0; i < 16; i++) {
tmpstr[i] = readb(ptr + i); tmpstr[i] = readb(ptr + i);
} }
iounmap(ptr); iounmap(ptr);
/* Check if PROM contains a valid string */ /* Check if PROM contains a valid string */
for (i=0;*signatures[i]!='\0';i++) { for (i = 0; *signatures[i] != '\0'; i++) {
for (j=0,k=0;j<16 && k<strlen(signatures[i]);j++) { for (j = 0, k = 0; j < 16 && k < strlen(signatures[i]); j++) {
if (signatures[i][k] == tmpstr[j]) { /* track signature */ if (signatures[i][k] == tmpstr[j]) { /* track signature */
k++; k++;
} else { /* lost signature; begin search again */ } else { /* lost signature; begin search again */
k=0; k = 0;
} }
} }
if (k == strlen(signatures[i])) break; if (k == strlen(signatures[i]))
break;
} }
/* Check if name string is valid, provided there's no PROM */ /* Check if name string is valid, provided there's no PROM */
if (*name && (i == unknown)) { if (*name && (i == unknown)) {
for (i=0;*signatures[i]!='\0';i++) { for (i = 0; *signatures[i] != '\0'; i++) {
if (strcmp(name,signatures[i]) == 0) break; if (strcmp(name, signatures[i]) == 0)
break;
} }
} }
/* Update search results */ /* Update search results */
strcpy(name,signatures[i]); strcpy(name, signatures[i]);
adapter = i; adapter = i;
return; return;
...@@ -1651,8 +1634,7 @@ DepcaSignature(char *name, u_long paddr) ...@@ -1651,8 +1634,7 @@ DepcaSignature(char *name, u_long paddr)
** PROM address counter is correctly positioned at the start of the ** PROM address counter is correctly positioned at the start of the
** ethernet address for later read out. ** ethernet address for later read out.
*/ */
static int __init static int __init DevicePresent(u_long ioaddr)
DevicePresent(u_long ioaddr)
{ {
union { union {
struct { struct {
...@@ -1660,8 +1642,9 @@ DevicePresent(u_long ioaddr) ...@@ -1660,8 +1642,9 @@ DevicePresent(u_long ioaddr)
u32 b; u32 b;
} llsig; } llsig;
char Sig[sizeof(u32) << 1]; char Sig[sizeof(u32) << 1];
} dev; }
short sigLength=0; dev;
short sigLength = 0;
s8 data; s8 data;
s16 nicsr; s16 nicsr;
int i, j, status = 0; int i, j, status = 0;
...@@ -1679,20 +1662,20 @@ DevicePresent(u_long ioaddr) ...@@ -1679,20 +1662,20 @@ DevicePresent(u_long ioaddr)
dev.llsig.b = ETH_PROM_SIG; dev.llsig.b = ETH_PROM_SIG;
sigLength = sizeof(u32) << 1; sigLength = sizeof(u32) << 1;
for (i=0,j=0;j<sigLength && i<PROBE_LENGTH+sigLength-1;i++) { for (i = 0, j = 0; j < sigLength && i < PROBE_LENGTH + sigLength - 1; i++) {
data = inb(DEPCA_PROM); data = inb(DEPCA_PROM);
if (dev.Sig[j] == data) { /* track signature */ if (dev.Sig[j] == data) { /* track signature */
j++; j++;
} else { /* lost signature; begin search again */ } else { /* lost signature; begin search again */
if (data == dev.Sig[0]) { /* rare case.... */ if (data == dev.Sig[0]) { /* rare case.... */
j=1; j = 1;
} else { } else {
j=0; j = 0;
} }
} }
} }
if (j!=sigLength) { if (j != sigLength) {
status = -ENODEV; /* search failed */ status = -ENODEV; /* search failed */
} }
...@@ -1704,8 +1687,7 @@ DevicePresent(u_long ioaddr) ...@@ -1704,8 +1687,7 @@ DevicePresent(u_long ioaddr)
** reason: access the upper half of the PROM with x=0; access the lower half ** reason: access the upper half of the PROM with x=0; access the lower half
** with x=1. ** with x=1.
*/ */
static int __init static int __init get_hw_addr(struct net_device *dev)
get_hw_addr(struct net_device *dev)
{ {
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
int i, k, tmp, status = 0; int i, k, tmp, status = 0;
...@@ -1713,22 +1695,26 @@ get_hw_addr(struct net_device *dev) ...@@ -1713,22 +1695,26 @@ get_hw_addr(struct net_device *dev)
x = (((adapter == de100) || (adapter == de101)) ? 1 : 0); x = (((adapter == de100) || (adapter == de101)) ? 1 : 0);
for (i=0,k=0,j=0;j<3;j++) { for (i = 0, k = 0, j = 0; j < 3; j++) {
k <<= 1 ; k <<= 1;
if (k > 0xffff) k-=0xffff; if (k > 0xffff)
k -= 0xffff;
k += (u_char) (tmp = inb(DEPCA_PROM + x)); k += (u_char) (tmp = inb(DEPCA_PROM + x));
dev->dev_addr[i++] = (u_char) tmp; dev->dev_addr[i++] = (u_char) tmp;
k += (u_short) ((tmp = inb(DEPCA_PROM + x)) << 8); k += (u_short) ((tmp = inb(DEPCA_PROM + x)) << 8);
dev->dev_addr[i++] = (u_char) tmp; dev->dev_addr[i++] = (u_char) tmp;
if (k > 0xffff) k-=0xffff; if (k > 0xffff)
k -= 0xffff;
} }
if (k == 0xffff) k=0; if (k == 0xffff)
k = 0;
chksum = (u_char) inb(DEPCA_PROM + x); chksum = (u_char) inb(DEPCA_PROM + x);
chksum |= (u_short) (inb(DEPCA_PROM + x) << 8); chksum |= (u_short) (inb(DEPCA_PROM + x) << 8);
if (k != chksum) status = -1; if (k != chksum)
status = -1;
return status; return status;
} }
...@@ -1738,12 +1724,12 @@ get_hw_addr(struct net_device *dev) ...@@ -1738,12 +1724,12 @@ get_hw_addr(struct net_device *dev)
*/ */
static int load_packet(struct net_device *dev, struct sk_buff *skb) static int load_packet(struct net_device *dev, struct sk_buff *skb)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
int i, entry, end, len, status = 0; int i, entry, end, len, status = 0;
entry = lp->tx_new; /* Ring around buffer number. */ entry = lp->tx_new; /* Ring around buffer number. */
end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask; end = (entry + (skb->len - 1) / TX_BUFF_SZ) & lp->txRingMask;
if (!(readl(&lp->tx_ring[end].base) & T_OWN)) {/* Enough room? */ if (!(readl(&lp->tx_ring[end].base) & T_OWN)) { /* Enough room? */
/* /*
** Caution: the write order is important here... don't set up the ** Caution: the write order is important here... don't set up the
** ownership rights until all the other information is in place. ** ownership rights until all the other information is in place.
...@@ -1762,7 +1748,7 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb) ...@@ -1762,7 +1748,7 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb)
/* clean out flags */ /* clean out flags */
writel(readl(&lp->tx_ring[i].base) & ~T_FLAGS, &lp->tx_ring[i].base); writel(readl(&lp->tx_ring[i].base) & ~T_FLAGS, &lp->tx_ring[i].base);
writew(0x0000, &lp->tx_ring[i].misc); /* clears other error flags */ writew(0x0000, &lp->tx_ring[i].misc); /* clears other error flags */
writew(-TX_BUFF_SZ, &lp->tx_ring[i].length);/* packet length in buffer */ writew(-TX_BUFF_SZ, &lp->tx_ring[i].length); /* packet length in buffer */
len -= TX_BUFF_SZ; len -= TX_BUFF_SZ;
} }
/* clean out flags */ /* clean out flags */
...@@ -1775,10 +1761,11 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb) ...@@ -1775,10 +1761,11 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb)
/* end of packet */ /* end of packet */
writel(readl(&lp->tx_ring[end].base) | T_ENP, &lp->tx_ring[end].base); writel(readl(&lp->tx_ring[end].base) | T_ENP, &lp->tx_ring[end].base);
for (i=end; i!=entry; --i) { for (i = end; i != entry; --i) {
/* ownership of packet */ /* ownership of packet */
writel(readl(&lp->tx_ring[i].base) | T_OWN, &lp->tx_ring[i].base); writel(readl(&lp->tx_ring[i].base) | T_OWN, &lp->tx_ring[i].base);
if (i == 0) i=lp->txRingMask+1; if (i == 0)
i = lp->txRingMask + 1;
} }
writel(readl(&lp->tx_ring[entry].base) | T_OWN, &lp->tx_ring[entry].base); writel(readl(&lp->tx_ring[entry].base) | T_OWN, &lp->tx_ring[entry].base);
...@@ -1793,8 +1780,7 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb) ...@@ -1793,8 +1780,7 @@ static int load_packet(struct net_device *dev, struct sk_buff *skb)
/* /*
** Look for a particular board name in the EISA configuration space ** Look for a particular board name in the EISA configuration space
*/ */
static int __init static int __init EISA_signature(char *name, s32 eisa_id)
EISA_signature(char *name, s32 eisa_id)
{ {
u_int i; u_int i;
const char *signatures[] = DEPCA_SIGNATURE; const char *signatures[] = DEPCA_SIGNATURE;
...@@ -1808,16 +1794,16 @@ EISA_signature(char *name, s32 eisa_id) ...@@ -1808,16 +1794,16 @@ EISA_signature(char *name, s32 eisa_id)
*name = '\0'; *name = '\0';
Eisa.ID = inl(eisa_id); Eisa.ID = inl(eisa_id);
ManCode[0]=(((Eisa.Id[0]>>2)&0x1f)+0x40); ManCode[0] = (((Eisa.Id[0] >> 2) & 0x1f) + 0x40);
ManCode[1]=(((Eisa.Id[1]&0xe0)>>5)+((Eisa.Id[0]&0x03)<<3)+0x40); ManCode[1] = (((Eisa.Id[1] & 0xe0) >> 5) + ((Eisa.Id[0] & 0x03) << 3) + 0x40);
ManCode[2]=(((Eisa.Id[2]>>4)&0x0f)+0x30); ManCode[2] = (((Eisa.Id[2] >> 4) & 0x0f) + 0x30);
ManCode[3]=(( Eisa.Id[2]&0x0f)+0x30); ManCode[3] = ((Eisa.Id[2] & 0x0f) + 0x30);
ManCode[4]=(((Eisa.Id[3]>>4)&0x0f)+0x30); ManCode[4] = (((Eisa.Id[3] >> 4) & 0x0f) + 0x30);
ManCode[5]='\0'; ManCode[5] = '\0';
for (i=0;(*signatures[i] != '\0') && (*name == '\0');i++) { for (i = 0; (*signatures[i] != '\0') && (*name == '\0'); i++) {
if (strstr(ManCode, signatures[i]) != NULL) { if (strstr(ManCode, signatures[i]) != NULL) {
strcpy(name,ManCode); strcpy(name, ManCode);
status = 1; status = 1;
} }
} }
...@@ -1827,73 +1813,69 @@ EISA_signature(char *name, s32 eisa_id) ...@@ -1827,73 +1813,69 @@ EISA_signature(char *name, s32 eisa_id)
static void depca_dbg_open(struct net_device *dev) static void depca_dbg_open(struct net_device *dev)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
struct depca_init *p = &lp->init_block; struct depca_init *p = &lp->init_block;
int i; int i;
if (depca_debug > 1){ if (depca_debug > 1) {
/* Do not copy the shadow init block into shared memory */ /* Do not copy the shadow init block into shared memory */
/* Debugging should not affect normal operation! */ /* Debugging should not affect normal operation! */
/* The shadow init block will get copied across during InitRestartDepca */ /* The shadow init block will get copied across during InitRestartDepca */
printk("%s: depca open with irq %d\n",dev->name,dev->irq); printk("%s: depca open with irq %d\n", dev->name, dev->irq);
printk("Descriptor head addresses (CPU):\n"); printk("Descriptor head addresses (CPU):\n");
printk(" 0x%lx 0x%lx\n",(u_long)lp->rx_ring, (u_long)lp->tx_ring); printk(" 0x%lx 0x%lx\n", (u_long) lp->rx_ring, (u_long) lp->tx_ring);
printk("Descriptor addresses (CPU):\nRX: "); printk("Descriptor addresses (CPU):\nRX: ");
for (i=0;i<lp->rxRingMask;i++){ for (i = 0; i < lp->rxRingMask; i++) {
if (i < 3) { if (i < 3) {
printk("0x%8.8lx ", (long) &lp->rx_ring[i].base); printk("0x%8.8lx ", (long) &lp->rx_ring[i].base);
} }
} }
printk("...0x%8.8lx\n", (long) &lp->rx_ring[i].base); printk("...0x%8.8lx\n", (long) &lp->rx_ring[i].base);
printk("TX: "); printk("TX: ");
for (i=0;i<lp->txRingMask;i++){ for (i = 0; i < lp->txRingMask; i++) {
if (i < 3) { if (i < 3) {
printk("0x%8.8lx ", (long) &lp->tx_ring[i].base); printk("0x%8.8lx ", (long) &lp->tx_ring[i].base);
} }
} }
printk("...0x%8.8lx\n", (long) &lp->tx_ring[i].base); printk("...0x%8.8lx\n", (long) &lp->tx_ring[i].base);
printk("\nDescriptor buffers (Device):\nRX: "); printk("\nDescriptor buffers (Device):\nRX: ");
for (i=0;i<lp->rxRingMask;i++){ for (i = 0; i < lp->rxRingMask; i++) {
if (i < 3) { if (i < 3) {
printk("0x%8.8x ", readl(&lp->rx_ring[i].base)); printk("0x%8.8x ", readl(&lp->rx_ring[i].base));
} }
} }
printk("...0x%8.8x\n", readl(&lp->rx_ring[i].base)); printk("...0x%8.8x\n", readl(&lp->rx_ring[i].base));
printk("TX: "); printk("TX: ");
for (i=0;i<lp->txRingMask;i++){ for (i = 0; i < lp->txRingMask; i++) {
if (i < 3) { if (i < 3) {
printk("0x%8.8x ", readl(&lp->tx_ring[i].base)); printk("0x%8.8x ", readl(&lp->tx_ring[i].base));
} }
} }
printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base)); printk("...0x%8.8x\n", readl(&lp->tx_ring[i].base));
printk("Initialisation block at 0x%8.8lx(Phys)\n",virt_to_phys(lp->sh_mem)); printk("Initialisation block at 0x%8.8lx(Phys)\n", virt_to_phys(lp->sh_mem));
printk(" mode: 0x%4.4x\n",p->mode); printk(" mode: 0x%4.4x\n", p->mode);
printk(" physical address: "); printk(" physical address: ");
for (i=0;i<ETH_ALEN-1;i++){ for (i = 0; i < ETH_ALEN - 1; i++) {
printk("%2.2x:", p->phys_addr[i]); printk("%2.2x:", p->phys_addr[i]);
} }
printk("%2.2x\n", p->phys_addr[i]); printk("%2.2x\n", p->phys_addr[i]);
printk(" multicast hash table: "); printk(" multicast hash table: ");
for (i=0;i<(HASH_TABLE_LEN >> 3)-1;i++){ for (i = 0; i < (HASH_TABLE_LEN >> 3) - 1; i++) {
printk("%2.2x:", p->mcast_table[i]); printk("%2.2x:", p->mcast_table[i]);
} }
printk("%2.2x\n", p->mcast_table[i]); printk("%2.2x\n", p->mcast_table[i]);
printk(" rx_ring at: 0x%8.8x\n", p->rx_ring); printk(" rx_ring at: 0x%8.8x\n", p->rx_ring);
printk(" tx_ring at: 0x%8.8x\n", p->tx_ring); printk(" tx_ring at: 0x%8.8x\n", p->tx_ring);
printk("buffers (Phys): 0x%8.8lx\n",virt_to_phys(lp->sh_mem)+lp->buffs_offset); printk("buffers (Phys): 0x%8.8lx\n", virt_to_phys(lp->sh_mem) + lp->buffs_offset);
printk("Ring size:\nRX: %d Log2(rxRingMask): 0x%8.8x\n", printk("Ring size:\nRX: %d Log2(rxRingMask): 0x%8.8x\n", (int) lp->rxRingMask + 1, lp->rx_rlen);
(int)lp->rxRingMask + 1, printk("TX: %d Log2(txRingMask): 0x%8.8x\n", (int) lp->txRingMask + 1, lp->tx_rlen);
lp->rx_rlen); outw(CSR2, DEPCA_ADDR);
printk("TX: %d Log2(txRingMask): 0x%8.8x\n", printk("CSR2&1: 0x%4.4x", inw(DEPCA_DATA));
(int)lp->txRingMask + 1, outw(CSR1, DEPCA_ADDR);
lp->tx_rlen); printk("%4.4x\n", inw(DEPCA_DATA));
outw(CSR2,DEPCA_ADDR); outw(CSR3, DEPCA_ADDR);
printk("CSR2&1: 0x%4.4x",inw(DEPCA_DATA)); printk("CSR3: 0x%4.4x\n", inw(DEPCA_DATA));
outw(CSR1,DEPCA_ADDR);
printk("%4.4x\n",inw(DEPCA_DATA));
outw(CSR3,DEPCA_ADDR);
printk("CSR3: 0x%4.4x\n",inw(DEPCA_DATA));
} }
return; return;
...@@ -1906,7 +1888,7 @@ static void depca_dbg_open(struct net_device *dev) ...@@ -1906,7 +1888,7 @@ static void depca_dbg_open(struct net_device *dev)
*/ */
static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
{ {
struct depca_private *lp = (struct depca_private *)dev->priv; struct depca_private *lp = (struct depca_private *) dev->priv;
struct depca_ioctl *ioc = (struct depca_ioctl *) &rq->ifr_data; struct depca_ioctl *ioc = (struct depca_ioctl *) &rq->ifr_data;
int i, status = 0; int i, status = 0;
u_long ioaddr = dev->base_addr; u_long ioaddr = dev->base_addr;
...@@ -1915,10 +1897,12 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1915,10 +1897,12 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1]; u16 sval[(HASH_TABLE_LEN * ETH_ALEN) >> 1];
u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2]; u32 lval[(HASH_TABLE_LEN * ETH_ALEN) >> 2];
} tmp; } tmp;
unsigned long flags;
void *buf;
switch(ioc->cmd) { switch (ioc->cmd) {
case DEPCA_GET_HWADDR: /* Get the hardware address */ case DEPCA_GET_HWADDR: /* Get the hardware address */
for (i=0; i<ETH_ALEN; i++) { for (i = 0; i < ETH_ALEN; i++) {
tmp.addr[i] = dev->dev_addr[i]; tmp.addr[i] = dev->dev_addr[i];
} }
ioc->len = ETH_ALEN; ioc->len = ETH_ALEN;
...@@ -1927,14 +1911,16 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1927,14 +1911,16 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break; break;
case DEPCA_SET_HWADDR: /* Set the hardware address */ case DEPCA_SET_HWADDR: /* Set the hardware address */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
return -EPERM;
if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN)) if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN))
return -EFAULT; return -EFAULT;
for (i=0; i<ETH_ALEN; i++) { for (i = 0; i < ETH_ALEN; i++) {
dev->dev_addr[i] = tmp.addr[i]; dev->dev_addr[i] = tmp.addr[i];
} }
netif_stop_queue(dev); netif_stop_queue(dev);
while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */ while (lp->tx_old != lp->tx_new)
cpu_relax(); /* Wait for the ring to empty */
STOP_DEPCA; /* Temporarily stop the depca. */ STOP_DEPCA; /* Temporarily stop the depca. */
depca_init_ring(dev); /* Initialize the descriptor rings */ depca_init_ring(dev); /* Initialize the descriptor rings */
...@@ -1944,9 +1930,11 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1944,9 +1930,11 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break; break;
case DEPCA_SET_PROM: /* Set Promiscuous Mode */ case DEPCA_SET_PROM: /* Set Promiscuous Mode */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
return -EPERM;
netif_stop_queue(dev); netif_stop_queue(dev);
while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */ while (lp->tx_old != lp->tx_new)
cpu_relax(); /* Wait for the ring to empty */
STOP_DEPCA; /* Temporarily stop the depca. */ STOP_DEPCA; /* Temporarily stop the depca. */
depca_init_ring(dev); /* Initialize the descriptor rings */ depca_init_ring(dev); /* Initialize the descriptor rings */
...@@ -1958,9 +1946,11 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1958,9 +1946,11 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break; break;
case DEPCA_CLR_PROM: /* Clear Promiscuous Mode */ case DEPCA_CLR_PROM: /* Clear Promiscuous Mode */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
return -EPERM;
netif_stop_queue(dev); netif_stop_queue(dev);
while(lp->tx_old != lp->tx_new); /* Wait for the ring to empty */ while (lp->tx_old != lp->tx_new)
cpu_relax(); /* Wait for the ring to empty */
STOP_DEPCA; /* Temporarily stop the depca. */ STOP_DEPCA; /* Temporarily stop the depca. */
depca_init_ring(dev); /* Initialize the descriptor rings */ depca_init_ring(dev); /* Initialize the descriptor rings */
...@@ -1972,6 +1962,8 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1972,6 +1962,8 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break; break;
case DEPCA_SAY_BOO: /* Say "Boo!" to the kernel log file */ case DEPCA_SAY_BOO: /* Say "Boo!" to the kernel log file */
if(!capable(CAP_NET_ADMIN))
return -EPERM;
printk("%s: Boo!\n", dev->name); printk("%s: Boo!\n", dev->name);
break; break;
...@@ -1982,44 +1974,55 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -1982,44 +1974,55 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
break; break;
case DEPCA_SET_MCA: /* Set a multicast address */ case DEPCA_SET_MCA: /* Set a multicast address */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
return -EPERM;
if (ioc->len >= HASH_TABLE_LEN)
return -EINVAL;
if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN * ioc->len)) if (copy_from_user(tmp.addr, ioc->data, ETH_ALEN * ioc->len))
return -EFAULT; return -EFAULT;
set_multicast_list(dev); set_multicast_list(dev);
break; break;
case DEPCA_CLR_MCA: /* Clear all multicast addresses */ case DEPCA_CLR_MCA: /* Clear all multicast addresses */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
return -EPERM;
set_multicast_list(dev); set_multicast_list(dev);
break; break;
case DEPCA_MCA_EN: /* Enable pass all multicast addressing */ case DEPCA_MCA_EN: /* Enable pass all multicast addressing */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
return -EPERM;
set_multicast_list(dev); set_multicast_list(dev);
break; break;
case DEPCA_GET_STATS: /* Get the driver statistics */ case DEPCA_GET_STATS: /* Get the driver statistics */
cli();
ioc->len = sizeof(lp->pktStats); ioc->len = sizeof(lp->pktStats);
buf = kmalloc(ioc->len, GFP_KERNEL);
if(!buf)
return -ENOMEM;
spin_lock_irqsave(&lp->lock, flags);
memcpy(buf, &lp->pktStats, ioc->len);
spin_unlock_irqrestore(&lp->lock, flags);
if (copy_to_user(ioc->data, &lp->pktStats, ioc->len)) if (copy_to_user(ioc->data, &lp->pktStats, ioc->len))
status = -EFAULT; status = -EFAULT;
sti(); kfree(buf);
break; break;
case DEPCA_CLR_STATS: /* Zero out the driver statistics */ case DEPCA_CLR_STATS: /* Zero out the driver statistics */
if (!capable(CAP_NET_ADMIN)) return -EPERM; if (!capable(CAP_NET_ADMIN))
cli(); return -EPERM;
spin_lock_irqsave(&lp->lock, flags);
memset(&lp->pktStats, 0, sizeof(lp->pktStats)); memset(&lp->pktStats, 0, sizeof(lp->pktStats));
sti(); spin_unlock_irqrestore(&lp->lock, flags);
break; break;
case DEPCA_GET_REG: /* Get the DEPCA Registers */ case DEPCA_GET_REG: /* Get the DEPCA Registers */
i=0; i = 0;
tmp.sval[i++] = inw(DEPCA_NICSR); tmp.sval[i++] = inw(DEPCA_NICSR);
outw(CSR0, DEPCA_ADDR); /* status register */ outw(CSR0, DEPCA_ADDR); /* status register */
tmp.sval[i++] = inw(DEPCA_DATA); tmp.sval[i++] = inw(DEPCA_DATA);
memcpy(&tmp.sval[i], &lp->init_block, sizeof(struct depca_init)); memcpy(&tmp.sval[i], &lp->init_block, sizeof(struct depca_init));
ioc->len = i+sizeof(struct depca_init); ioc->len = i + sizeof(struct depca_init);
if (copy_to_user(ioc->data, tmp.addr, ioc->len)) if (copy_to_user(ioc->data, tmp.addr, ioc->len))
return -EFAULT; return -EFAULT;
break; break;
...@@ -2033,19 +2036,18 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) ...@@ -2033,19 +2036,18 @@ static int depca_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
#ifdef MODULE #ifdef MODULE
static struct net_device thisDepca; static struct net_device thisDepca;
static int irq=7; /* EDIT THESE LINE FOR YOUR CONFIGURATION */ static int irq = 7; /* EDIT THESE LINE FOR YOUR CONFIGURATION */
static int io=0x200; /* Or use the irq= io= options to insmod */ static int io = 0x200; /* Or use the irq= io= options to insmod */
MODULE_PARM(irq, "i"); MODULE_PARM(irq, "i");
MODULE_PARM(io, "i"); MODULE_PARM(io, "i");
MODULE_PARM_DESC(irq, "DEPCA IRQ number"); MODULE_PARM_DESC(irq, "DEPCA IRQ number");
MODULE_PARM_DESC(io, "DEPCA I/O base address"); MODULE_PARM_DESC(io, "DEPCA I/O base address");
/* See depca_probe() for autoprobe messages when a module */ /* See depca_probe() for autoprobe messages when a module */
int int init_module(void)
init_module(void)
{ {
thisDepca.irq=irq; thisDepca.irq = irq;
thisDepca.base_addr=io; thisDepca.base_addr = io;
thisDepca.init = depca_probe; thisDepca.init = depca_probe;
if (register_netdev(&thisDepca) != 0) if (register_netdev(&thisDepca) != 0)
...@@ -2054,8 +2056,7 @@ init_module(void) ...@@ -2054,8 +2056,7 @@ init_module(void)
return 0; return 0;
} }
void void cleanup_module(void)
cleanup_module(void)
{ {
struct depca_private *lp = thisDepca.priv; struct depca_private *lp = thisDepca.priv;
...@@ -2063,20 +2064,20 @@ cleanup_module(void) ...@@ -2063,20 +2064,20 @@ cleanup_module(void)
if (lp) { if (lp) {
iounmap(lp->sh_mem); iounmap(lp->sh_mem);
#ifdef CONFIG_MCA #ifdef CONFIG_MCA
if(lp->mca_slot != -1) if (lp->mca_slot != -1)
mca_mark_as_unused(lp->mca_slot); mca_mark_as_unused(lp->mca_slot);
#endif #endif
kfree(lp); kfree(lp);
thisDepca.priv = NULL; thisDepca.priv = NULL;
} }
thisDepca.irq=0; thisDepca.irq = 0;
release_region(thisDepca.base_addr, DEPCA_TOTAL_SIZE); release_region(thisDepca.base_addr, DEPCA_TOTAL_SIZE);
} }
#endif /* MODULE */ #endif /* MODULE */
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
/* /*
* Local variables: * Local variables:
* compile-command: "gcc -D__KERNEL__ -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c depca.c" * compile-command: "gcc -D__KERNEL__ -I/linux/include -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -malign-functions=2 -O2 -m486 -c depca.c"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment