]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/net/r8169.c
[SK_BUFF]: Introduce ip_hdr(), remove skb->nh.iph
[net-next-2.6.git] / drivers / net / r8169.c
index 521b5f0618a4a904a4d736d2263a6573eb9dbd5e..45876a854f002975893d95265798797bb4bc7f1d 100644 (file)
@@ -66,6 +66,7 @@ VERSION 2.2LK <2005/01/25>
 #include <linux/init.h>
 #include <linux/dma-mapping.h>
 
+#include <asm/system.h>
 #include <asm/io.h>
 #include <asm/irq.h>
 
@@ -486,6 +487,7 @@ static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *,
                                void __iomem *);
 static int rtl8169_change_mtu(struct net_device *dev, int new_mtu);
 static void rtl8169_down(struct net_device *dev);
+static void rtl8169_rx_clear(struct rtl8169_private *tp);
 
 #ifdef CONFIG_R8169_NAPI
 static int rtl8169_poll(struct net_device *dev, int *budget);
@@ -1751,16 +1753,10 @@ static int rtl8169_open(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        struct pci_dev *pdev = tp->pci_dev;
-       int retval;
+       int retval = -ENOMEM;
 
-       rtl8169_set_rxbufsize(tp, dev);
-
-       retval =
-           request_irq(dev->irq, rtl8169_interrupt, IRQF_SHARED, dev->name, dev);
-       if (retval < 0)
-               goto out;
 
-       retval = -ENOMEM;
+       rtl8169_set_rxbufsize(tp, dev);
 
        /*
         * Rx and Tx desscriptors needs 256 bytes alignment.
@@ -1769,19 +1765,26 @@ static int rtl8169_open(struct net_device *dev)
        tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
                                               &tp->TxPhyAddr);
        if (!tp->TxDescArray)
-               goto err_free_irq;
+               goto out;
 
        tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
                                               &tp->RxPhyAddr);
        if (!tp->RxDescArray)
-               goto err_free_tx;
+               goto err_free_tx_0;
 
        retval = rtl8169_init_ring(dev);
        if (retval < 0)
-               goto err_free_rx;
+               goto err_free_rx_1;
 
        INIT_DELAYED_WORK(&tp->task, NULL);
 
+       smp_mb();
+
+       retval = request_irq(dev->irq, rtl8169_interrupt, IRQF_SHARED,
+                            dev->name, dev);
+       if (retval < 0)
+               goto err_release_ring_2;
+
        rtl8169_hw_start(dev);
 
        rtl8169_request_timer(dev);
@@ -1790,14 +1793,14 @@ static int rtl8169_open(struct net_device *dev)
 out:
        return retval;
 
-err_free_rx:
+err_release_ring_2:
+       rtl8169_rx_clear(tp);
+err_free_rx_1:
        pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
                            tp->RxPhyAddr);
-err_free_tx:
+err_free_tx_0:
        pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
                            tp->TxPhyAddr);
-err_free_irq:
-       free_irq(dev->irq, dev);
        goto out;
 }
 
@@ -2281,7 +2284,7 @@ static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
                        return LargeSend | ((mss & MSSMask) << MSSShift);
        }
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
-               const struct iphdr *ip = skb->nh.iph;
+               const struct iphdr *ip = ip_hdr(skb);
 
                if (ip->protocol == IPPROTO_TCP)
                        return IPCS | TCPCS;
@@ -2583,7 +2586,6 @@ rtl8169_rx_interrupt(struct net_device *dev, struct rtl8169_private *tp,
                        pci_action(tp->pci_dev, le64_to_cpu(desc->addr),
                                   tp->rx_buf_sz, PCI_DMA_FROMDEVICE);
 
-                       skb->dev = dev;
                        skb_put(skb, pkt_size);
                        skb->protocol = eth_type_trans(skb, dev);
 
@@ -2887,7 +2889,7 @@ static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
        void __iomem *ioaddr = tp->mmio_addr;
 
        if (!netif_running(dev))
-               goto out;
+               goto out_pci_suspend;
 
        netif_device_detach(dev);
        netif_stop_queue(dev);
@@ -2901,10 +2903,11 @@ static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
 
        spin_unlock_irq(&tp->lock);
 
+out_pci_suspend:
        pci_save_state(pdev);
        pci_enable_wake(pdev, pci_choose_state(pdev, state), tp->wol_enabled);
        pci_set_power_state(pdev, pci_choose_state(pdev, state));
-out:
+
        return 0;
 }
 
@@ -2912,15 +2915,15 @@ static int rtl8169_resume(struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
 
+       pci_set_power_state(pdev, PCI_D0);
+       pci_restore_state(pdev);
+       pci_enable_wake(pdev, PCI_D0, 0);
+
        if (!netif_running(dev))
                goto out;
 
        netif_device_attach(dev);
 
-       pci_set_power_state(pdev, PCI_D0);
-       pci_restore_state(pdev);
-       pci_enable_wake(pdev, PCI_D0, 0);
-
        rtl8169_schedule_work(dev, rtl8169_reset_task);
 out:
        return 0;