]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/net/8139cp.c
8139cp: ring_info removal for the transmit path
[karo-tx-linux.git] / drivers / net / 8139cp.c
index ae9bb7511d9005b27341f5417e8b3f28fbe9f7d5..c3b8400bdc3f99b1b62702ba4cd4d20a65cd421a 100644 (file)
@@ -314,11 +314,6 @@ struct cp_desc {
        u64             addr;
 };
 
-struct ring_info {
-       struct sk_buff          *skb;
-       u32                     len;
-};
-
 struct cp_dma_stats {
        u64                     tx_ok;
        u64                     rx_ok;
@@ -352,23 +347,23 @@ struct cp_private {
        struct net_device_stats net_stats;
        struct cp_extra_stats   cp_stats;
 
-       unsigned                rx_tail         ____cacheline_aligned;
+       unsigned                rx_head         ____cacheline_aligned;
+       unsigned                rx_tail;
        struct cp_desc          *rx_ring;
-       struct ring_info        rx_skb[CP_RX_RING_SIZE];
-       unsigned                rx_buf_sz;
+       struct sk_buff          *rx_skb[CP_RX_RING_SIZE];
 
        unsigned                tx_head         ____cacheline_aligned;
        unsigned                tx_tail;
-
        struct cp_desc          *tx_ring;
-       struct ring_info        tx_skb[CP_TX_RING_SIZE];
-       dma_addr_t              ring_dma;
+       struct sk_buff          *tx_skb[CP_TX_RING_SIZE];
+
+       unsigned                rx_buf_sz;
+       unsigned                wol_enabled : 1; /* Is Wake-on-LAN enabled? */
 
 #if CP_VLAN_TAG_USED
        struct vlan_group       *vlgrp;
 #endif
-
-       unsigned int            wol_enabled : 1; /* Is Wake-on-LAN enabled? */
+       dma_addr_t              ring_dma;
 
        struct mii_if_info      mii_if;
 };
@@ -406,10 +401,8 @@ static int cp_set_eeprom(struct net_device *dev,
                         struct ethtool_eeprom *eeprom, u8 *data);
 
 static struct pci_device_id cp_pci_tbl[] = {
-       { PCI_VENDOR_ID_REALTEK, PCI_DEVICE_ID_REALTEK_8139,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
-       { PCI_VENDOR_ID_TTTECH, PCI_DEVICE_ID_TTTECH_MC322,
-         PCI_ANY_ID, PCI_ANY_ID, 0, 0, },
+       { PCI_DEVICE(PCI_VENDOR_ID_REALTEK,     PCI_DEVICE_ID_REALTEK_8139), },
+       { PCI_DEVICE(PCI_VENDOR_ID_TTTECH,      PCI_DEVICE_ID_TTTECH_MC322), },
        { },
 };
 MODULE_DEVICE_TABLE(pci, cp_pci_tbl);
@@ -541,7 +534,7 @@ rx_status_loop:
                struct cp_desc *desc;
                unsigned buflen;
 
-               skb = cp->rx_skb[rx_tail].skb;
+               skb = cp->rx_skb[rx_tail];
                BUG_ON(!skb);
 
                desc = &cp->rx_ring[rx_tail];
@@ -596,7 +589,7 @@ rx_status_loop:
 
                mapping = pci_map_single(cp->pdev, new_skb->data, buflen,
                                         PCI_DMA_FROMDEVICE);
-               cp->rx_skb[rx_tail].skb = new_skb;
+               cp->rx_skb[rx_tail] = new_skb;
 
                cp_rx_skb(cp, skb, desc);
                rx++;
@@ -723,11 +716,12 @@ static void cp_tx (struct cp_private *cp)
                if (status & DescOwn)
                        break;
 
-               skb = cp->tx_skb[tx_tail].skb;
+               skb = cp->tx_skb[tx_tail];
                BUG_ON(!skb);
 
                pci_unmap_single(cp->pdev, le64_to_cpu(txd->addr),
-                                cp->tx_skb[tx_tail].len, PCI_DMA_TODEVICE);
+                                le32_to_cpu(txd->opts1) & 0xffff,
+                                PCI_DMA_TODEVICE);
 
                if (status & LastFrag) {
                        if (status & (TxError | TxFIFOUnder)) {
@@ -754,7 +748,7 @@ static void cp_tx (struct cp_private *cp)
                        dev_kfree_skb_irq(skb);
                }
 
-               cp->tx_skb[tx_tail].skb = NULL;
+               cp->tx_skb[tx_tail] = NULL;
 
                tx_tail = NEXT_TX(tx_tail);
        }
@@ -824,8 +818,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
                txd->opts1 = cpu_to_le32(flags);
                wmb();
 
-               cp->tx_skb[entry].skb = skb;
-               cp->tx_skb[entry].len = len;
+               cp->tx_skb[entry] = skb;
                entry = NEXT_TX(entry);
        } else {
                struct cp_desc *txd;
@@ -841,8 +834,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
                first_len = skb_headlen(skb);
                first_mapping = pci_map_single(cp->pdev, skb->data,
                                               first_len, PCI_DMA_TODEVICE);
-               cp->tx_skb[entry].skb = skb;
-               cp->tx_skb[entry].len = first_len;
+               cp->tx_skb[entry] = skb;
                entry = NEXT_TX(entry);
 
                for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
@@ -883,8 +875,7 @@ static int cp_start_xmit (struct sk_buff *skb, struct net_device *dev)
                        txd->opts1 = cpu_to_le32(ctrl);
                        wmb();
 
-                       cp->tx_skb[entry].skb = skb;
-                       cp->tx_skb[entry].len = len;
+                       cp->tx_skb[entry] = skb;
                        entry = NEXT_TX(entry);
                }
 
