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

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)