]> err.no Git - linux-2.6/blobdiff - drivers/net/skge.c
Merge master.kernel.org:/home/rmk/linux-2.6-serial
[linux-2.6] / drivers / net / skge.c
index a261766bc0528e0a4be3a990f3eb4270d382b90a..5ca5a1b546a162ed23eaf2e422fd9db21eee2537 100644 (file)
@@ -44,7 +44,7 @@
 #include "skge.h"
 
 #define DRV_NAME               "skge"
-#define DRV_VERSION            "1.4"
+#define DRV_VERSION            "1.5"
 #define PFX                    DRV_NAME " "
 
 #define DEFAULT_TX_RING_SIZE   128
@@ -78,6 +78,7 @@ static const struct pci_device_id skge_id_table[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_GE) },
        { PCI_DEVICE(PCI_VENDOR_ID_SYSKONNECT, PCI_DEVICE_ID_SYSKONNECT_YU) },
        { PCI_DEVICE(PCI_VENDOR_ID_DLINK, PCI_DEVICE_ID_DLINK_DGE510T), },
+       { PCI_DEVICE(PCI_VENDOR_ID_DLINK, 0x4b01) },    /* DGE-530T */
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4320) },
        { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x5005) }, /* Belkin */
        { PCI_DEVICE(PCI_VENDOR_ID_CNET, PCI_DEVICE_ID_CNET_GIGACARD) },
@@ -400,7 +401,7 @@ static int skge_set_ring_param(struct net_device *dev,
        int err;
 
        if (p->rx_pending == 0 || p->rx_pending > MAX_RX_RING_SIZE ||
-           p->tx_pending == 0 || p->tx_pending > MAX_TX_RING_SIZE)
+           p->tx_pending < MAX_SKB_FRAGS+1 || p->tx_pending > MAX_TX_RING_SIZE)
                return -EINVAL;
 
        skge->rx_ring.count = p->rx_pending;
@@ -847,8 +848,7 @@ static void skge_link_up(struct skge_port *skge)
                    LED_BLK_OFF|LED_SYNC_OFF|LED_ON);
 
        netif_carrier_on(skge->netdev);
-       if (skge->tx_avail > MAX_SKB_FRAGS + 1)
-               netif_wake_queue(skge->netdev);
+       netif_wake_queue(skge->netdev);
 
        if (netif_msg_link(skge))
                printk(KERN_INFO PFX
@@ -2190,8 +2190,6 @@ static int skge_up(struct net_device *dev)
        if (err)
                goto free_rx_ring;
 
-       skge->tx_avail = skge->tx_ring.count - 1;
-
        /* Initialize MAC */
        spin_lock_bh(&hw->phy_lock);
        if (hw->chip_id == CHIP_ID_GENESIS)
@@ -2294,6 +2292,12 @@ static int skge_down(struct net_device *dev)
        return 0;
 }
 
+static inline int skge_avail(const struct skge_ring *ring)
+{
+       return ((ring->to_clean > ring->to_use) ? 0 : ring->count)
+               + (ring->to_clean - ring->to_use) - 1;
+}
+
 static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
 {
        struct skge_port *skge = netdev_priv(dev);
@@ -2314,7 +2318,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
                return NETDEV_TX_LOCKED;
        }
 
-       if (unlikely(skge->tx_avail < skb_shinfo(skb)->nr_frags +1)) {
+       if (unlikely(skge_avail(&skge->tx_ring) < skb_shinfo(skb)->nr_frags + 1)) {
                if (!netif_queue_stopped(dev)) {
                        netif_stop_queue(dev);
 
@@ -2390,8 +2394,7 @@ static int skge_xmit_frame(struct sk_buff *skb, struct net_device *dev)
                       dev->name, e - ring->start, skb->len);
 
        ring->to_use = e->next;
-       skge->tx_avail -= skb_shinfo(skb)->nr_frags + 1;
-       if (skge->tx_avail <= MAX_SKB_FRAGS + 1) {
+       if (skge_avail(&skge->tx_ring) <= MAX_SKB_FRAGS + 1) {
                pr_debug("%s: transmit queue full\n", dev->name);
                netif_stop_queue(dev);
        }
@@ -2416,14 +2419,12 @@ static void skge_tx_complete(struct skge_port *skge, struct skge_element *last)
                e->skb = NULL;
                pci_unmap_single(pdev, pci_unmap_addr(e, mapaddr),
                                 skb_headlen(skb), PCI_DMA_TODEVICE);
-               ++skge->tx_avail;
 
                for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
                        e = e->next;
                        pci_unmap_page(pdev, pci_unmap_addr(e, mapaddr),
                                       skb_shinfo(skb)->frags[i].size,
                                       PCI_DMA_TODEVICE);
-                       ++skge->tx_avail;
                }
 
                dev_kfree_skb(skb);
@@ -2688,7 +2689,7 @@ static void skge_tx_done(struct skge_port *skge)
 
        skge_write8(skge->hw, Q_ADDR(txqaddr[skge->port], Q_CSR), CSR_IRQ_CL_F);
 
-       if (skge->tx_avail > MAX_SKB_FRAGS + 1)
+       if (skge_avail(&skge->tx_ring) > MAX_SKB_FRAGS + 1)
                netif_wake_queue(skge->netdev);
 
        spin_unlock(&skge->tx_lock);
@@ -2715,8 +2716,7 @@ static int skge_poll(struct net_device *dev, int *budget)
                if (control & BMU_OWN)
                        break;
 
-               skb = skge_rx_get(skge, e, control, rd->status,
-                                 le16_to_cpu(rd->csum2));
+               skb = skge_rx_get(skge, e, control, rd->status, rd->csum2);
                if (likely(skb)) {
                        dev->last_rx = jiffies;
                        netif_receive_skb(skb);