[PATCH v2.1] davinci_emac: fix kernel oops when changing MAC address while interface is down

2009-07-07 Thread Pablo Bitton
Check that network interface is running before changing its MAC address.
Otherwise, rxch is accessed when it's NULL - causing a kernel oops.
Moreover, check that the new MAC address is valid.

Signed-off-by: Pablo Bitton pablo.bit...@gmail.com
Signed-off-by: Chaithrika U S chaithr...@ti.com
Tested-by: Chaithrika U S chaithr...@ti.com
[tested on DM6467 EVM]

---
 drivers/net/davinci_emac.c |   12 ++--
 1 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
index cf689a0..dddb2b9 100644
--- a/drivers/net/davinci_emac.c
+++ b/drivers/net/davinci_emac.c
@@ -1821,11 +1821,19 @@ static int emac_dev_setmac_addr(struct net_device 
*ndev, void *addr)
struct sockaddr *sa = addr;
DECLARE_MAC_BUF(mac);
 
+   if (!is_valid_ether_addr(sa-sa_data))
+   return -EINVAL;
+
/* Store mac addr in priv and rx channel and set it in EMAC hw */
memcpy(priv-mac_addr, sa-sa_data, ndev-addr_len);
-   memcpy(rxch-mac_addr, sa-sa_data, ndev-addr_len);
memcpy(ndev-dev_addr, sa-sa_data, ndev-addr_len);
-   emac_setmac(priv, EMAC_DEF_RX_CH, rxch-mac_addr);
+
+   /* If the interface is down - rxch is NULL. */
+   /* MAC address is configured only after the interface is enabled. */
+   if (netif_running(ndev)) {
+   memcpy(rxch-mac_addr, sa-sa_data, ndev-addr_len);
+   emac_setmac(priv, EMAC_DEF_RX_CH, rxch-mac_addr);
+   }
 
if (netif_msg_drv(priv))
dev_notice(emac_dev, DaVinci EMAC: emac_dev_setmac_addr %s\n,
-- 
1.5.4.3




___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source


Re: [PATCH v2.1] davinci_emac: fix kernel oops when changing MAC address while interface is down

2009-07-07 Thread Pablo Bitton
Hi,

I've resubmitted this patch since my email client has corrupted
 the v2 patch, turning TAB characters into spaces.

Hopefully, this won't happen again.

On Tue, Jul 7, 2009 at 9:10 AM, Pablo Bittonpablo.bit...@gmail.com wrote:
 Check that network interface is running before changing its MAC address.
 Otherwise, rxch is accessed when it's NULL - causing a kernel oops.
 Moreover, check that the new MAC address is valid.

 Signed-off-by: Pablo Bitton pablo.bit...@gmail.com
 Signed-off-by: Chaithrika U S chaithr...@ti.com
 Tested-by: Chaithrika U S chaithr...@ti.com
 [tested on DM6467 EVM]

 ---
  drivers/net/davinci_emac.c |   12 ++--
  1 files changed, 10 insertions(+), 2 deletions(-)

 diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
 index cf689a0..dddb2b9 100644
 --- a/drivers/net/davinci_emac.c
 +++ b/drivers/net/davinci_emac.c
 @@ -1821,11 +1821,19 @@ static int emac_dev_setmac_addr(struct net_device 
 *ndev, void *addr)
        struct sockaddr *sa = addr;
        DECLARE_MAC_BUF(mac);

 +       if (!is_valid_ether_addr(sa-sa_data))
 +               return -EINVAL;
 +
        /* Store mac addr in priv and rx channel and set it in EMAC hw */
        memcpy(priv-mac_addr, sa-sa_data, ndev-addr_len);
 -       memcpy(rxch-mac_addr, sa-sa_data, ndev-addr_len);
        memcpy(ndev-dev_addr, sa-sa_data, ndev-addr_len);
 -       emac_setmac(priv, EMAC_DEF_RX_CH, rxch-mac_addr);
 +
 +       /* If the interface is down - rxch is NULL. */
 +       /* MAC address is configured only after the interface is enabled. */
 +       if (netif_running(ndev)) {
 +               memcpy(rxch-mac_addr, sa-sa_data, ndev-addr_len);
 +               emac_setmac(priv, EMAC_DEF_RX_CH, rxch-mac_addr);
 +       }

        if (netif_msg_drv(priv))
                dev_notice(emac_dev, DaVinci EMAC: emac_dev_setmac_addr %s\n,
 --
 1.5.4.3





___
Davinci-linux-open-source mailing list
Davinci-linux-open-source@linux.davincidsp.com
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source