#define BNXT_FW_CAP_RING_MONITOR                BIT_ULL(30)
        #define BNXT_FW_CAP_DBG_QCAPS                   BIT_ULL(31)
        #define BNXT_FW_CAP_PTP                         BIT_ULL(32)
+       #define BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED    BIT_ULL(33)
 
        u32                     fw_dbg_cap;
 
        struct bnxt_tc_info     *tc_info;
        struct list_head        tc_indr_block_list;
        struct dentry           *debugfs_pdev;
+#ifdef CONFIG_BNXT_HWMON
        struct device           *hwmon_dev;
+       u8                      warn_thresh_temp;
+       u8                      crit_thresh_temp;
+       u8                      fatal_thresh_temp;
+       u8                      shutdown_thresh_temp;
+#endif
        enum board_idx          board_idx;
 };
 
 
        if (rc)
                goto drop_req;
 
-       *temp = resp->temp;
-
+       if (temp) {
+               *temp = resp->temp;
+       } else if (resp->flags &
+                  TEMP_MONITOR_QUERY_RESP_FLAGS_THRESHOLD_VALUES_AVAILABLE) {
+               bp->fw_cap |= BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED;
+               bp->warn_thresh_temp = resp->warn_threshold;
+               bp->crit_thresh_temp = resp->critical_threshold;
+               bp->fatal_thresh_temp = resp->fatal_threshold;
+               bp->shutdown_thresh_temp = resp->shutdown_threshold;
+       }
 drop_req:
        hwrm_req_drop(bp, req);
        return rc;
 static umode_t bnxt_hwmon_is_visible(const void *_data, enum hwmon_sensor_types type,
                                     u32 attr, int channel)
 {
+       const struct bnxt *bp = _data;
+
        if (type != hwmon_temp)
                return 0;
 
        switch (attr) {
        case hwmon_temp_input:
                return 0444;
+       case hwmon_temp_max:
+       case hwmon_temp_crit:
+       case hwmon_temp_emergency:
+       case hwmon_temp_max_alarm:
+       case hwmon_temp_crit_alarm:
+       case hwmon_temp_emergency_alarm:
+               if (!(bp->fw_cap & BNXT_FW_CAP_THRESHOLD_TEMP_SUPPORTED))
+                       return 0;
+               return 0444;
        default:
                return 0;
        }
                if (!rc)
                        *val = temp * 1000;
                return rc;
+       case hwmon_temp_max:
+               *val = bp->warn_thresh_temp * 1000;
+               return 0;
+       case hwmon_temp_crit:
+               *val = bp->crit_thresh_temp * 1000;
+               return 0;
+       case hwmon_temp_emergency:
+               *val = bp->fatal_thresh_temp * 1000;
+               return 0;
+       case hwmon_temp_max_alarm:
+               rc = bnxt_hwrm_temp_query(bp, &temp);
+               if (!rc)
+                       *val = temp >= bp->warn_thresh_temp;
+               return rc;
+       case hwmon_temp_crit_alarm:
+               rc = bnxt_hwrm_temp_query(bp, &temp);
+               if (!rc)
+                       *val = temp >= bp->crit_thresh_temp;
+               return rc;
+       case hwmon_temp_emergency_alarm:
+               rc = bnxt_hwrm_temp_query(bp, &temp);
+               if (!rc)
+                       *val = temp >= bp->fatal_thresh_temp;
+               return rc;
        default:
                return -EOPNOTSUPP;
        }
 }
 
 static const struct hwmon_channel_info *bnxt_hwmon_info[] = {
-       HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT),
+       HWMON_CHANNEL_INFO(temp, HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT |
+                          HWMON_T_EMERGENCY | HWMON_T_MAX_ALARM |
+                          HWMON_T_CRIT_ALARM | HWMON_T_EMERGENCY_ALARM),
        NULL
 };
 
 
 void bnxt_hwmon_init(struct bnxt *bp)
 {
-       struct hwrm_temp_monitor_query_input *req;
        struct pci_dev *pdev = bp->pdev;
        int rc;
 
-       rc = hwrm_req_init(bp, req, HWRM_TEMP_MONITOR_QUERY);
-       if (!rc)
-               rc = hwrm_req_send_silent(bp, req);
+       /* temp1_xxx is only sensor, ensure not registered if it will fail */
+       rc = bnxt_hwrm_temp_query(bp, NULL);
        if (rc == -EACCES || rc == -EOPNOTSUPP) {
                bnxt_hwmon_uninit(bp);
                return;