Commit 7ef5ed1c authored by Carolyn Wyborny's avatar Carolyn Wyborny Committed by Jeff Kirsher

igb: Add messaging for thermal sensor events on i350 devices

This feature adds messaging to the link status change to notify
the user if the device returned from a downshift or power off
event due to the Thermal Sensor feature in i350 parts. Feature
is only available on internal copper ports.
Signed-off-by: default avatarCarolyn Wyborny <carolyn.wyborny@intel.com>
Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 673b8b70
...@@ -51,6 +51,7 @@ ...@@ -51,6 +51,7 @@
#define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000 #define E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES 0x00C00000
#define E1000_CTRL_EXT_LINK_MODE_1000BASE_KX 0x00400000 #define E1000_CTRL_EXT_LINK_MODE_1000BASE_KX 0x00400000
#define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000 #define E1000_CTRL_EXT_LINK_MODE_SGMII 0x00800000
#define E1000_CTRL_EXT_LINK_MODE_GMII 0x00000000
#define E1000_CTRL_EXT_EIAME 0x01000000 #define E1000_CTRL_EXT_EIAME 0x01000000
#define E1000_CTRL_EXT_IRCA 0x00000001 #define E1000_CTRL_EXT_IRCA 0x00000001
/* Interrupt delay cancellation */ /* Interrupt delay cancellation */
...@@ -788,6 +789,10 @@ ...@@ -788,6 +789,10 @@
#define E1000_MDIC_ERROR 0x40000000 #define E1000_MDIC_ERROR 0x40000000
#define E1000_MDIC_DEST 0x80000000 #define E1000_MDIC_DEST 0x80000000
/* Thermal Sensor */
#define E1000_THSTAT_PWR_DOWN 0x00000001 /* Power Down Event */
#define E1000_THSTAT_LINK_THROTTLE 0x00000002 /* Link Speed Throttle Event */
/* Energy Efficient Ethernet */ /* Energy Efficient Ethernet */
#define E1000_IPCNFG_EEE_1G_AN 0x00000008 /* EEE Enable 1G AN */ #define E1000_IPCNFG_EEE_1G_AN 0x00000008 /* EEE Enable 1G AN */
#define E1000_IPCNFG_EEE_100M_AN 0x00000004 /* EEE Enable 100M AN */ #define E1000_IPCNFG_EEE_100M_AN 0x00000004 /* EEE Enable 100M AN */
......
...@@ -342,6 +342,9 @@ ...@@ -342,6 +342,9 @@
#define E1000_IPCNFG 0x0E38 /* Internal PHY Configuration */ #define E1000_IPCNFG 0x0E38 /* Internal PHY Configuration */
#define E1000_EEER 0x0E30 /* Energy Efficient Ethernet */ #define E1000_EEER 0x0E30 /* Energy Efficient Ethernet */
/* Thermal Sensor Register */
#define E1000_THSTAT 0x08110 /* Thermal Sensor Status */
/* OS2BMC Registers */ /* OS2BMC Registers */
#define E1000_B2OSPC 0x08FE0 /* BMC2OS packets sent by BMC */ #define E1000_B2OSPC 0x08FE0 /* BMC2OS packets sent by BMC */
#define E1000_B2OGPRC 0x04158 /* BMC2OS packets received by host */ #define E1000_B2OGPRC 0x04158 /* BMC2OS packets received by host */
......
...@@ -3550,7 +3550,7 @@ static void igb_watchdog_task(struct work_struct *work) ...@@ -3550,7 +3550,7 @@ static void igb_watchdog_task(struct work_struct *work)
watchdog_task); watchdog_task);
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
struct net_device *netdev = adapter->netdev; struct net_device *netdev = adapter->netdev;
u32 link; u32 link, ctrl_ext, thstat;
int i; int i;
link = igb_has_link(adapter); link = igb_has_link(adapter);
...@@ -3574,6 +3574,25 @@ static void igb_watchdog_task(struct work_struct *work) ...@@ -3574,6 +3574,25 @@ static void igb_watchdog_task(struct work_struct *work)
((ctrl & E1000_CTRL_RFCE) ? "RX" : ((ctrl & E1000_CTRL_RFCE) ? "RX" :
((ctrl & E1000_CTRL_TFCE) ? "TX" : "None"))); ((ctrl & E1000_CTRL_TFCE) ? "TX" : "None")));
/* check for thermal sensor event on i350,
* copper only */
if (hw->mac.type == e1000_i350) {
thstat = rd32(E1000_THSTAT);
ctrl_ext = rd32(E1000_CTRL_EXT);
if ((hw->phy.media_type ==
e1000_media_type_copper) && !(ctrl_ext &
E1000_CTRL_EXT_LINK_MODE_SGMII)) {
if (thstat &
E1000_THSTAT_LINK_THROTTLE) {
printk(KERN_INFO "igb: %s The "
"network adapter link "
"speed was downshifted "
"because it "
"overheated.\n",
netdev->name);
}
}
}
/* adjust timeout factor according to speed/duplex */ /* adjust timeout factor according to speed/duplex */
adapter->tx_timeout_factor = 1; adapter->tx_timeout_factor = 1;
switch (adapter->link_speed) { switch (adapter->link_speed) {
...@@ -3599,6 +3618,22 @@ static void igb_watchdog_task(struct work_struct *work) ...@@ -3599,6 +3618,22 @@ static void igb_watchdog_task(struct work_struct *work)
if (netif_carrier_ok(netdev)) { if (netif_carrier_ok(netdev)) {
adapter->link_speed = 0; adapter->link_speed = 0;
adapter->link_duplex = 0; adapter->link_duplex = 0;
/* check for thermal sensor event on i350
* copper only*/
if (hw->mac.type == e1000_i350) {
thstat = rd32(E1000_THSTAT);
ctrl_ext = rd32(E1000_CTRL_EXT);
if ((hw->phy.media_type ==
e1000_media_type_copper) && !(ctrl_ext &
E1000_CTRL_EXT_LINK_MODE_SGMII)) {
if (thstat & E1000_THSTAT_PWR_DOWN) {
printk(KERN_ERR "igb: %s The "
"network adapter was stopped "
"because it overheated.\n",
netdev->name);
}
}
}
/* Links status message must follow this format */ /* Links status message must follow this format */
printk(KERN_INFO "igb: %s NIC Link is Down\n", printk(KERN_INFO "igb: %s NIC Link is Down\n",
netdev->name); netdev->name);
......
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