atl1c_main.c: add wait_for_idle routine
Slight refactoring of duplicated wait for idle checks Spelling fix Signed-off-by: Joe Perches <joe@perches.com> Acked-by: jie.yang@atheros.com Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
56d417b12e
commit
c930a66220
1 changed files with 23 additions and 25 deletions
|
@ -163,6 +163,24 @@ static inline void atl1c_irq_reset(struct atl1c_adapter *adapter)
|
|||
atl1c_irq_enable(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
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue