p54usb: New USB ID for Gemtek WUBI-100GW
[pandora-kernel.git] / drivers / net / r8169.c
index 242748b..d88ce9f 100644 (file)
@@ -1200,6 +1200,7 @@ static void rtl8169_update_counters(struct net_device *dev)
        dma_addr_t paddr;
        u32 cmd;
        int wait = 1000;
+       struct device *d = &tp->pci_dev->dev;
 
        /*
         * Some chips are unable to dump tally counters when the receiver
@@ -1208,8 +1209,7 @@ static void rtl8169_update_counters(struct net_device *dev)
        if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
                return;
 
-       counters = dma_alloc_coherent(&tp->pci_dev->dev, sizeof(*counters),
-                                     &paddr, GFP_KERNEL);
+       counters = dma_alloc_coherent(d, sizeof(*counters), &paddr, GFP_KERNEL);
        if (!counters)
                return;
 
@@ -1230,8 +1230,7 @@ static void rtl8169_update_counters(struct net_device *dev)
        RTL_W32(CounterAddrLow, 0);
        RTL_W32(CounterAddrHigh, 0);
 
-       dma_free_coherent(&tp->pci_dev->dev, sizeof(*counters), counters,
-                         paddr);
+       dma_free_coherent(d, sizeof(*counters), counters, paddr);
 }
 
 static void rtl8169_get_ethtool_stats(struct net_device *dev,
@@ -3909,31 +3908,11 @@ static void rtl_hw_start_8101(struct net_device *dev)
 
 static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
 {
-       struct rtl8169_private *tp = netdev_priv(dev);
-       int ret = 0;
-
        if (new_mtu < ETH_ZLEN || new_mtu > SafeMtu)
                return -EINVAL;
 
        dev->mtu = new_mtu;
-
-       if (!netif_running(dev))
-               goto out;
-
-       rtl8169_down(dev);
-
-       ret = rtl8169_init_ring(dev);
-       if (ret < 0)
-               goto out;
-
-       napi_enable(&tp->napi);
-
-       rtl_hw_start(dev);
-
-       rtl8169_request_timer(dev);
-
-out:
-       return ret;
+       return 0;
 }
 
 static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
@@ -3945,10 +3924,9 @@ static inline void rtl8169_make_unusable_by_asic(struct RxDesc *desc)
 static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
                                     void **data_buff, struct RxDesc *desc)
 {
-       struct pci_dev *pdev = tp->pci_dev;
+       dma_unmap_single(&tp->pci_dev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
+                        DMA_FROM_DEVICE);
 
-       dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
-                        PCI_DMA_FROMDEVICE);
        kfree(*data_buff);
        *data_buff = NULL;
        rtl8169_make_unusable_by_asic(desc);
@@ -3974,12 +3952,13 @@ static inline void *rtl8169_align(void *data)
        return (void *)ALIGN((long)data, 16);
 }
 
-static struct sk_buff *rtl8169_alloc_rx_data(struct pci_dev *pdev,
-                                           struct net_device *dev,
-                                           struct RxDesc *desc)
+static struct sk_buff *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
+                                            struct RxDesc *desc)
 {
        void *data;
        dma_addr_t mapping;
+       struct device *d = &tp->pci_dev->dev;
+       struct net_device *dev = tp->dev;
        int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
 
        data = kmalloc_node(rx_buf_sz, GFP_KERNEL, node);
@@ -3992,11 +3971,21 @@ static struct sk_buff *rtl8169_alloc_rx_data(struct pci_dev *pdev,
                if (!data)
                        return NULL;
        }
-       mapping = dma_map_single(&pdev->dev, rtl8169_align(data), rx_buf_sz,
-                                PCI_DMA_FROMDEVICE);
+
+       mapping = dma_map_single(d, rtl8169_align(data), rx_buf_sz,
+                                DMA_FROM_DEVICE);
+       if (unlikely(dma_mapping_error(d, mapping))) {
+               if (net_ratelimit())
+                       netif_err(tp, drv, tp->dev, "Failed to map RX DMA!\n");
+               goto err_out;
+       }
 
        rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
        return data;
+
+err_out:
+       kfree(data);
+       return NULL;
 }
 
 static void rtl8169_rx_clear(struct rtl8169_private *tp)
@@ -4011,34 +4000,35 @@ static void rtl8169_rx_clear(struct rtl8169_private *tp)
        }
 }
 
-static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
-                          u32 start, u32 end, gfp_t gfp)
+static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
+{
+       desc->opts1 |= cpu_to_le32(RingEnd);
+}
+
+static int rtl8169_rx_fill(struct rtl8169_private *tp)
 {
-       u32 cur;
+       unsigned int i;
 
-       for (cur = start; end - cur != 0; cur++) {
+       for (i = 0; i < NUM_RX_DESC; i++) {
                void *data;
-               unsigned int i = cur % NUM_RX_DESC;
-
-               WARN_ON((s32)(end - cur) < 0);
 
                if (tp->Rx_databuff[i])
                        continue;
 
-               data = rtl8169_alloc_rx_data(tp->pci_dev, dev,
-                                            tp->RxDescArray + i);
+               data = rtl8169_alloc_rx_data(tp, tp->RxDescArray + i);
                if (!data) {
                        rtl8169_make_unusable_by_asic(tp->RxDescArray + i);
-                       break;
+                       goto err_out;
                }
                tp->Rx_databuff[i] = data;
        }
-       return cur - start;
-}
 
-static inline void rtl8169_mark_as_last_descriptor(struct RxDesc *desc)
-{
-       desc->opts1 |= cpu_to_le32(RingEnd);
+       rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
+       return 0;
+
+err_out:
+       rtl8169_rx_clear(tp);
+       return -ENOMEM;
 }
 
 static void rtl8169_init_ring_indexes(struct rtl8169_private *tp)
@@ -4055,52 +4045,49 @@ static int rtl8169_init_ring(struct net_device *dev)
        memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
        memset(tp->Rx_databuff, 0x0, NUM_RX_DESC * sizeof(void *));
 
-       if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC, GFP_KERNEL) != NUM_RX_DESC)
-               goto err_out;
-
-       rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
-
-       return 0;
-
-err_out:
-       rtl8169_rx_clear(tp);
-       return -ENOMEM;
+       return rtl8169_rx_fill(tp);
 }
 
-static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
+static void rtl8169_unmap_tx_skb(struct device *d, struct ring_info *tx_skb,
                                 struct TxDesc *desc)
 {
        unsigned int len = tx_skb->len;
 
-       dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), len,
-                        PCI_DMA_TODEVICE);
+       dma_unmap_single(d, le64_to_cpu(desc->addr), len, DMA_TO_DEVICE);
+
        desc->opts1 = 0x00;
        desc->opts2 = 0x00;
        desc->addr = 0x00;
        tx_skb->len = 0;
 }
 
-static void rtl8169_tx_clear(struct rtl8169_private *tp)
+static void rtl8169_tx_clear_range(struct rtl8169_private *tp, u32 start,
+                                  unsigned int n)
 {
        unsigned int i;
 
-       for (i = tp->dirty_tx; i < tp->dirty_tx + NUM_TX_DESC; i++) {
-               unsigned int entry = i % NUM_TX_DESC;
+       for (i = 0; i < n; i++) {
+               unsigned int entry = (start + i) % NUM_TX_DESC;
                struct ring_info *tx_skb = tp->tx_skb + entry;
                unsigned int len = tx_skb->len;
 
                if (len) {
                        struct sk_buff *skb = tx_skb->skb;
 
-                       rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb,
+                       rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
                                             tp->TxDescArray + entry);
                        if (skb) {
+                               tp->dev->stats.tx_dropped++;
                                dev_kfree_skb(skb);
                                tx_skb->skb = NULL;
                        }
-                       tp->dev->stats.tx_dropped++;
                }
        }
+}
+
+static void rtl8169_tx_clear(struct rtl8169_private *tp)
+{
+       rtl8169_tx_clear_range(tp, tp->dirty_tx, NUM_TX_DESC);
        tp->cur_tx = tp->dirty_tx = 0;
 }
 
@@ -4204,6 +4191,7 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
        struct skb_shared_info *info = skb_shinfo(skb);
        unsigned int cur_frag, entry;
        struct TxDesc * uninitialized_var(txd);
+       struct device *d = &tp->pci_dev->dev;
 
        entry = tp->cur_tx;
        for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
@@ -4217,8 +4205,13 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
                txd = tp->TxDescArray + entry;
                len = frag->size;
                addr = ((void *) page_address(frag->page)) + frag->page_offset;
-               mapping = dma_map_single(&tp->pci_dev->dev, addr, len,
-                                        PCI_DMA_TODEVICE);
+               mapping = dma_map_single(d, addr, len, DMA_TO_DEVICE);
+               if (unlikely(dma_mapping_error(d, mapping))) {
+                       if (net_ratelimit())
+                               netif_err(tp, drv, tp->dev,
+                                         "Failed to map TX fragments DMA!\n");
+                       goto err_out;
+               }
 
                /* anti gcc 2.95.3 bugware (sic) */
                status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
