Commit 805cedd6 authored by Don Skidmore's avatar Don Skidmore Committed by Jeff Kirsher

ixgbe: Add support to retrieve and store LED link active

This patch adds support to get the LED link active via the LEDCTL
register.  If the LEDCTL register does not have LED link active
(LED mode field = 0x0100) set then default LED link active returned.
Signed-off-by: default avatarDon Skidmore <donald.c.skidmore@intel.com>
Tested-by: default avatarKrishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 0c1b7de4
...@@ -1179,6 +1179,7 @@ static const struct ixgbe_mac_operations mac_ops_82598 = { ...@@ -1179,6 +1179,7 @@ static const struct ixgbe_mac_operations mac_ops_82598 = {
.get_link_capabilities = &ixgbe_get_link_capabilities_82598, .get_link_capabilities = &ixgbe_get_link_capabilities_82598,
.led_on = &ixgbe_led_on_generic, .led_on = &ixgbe_led_on_generic,
.led_off = &ixgbe_led_off_generic, .led_off = &ixgbe_led_off_generic,
.init_led_link_act = ixgbe_init_led_link_act_generic,
.blink_led_start = &ixgbe_blink_led_start_generic, .blink_led_start = &ixgbe_blink_led_start_generic,
.blink_led_stop = &ixgbe_blink_led_stop_generic, .blink_led_stop = &ixgbe_blink_led_stop_generic,
.set_rar = &ixgbe_set_rar_generic, .set_rar = &ixgbe_set_rar_generic,
......
...@@ -2204,6 +2204,7 @@ static const struct ixgbe_mac_operations mac_ops_82599 = { ...@@ -2204,6 +2204,7 @@ static const struct ixgbe_mac_operations mac_ops_82599 = {
.get_link_capabilities = &ixgbe_get_link_capabilities_82599, .get_link_capabilities = &ixgbe_get_link_capabilities_82599,
.led_on = &ixgbe_led_on_generic, .led_on = &ixgbe_led_on_generic,
.led_off = &ixgbe_led_off_generic, .led_off = &ixgbe_led_off_generic,
.init_led_link_act = ixgbe_init_led_link_act_generic,
.blink_led_start = &ixgbe_blink_led_start_generic, .blink_led_start = &ixgbe_blink_led_start_generic,
.blink_led_stop = &ixgbe_blink_led_stop_generic, .blink_led_stop = &ixgbe_blink_led_stop_generic,
.set_rar = &ixgbe_set_rar_generic, .set_rar = &ixgbe_set_rar_generic,
......
...@@ -390,6 +390,9 @@ s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw) ...@@ -390,6 +390,9 @@ s32 ixgbe_init_hw_generic(struct ixgbe_hw *hw)
status = hw->mac.ops.start_hw(hw); status = hw->mac.ops.start_hw(hw);
} }
/* Initialize the LED link active for LED blink support */
hw->mac.ops.init_led_link_act(hw);
return status; return status;
} }
...@@ -772,6 +775,49 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw) ...@@ -772,6 +775,49 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw)
return ixgbe_disable_pcie_master(hw); return ixgbe_disable_pcie_master(hw);
} }
/**
* ixgbe_init_led_link_act_generic - Store the LED index link/activity.
* @hw: pointer to hardware structure
*
* Store the index for the link active LED. This will be used to support
* blinking the LED.
**/
s32 ixgbe_init_led_link_act_generic(struct ixgbe_hw *hw)
{
struct ixgbe_mac_info *mac = &hw->mac;
u32 led_reg, led_mode;
u16 i;
led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
/* Get LED link active from the LEDCTL register */
for (i = 0; i < 4; i++) {
led_mode = led_reg >> IXGBE_LED_MODE_SHIFT(i);
if ((led_mode & IXGBE_LED_MODE_MASK_BASE) ==
IXGBE_LED_LINK_ACTIVE) {
mac->led_link_act = i;
return 0;
}
}
/* If LEDCTL register does not have the LED link active set, then use
* known MAC defaults.
*/
switch (hw->mac.type) {
case ixgbe_mac_x550em_a:
mac->led_link_act = 0;
break;
case ixgbe_mac_X550EM_x:
mac->led_link_act = 1;
break;
default:
mac->led_link_act = 2;
}
return 0;
}
/** /**
* ixgbe_led_on_generic - Turns on the software controllable LEDs. * ixgbe_led_on_generic - Turns on the software controllable LEDs.
* @hw: pointer to hardware structure * @hw: pointer to hardware structure
......
...@@ -49,6 +49,7 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw); ...@@ -49,6 +49,7 @@ s32 ixgbe_stop_adapter_generic(struct ixgbe_hw *hw);
s32 ixgbe_led_on_generic(struct ixgbe_hw *hw, u32 index); s32 ixgbe_led_on_generic(struct ixgbe_hw *hw, u32 index);
s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index); s32 ixgbe_led_off_generic(struct ixgbe_hw *hw, u32 index);
s32 ixgbe_init_led_link_act_generic(struct ixgbe_hw *hw);
s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw); s32 ixgbe_init_eeprom_params_generic(struct ixgbe_hw *hw);
s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data); s32 ixgbe_write_eeprom_generic(struct ixgbe_hw *hw, u16 offset, u16 data);
......
...@@ -2225,11 +2225,11 @@ static int ixgbe_set_phys_id(struct net_device *netdev, ...@@ -2225,11 +2225,11 @@ static int ixgbe_set_phys_id(struct net_device *netdev,
return 2; return 2;
case ETHTOOL_ID_ON: case ETHTOOL_ID_ON:
hw->mac.ops.led_on(hw, hw->bus.func); hw->mac.ops.led_on(hw, hw->mac.led_link_act);
break; break;
case ETHTOOL_ID_OFF: case ETHTOOL_ID_OFF:
hw->mac.ops.led_off(hw, hw->bus.func); hw->mac.ops.led_off(hw, hw->mac.led_link_act);
break; break;
case ETHTOOL_ID_INACTIVE: case ETHTOOL_ID_INACTIVE:
......
...@@ -3352,6 +3352,7 @@ struct ixgbe_mac_operations { ...@@ -3352,6 +3352,7 @@ struct ixgbe_mac_operations {
s32 (*led_off)(struct ixgbe_hw *, u32); s32 (*led_off)(struct ixgbe_hw *, u32);
s32 (*blink_led_start)(struct ixgbe_hw *, u32); s32 (*blink_led_start)(struct ixgbe_hw *, u32);
s32 (*blink_led_stop)(struct ixgbe_hw *, u32); s32 (*blink_led_stop)(struct ixgbe_hw *, u32);
s32 (*init_led_link_act)(struct ixgbe_hw *);
/* RAR, Multicast, VLAN */ /* RAR, Multicast, VLAN */
s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32, u32); s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32, u32);
...@@ -3462,6 +3463,7 @@ struct ixgbe_mac_info { ...@@ -3462,6 +3463,7 @@ struct ixgbe_mac_info {
u8 san_mac_rar_index; u8 san_mac_rar_index;
struct ixgbe_thermal_sensor_data thermal_sensor_data; struct ixgbe_thermal_sensor_data thermal_sensor_data;
bool set_lben; bool set_lben;
u8 led_link_act;
}; };
struct ixgbe_phy_info { struct ixgbe_phy_info {
......
...@@ -851,6 +851,7 @@ static const struct ixgbe_mac_operations mac_ops_X540 = { ...@@ -851,6 +851,7 @@ static const struct ixgbe_mac_operations mac_ops_X540 = {
.get_link_capabilities = &ixgbe_get_copper_link_capabilities_generic, .get_link_capabilities = &ixgbe_get_copper_link_capabilities_generic,
.led_on = &ixgbe_led_on_generic, .led_on = &ixgbe_led_on_generic,
.led_off = &ixgbe_led_off_generic, .led_off = &ixgbe_led_off_generic,
.init_led_link_act = ixgbe_init_led_link_act_generic,
.blink_led_start = &ixgbe_blink_led_start_X540, .blink_led_start = &ixgbe_blink_led_start_X540,
.blink_led_stop = &ixgbe_blink_led_stop_X540, .blink_led_stop = &ixgbe_blink_led_stop_X540,
.set_rar = &ixgbe_set_rar_generic, .set_rar = &ixgbe_set_rar_generic,
......
...@@ -2952,6 +2952,7 @@ static const struct ixgbe_mac_operations mac_ops_X550 = { ...@@ -2952,6 +2952,7 @@ static const struct ixgbe_mac_operations mac_ops_X550 = {
X550_COMMON_MAC X550_COMMON_MAC
.led_on = ixgbe_led_on_generic, .led_on = ixgbe_led_on_generic,
.led_off = ixgbe_led_off_generic, .led_off = ixgbe_led_off_generic,
.init_led_link_act = ixgbe_init_led_link_act_generic,
.reset_hw = &ixgbe_reset_hw_X540, .reset_hw = &ixgbe_reset_hw_X540,
.get_media_type = &ixgbe_get_media_type_X540, .get_media_type = &ixgbe_get_media_type_X540,
.get_san_mac_addr = &ixgbe_get_san_mac_addr_generic, .get_san_mac_addr = &ixgbe_get_san_mac_addr_generic,
...@@ -2972,6 +2973,7 @@ static const struct ixgbe_mac_operations mac_ops_X550EM_x = { ...@@ -2972,6 +2973,7 @@ static const struct ixgbe_mac_operations mac_ops_X550EM_x = {
X550_COMMON_MAC X550_COMMON_MAC
.led_on = ixgbe_led_on_t_x550em, .led_on = ixgbe_led_on_t_x550em,
.led_off = ixgbe_led_off_t_x550em, .led_off = ixgbe_led_off_t_x550em,
.init_led_link_act = ixgbe_init_led_link_act_generic,
.reset_hw = &ixgbe_reset_hw_X550em, .reset_hw = &ixgbe_reset_hw_X550em,
.get_media_type = &ixgbe_get_media_type_X550em, .get_media_type = &ixgbe_get_media_type_X550em,
.get_san_mac_addr = NULL, .get_san_mac_addr = NULL,
...@@ -2992,6 +2994,7 @@ static struct ixgbe_mac_operations mac_ops_x550em_a = { ...@@ -2992,6 +2994,7 @@ static struct ixgbe_mac_operations mac_ops_x550em_a = {
X550_COMMON_MAC X550_COMMON_MAC
.led_on = ixgbe_led_on_t_x550em, .led_on = ixgbe_led_on_t_x550em,
.led_off = ixgbe_led_off_t_x550em, .led_off = ixgbe_led_off_t_x550em,
.init_led_link_act = ixgbe_init_led_link_act_generic,
.reset_hw = ixgbe_reset_hw_X550em, .reset_hw = ixgbe_reset_hw_X550em,
.get_media_type = ixgbe_get_media_type_X550em, .get_media_type = ixgbe_get_media_type_X550em,
.get_san_mac_addr = NULL, .get_san_mac_addr = NULL,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment