Skip to content

Commit

Permalink
KSZ8851-SNL: Fix MAC address change problem
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Tristram Ha authored and David S. Miller committed Nov 26, 2011
1 parent a9a8de2 commit 32f160d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 21 deletions.
47 changes: 27 additions & 20 deletions drivers/net/ethernet/micrel/ks8851.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);

Expand Down Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/ethernet/micrel/ks8851.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 32f160d

Please sign in to comment.