@@ -4235,6 +4228,10 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
        }
 
        return cur_frag;
+
+err_out:
+       rtl8169_tx_clear_range(tp, tp->cur_tx + 1, cur_frag);
+       return -EIO;
 }
 
 static inline u32 rtl8169_tso_csum(struct sk_buff *skb, struct net_device *dev)
@@ -4261,40 +4258,47 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
                                      struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
-       unsigned int frags, entry = tp->cur_tx % NUM_TX_DESC;
+       unsigned int entry = tp->cur_tx % NUM_TX_DESC;
        struct TxDesc *txd = tp->TxDescArray + entry;
        void __iomem *ioaddr = tp->mmio_addr;
+       struct device *d = &tp->pci_dev->dev;
        dma_addr_t mapping;
        u32 status, len;
        u32 opts1;
+       int frags;
 
        if (unlikely(TX_BUFFS_AVAIL(tp) < skb_shinfo(skb)->nr_frags)) {
                netif_err(tp, drv, dev, "BUG! Tx Ring full when queue awake!\n");
-               goto err_stop;
+               goto err_stop_0;
        }
 
        if (unlikely(le32_to_cpu(txd->opts1) & DescOwn))
-               goto err_stop;
+               goto err_stop_0;
+
+       len = skb_headlen(skb);
+       mapping = dma_map_single(d, skb->data, len, DMA_TO_DEVICE);
+       if (unlikely(dma_mapping_error(d, mapping))) {
+               if (net_ratelimit())
+                       netif_err(tp, drv, dev, "Failed to map TX DMA!\n");
+               goto err_dma_0;
+       }
+
+       tp->tx_skb[entry].len = len;
+       txd->addr = cpu_to_le64(mapping);
+       txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
 
        opts1 = DescOwn | rtl8169_tso_csum(skb, dev);
 
        frags = rtl8169_xmit_frags(tp, skb, opts1);
