aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2013-03-06 04:02:41 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-03-28 02:32:06 -0400
commit86a80eab8ced2454bae954b681797c692afe2ea2 (patch)
tree3adcd833547a770be612ff72050ec1cdc7de3b07
parent772d05c51c4f4896c120ad418b1e91144a2ac813 (diff)
e1000e: fix LED blink logic for designs with LEDs driven by cathode
When the LEDs are driven by cathode, the bit logic is reversed. Use the LED Invert bit to invert the logic. Cleanup use of a magic number and change the for loop increment to reduce the number of shifts. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/e1000e/mac.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/mac.c b/drivers/net/ethernet/intel/e1000e/mac.c
index b25cc4300de7..2480c1091873 100644
--- a/drivers/net/ethernet/intel/e1000e/mac.c
+++ b/drivers/net/ethernet/intel/e1000e/mac.c
@@ -1600,15 +1600,28 @@ s32 e1000e_blink_led_generic(struct e1000_hw *hw)
1600 ledctl_blink = E1000_LEDCTL_LED0_BLINK | 1600 ledctl_blink = E1000_LEDCTL_LED0_BLINK |
1601 (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT); 1601 (E1000_LEDCTL_MODE_LED_ON << E1000_LEDCTL_LED0_MODE_SHIFT);
1602 } else { 1602 } else {
1603 /* set the blink bit for each LED that's "on" (0x0E) 1603 /* Set the blink bit for each LED that's "on" (0x0E)
1604 * in ledctl_mode2 1604 * (or "off" if inverted) in ledctl_mode2. The blink
1605 * logic in hardware only works when mode is set to "on"
1606 * so it must be changed accordingly when the mode is
1607 * "off" and inverted.
1605 */ 1608 */
1606 ledctl_blink = hw->mac.ledctl_mode2; 1609 ledctl_blink = hw->mac.ledctl_mode2;
1607 for (i = 0; i < 4; i++) 1610 for (i = 0; i < 32; i += 8) {
1608 if (((hw->mac.ledctl_mode2 >> (i * 8)) & 0xFF) == 1611 u32 mode = (hw->mac.ledctl_mode2 >> i) &
1609 E1000_LEDCTL_MODE_LED_ON) 1612 E1000_LEDCTL_LED0_MODE_MASK;
1610 ledctl_blink |= (E1000_LEDCTL_LED0_BLINK << 1613 u32 led_default = hw->mac.ledctl_default >> i;
1611 (i * 8)); 1614
1615 if ((!(led_default & E1000_LEDCTL_LED0_IVRT) &&
1616 (mode == E1000_LEDCTL_MODE_LED_ON)) ||
1617 ((led_default & E1000_LEDCTL_LED0_IVRT) &&
1618 (mode == E1000_LEDCTL_MODE_LED_OFF))) {
1619 ledctl_blink &=
1620 ~(E1000_LEDCTL_LED0_MODE_MASK << i);
1621 ledctl_blink |= (E1000_LEDCTL_LED0_BLINK |
1622 E1000_LEDCTL_MODE_LED_ON) << i;
1623 }
1624 }
1612 } 1625 }
1613 1626
1614 ew32(LEDCTL, ledctl_blink); 1627 ew32(LEDCTL, ledctl_blink);