[PATCH] powerpc 2.6.21-rt6: revert spider_net

Tsutomu OWA tsutomu.owa at toshiba.co.jp
Tue May 22 21:53:32 EST 2007


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 <tsutomu.owa at toshiba.co.jp>
-- 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);



More information about the Linuxppc-dev mailing list