aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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