Hi Ingo and Thomas,

Please apply.

To revert spider_net.c to original one as it turns out that the patch 
I sent was unnecessary.  It was my mistake.

Compile, boot and netperf tested on celleb.

thanks for your time!

Signed-off-by: Tsutomu OWA <[EMAIL PROTECTED]>
-- owa

--- linux-2.6.21-rt3/drivers/net/spider_net.c   2007-05-21 15:19:42.000000000 
+0900
+++ rt/drivers/net/spider_net.c 2007-04-26 12:08:32.000000000 +0900
@@ -688,6 +688,7 @@ spider_net_prepare_tx_descr(struct spide
        struct spider_net_descr *descr;
        struct spider_net_hw_descr *hwdescr;
        dma_addr_t buf;
+       unsigned long flags;
 
        buf = pci_map_single(card->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
        if (pci_dma_mapping_error(buf)) {
@@ -698,8 +699,10 @@ spider_net_prepare_tx_descr(struct spide
                return -ENOMEM;
        }
 
+       spin_lock_irqsave(&chain->lock, flags);
        descr = card->tx_chain.head;
        if (descr->next == chain->tail->prev) {
+               spin_unlock_irqrestore(&chain->lock, flags);
                pci_unmap_single(card->pdev, buf, skb->len, PCI_DMA_TODEVICE);
                return -ENOMEM;
        }
@@ -714,6 +717,7 @@ spider_net_prepare_tx_descr(struct spide
 
        hwdescr->dmac_cmd_status =
                        SPIDER_NET_DESCR_CARDOWNED | SPIDER_NET_DMAC_NOCS;
+       spin_unlock_irqrestore(&chain->lock, flags);
 
        if (skb->protocol == htons(ETH_P_IP) && skb->ip_summed == 
CHECKSUM_PARTIAL)
                switch (skb->nh.iph->protocol) {
@@ -738,6 +742,7 @@ spider_net_set_low_watermark(struct spid
 {
        struct spider_net_descr *descr = card->tx_chain.tail;
        struct spider_net_hw_descr *hwdescr;
+       unsigned long flags;
        int status;
        int cnt=0;
        int i;
@@ -763,6 +768,7 @@ spider_net_set_low_watermark(struct spid
                descr = descr->next;
 
        /* Set the new watermark, clear the old watermark */
+       spin_lock_irqsave(&card->tx_chain.lock, flags);
        descr->hwdescr->dmac_cmd_status |= SPIDER_NET_DESCR_TXDESFLG;
        if (card->low_watermark && card->low_watermark != descr) {
                hwdescr = card->low_watermark->hwdescr;
@@ -770,7 +776,7 @@ spider_net_set_low_watermark(struct spid
                     hwdescr->dmac_cmd_status & ~SPIDER_NET_DESCR_TXDESFLG;
        }
        card->low_watermark = descr;
-
+       spin_unlock_irqrestore(&card->tx_chain.lock, flags);
        return cnt;
 }
 
@@ -778,7 +784,6 @@ spider_net_set_low_watermark(struct spid
  * spider_net_release_tx_chain - processes sent tx descriptors
  * @card: adapter structure
  * @brutal: if set, don't care about whether descriptor seems to be in use
- * @locked: if set, tx_chain locked is held by caller.
  *
  * returns 0 if the tx ring is empty, otherwise 1.
  *
@@ -788,7 +793,7 @@ spider_net_set_low_watermark(struct spid
  * scheduled again (if we were scheduled) and will not loose initiative.
  */
 static int
-spider_net_release_tx_chain(struct spider_net_card *card, int brutal, int 
locked)
+spider_net_release_tx_chain(struct spider_net_card *card, int brutal)
 {
        struct spider_net_descr_chain *chain = &card->tx_chain;
        struct spider_net_descr *descr;
@@ -799,11 +804,9 @@ spider_net_release_tx_chain(struct spide
        int status;
 
        while (1) {
-               if (!locked)
-                       spin_lock_irqsave(&chain->lock, flags);
+               spin_lock_irqsave(&chain->lock, flags);
                if (chain->tail == chain->head) {
-                       if (!locked)
-                               spin_unlock_irqrestore(&chain->lock, flags);
+                       spin_unlock_irqrestore(&chain->lock, flags);
                        return 0;
                }
                descr = chain->tail;
@@ -818,8 +821,7 @@ spider_net_release_tx_chain(struct spide
 
                case SPIDER_NET_DESCR_CARDOWNED:
                        if (!brutal) {
-                               if (!locked)
-                                       spin_unlock_irqrestore(&chain->lock, 
flags);
+                               spin_unlock_irqrestore(&chain->lock, flags);
                                return 1;
                        }
 
@@ -840,8 +842,7 @@ spider_net_release_tx_chain(struct spide
                default:
                        card->netdev_stats.tx_dropped++;
                        if (!brutal) {
-                               if (!locked)
-                                       spin_unlock_irqrestore(&chain->lock, 
flags);
+                               spin_unlock_irqrestore(&chain->lock, flags);
                                return 1;
                        }
                }
@@ -851,9 +852,7 @@ spider_net_release_tx_chain(struct spide
                skb = descr->skb;
                descr->skb = NULL;
                buf_addr = hwdescr->buf_addr;
-
-               if (!locked)
-                       spin_unlock_irqrestore(&chain->lock, flags);
+               spin_unlock_irqrestore(&chain->lock, flags);
 
                /* unmap the skb */
                if (skb) {
@@ -917,28 +916,18 @@ spider_net_xmit(struct sk_buff *skb, str
 {
        int cnt;
        struct spider_net_card *card = netdev_priv(netdev);
-       unsigned long flags;
-
-       if (!spin_trylock_irqsave(&card->tx_chain.lock, flags))
-               return NETDEV_TX_BUSY;
-               //? collision ? return NETDEV_TX_LOCKED;
 
-       spider_net_release_tx_chain(card, 0, 1);
+       spider_net_release_tx_chain(card, 0);
 
        if (spider_net_prepare_tx_descr(card, skb) != 0) {
-               spin_unlock_irqrestore(&card->tx_chain.lock, flags);
                card->netdev_stats.tx_dropped++;
                netif_stop_queue(netdev);
                return NETDEV_TX_BUSY;
        }
 
        cnt = spider_net_set_low_watermark(card);
-
-       spin_unlock_irqrestore(&card->tx_chain.lock, flags);
-
        if (cnt < 5)
                spider_net_kick_tx_dma(card);
-
        return NETDEV_TX_OK;
 }
 
@@ -954,20 +943,11 @@ spider_net_xmit(struct sk_buff *skb, str
 static void
 spider_net_cleanup_tx_ring(struct spider_net_card *card)
 {
-       unsigned long flags;
-
-       if (!spin_trylock_irqsave(&card->tx_chain.lock, flags))
-               return;
-
-       if ((spider_net_release_tx_chain(card, 0, 1) != 0) &&
+       if ((spider_net_release_tx_chain(card, 0) != 0) &&
            (card->netdev->flags & IFF_UP)) {
-               spin_unlock_irqrestore(&card->tx_chain.lock, flags);
                spider_net_kick_tx_dma(card);
                netif_wake_queue(card->netdev);
-       } else
-               spin_unlock_irqrestore(&card->tx_chain.lock, flags);
-
-
+       }
 }
 
 /**
@@ -2112,7 +2092,7 @@ spider_net_stop(struct net_device *netde
        spider_net_disable_rxdmac(card);
 
        /* release chains */
-       spider_net_release_tx_chain(card, 1, 0);
+       spider_net_release_tx_chain(card, 1);
        spider_net_free_rx_chain_contents(card);
 
        spider_net_free_chain(card, &card->tx_chain);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to