|
@@ -127,11 +127,11 @@ static unsigned long mdio_read(struct meth_private *priv, unsigned long phyreg)
|
|
|
static int mdio_probe(struct meth_private *priv)
|
|
|
{
|
|
|
int i;
|
|
|
- unsigned long p2, p3;
|
|
|
+ unsigned long p2, p3, flags;
|
|
|
/* check if phy is detected already */
|
|
|
if(priv->phy_addr>=0&&priv->phy_addr<32)
|
|
|
return 0;
|
|
|
- spin_lock(&priv->meth_lock);
|
|
|
+ spin_lock_irqsave(&priv->meth_lock, flags);
|
|
|
for (i=0;i<32;++i){
|
|
|
priv->phy_addr=i;
|
|
|
p2=mdio_read(priv,2);
|
|
@@ -157,7 +157,7 @@ static int mdio_probe(struct meth_private *priv)
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
- spin_unlock(&priv->meth_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->meth_lock, flags);
|
|
|
if(priv->phy_addr<32) {
|
|
|
return 0;
|
|
|
}
|
|
@@ -373,14 +373,14 @@ static int meth_release(struct net_device *dev)
|
|
|
static void meth_rx(struct net_device* dev, unsigned long int_status)
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
|
- unsigned long status;
|
|
|
+ unsigned long status, flags;
|
|
|
struct meth_private *priv = netdev_priv(dev);
|
|
|
unsigned long fifo_rptr = (int_status & METH_INT_RX_RPTR_MASK) >> 8;
|
|
|
|
|
|
- spin_lock(&priv->meth_lock);
|
|
|
+ spin_lock_irqsave(&priv->meth_lock, flags);
|
|
|
priv->dma_ctrl &= ~METH_DMA_RX_INT_EN;
|
|
|
mace->eth.dma_ctrl = priv->dma_ctrl;
|
|
|
- spin_unlock(&priv->meth_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->meth_lock, flags);
|
|
|
|
|
|
if (int_status & METH_INT_RX_UNDERFLOW) {
|
|
|
fifo_rptr = (fifo_rptr - 1) & 0x0f;
|
|
@@ -452,12 +452,12 @@ static void meth_rx(struct net_device* dev, unsigned long int_status)
|
|
|
mace->eth.rx_fifo = priv->rx_ring_dmas[priv->rx_write];
|
|
|
ADVANCE_RX_PTR(priv->rx_write);
|
|
|
}
|
|
|
- spin_lock(&priv->meth_lock);
|
|
|
+ spin_lock_irqsave(&priv->meth_lock, flags);
|
|
|
/* In case there was underflow, and Rx DMA was disabled */
|
|
|
priv->dma_ctrl |= METH_DMA_RX_INT_EN | METH_DMA_RX_EN;
|
|
|
mace->eth.dma_ctrl = priv->dma_ctrl;
|
|
|
mace->eth.int_stat = METH_INT_RX_THRESHOLD;
|
|
|
- spin_unlock(&priv->meth_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->meth_lock, flags);
|
|
|
}
|
|
|
|
|
|
static int meth_tx_full(struct net_device *dev)
|
|
@@ -470,11 +470,11 @@ static int meth_tx_full(struct net_device *dev)
|
|
|
static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status)
|
|
|
{
|
|
|
struct meth_private *priv = netdev_priv(dev);
|
|
|
- unsigned long status;
|
|
|
+ unsigned long status, flags;
|
|
|
struct sk_buff *skb;
|
|
|
unsigned long rptr = (int_status&TX_INFO_RPTR) >> 16;
|
|
|
|
|
|
- spin_lock(&priv->meth_lock);
|
|
|
+ spin_lock_irqsave(&priv->meth_lock, flags);
|
|
|
|
|
|
/* Stop DMA notification */
|
|
|
priv->dma_ctrl &= ~(METH_DMA_TX_INT_EN);
|
|
@@ -527,12 +527,13 @@ static void meth_tx_cleanup(struct net_device* dev, unsigned long int_status)
|
|
|
}
|
|
|
|
|
|
mace->eth.int_stat = METH_INT_TX_EMPTY | METH_INT_TX_PKT;
|
|
|
- spin_unlock(&priv->meth_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->meth_lock, flags);
|
|
|
}
|
|
|
|
|
|
static void meth_error(struct net_device* dev, unsigned status)
|
|
|
{
|
|
|
struct meth_private *priv = netdev_priv(dev);
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
printk(KERN_WARNING "meth: error status: 0x%08x\n",status);
|
|
|
/* check for errors too... */
|
|
@@ -547,7 +548,7 @@ static void meth_error(struct net_device* dev, unsigned status)
|
|
|
printk(KERN_WARNING "meth: Rx overflow\n");
|
|
|
if (status & (METH_INT_RX_UNDERFLOW)) {
|
|
|
printk(KERN_WARNING "meth: Rx underflow\n");
|
|
|
- spin_lock(&priv->meth_lock);
|
|
|
+ spin_lock_irqsave(&priv->meth_lock, flags);
|
|
|
mace->eth.int_stat = METH_INT_RX_UNDERFLOW;
|
|
|
/* more underflow interrupts will be delivered,
|
|
|
* effectively throwing us into an infinite loop.
|
|
@@ -555,7 +556,7 @@ static void meth_error(struct net_device* dev, unsigned status)
|
|
|
priv->dma_ctrl &= ~METH_DMA_RX_EN;
|
|
|
mace->eth.dma_ctrl = priv->dma_ctrl;
|
|
|
DPRINTK("Disabled meth Rx DMA temporarily\n");
|
|
|
- spin_unlock(&priv->meth_lock);
|
|
|
+ spin_unlock_irqrestore(&priv->meth_lock, flags);
|
|
|
}
|
|
|
mace->eth.int_stat = METH_INT_ERROR;
|
|
|
}
|