Commit 7342cd81 authored by Dale Farnsworth's avatar Dale Farnsworth Committed by Jeff Garzik

[PATCH] mv643xx: Fix promiscuous mode handling

mv643xx_eth_get_config_reg() was reading the wrong register.
mv643xx_eth_set_config_reg() was or'ing instead of setting the
register.  These functions are trivial and both are called only from
mv643xx_eth_set_rx_mode() when changing to/from promiscuous mode.
Remove both functions and do the operations directly in
mv643xx_eth_set_rx_mode().

Also, maintain promiscuous mode setting across port resets.
Signed-off-by: default avatarDale Farnsworth <dale@farnsworth.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 8f543718
...@@ -259,14 +259,13 @@ static void mv643xx_eth_update_mac_address(struct net_device *dev) ...@@ -259,14 +259,13 @@ static void mv643xx_eth_update_mac_address(struct net_device *dev)
static void mv643xx_eth_set_rx_mode(struct net_device *dev) static void mv643xx_eth_set_rx_mode(struct net_device *dev)
{ {
struct mv643xx_private *mp = netdev_priv(dev); struct mv643xx_private *mp = netdev_priv(dev);
u32 config_reg;
config_reg = ethernet_get_config_reg(mp->port_num);
if (dev->flags & IFF_PROMISC) if (dev->flags & IFF_PROMISC)
config_reg |= (u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE; mp->port_config |= (u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE;
else else
config_reg &= ~(u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE; mp->port_config &= ~(u32) MV643XX_ETH_UNICAST_PROMISCUOUS_MODE;
ethernet_set_config_reg(mp->port_num, config_reg);
mv_write(MV643XX_ETH_PORT_CONFIG_REG(mp->port_num), mp->port_config);
} }
/* /*
...@@ -2278,34 +2277,6 @@ static void eth_port_reset(unsigned int port_num) ...@@ -2278,34 +2277,6 @@ static void eth_port_reset(unsigned int port_num)
mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), reg_data); mv_write(MV643XX_ETH_PORT_SERIAL_CONTROL_REG(port_num), reg_data);
} }
/*
* ethernet_set_config_reg - Set specified bits in configuration register.
*
* DESCRIPTION:
* This function sets specified bits in the given ethernet
* configuration register.
*
* INPUT:
* unsigned int eth_port_num Ethernet Port number.
* unsigned int value 32 bit value.
*
* OUTPUT:
* The set bits in the value parameter are set in the configuration
* register.
*
* RETURN:
* None.
*
*/
static void ethernet_set_config_reg(unsigned int eth_port_num,
unsigned int value)
{
unsigned int eth_config_reg;
eth_config_reg = mv_read(MV643XX_ETH_PORT_CONFIG_REG(eth_port_num));
eth_config_reg |= value;
mv_write(MV643XX_ETH_PORT_CONFIG_REG(eth_port_num), eth_config_reg);
}
static int eth_port_autoneg_supported(unsigned int eth_port_num) static int eth_port_autoneg_supported(unsigned int eth_port_num)
{ {
...@@ -2331,31 +2302,6 @@ static int eth_port_link_is_up(unsigned int eth_port_num) ...@@ -2331,31 +2302,6 @@ static int eth_port_link_is_up(unsigned int eth_port_num)
return 0; return 0;
} }
/*
* ethernet_get_config_reg - Get the port configuration register
*
* DESCRIPTION:
* This function returns the configuration register value of the given
* ethernet port.
*
* INPUT:
* unsigned int eth_port_num Ethernet Port number.
*
* OUTPUT:
* None.
*
* RETURN:
* Port configuration register value.
*/
static unsigned int ethernet_get_config_reg(unsigned int eth_port_num)
{
unsigned int eth_config_reg;
eth_config_reg = mv_read(MV643XX_ETH_PORT_CONFIG_EXTEND_REG
(eth_port_num));
return eth_config_reg;
}
/* /*
* eth_port_read_smi_reg - Read PHY registers * eth_port_read_smi_reg - Read PHY registers
* *
......
...@@ -408,10 +408,6 @@ static void eth_port_init(struct mv643xx_private *mp); ...@@ -408,10 +408,6 @@ static void eth_port_init(struct mv643xx_private *mp);
static void eth_port_reset(unsigned int eth_port_num); static void eth_port_reset(unsigned int eth_port_num);
static void eth_port_start(struct mv643xx_private *mp); static void eth_port_start(struct mv643xx_private *mp);
static void ethernet_set_config_reg(unsigned int eth_port_num,
unsigned int value);
static unsigned int ethernet_get_config_reg(unsigned int eth_port_num);
/* Port MAC address routines */ /* Port MAC address routines */
static void eth_port_uc_addr_set(unsigned int eth_port_num, static void eth_port_uc_addr_set(unsigned int eth_port_num,
unsigned char *p_addr); unsigned char *p_addr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment