diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_defines.h | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/e1000_mac.c | 37 |
2 files changed, 32 insertions, 11 deletions
diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h index 31a0f82cc650..aa176490ddbc 100644 --- a/drivers/net/ethernet/intel/igb/e1000_defines.h +++ b/drivers/net/ethernet/intel/igb/e1000_defines.h | |||
@@ -270,8 +270,10 @@ | |||
270 | #define AUTONEG_ADVERTISE_SPEED_DEFAULT E1000_ALL_SPEED_DUPLEX | 270 | #define AUTONEG_ADVERTISE_SPEED_DEFAULT E1000_ALL_SPEED_DUPLEX |
271 | 271 | ||
272 | /* LED Control */ | 272 | /* LED Control */ |
273 | #define E1000_LEDCTL_LED0_MODE_SHIFT 0 | 273 | #define E1000_LEDCTL_LED0_MODE_SHIFT 0 |
274 | #define E1000_LEDCTL_LED0_BLINK 0x00000080 | 274 | #define E1000_LEDCTL_LED0_BLINK 0x00000080 |
275 | #define E1000_LEDCTL_LED0_MODE_MASK 0x0000000F | ||
276 | #define E1000_LEDCTL_LED0_IVRT 0x00000040 | ||
275 | 277 | ||
276 | #define E1000_LEDCTL_MODE_LED_ON 0xE | 278 | #define E1000_LEDCTL_MODE_LED_ON 0xE |
277 | #define E1000_LEDCTL_MODE_LED_OFF 0xF | 279 | #define E1000_LEDCTL_MODE_LED_OFF 0xF |
diff --git a/drivers/net/ethernet/intel/igb/e1000_mac.c b/drivers/net/ethernet/intel/igb/e1000_mac.c index 2559d70a2321..660b7addfbb0 100644 --- a/drivers/net/ethernet/intel/igb/e1000_mac.c +++ b/drivers/net/ethernet/intel/igb/e1000_mac.c | |||
@@ -1406,15 +1406,34 @@ s32 igb_blink_led(struct e1000_hw *hw) | |||
1406 | u32 ledctl_blink = 0; | 1406 | u32 ledctl_blink = 0; |
1407 | u32 i; | 1407 | u32 i; |
1408 | 1408 | ||
1409 | /* set the blink bit for each LED that's "on" (0x0E) | 1409 | if (hw->phy.media_type == e1000_media_type_fiber) { |
1410 | * in ledctl_mode2 | 1410 | /* always blink LED0 for PCI-E fiber */ |
1411 | */ | 1411 | ledctl_blink = E1000_LEDCTL_LED0_BLINK | |
1412 | ledctl_blink = hw->mac.ledctl_mode2; | 1412 | (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); |
1413 | for (i = 0; i < 4; i++) | 1413 | } else { |
1414 | if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == | 1414 | /* Set the blink bit for each LED that's "on" (0x0E) |
1415 | E1000_LEDCTL_MODE_LED_ON) | 1415 | * (or "off" if inverted) in ledctl_mode2. The blink |
1416 | ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << | 1416 | * logic in hardware only works when mode is set to "on" |
1417 | (i * 8)); | 1417 | * so it must be changed accordingly when the mode is |
1418 | * "off" and inverted. | ||
1419 | */ | ||
1420 | ledctl_blink = hw->mac.ledctl_mode2; | ||
1421 | for (i = 0; i < 32; i += 8) { | ||
1422 | u32 mode = (hw->mac.ledctl_mode2 >> i) & | ||
1423 | E1000_LEDCTL_LED0_MODE_MASK; | ||
1424 | u32 led_default = hw->mac.ledctl_default >> i; | ||
1425 | |||
1426 | if ((!(led_default & E1000_LEDCTL_LED0_IVRT) && | ||
1427 | (mode == E1000_LEDCTL_MODE_LED_ON)) || | ||
1428 | ((led_default & E1000_LEDCTL_LED0_IVRT) && | ||
1429 | (mode == E1000_LEDCTL_MODE_LED_OFF))) { | ||
1430 | ledctl_blink &= | ||
1431 | ~(E1000_LEDCTL_LED0_MODE_MASK << i); | ||
1432 | ledctl_blink |= (E1000_LEDCTL_LED0_BLINK | | ||
1433 | E1000_LEDCTL_MODE_LED_ON) << i; | ||
1434 | } | ||
1435 | } | ||
1436 | } | ||
1418 | 1437 | ||
1419 | wr32(E1000_LEDCTL, ledctl_blink); | 1438 | wr32(E1000_LEDCTL, ledctl_blink); |
1420 | 1439 | ||