]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
KSZ8851-SNL: Fix MAC address change problem
authorTristram Ha <Tristram.Ha@micrel.com>
Mon, 21 Nov 2011 08:57:59 +0000 (08:57 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 26 Nov 2011 19:59:39 +0000 (14:59 -0500)
When device is off it is under power saving mode. Changing the MAC address
in that situation will result in the device not communicating as the first
write to the MAC address register is not executed.

Signed-off-by: Tristram Ha <Tristram.Ha@micrel.com>
[ben@simtec.co.uk: cleaned up header]
Signed-off-by: Ben Dooks <ben@simtec.co.uk>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/micrel/ks8851.c
drivers/net/ethernet/micrel/ks8851.h

index d1669bcd4b4dcbff77f07f7299223dc3f132f36f..208e25a9e08cc05ead0f8ae6adc8bc7375542bdd 100644 (file)
@@ -342,6 +342,26 @@ static void ks8851_soft_reset(struct ks8851_net *ks, unsigned op)
        mdelay(1);      /* wait for condition to clear */
 }
 
+/**
+ * ks8851_set_powermode - set power mode of the device
+ * @ks: The device state
+ * @pwrmode: The power mode value to write to KS_PMECR.
+ *
+ * Change the power mode of the chip.
+ */
+static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode)
+{
+       unsigned pmecr;
+
+       netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
+
+       pmecr = ks8851_rdreg16(ks, KS_PMECR);
+       pmecr &= ~PMECR_PM_MASK;
+       pmecr |= pwrmode;
+
+       ks8851_wrreg16(ks, KS_PMECR, pmecr);
+}
+
 /**
  * ks8851_write_mac_addr - write mac address to device registers
  * @dev: The network device
@@ -358,8 +378,15 @@ static int ks8851_write_mac_addr(struct net_device *dev)
 
        mutex_lock(&ks->lock);
 
+       /*
+        * Wake up chip in case it was powered off when stopped; otherwise,
+        * the first write to the MAC address does not take effect.
+        */
+       ks8851_set_powermode(ks, PMECR_PM_NORMAL);
        for (i = 0; i < ETH_ALEN; i++)
                ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]);
+       if (!netif_running(dev))
+               ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);
 
        mutex_unlock(&ks->lock);
 
@@ -764,26 +791,6 @@ static void ks8851_tx_work(struct work_struct *work)
        mutex_unlock(&ks->lock);
 }
 
-/**
- * ks8851_set_powermode - set power mode of the device
- * @ks: The device state
- * @pwrmode: The power mode value to write to KS_PMECR.
- *
- * Change the power mode of the chip.
- */
-static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode)
-{
-       unsigned pmecr;
-
-       netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
-
-       pmecr = ks8851_rdreg16(ks, KS_PMECR);
-       pmecr &= ~PMECR_PM_MASK;
-       pmecr |= pwrmode;
-
-       ks8851_wrreg16(ks, KS_PMECR, pmecr);
-}
-
 /**
  * ks8851_net_open - open network device
  * @dev: The network device being opened.
index 537fb06e593200144c8b1d09c1aae732416748e1..b2703a11d04ba9f0146e84c1f8e587084c34a5ae 100644 (file)
@@ -16,7 +16,7 @@
 #define CCR_32PIN                              (1 << 0)
 
 /* MAC address registers */
-#define KS_MAR(_m)                             0x15 - (_m)
+#define KS_MAR(_m)                             (0x15 - (_m))
 #define KS_MARL                                        0x10
 #define KS_MARM                                        0x12
 #define KS_MARH                                        0x14