From: Nicolas Pitre This change is flaky. Also conflicting with planned update of the driver. Signed-off-by: Nicolas Pitre Signed-off-by: Andrew Morton --- 25-akpm/drivers/net/smc91x.c | 29 ++++++++++------------------- 1 files changed, 10 insertions(+), 19 deletions(-) diff -puN drivers/net/smc91x.c~smc91x-revert-11923358-m32r-modify-drivers-net-smc91xc drivers/net/smc91x.c --- 25/drivers/net/smc91x.c~smc91x-revert-11923358-m32r-modify-drivers-net-smc91xc Thu Sep 23 14:57:44 2004 +++ 25-akpm/drivers/net/smc91x.c Thu Sep 23 14:57:44 2004 @@ -55,9 +55,6 @@ * smc_phy_configure * - clean up (and fix stack overrun) in PHY * MII read/write functions - * 09/15/04 Hayato Fujiwara - Add m32r support. - * - Modify for SMP kernel; Change spin-locked - * regions. */ static const char version[] = "smc91x.c: v1.0, mar 07 2003 by Nicolas Pitre \n"; @@ -259,18 +256,24 @@ static void PRINT_PKT(u_char *buf, int l /* this enables an interrupt in the interrupt mask register */ #define SMC_ENABLE_INT(x) do { \ + unsigned long flags; \ unsigned char mask; \ + spin_lock_irqsave(&lp->lock, flags); \ mask = SMC_GET_INT_MASK(); \ mask |= (x); \ SMC_SET_INT_MASK(mask); \ + spin_unlock_irqrestore(&lp->lock, flags); \ } while (0) /* this disables an interrupt from the interrupt mask register */ #define SMC_DISABLE_INT(x) do { \ + unsigned long flags; \ unsigned char mask; \ + spin_lock_irqsave(&lp->lock, flags); \ mask = SMC_GET_INT_MASK(); \ mask &= ~(x); \ SMC_SET_INT_MASK(mask); \ + spin_unlock_irqrestore(&lp->lock, flags); \ } while (0) /* @@ -577,12 +580,9 @@ static int smc_hard_start_xmit(struct sk struct smc_local *lp = netdev_priv(dev); unsigned long ioaddr = dev->base_addr; unsigned int numPages, poll_count, status, saved_bank; - unsigned long flags; DBG(3, "%s: %s\n", dev->name, __FUNCTION__); - spin_lock_irqsave(&lp->lock, flags); - BUG_ON(lp->saved_skb != NULL); lp->saved_skb = skb; @@ -604,7 +604,6 @@ static int smc_hard_start_xmit(struct sk lp->stats.tx_errors++; lp->stats.tx_dropped++; dev_kfree_skb(skb); - spin_unlock_irqrestore(&lp->lock, flags); return 0; } @@ -653,7 +652,6 @@ static int smc_hard_start_xmit(struct sk } SMC_SELECT_BANK(saved_bank); - spin_unlock_irqrestore(&lp->lock, flags); return 0; } @@ -1168,8 +1166,6 @@ static irqreturn_t smc_interrupt(int irq DBG(3, "%s: %s\n", dev->name, __FUNCTION__); - spin_lock(&lp->lock); - saved_bank = SMC_CURRENT_BANK(); SMC_SELECT_BANK(2); saved_pointer = SMC_GET_PTR(); @@ -1193,6 +1189,8 @@ static irqreturn_t smc_interrupt(int irq if (!status) break; + spin_lock(&lp->lock); + if (status & IM_RCV_INT) { DBG(3, "%s: RX irq\n", dev->name); smc_rcv(dev); @@ -1241,6 +1239,7 @@ static irqreturn_t smc_interrupt(int irq PRINTK("%s: UNSUPPORTED: ERCV INTERRUPT \n", dev->name); } + spin_unlock(&lp->lock); } while (--timeout); /* restore register states */ @@ -1250,7 +1249,6 @@ static irqreturn_t smc_interrupt(int irq DBG(3, "%s: Interrupt done (%d loops)\n", dev->name, 8-timeout); - spin_unlock(&lp->lock); /* * We return IRQ_HANDLED unconditionally here even if there was * nothing to do. There is a possibility that a packet might @@ -1266,9 +1264,7 @@ static irqreturn_t smc_interrupt(int irq static void smc_timeout(struct net_device *dev) { struct smc_local *lp = netdev_priv(dev); - unsigned long flags; - spin_lock_irqsave(&lp->lock, flags); DBG(2, "%s: %s\n", dev->name, __FUNCTION__); smc_reset(dev); @@ -1302,9 +1298,6 @@ static void smc_timeout(struct net_devic } /* We can accept TX packets again */ dev->trans_start = jiffies; - - spin_unlock_irqrestore(&lp->lock, flags); - netif_wake_queue(dev); } @@ -1445,7 +1438,7 @@ smc_open(struct net_device *dev) * address using ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx */ if (!is_valid_ether_addr(dev->dev_addr)) { - DBG(2, "smc_open: no valid ethernet hw addr\n"); + DBG(2, (KERN_DEBUG "smc_open: no valid ethernet hw addr\n")); return -EINVAL; } @@ -1885,9 +1878,7 @@ static int __init smc_probe(struct net_d if (retval) goto err_out; -#if !defined(__m32r__) set_irq_type(dev->irq, IRQT_RISING); -#endif #ifdef SMC_USE_PXA_DMA { int dma = pxa_request_dma(dev->name, DMA_PRIO_LOW, _