Merge branch 'for-next' into for-linus
[safe/jmp/linux-2.6] / drivers / net / smsc9420.c
index 72f1348..34fa10d 100644 (file)
@@ -80,7 +80,7 @@ struct smsc9420_pdata {
        int last_carrier;
 };
 
-static const struct pci_device_id smsc9420_id_table[] = {
+static DEFINE_PCI_DEVICE_TABLE(smsc9420_id_table) = {
        { PCI_VENDOR_ID_9420, PCI_DEVICE_ID_9420, PCI_ANY_ID, PCI_ANY_ID, },
        { 0, }
 };
@@ -252,6 +252,9 @@ static int smsc9420_ethtool_get_settings(struct net_device *dev,
 {
        struct smsc9420_pdata *pd = netdev_priv(dev);
 
+       if (!pd->phy_dev)
+               return -ENODEV;
+
        cmd->maxtxpkt = 1;
        cmd->maxrxpkt = 1;
        return phy_ethtool_gset(pd->phy_dev, cmd);
@@ -262,6 +265,9 @@ static int smsc9420_ethtool_set_settings(struct net_device *dev,
 {
        struct smsc9420_pdata *pd = netdev_priv(dev);
 
+       if (!pd->phy_dev)
+               return -ENODEV;
+
        return phy_ethtool_sset(pd->phy_dev, cmd);
 }
 
@@ -290,6 +296,10 @@ static void smsc9420_ethtool_set_msglevel(struct net_device *netdev, u32 data)
 static int smsc9420_ethtool_nway_reset(struct net_device *netdev)
 {
        struct smsc9420_pdata *pd = netdev_priv(netdev);
+
+       if (!pd->phy_dev)
+               return -ENODEV;
+
        return phy_start_aneg(pd->phy_dev);
 }
 
@@ -312,6 +322,10 @@ smsc9420_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs,
        for (i = 0; i < 0x100; i += (sizeof(u32)))
                data[j++] = smsc9420_reg_read(pd, i);
 
+       // cannot read phy registers if the net device is down
+       if (!phy_dev)
+               return;
+
        for (i = 0; i <= 31; i++)
                data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i);
 }
@@ -670,7 +684,7 @@ static irqreturn_t smsc9420_isr(int irq, void *dev_id)
                        smsc9420_pci_flush_write(pd);
 
                        ints_to_clear |= (DMAC_STS_RX_ | DMAC_STS_NIS_);
-                       netif_rx_schedule(&pd->napi);
+                       napi_schedule(&pd->napi);
                }
 
                if (ints_to_clear)
@@ -807,7 +821,7 @@ static void smsc9420_rx_handoff(struct smsc9420_pdata *pd, const int index,
        if (pd->rx_csum) {
                u16 hw_csum = get_unaligned_le16(skb_tail_pointer(skb) +
                        NET_IP_ALIGN + packet_length + 4);
-               put_unaligned_le16(cpu_to_le16(hw_csum), &skb->csum);
+               put_unaligned_le16(hw_csum, &skb->csum);
                skb->ip_summed = CHECKSUM_COMPLETE;
        }
 
@@ -817,7 +831,6 @@ static void smsc9420_rx_handoff(struct smsc9420_pdata *pd, const int index,
        skb->protocol = eth_type_trans(skb, dev);
 
        netif_receive_skb(skb);
-       dev->last_rx = jiffies;
 }
 
 static int smsc9420_alloc_rx_buffer(struct smsc9420_pdata *pd, int index)
@@ -893,7 +906,7 @@ static int smsc9420_rx_poll(struct napi_struct *napi, int budget)
        smsc9420_pci_flush_write(pd);
 
        if (work_done < budget) {
-               netif_rx_complete(&pd->napi);
+               napi_complete(&pd->napi);
 
                /* re-enable RX DMA interrupts */
                dma_intr_ena = smsc9420_reg_read(pd, DMAC_INTR_ENA);
@@ -968,7 +981,8 @@ static void smsc9420_complete_tx(struct net_device *dev)
        }
 }
 
-static int smsc9420_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t smsc9420_hard_start_xmit(struct sk_buff *skb,
+                                           struct net_device *dev)
 {
        struct smsc9420_pdata *pd = netdev_priv(dev);
        dma_addr_t mapping;
@@ -1048,12 +1062,12 @@ static void smsc9420_set_multicast_list(struct net_device *dev)
                mac_cr &= (~MAC_CR_PRMS_);
                mac_cr |= MAC_CR_MCPAS_;
                mac_cr &= (~MAC_CR_HPFILT_);
-       } else if (dev->mc_count > 0) {
-               struct dev_mc_list *mc_list = dev->mc_list;
+       } else if (!netdev_mc_empty(dev)) {
+               struct dev_mc_list *mc_list;
                u32 hash_lo = 0, hash_hi = 0;
 
                smsc_dbg(HW, "Multicast filter enabled");
-               while (mc_list) {
+               netdev_for_each_mc_addr(mc_list, dev) {
                        u32 bit_num = smsc9420_hash(mc_list->dmi_addr);
                        u32 mask = 1 << (bit_num & 0x1F);
 
@@ -1062,7 +1076,6 @@ static void smsc9420_set_multicast_list(struct net_device *dev)
                        else
                                hash_lo |= mask;
 
-                       mc_list = mc_list->next;
                }
                smsc9420_reg_write(pd, HASHH, hash_hi);
                smsc9420_reg_write(pd, HASHL, hash_lo);
@@ -1161,7 +1174,7 @@ static int smsc9420_mii_probe(struct net_device *dev)
                phydev->phy_id);
 
        phydev = phy_connect(dev, dev_name(&phydev->dev),
-               &smsc9420_phy_adjust_link, 0, PHY_INTERFACE_MODE_MII);
+               smsc9420_phy_adjust_link, 0, PHY_INTERFACE_MODE_MII);
 
        if (IS_ERR(phydev)) {
                pr_err("%s: Could not attach to PHY\n", dev->name);
@@ -1334,7 +1347,7 @@ static int smsc9420_open(struct net_device *dev)
 
        netif_carrier_off(dev);
 
-       /* disable, mask and acknowlege all interrupts */
+       /* disable, mask and acknowledge all interrupts */
        spin_lock_irqsave(&pd->int_lock, flags);
        int_cfg = smsc9420_reg_read(pd, INT_CFG) & (~INT_CFG_IRQ_EN_);
        smsc9420_reg_write(pd, INT_CFG, int_cfg);
@@ -1598,7 +1611,7 @@ smsc9420_probe(struct pci_dev *pdev, const struct pci_device_id *id)
                goto out_free_netdev_2;
        }
 
-       if (pci_set_dma_mask(pdev, DMA_32BIT_MASK)) {
+       if (pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
                printk(KERN_ERR "No usable DMA configuration, aborting.\n");
                goto out_free_regions_3;
        }