aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/micrel
diff options
context:
space:
mode:
authorTristram Ha <Tristram.Ha@micrel.com>2011-11-21 03:57:59 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-26 14:59:39 -0500
commit32f160d96514a15cc52b708d8a8b9742bc3acd5d (patch)
tree69dd57a9b0da0751d1fbece1e844b21225868416 /drivers/net/ethernet/micrel
parenta9a8de214c91eecf596b3e79c7986b74ef17f4ec (diff)
KSZ8851-SNL: Fix MAC address change problem
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>
Diffstat (limited to 'drivers/net/ethernet/micrel')
-rw-r--r--drivers/net/ethernet/micrel/ks8851.c47
-rw-r--r--drivers/net/ethernet/micrel/ks8851.h2
2 files changed, 28 insertions, 21 deletions
diff --git a/drivers/net/ethernet/micrel/ks8851.c b/drivers/net/ethernet/micrel/ks8851.c
index d1669bcd4b4d..208e25a9e08c 100644
--- a/drivers/net/ethernet/micrel/ks8851.c
+++ b/drivers/net/ethernet/micrel/ks8851.c
@@ -343,6 +343,26 @@ static void ks8851_soft_reset(struct ks8851_net *ks, unsigned op)
343} 343}
344 344
345/** 345/**
346 * ks8851_set_powermode - set power mode of the device
347 * @ks: The device state
348 * @pwrmode: The power mode value to write to KS_PMECR.
349 *
350 * Change the power mode of the chip.
351 */
352static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode)
353{
354 unsigned pmecr;
355
356 netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
357
358 pmecr = ks8851_rdreg16(ks, KS_PMECR);
359 pmecr &= ~PMECR_PM_MASK;
360 pmecr |= pwrmode;
361
362 ks8851_wrreg16(ks, KS_PMECR, pmecr);
363}
364
365/**
346 * ks8851_write_mac_addr - write mac address to device registers 366 * ks8851_write_mac_addr - write mac address to device registers
347 * @dev: The network device 367 * @dev: The network device
348 * 368 *
@@ -358,8 +378,15 @@ static int ks8851_write_mac_addr(struct net_device *dev)
358 378
359 mutex_lock(&ks->lock); 379 mutex_lock(&ks->lock);
360 380
381 /*
382 * Wake up chip in case it was powered off when stopped; otherwise,
383 * the first write to the MAC address does not take effect.
384 */
385 ks8851_set_powermode(ks, PMECR_PM_NORMAL);
361 for (i = 0; i < ETH_ALEN; i++) 386 for (i = 0; i < ETH_ALEN; i++)
362 ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]); 387 ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]);
388 if (!netif_running(dev))
389 ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);
363 390
364 mutex_unlock(&ks->lock); 391 mutex_unlock(&ks->lock);
365 392
@@ -765,26 +792,6 @@ static void ks8851_tx_work(struct work_struct *work)
765} 792}
766 793
767/** 794/**
768 * ks8851_set_powermode - set power mode of the device
769 * @ks: The device state
770 * @pwrmode: The power mode value to write to KS_PMECR.
771 *
772 * Change the power mode of the chip.
773 */
774static void ks8851_set_powermode(struct ks8851_net *ks, unsigned pwrmode)
775{
776 unsigned pmecr;
777
778 netif_dbg(ks, hw, ks->netdev, "setting power mode %d\n", pwrmode);
779
780 pmecr = ks8851_rdreg16(ks, KS_PMECR);
781 pmecr &= ~PMECR_PM_MASK;
782 pmecr |= pwrmode;
783
784 ks8851_wrreg16(ks, KS_PMECR, pmecr);
785}
786
787/**
788 * ks8851_net_open - open network device 795 * ks8851_net_open - open network device
789 * @dev: The network device being opened. 796 * @dev: The network device being opened.
790 * 797 *
diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h
index 537fb06e5932..b2703a11d04b 100644
--- a/drivers/net/ethernet/micrel/ks8851.h
+++ b/drivers/net/ethernet/micrel/ks8851.h
@@ -16,7 +16,7 @@
16#define CCR_32PIN (1 << 0) 16#define CCR_32PIN (1 << 0)
17 17
18/* MAC address registers */ 18/* MAC address registers */
19#define KS_MAR(_m) 0x15 - (_m) 19#define KS_MAR(_m) (0x15 - (_m))
20#define KS_MARL 0x10 20#define KS_MARL 0x10
21#define KS_MARM 0x12 21#define KS_MARM 0x12
22#define KS_MARH 0x14 22#define KS_MARH 0x14