]> Pileus Git - ~andy/linux/commitdiff
ixgbe add thermal sensor support for x540 hardware
authorJacob Keller <jacob.e.keller@intel.com>
Sat, 20 Aug 2011 04:49:45 +0000 (04:49 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 29 Sep 2011 06:10:26 +0000 (23:10 -0700)
Add code to enable thermal sensors for the x540 hardware, as well as a
thermal interrupt check which will exit with a critical message of a
thermal overheat is detected. Intent of code allows other mac types to
be added with different configuration in the future.

Fixed in this version is the addition of setting the temp_sensor
capable flag which was previously only set for a specific mac.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h

index ba703d30f3a956b75f0936690a18efcf7fa7faad..79636eaeb74d160285d5d9f89f09ece0f2304a61 100644 (file)
@@ -1751,6 +1751,39 @@ static void ixgbe_check_fan_failure(struct ixgbe_adapter *adapter, u32 eicr)
        }
 }
 
+static void ixgbe_check_overtemp_event(struct ixgbe_adapter *adapter, u32 eicr)
+{
+       if (!(adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE))
+               return;
+
+       switch (adapter->hw.mac.type) {
+       case ixgbe_mac_82599EB:
+               /*
+                * Need to check link state so complete overtemp check
+                * on service task
+                */
+               if (((eicr & IXGBE_EICR_GPI_SDP0) || (eicr & IXGBE_EICR_LSC)) &&
+                   (!test_bit(__IXGBE_DOWN, &adapter->state))) {
+                       adapter->interrupt_event = eicr;
+                       adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_EVENT;
+                       ixgbe_service_event_schedule(adapter);
+                       return;
+               }
+               return;
+       case ixgbe_mac_X540:
+               if (!(eicr & IXGBE_EICR_TS))
+                       return;
+               break;
+       default:
+               return;
+       }
+
+       e_crit(drv,
+              "Network adapter has been stopped because it has over heated. "
+              "Restart the computer. If the problem persists, "
+              "power off the system and replace the adapter\n");
+}
+
 static void ixgbe_check_sfp_event(struct ixgbe_adapter *adapter, u32 eicr)
 {
        struct ixgbe_hw *hw = &adapter->hw;
@@ -1854,7 +1887,16 @@ static inline void ixgbe_irq_enable(struct ixgbe_adapter *adapter, bool queues,
                mask &= ~IXGBE_EIMS_LSC;
 
        if (adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE)
-               mask |= IXGBE_EIMS_GPI_SDP0;
+               switch (adapter->hw.mac.type) {
+               case ixgbe_mac_82599EB:
+                       mask |= IXGBE_EIMS_GPI_SDP0;
+                       break;
+               case ixgbe_mac_X540:
+                       mask |= IXGBE_EIMS_TS;
+                       break;
+               default:
+                       break;
+               }
        if (adapter->flags & IXGBE_FLAG_FAN_FAIL_CAPABLE)
                mask |= IXGBE_EIMS_GPI_SDP1;
        switch (adapter->hw.mac.type) {
@@ -1924,14 +1966,7 @@ static irqreturn_t ixgbe_msix_other(int irq, void *data)
                        }
                }
                ixgbe_check_sfp_event(adapter, eicr);
-               if ((adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE) &&
-                   ((eicr & IXGBE_EICR_GPI_SDP0) || (eicr & IXGBE_EICR_LSC))) {
-                       if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
-                               adapter->interrupt_event = eicr;
-                               adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_EVENT;
-                               ixgbe_service_event_schedule(adapter);
-                       }
-               }
+               ixgbe_check_overtemp_event(adapter, eicr);
                break;
        default:
                break;
@@ -2140,15 +2175,9 @@ static irqreturn_t ixgbe_intr(int irq, void *data)
 
        switch (hw->mac.type) {
        case ixgbe_mac_82599EB:
+       case ixgbe_mac_X540:
                ixgbe_check_sfp_event(adapter, eicr);
-               if ((adapter->flags2 & IXGBE_FLAG2_TEMP_SENSOR_CAPABLE) &&
-                   ((eicr & IXGBE_EICR_GPI_SDP0) || (eicr & IXGBE_EICR_LSC))) {
-                       if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
-                               adapter->interrupt_event = eicr;
-                               adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_EVENT;
-                               ixgbe_service_event_schedule(adapter);
-                       }
-               }
+               ixgbe_check_overtemp_event(adapter, eicr);
                break;
        default:
                break;
@@ -4913,8 +4942,9 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
                        adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE;
                adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82598;
                break;
-       case ixgbe_mac_82599EB:
        case ixgbe_mac_X540:
+               adapter->flags2 |= IXGBE_FLAG2_TEMP_SENSOR_CAPABLE;
+       case ixgbe_mac_82599EB:
                adapter->max_msix_q_vectors = MAX_MSIX_Q_VECTORS_82599;
                adapter->flags2 |= IXGBE_FLAG2_RSC_CAPABLE;
                adapter->flags2 |= IXGBE_FLAG2_RSC_ENABLED;
index 16dd461d4af3c86eb851ed186930fc069ed8385a..838847cd8c6a7853e70b149d631bd1b6bb83b26e 100644 (file)
@@ -1280,6 +1280,7 @@ enum {
 #define IXGBE_EICR_LSC          0x00100000 /* Link Status Change */
 #define IXGBE_EICR_LINKSEC      0x00200000 /* PN Threshold */
 #define IXGBE_EICR_MNG          0x00400000 /* Manageability Event Interrupt */
+#define IXGBE_EICR_TS           0x00800000 /* Thermal Sensor Event */
 #define IXGBE_EICR_GPI_SDP0     0x01000000 /* Gen Purpose Interrupt on SDP0 */
 #define IXGBE_EICR_GPI_SDP1     0x02000000 /* Gen Purpose Interrupt on SDP1 */
 #define IXGBE_EICR_GPI_SDP2     0x04000000 /* Gen Purpose Interrupt on SDP2 */
@@ -1314,6 +1315,7 @@ enum {
 #define IXGBE_EIMS_MAILBOX      IXGBE_EICR_MAILBOX   /* VF to PF Mailbox Int */
 #define IXGBE_EIMS_LSC          IXGBE_EICR_LSC       /* Link Status Change */
 #define IXGBE_EIMS_MNG          IXGBE_EICR_MNG       /* MNG Event Interrupt */
+#define IXGBE_EIMS_TS           IXGBE_EICR_TS        /* Thermel Sensor Event */
 #define IXGBE_EIMS_GPI_SDP0     IXGBE_EICR_GPI_SDP0  /* SDP0 Gen Purpose Int */
 #define IXGBE_EIMS_GPI_SDP1     IXGBE_EICR_GPI_SDP1  /* SDP1 Gen Purpose Int */
 #define IXGBE_EIMS_GPI_SDP2     IXGBE_EICR_GPI_SDP2  /* SDP2 Gen Purpose Int */