-       if (frags) {
-               len = skb_headlen(skb);
+       if (frags < 0)
+               goto err_dma_1;
+       else if (frags)
                opts1 |= FirstFrag;
-       } else {
-               len = skb->len;
+       else {
                opts1 |= FirstFrag | LastFrag;
                tp->tx_skb[entry].skb = skb;
        }
 
-       mapping = dma_map_single(&tp->pci_dev->dev, skb->data, len,
-                                PCI_DMA_TODEVICE);
-
-       tp->tx_skb[entry].len = len;
-       txd->addr = cpu_to_le64(mapping);
-       txd->opts2 = cpu_to_le32(rtl8169_tx_vlan_tag(tp, skb));
-
        wmb();
 
        /* anti gcc 2.95.3 bugware (sic) */
@@ -4316,7 +4320,14 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
 
        return NETDEV_TX_OK;
 
-err_stop:
+err_dma_1:
+       rtl8169_unmap_tx_skb(d, tp->tx_skb + entry, txd);
+err_dma_0:
+       dev_kfree_skb(skb);
+       dev->stats.tx_dropped++;
+       return NETDEV_TX_OK;
+
+err_stop_0:
        netif_stop_queue(dev);
        dev->stats.tx_dropped++;
        return NETDEV_TX_BUSY;
@@ -4381,7 +4392,6 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
        while (tx_left > 0) {
                unsigned int entry = dirty_tx % NUM_TX_DESC;
                struct ring_info *tx_skb = tp->tx_skb + entry;
-               u32 len = tx_skb->len;
                u32 status;
 
                rmb();
@@ -4389,12 +4399,11 @@ static void rtl8169_tx_interrupt(struct net_device *dev,
                if (status & DescOwn)
                        break;
 
-               dev->stats.tx_bytes += len;
-               dev->stats.tx_packets++;
-
-               rtl8169_unmap_tx_skb(tp->pci_dev, tx_skb, tp->TxDescArray + entry);
-
+               rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
+                                    tp->TxDescArray + entry);
                if (status & LastFrag) {
+                       dev->stats.tx_packets++;
+                       dev->stats.tx_bytes += tx_skb->skb->len;
                        dev_kfree_skb(tx_skb->skb);
                        tx_skb->skb = NULL;
                }
@@ -4444,16 +4453,16 @@ static struct sk_buff *rtl8169_try_rx_copy(void *data,
                                           dma_addr_t addr)
 {
        struct sk_buff *skb;
+       struct device *d = &tp->pci_dev->dev;
 
        data = rtl8169_align(data);
-       dma_sync_single_for_cpu(&tp->pci_dev->dev, addr, pkt_size,
-                               PCI_DMA_FROMDEVICE);
+       dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
        prefetch(data);
        skb = netdev_alloc_skb_ip_align(tp->dev, pkt_size);
        if (skb)
                memcpy(skb->data, data, pkt_size);
-       dma_sync_single_for_device(&tp->pci_dev->dev, addr, pkt_size,
-                                  PCI_DMA_FROMDEVICE);
+       dma_sync_single_for_device(d, addr, pkt_size, DMA_FROM_DEVICE);
+
        return skb;
 }
 
@@ -4665,7 +4674,6 @@ static void rtl8169_down(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
        void __iomem *ioaddr = tp->mmio_addr;
-       unsigned int intrmask;
 
        rtl8169_delete_timer(dev);
 
@@ -4673,11 +4681,14 @@ static void rtl8169_down(struct net_device *dev)
 
        napi_disable(&tp->napi);
 
-core_down:
        spin_lock_irq(&tp->lock);
 
        rtl8169_asic_down(ioaddr);
-
+       /*
+        * At this point device interrupts can not be enabled in any function,
+        * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task,
+        * rtl8169_reinit_task) and napi is disabled (rtl8169_poll).
+        */
        rtl8169_rx_missed(dev, ioaddr);
 
        spin_unlock_irq(&tp->lock);
@@ -4687,23 +4698,6 @@ core_down:
        /* Give a racing hard_start_xmit a few cycles to complete. */
        synchronize_sched();  /* FIXME: should this be synchronize_irq()? */
 
-       /*
-        * And now for the 50k$ question: are IRQ disabled or not ?
-        *
-        * Two paths lead here:
-        * 1) dev->close
-        *    -> netif_running() is available to sync the current code and the
-        *       IRQ handler. See rtl8169_interrupt for details.
-        * 2) dev->change_mtu
-        *    -> rtl8169_poll can not be issued again and re-enable the
-        *       interruptions. Let's simply issue the IRQ down sequence again.
-        *
-        * No loop if hotpluged or major error (0xffff).
-        */
-       intrmask = RTL_R16(IntrMask);
-       if (intrmask && (intrmask != 0xffff))
-               goto core_down;
-
        rtl8169_tx_clear(tp);
 
        rtl8169_rx_clear(tp);
@@ -4840,6 +4834,9 @@ static int rtl8169_resume(struct device *device)
 {
        struct pci_dev *pdev = to_pci_dev(device);
        struct net_device *dev = pci_get_drvdata(pdev);
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       rtl8169_init_phy(dev, tp);
 
        if (netif_running(dev))
                __rtl8169_resume(dev);
@@ -4880,6 +4877,8 @@ static int rtl8169_runtime_resume(struct device *device)
        tp->saved_wolopts = 0;
        spin_unlock_irq(&tp->lock);
 
+       rtl8169_init_phy(dev, tp);
+
        __rtl8169_resume(dev);
 
        return 0;