linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / net / tulip / de2104x.c
index dd357dd..2d0cfbc 100644 (file)
@@ -446,13 +446,13 @@ static void de_rx (struct de_private *de)
 
                        mapping =
                        de->rx_skb[rx_tail].mapping =
-                               pci_map_single(de->pdev, copy_skb->tail,
+                               pci_map_single(de->pdev, copy_skb->data,
                                               buflen, PCI_DMA_FROMDEVICE);
                        de->rx_skb[rx_tail].skb = copy_skb;
                } else {
                        pci_dma_sync_single_for_cpu(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
                        skb_reserve(copy_skb, RX_OFFSET);
-                       memcpy(skb_put(copy_skb, len), skb->tail, len);
+                       memcpy(skb_put(copy_skb, len), skb->data, len);
 
                        pci_dma_sync_single_for_device(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
 
@@ -1269,7 +1269,7 @@ static int de_refill_rx (struct de_private *de)
                skb->dev = de->dev;
 
                de->rx_skb[i].mapping = pci_map_single(de->pdev,
-                       skb->tail, de->rx_buf_sz, PCI_DMA_FROMDEVICE);
+                       skb->data, de->rx_buf_sz, PCI_DMA_FROMDEVICE);
                de->rx_skb[i].skb = skb;
 
                de->rx_ring[i].opts1 = cpu_to_le32(DescOwn);
@@ -1362,7 +1362,6 @@ static int de_open (struct net_device *dev)
 {
        struct de_private *de = dev->priv;
        int rc;
-       unsigned long flags;
 
        if (netif_msg_ifup(de))
                printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
@@ -1376,18 +1375,20 @@ static int de_open (struct net_device *dev)
                return rc;
        }
 
-       rc = de_init_hw(de);
-       if (rc) {
-               printk(KERN_ERR "%s: h/w init failure, err=%d\n",
-                      dev->name, rc);
-               goto err_out_free;
-       }
+       dw32(IntrMask, 0);
 
        rc = request_irq(dev->irq, de_interrupt, SA_SHIRQ, dev->name, dev);
        if (rc) {
                printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n",
                       dev->name, dev->irq, rc);
-               goto err_out_hw;
+               goto err_out_free;
+       }
+
+       rc = de_init_hw(de);
+       if (rc) {
+               printk(KERN_ERR "%s: h/w init failure, err=%d\n",
+                      dev->name, rc);
+               goto err_out_free_irq;
        }
 
        netif_start_queue(dev);
@@ -1395,11 +1396,8 @@ static int de_open (struct net_device *dev)
 
        return 0;
 
-err_out_hw:
-       spin_lock_irqsave(&de->lock, flags);
-       de_stop_hw(de);
-       spin_unlock_irqrestore(&de->lock, flags);
-
+err_out_free_irq:
+       free_irq(dev->irq, dev);
 err_out_free:
        de_free_rings(de);
        return rc;
@@ -1455,6 +1453,8 @@ static void de_tx_timeout (struct net_device *dev)
        synchronize_irq(dev->irq);
        de_clean_rings(de);
 
+       de_init_rings(de);
+
        de_init_hw(de);
        
        netif_wake_queue(dev);
@@ -1787,10 +1787,15 @@ static void __init de21041_get_srom_info (struct de_private *de)
        /* DEC now has a specification but early board makers
           just put the address in the first EEPROM locations. */
        /* This does  memcmp(eedata, eedata+16, 8) */
+
+#ifndef CONFIG_MIPS_COBALT
+
        for (i = 0; i < 8; i ++)
                if (ee_data[i] != ee_data[16+i])
                        sa_offset = 20;
 
+#endif
+
        /* store MAC address */
        for (i = 0; i < 6; i ++)
                de->dev->dev_addr[i] = ee_data[i + sa_offset];
@@ -1934,7 +1939,7 @@ static int __init de_init_one (struct pci_dev *pdev,
        struct de_private *de;
        int rc;
        void __iomem *regs;
-       long pciaddr;
+       unsigned long pciaddr;
        static int board_idx = -1;
 
        board_idx++;
@@ -2071,8 +2076,7 @@ static int __init de_init_one (struct pci_dev *pdev,
        return 0;
 
 err_out_iomap:
-       if (de->ee_data)
-               kfree(de->ee_data);
+       kfree(de->ee_data);
        iounmap(regs);
 err_out_res:
        pci_release_regions(pdev);
@@ -2091,8 +2095,7 @@ static void __exit de_remove_one (struct pci_dev *pdev)
        if (!dev)
                BUG();
        unregister_netdev(dev);
-       if (de->ee_data)
-               kfree(de->ee_data);
+       kfree(de->ee_data);
        iounmap(de->regs);
        pci_release_regions(pdev);
        pci_disable_device(pdev);