The usage of longer busy-wait delays is discouraged in non-atomic context.
See also Documentation/timers/timers-howto.txt
Therefore replace them with sleeping equivalents.
I successfully tested the patch on a device with I211.

Signed-off-by: Heiner Kallweit <hkallwe...@gmail.com>
---
 drivers/net/ethernet/intel/igb/e1000_82575.c |  2 +-
 drivers/net/ethernet/intel/igb/e1000_i210.c  |  2 +-
 drivers/net/ethernet/intel/igb/e1000_phy.c   | 10 ++--------
 drivers/net/ethernet/intel/igb/e1000_phy.h   |  1 +
 drivers/net/ethernet/intel/igb/igb.h         |  1 +
 drivers/net/ethernet/intel/igb/igb_ethtool.c |  2 +-
 drivers/net/ethernet/intel/igb/igb_main.c    | 12 +++++++++++-
 7 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c 
b/drivers/net/ethernet/intel/igb/e1000_82575.c
index 051ea94..d58dd7b 100644
--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
+++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
@@ -1141,7 +1141,7 @@ static s32 igb_acquire_swfw_sync_82575(struct e1000_hw 
*hw, u16 mask)
                 * or other software thread using resource (swmask)
                 */
                igb_put_hw_semaphore(hw);
-               mdelay(5);
+               usleep_range(5000, 6000);
                i++;
        }
 
diff --git a/drivers/net/ethernet/intel/igb/e1000_i210.c 
b/drivers/net/ethernet/intel/igb/e1000_i210.c
index 65d9316..345bb19 100644
--- a/drivers/net/ethernet/intel/igb/e1000_i210.c
+++ b/drivers/net/ethernet/intel/igb/e1000_i210.c
@@ -154,7 +154,7 @@ s32 igb_acquire_swfw_sync_i210(struct e1000_hw *hw, u16 
mask)
 
                /* Firmware currently using resource (fwmask) */
                igb_put_hw_semaphore(hw);
-               mdelay(5);
+               usleep_range(5000, 6000);
                i++;
        }
 
diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.c 
b/drivers/net/ethernet/intel/igb/e1000_phy.c
index c1bb64d..c127d9b 100644
--- a/drivers/net/ethernet/intel/igb/e1000_phy.c
+++ b/drivers/net/ethernet/intel/igb/e1000_phy.c
@@ -1652,20 +1652,14 @@ s32 igb_phy_has_link(struct e1000_hw *hw, u32 
iterations,
                         * ownership of the resources, wait and try again to
                         * see if they have relinquished the resources yet.
                         */
-                       if (usec_interval >= 1000)
-                               mdelay(usec_interval/1000);
-                       else
-                               udelay(usec_interval);
+                       igb_sleep_usecs(usec_interval);
                }
                ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status);
                if (ret_val)
                        break;
                if (phy_status & MII_SR_LINK_STATUS)
                        break;
-               if (usec_interval >= 1000)
-                       mdelay(usec_interval/1000);
-               else
-                       udelay(usec_interval);
+               igb_sleep_usecs(usec_interval);
        }
 
        *success = (i < iterations) ? true : false;
diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.h 
b/drivers/net/ethernet/intel/igb/e1000_phy.h
index 7af4ffa..e80e129 100644
--- a/drivers/net/ethernet/intel/igb/e1000_phy.h
+++ b/drivers/net/ethernet/intel/igb/e1000_phy.h
@@ -73,6 +73,7 @@ s32  igb_get_cable_length_82580(struct e1000_hw *hw);
 s32  igb_read_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 *data);
 s32  igb_write_phy_reg_gs40g(struct e1000_hw *hw, u32 offset, u16 data);
 s32  igb_check_polarity_m88(struct e1000_hw *hw);
+void igb_sleep_usecs(u32 usecs);
 
 /* IGP01E1000 Specific Registers */
 #define IGP01E1000_PHY_PORT_CONFIG        0x10 /* Port Config */
diff --git a/drivers/net/ethernet/intel/igb/igb.h 
b/drivers/net/ethernet/intel/igb/igb.h
index 82d891e..d9b0902 100644
--- a/drivers/net/ethernet/intel/igb/igb.h
+++ b/drivers/net/ethernet/intel/igb/igb.h
@@ -531,6 +531,7 @@ void igb_ptp_rx_pktstamp(struct igb_q_vector *q_vector, 
unsigned char *va,
                         struct sk_buff *skb);
 int igb_ptp_set_ts_config(struct net_device *netdev, struct ifreq *ifr);
 int igb_ptp_get_ts_config(struct net_device *netdev, struct ifreq *ifr);
+void igb_sleep_usecs(u32 usecs);
 #ifdef CONFIG_IGB_HWMON
 void igb_sysfs_exit(struct igb_adapter *adapter);
 int igb_sysfs_init(struct igb_adapter *adapter);
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c 
b/drivers/net/ethernet/intel/igb/igb_ethtool.c
index 02cfd3b..bf524db 100644
--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
+++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
@@ -1645,7 +1645,7 @@ static int igb_integrated_phy_loopback(struct igb_adapter 
*adapter)
        if (hw->phy.type == e1000_phy_m88)
                igb_phy_disable_receiver(adapter);
 
-       mdelay(500);
+       msleep(500);
        return 0;
 }
 
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
index 3c02216..277797f 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -294,6 +294,16 @@ static const struct igb_reg_info igb_reg_info_tbl[] = {
        {}
 };
 
+void igb_sleep_usecs(u32 usecs)
+{
+       if (usecs > 10000)
+               msleep(usecs / 1000 + 1);
+       else if (usecs > 10)
+               usleep_range(usecs, 2 * usecs);
+       else
+               udelay(usecs);
+}
+
 /* igb_regdump - register printout routine */
 static void igb_regdump(struct e1000_hw *hw, struct igb_reg_info *reginfo)
 {
@@ -3267,7 +3277,7 @@ void igb_configure_tx_ring(struct igb_adapter *adapter,
        /* disable the queue */
        wr32(E1000_TXDCTL(reg_idx), 0);
        wrfl();
-       mdelay(10);
+       msleep(10);
 
        wr32(E1000_TDLEN(reg_idx),
             ring->count * sizeof(union e1000_adv_tx_desc));
-- 
2.1.3


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=164703151&iu=/4140/ostg.clktrk
_______________________________________________
E1000-devel mailing list
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel&#174; Ethernet, visit 
http://communities.intel.com/community/wired

Reply via email to