diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/mac.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/mac.c | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/mac.c b/drivers/net/ethernet/intel/e1000e/mac.c index b78e0217460..2480c109187 100644 --- a/drivers/net/ethernet/intel/e1000e/mac.c +++ b/drivers/net/ethernet/intel/e1000e/mac.c @@ -596,7 +596,7 @@ s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)  		 * serdes media type.  		 */  		/* SYNCH bit and IV bit are sticky. */ -		udelay(10); +		usleep_range(10, 20);  		rxcw = er32(RXCW);  		if (rxcw & E1000_RXCW_SYNCH) {  			if (!(rxcw & E1000_RXCW_IV)) { @@ -613,7 +613,7 @@ s32 e1000e_check_for_serdes_link(struct e1000_hw *hw)  		status = er32(STATUS);  		if (status & E1000_STATUS_LU) {  			/* SYNCH bit and IV bit are sticky, so reread rxcw. */ -			udelay(10); +			usleep_range(10, 20);  			rxcw = er32(RXCW);  			if (rxcw & E1000_RXCW_SYNCH) {  				if (!(rxcw & E1000_RXCW_IV)) { @@ -1382,7 +1382,7 @@ s32 e1000e_get_hw_semaphore(struct e1000_hw *hw)  		if (!(swsm & E1000_SWSM_SMBI))  			break; -		udelay(50); +		usleep_range(50, 100);  		i++;  	} @@ -1400,7 +1400,7 @@ s32 e1000e_get_hw_semaphore(struct e1000_hw *hw)  		if (er32(SWSM) & E1000_SWSM_SWESMBI)  			break; -		udelay(50); +		usleep_range(50, 100);  	}  	if (i == timeout) { @@ -1600,15 +1600,28 @@ s32 e1000e_blink_led_generic(struct e1000_hw *hw)  		ledctl_blink = E1000_LEDCTL_LED0_BLINK |  		    (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);  	} else { -		/* set the blink bit for each LED that's "on" (0x0E) -		 * in ledctl_mode2 +		/* Set the blink bit for each LED that's "on" (0x0E) +		 * (or "off" if inverted) in ledctl_mode2.  The blink +		 * logic in hardware only works when mode is set to "on" +		 * so it must be changed accordingly when the mode is +		 * "off" and inverted.  		 */  		ledctl_blink = hw->mac.ledctl_mode2; -		for (i = 0; i < 4; i++) -			if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == -			    E1000_LEDCTL_MODE_LED_ON) -				ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << -						 (i * 8)); +		for (i = 0; i < 32; i += 8) { +			u32 mode = (hw->mac.ledctl_mode2 >> i) & +			    E1000_LEDCTL_LED0_MODE_MASK; +			u32 led_default = hw->mac.ledctl_default >> i; + +			if ((!(led_default & E1000_LEDCTL_LED0_IVRT) && +			     (mode == E1000_LEDCTL_MODE_LED_ON)) || +			    ((led_default & E1000_LEDCTL_LED0_IVRT) && +			     (mode == E1000_LEDCTL_MODE_LED_OFF))) { +				ledctl_blink &= +				    ~(E1000_LEDCTL_LED0_MODE_MASK << i); +				ledctl_blink |= (E1000_LEDCTL_LED0_BLINK | +						 E1000_LEDCTL_MODE_LED_ON) << i; +			} +		}  	}  	ew32(LEDCTL, ledctl_blink); @@ -1712,7 +1725,7 @@ s32 e1000e_disable_pcie_master(struct e1000_hw *hw)  	while (timeout) {  		if (!(er32(STATUS) & E1000_STATUS_GIO_MASTER_ENABLE))  			break; -		udelay(100); +		usleep_range(100, 200);  		timeout--;  	}  |