patch-2.4.0-test9 linux/drivers/net/am79c961a.c
Next file: linux/drivers/net/am79c961a.h
Previous file: linux/drivers/net/aironet4500_core.c
Back to the patch index
Back to the overall index
- Lines: 133
- Date:
Mon Sep 18 15:15:22 2000
- Orig file:
v2.4.0-test8/linux/drivers/net/am79c961a.c
- Orig date:
Tue Jul 11 11:12:23 2000
diff -u --recursive --new-file v2.4.0-test8/linux/drivers/net/am79c961a.c linux/drivers/net/am79c961a.c
@@ -1,9 +1,13 @@
/*
- * linux/drivers/net/am79c961.c
+ * linux/drivers/net/am79c961.c
*
- * Derived from various things including skeleton.c
+ * by Russell King <rmk@arm.linux.org.uk> 1995-2000.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
*
- * Russell King 1995-2000.
+ * Derived from various things including skeleton.c
*
* This is a special driver for the am79c961A Lance chip used in the
* Intel (formally Digital Equipment Corp) EBSA110 platform.
@@ -204,9 +208,12 @@
u_int hdr_addr, first_free_addr;
int i;
- save_flags_cli (flags);
+ /*
+ * Stop the chip.
+ */
+ spin_lock_irqsave(priv->chip_lock, flags);
write_rreg (dev->base_addr, CSR0, CSR0_BABL|CSR0_CERR|CSR0_MISS|CSR0_MERR|CSR0_TINT|CSR0_RINT|CSR0_STOP);
- restore_flags (flags);
+ spin_unlock_irqrestore(priv->chip_lock, flags);
write_ireg (dev->base_addr, 5, 0x00a0); /* Receive address LED */
write_ireg (dev->base_addr, 6, 0x0081); /* Collision LED */
@@ -301,16 +308,15 @@
static int
am79c961_close(struct net_device *dev)
{
+ struct dev_priv *priv = (struct dev_priv *)dev->priv;
unsigned long flags;
netif_stop_queue(dev);
- save_flags_cli (flags);
-
+ spin_lock_irqsave(priv->chip_lock, flags);
write_rreg (dev->base_addr, CSR0, CSR0_STOP);
write_rreg (dev->base_addr, CSR3, CSR3_MASKALL);
-
- restore_flags (flags);
+ spin_unlock_irqrestore(priv->chip_lock, flags);
free_irq (dev->irq, dev);
@@ -368,6 +374,7 @@
*/
static void am79c961_setmulticastlist (struct net_device *dev)
{
+ struct dev_priv *priv = (struct dev_priv *)dev->priv;
unsigned long flags;
unsigned short multi_hash[4], mode;
int i, stopped;
@@ -387,7 +394,7 @@
am79c961_mc_hash(dmi, multi_hash);
}
- save_flags_cli(flags);
+ spin_lock_irqsave(priv->chip_lock, flags);
stopped = read_rreg(dev->base_addr, CSR0) & CSR0_STOP;
@@ -401,9 +408,9 @@
* Spin waiting for chip to report suspend mode
*/
while ((read_rreg(dev->base_addr, CTRL1) & CTRL1_SPND) == 0) {
- restore_flags(flags);
+ spin_unlock_irqrestore(priv->chip_lock, flags);
nop();
- save_flags_cli(flags);
+ spin_lock_irqsave(priv->chip_lock, flags);
}
}
@@ -425,7 +432,7 @@
write_rreg(dev->base_addr, CTRL1, 0);
}
- restore_flags(flags);
+ spin_unlock_irqrestore(priv->chip_lock, flags);
}
static void am79c961_timeout(struct net_device *dev)
@@ -464,10 +471,10 @@
am_writeword (dev, hdraddr + 2, TMD_OWN|TMD_STP|TMD_ENP);
priv->txhead = head;
- save_flags_cli (flags);
+ spin_lock_irqsave(priv->chip_lock, flags);
write_rreg (dev->base_addr, CSR0, CSR0_TDMD|CSR0_IENA);
dev->trans_start = jiffies;
- restore_flags (flags);
+ spin_unlock_irqrestore(priv->chip_lock, flags);
/*
* If the next packet is owned by the ethernet device,
@@ -611,20 +618,22 @@
priv->stats.rx_dropped ++;
}
+/*
+ * Initialise the chip. Note that we always expect
+ * to be entered with interrupts enabled.
+ */
static int
am79c961_hw_init(struct net_device *dev)
{
- unsigned long flags;
-
- am79c961_ramtest(dev, 0x66);
- am79c961_ramtest(dev, 0x99);
-
- save_flags_cli (flags);
+ struct dev_priv *priv = (struct dev_priv *)dev->priv;
+ spin_lock_irq(priv->chip_lock);
write_rreg (dev->base_addr, CSR0, CSR0_STOP);
write_rreg (dev->base_addr, CSR3, CSR3_MASKALL);
+ spin_unlock_irq(priv->chip_lock);
- restore_flags (flags);
+ am79c961_ramtest(dev, 0x66);
+ am79c961_ramtest(dev, 0x99);
return 0;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)