]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/skge.c
Merge current mainline tree into linux-omap tree
[linux-2.6-omap-h63xx.git] / drivers / net / skge.c
index f7e0fbbd4ad6840b3157c07a2b9fe8ca6f3df343..2e26dced13a1ed3bb124e8432382cb13b3555af7 100644 (file)
@@ -44,7 +44,7 @@
 #include "skge.h"
 
 #define DRV_NAME               "skge"
-#define DRV_VERSION            "1.12"
+#define DRV_VERSION            "1.13"
 #define PFX                    DRV_NAME " "
 
 #define DEFAULT_TX_RING_SIZE   128
@@ -2190,9 +2190,12 @@ static void yukon_mac_init(struct skge_hw *hw, int port)
                         TX_JAM_IPG_VAL(TX_JAM_IPG_DEF) |
                         TX_IPG_JAM_DATA(TX_IPG_JAM_DEF));
 
-       /* serial mode register */
-       reg = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
-       if (hw->dev[port]->mtu > 1500)
+       /* configure the Serial Mode Register */
+       reg = DATA_BLIND_VAL(DATA_BLIND_DEF)
+               | GM_SMOD_VLAN_ENA
+               | IPG_DATA_VAL(IPG_DATA_DEF);
+
+       if (hw->dev[port]->mtu > ETH_DATA_LEN)
                reg |= GM_SMOD_JUMBO_ENA;
 
        gma_write16(hw, port, GM_SERIAL_MODE, reg);
@@ -2893,11 +2896,7 @@ static void skge_tx_timeout(struct net_device *dev)
 
 static int skge_change_mtu(struct net_device *dev, int new_mtu)
 {
-       struct skge_port *skge = netdev_priv(dev);
-       struct skge_hw *hw = skge->hw;
-       int port = skge->port;
        int err;
-       u16 ctl, reg;
 
        if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
                return -EINVAL;
@@ -2907,40 +2906,13 @@ static int skge_change_mtu(struct net_device *dev, int new_mtu)
                return 0;
        }
 
-       skge_write32(hw, B0_IMSK, 0);
-       dev->trans_start = jiffies;     /* prevent tx timeout */
-       netif_stop_queue(dev);
-       napi_disable(&skge->napi);
-
-       ctl = gma_read16(hw, port, GM_GP_CTRL);
-       gma_write16(hw, port, GM_GP_CTRL, ctl & ~GM_GPCR_RX_ENA);
-
-       skge_rx_clean(skge);
-       skge_rx_stop(hw, port);
+       skge_down(dev);
 
        dev->mtu = new_mtu;
 
-       reg = GM_SMOD_VLAN_ENA | IPG_DATA_VAL(IPG_DATA_DEF);
-       if (new_mtu > 1500)
-               reg |= GM_SMOD_JUMBO_ENA;
-       gma_write16(hw, port, GM_SERIAL_MODE, reg);
-
-       skge_write8(hw, RB_ADDR(rxqaddr[port], RB_CTRL), RB_ENA_OP_MD);
-
-       err = skge_rx_fill(dev);
-       wmb();
-       if (!err)
-               skge_write8(hw, Q_ADDR(rxqaddr[port], Q_CSR), CSR_START | CSR_IRQ_CL_F);
-       skge_write32(hw, B0_IMSK, hw->intr_mask);
-
+       err = skge_up(dev);
        if (err)
                dev_close(dev);
-       else {
-               gma_write16(hw, port, GM_GP_CTRL, ctl);
-
-               napi_enable(&skge->napi);
-               netif_wake_queue(dev);
-       }
 
        return err;
 }
@@ -3227,12 +3199,14 @@ static int skge_poll(struct napi_struct *napi, int to_do)
        skge_write8(hw, Q_ADDR(rxqaddr[skge->port], Q_CSR), CSR_START);
 
        if (work_done < to_do) {
-               spin_lock_irq(&hw->hw_lock);
+               unsigned long flags;
+
+               spin_lock_irqsave(&hw->hw_lock, flags);
                __netif_rx_complete(dev, napi);
                hw->intr_mask |= napimask[skge->port];
                skge_write32(hw, B0_IMSK, hw->intr_mask);
                skge_read32(hw, B0_IMSK);
-               spin_unlock_irq(&hw->hw_lock);
+               spin_unlock_irqrestore(&hw->hw_lock, flags);
        }
 
        return work_done;