@@ -1097,7 +1088,7 @@ static int cp_refill_rx (struct cp_private *cp)
 
                mapping = pci_map_single(cp->pdev, skb->data, cp->rx_buf_sz,
                                         PCI_DMA_FROMDEVICE);
-               cp->rx_skb[i].skb = skb;
+               cp->rx_skb[i] = skb;
 
                cp->rx_ring[i].opts2 = 0;
                cp->rx_ring[i].addr = cpu_to_le64(mapping);
@@ -1152,21 +1143,22 @@ static void cp_clean_rings (struct cp_private *cp)
        unsigned i;
 
        for (i = 0; i < CP_RX_RING_SIZE; i++) {
-               if (cp->rx_skb[i].skb) {
+               if (cp->rx_skb[i]) {
                        desc = cp->rx_ring + i;
                        pci_unmap_single(cp->pdev, le64_to_cpu(desc->addr),
                                         cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
-                       dev_kfree_skb(cp->rx_skb[i].skb);
+                       dev_kfree_skb(cp->rx_skb[i]);
                }
        }
 
        for (i = 0; i < CP_TX_RING_SIZE; i++) {
-               if (cp->tx_skb[i].skb) {
-                       struct sk_buff *skb = cp->tx_skb[i].skb;
+               if (cp->tx_skb[i]) {
+                       struct sk_buff *skb = cp->tx_skb[i];
 
                        desc = cp->tx_ring + i;
                        pci_unmap_single(cp->pdev, le64_to_cpu(desc->addr),
-                                        cp->tx_skb[i].len, PCI_DMA_TODEVICE);
+                                        le32_to_cpu(desc->opts1) & 0xffff,
+                                        PCI_DMA_TODEVICE);
                        if (le32_to_cpu(desc->opts1) & LastFrag)
                                dev_kfree_skb(skb);
                        cp->net_stats.tx_dropped++;
@@ -1176,8 +1168,8 @@ static void cp_clean_rings (struct cp_private *cp)
        memset(cp->rx_ring, 0, sizeof(struct cp_desc) * CP_RX_RING_SIZE);
        memset(cp->tx_ring, 0, sizeof(struct cp_desc) * CP_TX_RING_SIZE);
 
-       memset(&cp->rx_skb, 0, sizeof(struct ring_info) * CP_RX_RING_SIZE);
-       memset(&cp->tx_skb, 0, sizeof(struct ring_info) * CP_TX_RING_SIZE);
+       memset(cp->rx_skb, 0, sizeof(struct sk_buff *) * CP_RX_RING_SIZE);
+       memset(cp->tx_skb, 0, sizeof(struct sk_buff *) * CP_TX_RING_SIZE);
 }
 
 static void cp_free_rings (struct cp_private *cp)
@@ -2009,7 +2001,6 @@ static void cp_remove_one (struct pci_dev *pdev)
        struct net_device *dev = pci_get_drvdata(pdev);
        struct cp_private *cp = netdev_priv(dev);
 
-       BUG_ON(!dev);
        unregister_netdev(dev);
        iounmap(cp->regs);
        if (cp->wol_enabled)
@@ -2024,14 +2015,12 @@ static void cp_remove_one (struct pci_dev *pdev)
 #ifdef CONFIG_PM
 static int cp_suspend (struct pci_dev *pdev, pm_message_t state)
 {
-       struct net_device *dev;
-       struct cp_private *cp;
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct cp_private *cp = netdev_priv(dev);
        unsigned long flags;
 
-       dev = pci_get_drvdata (pdev);
-       cp  = netdev_priv(dev);
-
-       if (!dev || !netif_running (dev)) return 0;
+       if (!netif_running(dev))
+               return 0;
 
        netif_device_detach (dev);
        netif_stop_queue (dev);