diff options
-rw-r--r-- | drivers/net/ethernet/micrel/ks8851.c | 47 | ||||
-rw-r--r-- | drivers/net/ethernet/micrel/ks8851.h | 2 |
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 | */ | ||
352 | static 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 | */ | ||
774 | static 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 |