ixgbe: cleanup short msleep's (<20ms) to use usleep_range
[pandora-kernel.git] / drivers / net / ixgbe / ixgbe_82599.c
index 00aeba3..e39380c 100644 (file)
@@ -61,6 +61,7 @@ static s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw,
                                          bool autoneg,
                                          bool autoneg_wait_to_complete);
 static s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw);
+static bool ixgbe_verify_lesm_fw_enabled_82599(struct ixgbe_hw *hw);
 
 static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
 {
@@ -86,7 +87,8 @@ static void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
                if ((mac->ops.get_media_type(hw) ==
                     ixgbe_media_type_backplane) &&
                    (hw->phy.smart_speed == ixgbe_smart_speed_auto ||
-                    hw->phy.smart_speed == ixgbe_smart_speed_on))
+                    hw->phy.smart_speed == ixgbe_smart_speed_on) &&
+                    !ixgbe_verify_lesm_fw_enabled_82599(hw))
                        mac->ops.setup_link = &ixgbe_setup_mac_link_smartspeed;
                else
                        mac->ops.setup_link = &ixgbe_setup_mac_link_82599;
@@ -128,8 +130,12 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
 
                /* Release the semaphore */
                ixgbe_release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
-               /* Delay obtaining semaphore again to allow FW access */
-               msleep(hw->eeprom.semaphore_delay);
+               /*
+                * Delay obtaining semaphore again to allow FW access,
+                * semaphore_delay is in ms usleep_range needs us.
+                */
+               usleep_range(hw->eeprom.semaphore_delay * 1000,
+                            hw->eeprom.semaphore_delay * 2000);
 
                /* Now restart DSP by setting Restart_AN and clearing LMS */
                IXGBE_WRITE_REG(hw, IXGBE_AUTOC, ((IXGBE_READ_REG(hw,
@@ -138,7 +144,7 @@ static s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
 
                /* Wait for AN to leave state 0 */
                for (i = 0; i < 10; i++) {
-                       msleep(4);
+                       usleep_range(4000, 8000);
                        reg_anlp1 = IXGBE_READ_REG(hw, IXGBE_ANLP1);
                        if (reg_anlp1 & IXGBE_ANLP1_AN_STATE_MASK)
                                break;
@@ -1176,7 +1182,7 @@ s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 pballoc)
                if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) &
                                   IXGBE_FDIRCTRL_INIT_DONE)
                        break;
-               msleep(1);
+               usleep_range(1000, 2000);
        }
        if (i >= IXGBE_FDIR_INIT_DONE_POLL)
                hw_dbg(hw, "Flow Director Signature poll time exceeded!\n");
@@ -1271,7 +1277,7 @@ s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 pballoc)
                if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) &
                                   IXGBE_FDIRCTRL_INIT_DONE)
                        break;
-               msleep(1);
+               usleep_range(1000, 2000);
        }
        if (i >= IXGBE_FDIR_INIT_DONE_POLL)
                hw_dbg(hw, "Flow Director Perfect poll time exceeded!\n");
@@ -1740,30 +1746,28 @@ static s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val)
  *  ixgbe_start_hw_82599 - Prepare hardware for Tx/Rx
  *  @hw: pointer to hardware structure
  *
- *  Starts the hardware using the generic start_hw function.
- *  Then performs device-specific:
- *  Clears the rate limiter registers.
+ *  Starts the hardware using the generic start_hw function
+ *  and the generation start_hw function.
+ *  Then performs revision-specific operations, if any.
  **/
 static s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw)
 {
-       u32 q_num;
-       s32 ret_val;
+       s32 ret_val = 0;
 
        ret_val = ixgbe_start_hw_generic(hw);
+       if (ret_val != 0)
+               goto out;
 
-       /* Clear the rate limiters */
-       for (q_num = 0; q_num < hw->mac.max_tx_queues; q_num++) {
-               IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, q_num);
-               IXGBE_WRITE_REG(hw, IXGBE_RTTBCNRC, 0);
-       }
-       IXGBE_WRITE_FLUSH(hw);
+       ret_val = ixgbe_start_hw_gen2(hw);
+       if (ret_val != 0)
+               goto out;
 
        /* We need to run link autotry after the driver loads */
        hw->mac.autotry_restart = true;
 
        if (ret_val == 0)
                ret_val = ixgbe_verify_fw_version_82599(hw);
-
+out:
        return ret_val;
 }
 
@@ -1775,7 +1779,7 @@ static s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw)
  *  If PHY already detected, maintains current PHY type in hw struct,
  *  otherwise executes the PHY detection routine.
  **/
-s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
+static s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
 {
        s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
 
@@ -2030,6 +2034,48 @@ fw_version_out:
        return status;
 }
 
+/**
+ *  ixgbe_verify_lesm_fw_enabled_82599 - Checks LESM FW module state.
+ *  @hw: pointer to hardware structure
+ *
+ *  Returns true if the LESM FW module is present and enabled. Otherwise
+ *  returns false. Smart Speed must be disabled if LESM FW module is enabled.
+ **/
+static bool ixgbe_verify_lesm_fw_enabled_82599(struct ixgbe_hw *hw)
+{
+       bool lesm_enabled = false;
+       u16 fw_offset, fw_lesm_param_offset, fw_lesm_state;
+       s32 status;
+
+       /* get the offset to the Firmware Module block */
+       status = hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset);
+
+       if ((status != 0) ||
+           (fw_offset == 0) || (fw_offset == 0xFFFF))
+               goto out;
+
+       /* get the offset to the LESM Parameters block */
+       status = hw->eeprom.ops.read(hw, (fw_offset +
+                                    IXGBE_FW_LESM_PARAMETERS_PTR),
+                                    &fw_lesm_param_offset);
+
+       if ((status != 0) ||
+           (fw_lesm_param_offset == 0) || (fw_lesm_param_offset == 0xFFFF))
+               goto out;
+
+       /* get the lesm state word */
+       status = hw->eeprom.ops.read(hw, (fw_lesm_param_offset +
+                                    IXGBE_FW_LESM_STATE_1),
+                                    &fw_lesm_state);
+
+       if ((status == 0) &&
+           (fw_lesm_state & IXGBE_FW_LESM_STATE_ENABLED))
+               lesm_enabled = true;
+
+out:
+       return lesm_enabled;
+}
+
 static struct ixgbe_mac_operations mac_ops_82599 = {
        .init_hw                = &ixgbe_init_hw_generic,
        .reset_hw               = &ixgbe_reset_hw_82599,