drivers/net/usb/asix.c: Fix unaligned accesses
[safe/jmp/linux-2.6] / drivers / net / e100.c
index c0cd576..b194bad 100644 (file)
 #include <linux/ethtool.h>
 #include <linux/string.h>
 #include <linux/firmware.h>
+#include <linux/rtnetlink.h>
 #include <asm/unaligned.h>
 
 
@@ -1545,16 +1546,16 @@ static int e100_hw_init(struct nic *nic)
 static void e100_multi(struct nic *nic, struct cb *cb, struct sk_buff *skb)
 {
        struct net_device *netdev = nic->netdev;
-       struct dev_mc_list *list;
+       struct netdev_hw_addr *ha;
        u16 i, count = min(netdev_mc_count(netdev), E100_MAX_MULTICAST_ADDRS);
 
        cb->command = cpu_to_le16(cb_multi);
        cb->u.multi.count = cpu_to_le16(count * ETH_ALEN);
        i = 0;
-       netdev_for_each_mc_addr(list, netdev) {
+       netdev_for_each_mc_addr(ha, netdev) {
                if (i == count)
                        break;
-               memcpy(&cb->u.multi.addr[i++ * ETH_ALEN], &list->dmi_addr,
+               memcpy(&cb->u.multi.addr[i++ * ETH_ALEN], &ha->addr,
                        ETH_ALEN);
        }
 }
@@ -1763,7 +1764,6 @@ static netdev_tx_t e100_xmit_frame(struct sk_buff *skb,
                return NETDEV_TX_BUSY;
        }
 
-       netdev->trans_start = jiffies;
        return NETDEV_TX_OK;
 }
 
@@ -2280,8 +2280,13 @@ static void e100_tx_timeout_task(struct work_struct *work)
 
        netif_printk(nic, tx_err, KERN_DEBUG, nic->netdev,
                     "scb.status=0x%02X\n", ioread8(&nic->csr->scb.status));
-       e100_down(netdev_priv(netdev));
-       e100_up(netdev_priv(netdev));
+
+       rtnl_lock();
+       if (netif_running(netdev)) {
+               e100_down(netdev_priv(netdev));
+               e100_up(netdev_priv(netdev));
+       }
+       rtnl_unlock();
 }
 
 static int e100_loopback_test(struct nic *nic, enum loopback loopback_mode)