aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorAkeem G. Abodunrin <akeem.g.abodunrin@intel.com>2013-03-29 04:22:25 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-05-21 05:25:25 -0400
commitcf7ed221714c36848b257311b316452e274f7e15 (patch)
treec25231d0ddb720a4a32176d7bab2dfef9e86fccf /drivers/net
parent6c1d8b96d09ed8852f5bc11c42374be3232374ce (diff)
igb: Changed LEDs blink mechanism to include designs using cathode
This patch addresses the changes needed to make LEDs work properly with negative logic. This implementation uses LED Invert bit to reverse the logic issue that occurred when LEDs are driven by cathode. Keep LEDs blinking for SerDes devices. Also made changes to magic number and the for loop to reduce number of shifts. Signed-off-by: Akeem G Abodunrin <akeem.g.abodunrin@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_defines.h6
-rw-r--r--drivers/net/ethernet/intel/igb/e1000_mac.c37
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