Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net...
[safe/jmp/linux-2.6] / drivers / net / atl1c / atl1c_main.c
index 83a1212..cd547a2 100644 (file)
@@ -164,6 +164,24 @@ static inline void atl1c_irq_reset(struct atl1c_adapter *adapter)
 }
 
 /*
+ * atl1c_wait_until_idle - wait up to AT_HW_MAX_IDLE_DELAY reads
+ * of the idle status register until the device is actually idle
+ */
+static u32 atl1c_wait_until_idle(struct atl1c_hw *hw)
+{
+       int timeout;
+       u32 data;
+
+       for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
+               AT_READ_REG(hw, REG_IDLE_STATUS, &data);
+               if ((data & IDLE_STATUS_MASK) == 0)
+                       return 0;
+               msleep(1);
+       }
+       return data;
+}
+
+/*
  * atl1c_phy_config - Timer Call-back
  * @data: pointer to netdev cast into an unsigned long
  */
@@ -220,11 +238,11 @@ static void atl1c_check_link_status(struct atl1c_adapter *adapter)
                /* link down */
                if (netif_carrier_ok(netdev)) {
                        hw->hibernate = true;
-                       atl1c_set_aspm(hw, false);
                        if (atl1c_stop_mac(hw) != 0)
                                if (netif_msg_hw(adapter))
                                        dev_warn(&pdev->dev,
                                                "stop mac failed\n");
+                       atl1c_set_aspm(hw, false);
                }
                netif_carrier_off(netdev);
        } else {
@@ -240,10 +258,10 @@ static void atl1c_check_link_status(struct atl1c_adapter *adapter)
                    adapter->link_duplex != duplex) {
                        adapter->link_speed  = speed;
                        adapter->link_duplex = duplex;
+                       atl1c_set_aspm(hw, true);
                        atl1c_enable_tx_ctrl(hw);
                        atl1c_enable_rx_ctrl(hw);
                        atl1c_setup_mac_ctrl(adapter);
-                       atl1c_set_aspm(hw, true);
                        if (netif_msg_link(adapter))
                                dev_info(&pdev->dev,
                                        "%s: %s NIC Link is Up<%d Mbps %s>\n",
@@ -1106,7 +1124,6 @@ static void atl1c_configure_dma(struct atl1c_adapter *adapter)
 static int atl1c_stop_mac(struct atl1c_hw *hw)
 {
        u32 data;
-       int timeout;
 
        AT_READ_REG(hw, REG_RXQ_CTRL, &data);
        data &= ~(RXQ1_CTRL_EN | RXQ2_CTRL_EN |
@@ -1117,25 +1134,13 @@ static int atl1c_stop_mac(struct atl1c_hw *hw)
        data &= ~TXQ_CTRL_EN;
        AT_WRITE_REG(hw, REG_TWSI_CTRL, data);
 
-       for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
-               AT_READ_REG(hw, REG_IDLE_STATUS, &data);
-               if ((data & (IDLE_STATUS_RXQ_NO_IDLE |
-                       IDLE_STATUS_TXQ_NO_IDLE)) == 0)
-                       break;
-               msleep(1);
-       }
+       atl1c_wait_until_idle(hw);
 
        AT_READ_REG(hw, REG_MAC_CTRL, &data);
        data &= ~(MAC_CTRL_TX_EN | MAC_CTRL_RX_EN);
        AT_WRITE_REG(hw, REG_MAC_CTRL, data);
 
-       for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
-               AT_READ_REG(hw, REG_IDLE_STATUS, &data);
-               if ((data & IDLE_STATUS_MASK) == 0)
-                       return 0;
-               msleep(1);
-       }
-       return data;
+       return (int)atl1c_wait_until_idle(hw);
 }
 
 static void atl1c_enable_rx_ctrl(struct atl1c_hw *hw)
@@ -1178,8 +1183,6 @@ static int atl1c_reset_mac(struct atl1c_hw *hw)
 {
        struct atl1c_adapter *adapter = (struct atl1c_adapter *)hw->adapter;
        struct pci_dev *pdev = adapter->pdev;
-       u32 idle_status_data = 0;
-       int timeout = 0;
        int ret;
 
        AT_WRITE_REG(hw, REG_IMR, 0);
@@ -1198,15 +1201,10 @@ static int atl1c_reset_mac(struct atl1c_hw *hw)
        AT_WRITE_FLUSH(hw);
        msleep(10);
        /* Wait at least 10ms for All module to be Idle */
-       for (timeout = 0; timeout < AT_HW_MAX_IDLE_DELAY; timeout++) {
-               AT_READ_REG(hw, REG_IDLE_STATUS, &idle_status_data);
-               if ((idle_status_data & IDLE_STATUS_MASK) == 0)
-                       break;
-               msleep(1);
-       }
-       if (timeout >= AT_HW_MAX_IDLE_DELAY) {
+
+       if (atl1c_wait_until_idle(hw)) {
                dev_err(&pdev->dev,
-                       "MAC state machine cann't be idle since"
+                       "MAC state machine can't be idle since"
                        " disabled for 10ms second\n");
                return -1;
        }
@@ -1242,9 +1240,7 @@ static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup)
 
        AT_READ_REG(hw, REG_PM_CTRL, &pm_ctrl_data);
 
-       pm_ctrl_data &= PM_CTRL_SERDES_PD_EX_L1;
-       pm_ctrl_data |= ~PM_CTRL_SERDES_BUDS_RX_L1_EN;
-       pm_ctrl_data |= ~PM_CTRL_SERDES_L1_EN;
+       pm_ctrl_data &= ~PM_CTRL_SERDES_PD_EX_L1;
        pm_ctrl_data &=  ~(PM_CTRL_L1_ENTRY_TIMER_MASK <<
                        PM_CTRL_L1_ENTRY_TIMER_SHIFT);
 
@@ -1254,19 +1250,11 @@ static void atl1c_set_aspm(struct atl1c_hw *hw, bool linkup)
                pm_ctrl_data |= PM_CTRL_SERDES_PLL_L1_EN;
                pm_ctrl_data &= ~PM_CTRL_CLK_SWH_L1;
 
-               if (hw->ctrl_flags & ATL1C_ASPM_L1_SUPPORT) {
-                       pm_ctrl_data |= AT_ASPM_L1_TIMER <<
-                               PM_CTRL_L1_ENTRY_TIMER_SHIFT;
-                       pm_ctrl_data |= PM_CTRL_ASPM_L1_EN;
-               } else
-                       pm_ctrl_data &= ~PM_CTRL_ASPM_L1_EN;
-
-               if (hw->ctrl_flags & ATL1C_ASPM_L0S_SUPPORT)
-                       pm_ctrl_data |= PM_CTRL_ASPM_L0S_EN;
-               else
-                       pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
-
+               pm_ctrl_data |= PM_CTRL_SERDES_BUDS_RX_L1_EN;
+               pm_ctrl_data |= PM_CTRL_SERDES_L1_EN;
        } else {
+               pm_ctrl_data &= ~PM_CTRL_SERDES_BUDS_RX_L1_EN;
+               pm_ctrl_data &= ~PM_CTRL_SERDES_L1_EN;
                pm_ctrl_data &= ~PM_CTRL_ASPM_L0S_EN;
                pm_ctrl_data &= ~PM_CTRL_SERDES_PLL_L1_EN;
 
@@ -2123,7 +2111,6 @@ static int atl1c_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
        atl1c_tx_map(adapter, skb, tpd, type);
        atl1c_tx_queue(adapter, skb, tpd, type);
 
-       netdev->trans_start = jiffies;
        spin_unlock_irqrestore(&adapter->tx_lock, flags);
        return NETDEV_TX_OK;
 }