diff options
author | Sreekanth Reddy <sreekanth.reddy@avagotech.com> | 2015-01-12 01:08:56 -0500 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2015-01-13 10:27:23 -0500 |
commit | 2d8ce8c9d4b25b88eb4aa6bc52492eb7e0ae1dab (patch) | |
tree | c452e3daa9cd66844d5141a4025b769b16392c80 /drivers/scsi | |
parent | cb16ef384f15d33a53b4db47878aa818be059d77 (diff) |
mpt2sas, mpt3sas: log exceeded temperature thresholds
This patch will log a message when driver receives "Temperature Threshold
exceeded" event from any temperature sensor.
The message will look similar to like:
mpt3sas0: Temperature Threshold flags a b c d exceeded for Sensor: x !!!
mpt3sas0: Current Temp In Celsius: y
where a b c d are threshold flags 0 1 2 3
Change_set:
1. Get the number of sensor count of this IOC by reading IO Unit page 8 at
driver initialization time.
2. Also unmask the Temperature Threshold Event at driver initialization
time
3. Whenever a MPI2_EVENT_TEMP_THRESHOLD event is received from the
firmware, then print the sensor number, the maximum threshold number it
has exceed and the current temperature of this sensor.
Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@avagotech.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.c | 7 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_base.h | 6 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_config.c | 36 | ||||
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 31 | ||||
-rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_base.c | 8 | ||||
-rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_base.h | 6 | ||||
-rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_config.c | 36 | ||||
-rw-r--r-- | drivers/scsi/mpt3sas/mpt3sas_scsih.c | 31 |
8 files changed, 161 insertions, 0 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 3fb01d1883c6..14ebb54fae33 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
@@ -639,6 +639,9 @@ _base_display_event_data(struct MPT2SAS_ADAPTER *ioc, | |||
639 | if (!ioc->hide_ir_msg) | 639 | if (!ioc->hide_ir_msg) |
640 | desc = "Log Entry Added"; | 640 | desc = "Log Entry Added"; |
641 | break; | 641 | break; |
642 | case MPI2_EVENT_TEMP_THRESHOLD: | ||
643 | desc = "Temperature Threshold"; | ||
644 | break; | ||
642 | } | 645 | } |
643 | 646 | ||
644 | if (!desc) | 647 | if (!desc) |
@@ -2338,6 +2341,7 @@ _base_static_config_pages(struct MPT2SAS_ADAPTER *ioc) | |||
2338 | mpt2sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8); | 2341 | mpt2sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8); |
2339 | mpt2sas_config_get_iounit_pg0(ioc, &mpi_reply, &ioc->iounit_pg0); | 2342 | mpt2sas_config_get_iounit_pg0(ioc, &mpi_reply, &ioc->iounit_pg0); |
2340 | mpt2sas_config_get_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); | 2343 | mpt2sas_config_get_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); |
2344 | mpt2sas_config_get_iounit_pg8(ioc, &mpi_reply, &ioc->iounit_pg8); | ||
2341 | _base_display_ioc_capabilities(ioc); | 2345 | _base_display_ioc_capabilities(ioc); |
2342 | 2346 | ||
2343 | /* | 2347 | /* |
@@ -2355,6 +2359,8 @@ _base_static_config_pages(struct MPT2SAS_ADAPTER *ioc) | |||
2355 | ioc->iounit_pg1.Flags = cpu_to_le32(iounit_pg1_flags); | 2359 | ioc->iounit_pg1.Flags = cpu_to_le32(iounit_pg1_flags); |
2356 | mpt2sas_config_set_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); | 2360 | mpt2sas_config_set_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); |
2357 | 2361 | ||
2362 | if (ioc->iounit_pg8.NumSensors) | ||
2363 | ioc->temp_sensors_count = ioc->iounit_pg8.NumSensors; | ||
2358 | } | 2364 | } |
2359 | 2365 | ||
2360 | /** | 2366 | /** |
@@ -4594,6 +4600,7 @@ mpt2sas_base_attach(struct MPT2SAS_ADAPTER *ioc) | |||
4594 | _base_unmask_events(ioc, MPI2_EVENT_IR_PHYSICAL_DISK); | 4600 | _base_unmask_events(ioc, MPI2_EVENT_IR_PHYSICAL_DISK); |
4595 | _base_unmask_events(ioc, MPI2_EVENT_IR_OPERATION_STATUS); | 4601 | _base_unmask_events(ioc, MPI2_EVENT_IR_OPERATION_STATUS); |
4596 | _base_unmask_events(ioc, MPI2_EVENT_LOG_ENTRY_ADDED); | 4602 | _base_unmask_events(ioc, MPI2_EVENT_LOG_ENTRY_ADDED); |
4603 | _base_unmask_events(ioc, MPI2_EVENT_TEMP_THRESHOLD); | ||
4597 | r = _base_make_ioc_operational(ioc, CAN_SLEEP); | 4604 | r = _base_make_ioc_operational(ioc, CAN_SLEEP); |
4598 | if (r) | 4605 | if (r) |
4599 | goto out_free_resources; | 4606 | goto out_free_resources; |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.h b/drivers/scsi/mpt2sas/mpt2sas_base.h index 239f169b0673..8a41a4e99d71 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.h +++ b/drivers/scsi/mpt2sas/mpt2sas_base.h | |||
@@ -725,6 +725,7 @@ typedef void (*MPT2SAS_FLUSH_RUNNING_CMDS)(struct MPT2SAS_ADAPTER *ioc); | |||
725 | * @ioc_pg8: static ioc page 8 | 725 | * @ioc_pg8: static ioc page 8 |
726 | * @iounit_pg0: static iounit page 0 | 726 | * @iounit_pg0: static iounit page 0 |
727 | * @iounit_pg1: static iounit page 1 | 727 | * @iounit_pg1: static iounit page 1 |
728 | * @iounit_pg8: static iounit page 8 | ||
728 | * @sas_hba: sas host object | 729 | * @sas_hba: sas host object |
729 | * @sas_expander_list: expander object list | 730 | * @sas_expander_list: expander object list |
730 | * @sas_node_lock: | 731 | * @sas_node_lock: |
@@ -795,6 +796,7 @@ typedef void (*MPT2SAS_FLUSH_RUNNING_CMDS)(struct MPT2SAS_ADAPTER *ioc); | |||
795 | * @reply_post_host_index: head index in the pool where FW completes IO | 796 | * @reply_post_host_index: head index in the pool where FW completes IO |
796 | * @delayed_tr_list: target reset link list | 797 | * @delayed_tr_list: target reset link list |
797 | * @delayed_tr_volume_list: volume target reset link list | 798 | * @delayed_tr_volume_list: volume target reset link list |
799 | * @@temp_sensors_count: flag to carry the number of temperature sensors | ||
798 | */ | 800 | */ |
799 | struct MPT2SAS_ADAPTER { | 801 | struct MPT2SAS_ADAPTER { |
800 | struct list_head list; | 802 | struct list_head list; |
@@ -892,6 +894,7 @@ struct MPT2SAS_ADAPTER { | |||
892 | Mpi2IOCPage8_t ioc_pg8; | 894 | Mpi2IOCPage8_t ioc_pg8; |
893 | Mpi2IOUnitPage0_t iounit_pg0; | 895 | Mpi2IOUnitPage0_t iounit_pg0; |
894 | Mpi2IOUnitPage1_t iounit_pg1; | 896 | Mpi2IOUnitPage1_t iounit_pg1; |
897 | Mpi2IOUnitPage8_t iounit_pg8; | ||
895 | 898 | ||
896 | struct _boot_device req_boot_device; | 899 | struct _boot_device req_boot_device; |
897 | struct _boot_device req_alt_boot_device; | 900 | struct _boot_device req_alt_boot_device; |
@@ -992,6 +995,7 @@ struct MPT2SAS_ADAPTER { | |||
992 | 995 | ||
993 | struct list_head delayed_tr_list; | 996 | struct list_head delayed_tr_list; |
994 | struct list_head delayed_tr_volume_list; | 997 | struct list_head delayed_tr_volume_list; |
998 | u8 temp_sensors_count; | ||
995 | 999 | ||
996 | /* diag buffer support */ | 1000 | /* diag buffer support */ |
997 | u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT]; | 1001 | u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT]; |
@@ -1120,6 +1124,8 @@ int mpt2sas_config_get_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
1120 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); | 1124 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); |
1121 | int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | 1125 | int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t |
1122 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); | 1126 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); |
1127 | int mpt2sas_config_get_iounit_pg8(struct MPT2SAS_ADAPTER *ioc, | ||
1128 | Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage8_t *config_page); | ||
1123 | int mpt2sas_config_get_iounit_pg3(struct MPT2SAS_ADAPTER *ioc, | 1129 | int mpt2sas_config_get_iounit_pg3(struct MPT2SAS_ADAPTER *ioc, |
1124 | Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage3_t *config_page, u16 sz); | 1130 | Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage3_t *config_page, u16 sz); |
1125 | int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t | 1131 | int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_config.c b/drivers/scsi/mpt2sas/mpt2sas_config.c index c72a2fff5dbb..41a8f84ec8a4 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_config.c +++ b/drivers/scsi/mpt2sas/mpt2sas_config.c | |||
@@ -719,6 +719,42 @@ mpt2sas_config_get_iounit_pg3(struct MPT2SAS_ADAPTER *ioc, | |||
719 | } | 719 | } |
720 | 720 | ||
721 | /** | 721 | /** |
722 | * mpt2sas_config_get_iounit_pg8 - obtain iounit page 8 | ||
723 | * @ioc: per adapter object | ||
724 | * @mpi_reply: reply mf payload returned from firmware | ||
725 | * @config_page: contents of the config page | ||
726 | * Context: sleep. | ||
727 | * | ||
728 | * Returns 0 for success, non-zero for failure. | ||
729 | */ | ||
730 | int | ||
731 | mpt2sas_config_get_iounit_pg8(struct MPT2SAS_ADAPTER *ioc, | ||
732 | Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage8_t *config_page) | ||
733 | { | ||
734 | Mpi2ConfigRequest_t mpi_request; | ||
735 | int r; | ||
736 | |||
737 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | ||
738 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | ||
739 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | ||
740 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT; | ||
741 | mpi_request.Header.PageNumber = 8; | ||
742 | mpi_request.Header.PageVersion = MPI2_IOUNITPAGE8_PAGEVERSION; | ||
743 | mpt2sas_base_build_zero_len_sge(ioc, &mpi_request.PageBufferSGE); | ||
744 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
745 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); | ||
746 | if (r) | ||
747 | goto out; | ||
748 | |||
749 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; | ||
750 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
751 | MPT2_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, | ||
752 | sizeof(*config_page)); | ||
753 | out: | ||
754 | return r; | ||
755 | } | ||
756 | |||
757 | /** | ||
722 | * mpt2sas_config_get_ioc_pg8 - obtain ioc page 8 | 758 | * mpt2sas_config_get_ioc_pg8 - obtain ioc page 8 |
723 | * @ioc: per adapter object | 759 | * @ioc: per adapter object |
724 | * @mpi_reply: reply mf payload returned from firmware | 760 | * @mpi_reply: reply mf payload returned from firmware |
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index 6a1c036a6f3f..7000815277b1 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -3647,6 +3647,31 @@ _scsih_check_volume_delete_events(struct MPT2SAS_ADAPTER *ioc, | |||
3647 | } | 3647 | } |
3648 | 3648 | ||
3649 | /** | 3649 | /** |
3650 | * _scsih_temp_threshold_events - display temperature threshold exceeded events | ||
3651 | * @ioc: per adapter object | ||
3652 | * @event_data: the temp threshold event data | ||
3653 | * Context: interrupt time. | ||
3654 | * | ||
3655 | * Return nothing. | ||
3656 | */ | ||
3657 | static void | ||
3658 | _scsih_temp_threshold_events(struct MPT2SAS_ADAPTER *ioc, | ||
3659 | Mpi2EventDataTemperature_t *event_data) | ||
3660 | { | ||
3661 | if (ioc->temp_sensors_count >= event_data->SensorNum) { | ||
3662 | printk(MPT2SAS_ERR_FMT "Temperature Threshold flags %s%s%s%s" | ||
3663 | " exceeded for Sensor: %d !!!\n", ioc->name, | ||
3664 | ((le16_to_cpu(event_data->Status) & 0x1) == 1) ? "0 " : " ", | ||
3665 | ((le16_to_cpu(event_data->Status) & 0x2) == 2) ? "1 " : " ", | ||
3666 | ((le16_to_cpu(event_data->Status) & 0x4) == 4) ? "2 " : " ", | ||
3667 | ((le16_to_cpu(event_data->Status) & 0x8) == 8) ? "3 " : " ", | ||
3668 | event_data->SensorNum); | ||
3669 | printk(MPT2SAS_ERR_FMT "Current Temp In Celsius: %d\n", | ||
3670 | ioc->name, event_data->CurrentTemperature); | ||
3671 | } | ||
3672 | } | ||
3673 | |||
3674 | /** | ||
3650 | * _scsih_flush_running_cmds - completing outstanding commands. | 3675 | * _scsih_flush_running_cmds - completing outstanding commands. |
3651 | * @ioc: per adapter object | 3676 | * @ioc: per adapter object |
3652 | * | 3677 | * |
@@ -7557,6 +7582,12 @@ mpt2sas_scsih_event_callback(struct MPT2SAS_ADAPTER *ioc, u8 msix_index, | |||
7557 | case MPI2_EVENT_IR_PHYSICAL_DISK: | 7582 | case MPI2_EVENT_IR_PHYSICAL_DISK: |
7558 | break; | 7583 | break; |
7559 | 7584 | ||
7585 | case MPI2_EVENT_TEMP_THRESHOLD: | ||
7586 | _scsih_temp_threshold_events(ioc, | ||
7587 | (Mpi2EventDataTemperature_t *) | ||
7588 | mpi_reply->EventData); | ||
7589 | break; | ||
7590 | |||
7560 | default: /* ignore the rest */ | 7591 | default: /* ignore the rest */ |
7561 | return; | 7592 | return; |
7562 | } | 7593 | } |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c index b9c27398e206..678e1ff33f1e 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.c +++ b/drivers/scsi/mpt3sas/mpt3sas_base.c | |||
@@ -619,6 +619,9 @@ _base_display_event_data(struct MPT3SAS_ADAPTER *ioc, | |||
619 | case MPI2_EVENT_LOG_ENTRY_ADDED: | 619 | case MPI2_EVENT_LOG_ENTRY_ADDED: |
620 | desc = "Log Entry Added"; | 620 | desc = "Log Entry Added"; |
621 | break; | 621 | break; |
622 | case MPI2_EVENT_TEMP_THRESHOLD: | ||
623 | desc = "Temperature Threshold"; | ||
624 | break; | ||
622 | } | 625 | } |
623 | 626 | ||
624 | if (!desc) | 627 | if (!desc) |
@@ -2500,6 +2503,7 @@ _base_static_config_pages(struct MPT3SAS_ADAPTER *ioc) | |||
2500 | mpt3sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8); | 2503 | mpt3sas_config_get_ioc_pg8(ioc, &mpi_reply, &ioc->ioc_pg8); |
2501 | mpt3sas_config_get_iounit_pg0(ioc, &mpi_reply, &ioc->iounit_pg0); | 2504 | mpt3sas_config_get_iounit_pg0(ioc, &mpi_reply, &ioc->iounit_pg0); |
2502 | mpt3sas_config_get_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); | 2505 | mpt3sas_config_get_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); |
2506 | mpt3sas_config_get_iounit_pg8(ioc, &mpi_reply, &ioc->iounit_pg8); | ||
2503 | _base_display_ioc_capabilities(ioc); | 2507 | _base_display_ioc_capabilities(ioc); |
2504 | 2508 | ||
2505 | /* | 2509 | /* |
@@ -2516,6 +2520,9 @@ _base_static_config_pages(struct MPT3SAS_ADAPTER *ioc) | |||
2516 | MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING; | 2520 | MPI2_IOUNITPAGE1_DISABLE_TASK_SET_FULL_HANDLING; |
2517 | ioc->iounit_pg1.Flags = cpu_to_le32(iounit_pg1_flags); | 2521 | ioc->iounit_pg1.Flags = cpu_to_le32(iounit_pg1_flags); |
2518 | mpt3sas_config_set_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); | 2522 | mpt3sas_config_set_iounit_pg1(ioc, &mpi_reply, &ioc->iounit_pg1); |
2523 | |||
2524 | if (ioc->iounit_pg8.NumSensors) | ||
2525 | ioc->temp_sensors_count = ioc->iounit_pg8.NumSensors; | ||
2519 | } | 2526 | } |
2520 | 2527 | ||
2521 | /** | 2528 | /** |
@@ -4720,6 +4727,7 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc) | |||
4720 | _base_unmask_events(ioc, MPI2_EVENT_IR_PHYSICAL_DISK); | 4727 | _base_unmask_events(ioc, MPI2_EVENT_IR_PHYSICAL_DISK); |
4721 | _base_unmask_events(ioc, MPI2_EVENT_IR_OPERATION_STATUS); | 4728 | _base_unmask_events(ioc, MPI2_EVENT_IR_OPERATION_STATUS); |
4722 | _base_unmask_events(ioc, MPI2_EVENT_LOG_ENTRY_ADDED); | 4729 | _base_unmask_events(ioc, MPI2_EVENT_LOG_ENTRY_ADDED); |
4730 | _base_unmask_events(ioc, MPI2_EVENT_TEMP_THRESHOLD); | ||
4723 | 4731 | ||
4724 | r = _base_make_ioc_operational(ioc, CAN_SLEEP); | 4732 | r = _base_make_ioc_operational(ioc, CAN_SLEEP); |
4725 | if (r) | 4733 | if (r) |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h index 40926aa9b24d..4fef8f38cae4 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.h +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h | |||
@@ -659,6 +659,7 @@ typedef void (*MPT3SAS_FLUSH_RUNNING_CMDS)(struct MPT3SAS_ADAPTER *ioc); | |||
659 | * @ioc_pg8: static ioc page 8 | 659 | * @ioc_pg8: static ioc page 8 |
660 | * @iounit_pg0: static iounit page 0 | 660 | * @iounit_pg0: static iounit page 0 |
661 | * @iounit_pg1: static iounit page 1 | 661 | * @iounit_pg1: static iounit page 1 |
662 | * @iounit_pg8: static iounit page 8 | ||
662 | * @sas_hba: sas host object | 663 | * @sas_hba: sas host object |
663 | * @sas_expander_list: expander object list | 664 | * @sas_expander_list: expander object list |
664 | * @sas_node_lock: | 665 | * @sas_node_lock: |
@@ -728,6 +729,7 @@ typedef void (*MPT3SAS_FLUSH_RUNNING_CMDS)(struct MPT3SAS_ADAPTER *ioc); | |||
728 | * @reply_post_host_index: head index in the pool where FW completes IO | 729 | * @reply_post_host_index: head index in the pool where FW completes IO |
729 | * @delayed_tr_list: target reset link list | 730 | * @delayed_tr_list: target reset link list |
730 | * @delayed_tr_volume_list: volume target reset link list | 731 | * @delayed_tr_volume_list: volume target reset link list |
732 | * @@temp_sensors_count: flag to carry the number of temperature sensors | ||
731 | */ | 733 | */ |
732 | struct MPT3SAS_ADAPTER { | 734 | struct MPT3SAS_ADAPTER { |
733 | struct list_head list; | 735 | struct list_head list; |
@@ -834,6 +836,7 @@ struct MPT3SAS_ADAPTER { | |||
834 | Mpi2IOCPage8_t ioc_pg8; | 836 | Mpi2IOCPage8_t ioc_pg8; |
835 | Mpi2IOUnitPage0_t iounit_pg0; | 837 | Mpi2IOUnitPage0_t iounit_pg0; |
836 | Mpi2IOUnitPage1_t iounit_pg1; | 838 | Mpi2IOUnitPage1_t iounit_pg1; |
839 | Mpi2IOUnitPage8_t iounit_pg8; | ||
837 | 840 | ||
838 | struct _boot_device req_boot_device; | 841 | struct _boot_device req_boot_device; |
839 | struct _boot_device req_alt_boot_device; | 842 | struct _boot_device req_alt_boot_device; |
@@ -934,6 +937,7 @@ struct MPT3SAS_ADAPTER { | |||
934 | 937 | ||
935 | struct list_head delayed_tr_list; | 938 | struct list_head delayed_tr_list; |
936 | struct list_head delayed_tr_volume_list; | 939 | struct list_head delayed_tr_volume_list; |
940 | u8 temp_sensors_count; | ||
937 | 941 | ||
938 | /* diag buffer support */ | 942 | /* diag buffer support */ |
939 | u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT]; | 943 | u8 *diag_buffer[MPI2_DIAG_BUF_TYPE_COUNT]; |
@@ -1082,6 +1086,8 @@ int mpt3sas_config_get_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t | |||
1082 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); | 1086 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); |
1083 | int mpt3sas_config_set_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t | 1087 | int mpt3sas_config_set_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t |
1084 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); | 1088 | *mpi_reply, Mpi2IOUnitPage1_t *config_page); |
1089 | int mpt3sas_config_get_iounit_pg8(struct MPT3SAS_ADAPTER *ioc, Mpi2ConfigReply_t | ||
1090 | *mpi_reply, Mpi2IOUnitPage8_t *config_page); | ||
1085 | int mpt3sas_config_get_sas_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, | 1091 | int mpt3sas_config_get_sas_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, |
1086 | Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, | 1092 | Mpi2ConfigReply_t *mpi_reply, Mpi2SasIOUnitPage1_t *config_page, |
1087 | u16 sz); | 1093 | u16 sz); |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_config.c b/drivers/scsi/mpt3sas/mpt3sas_config.c index 4472c2af9255..6582193d3ccf 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_config.c +++ b/drivers/scsi/mpt3sas/mpt3sas_config.c | |||
@@ -871,6 +871,42 @@ mpt3sas_config_set_iounit_pg1(struct MPT3SAS_ADAPTER *ioc, | |||
871 | } | 871 | } |
872 | 872 | ||
873 | /** | 873 | /** |
874 | * mpt3sas_config_get_iounit_pg8 - obtain iounit page 8 | ||
875 | * @ioc: per adapter object | ||
876 | * @mpi_reply: reply mf payload returned from firmware | ||
877 | * @config_page: contents of the config page | ||
878 | * Context: sleep. | ||
879 | * | ||
880 | * Returns 0 for success, non-zero for failure. | ||
881 | */ | ||
882 | int | ||
883 | mpt3sas_config_get_iounit_pg8(struct MPT3SAS_ADAPTER *ioc, | ||
884 | Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage8_t *config_page) | ||
885 | { | ||
886 | Mpi2ConfigRequest_t mpi_request; | ||
887 | int r; | ||
888 | |||
889 | memset(&mpi_request, 0, sizeof(Mpi2ConfigRequest_t)); | ||
890 | mpi_request.Function = MPI2_FUNCTION_CONFIG; | ||
891 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_HEADER; | ||
892 | mpi_request.Header.PageType = MPI2_CONFIG_PAGETYPE_IO_UNIT; | ||
893 | mpi_request.Header.PageNumber = 8; | ||
894 | mpi_request.Header.PageVersion = MPI2_IOUNITPAGE8_PAGEVERSION; | ||
895 | ioc->build_zero_len_sge_mpi(ioc, &mpi_request.PageBufferSGE); | ||
896 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
897 | MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, NULL, 0); | ||
898 | if (r) | ||
899 | goto out; | ||
900 | |||
901 | mpi_request.Action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT; | ||
902 | r = _config_request(ioc, &mpi_request, mpi_reply, | ||
903 | MPT3_CONFIG_PAGE_DEFAULT_TIMEOUT, config_page, | ||
904 | sizeof(*config_page)); | ||
905 | out: | ||
906 | return r; | ||
907 | } | ||
908 | |||
909 | /** | ||
874 | * mpt3sas_config_get_ioc_pg8 - obtain ioc page 8 | 910 | * mpt3sas_config_get_ioc_pg8 - obtain ioc page 8 |
875 | * @ioc: per adapter object | 911 | * @ioc: per adapter object |
876 | * @mpi_reply: reply mf payload returned from firmware | 912 | * @mpi_reply: reply mf payload returned from firmware |
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index 94261ee9e72d..c3c0b45df102 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c | |||
@@ -3342,6 +3342,31 @@ _scsih_check_volume_delete_events(struct MPT3SAS_ADAPTER *ioc, | |||
3342 | } | 3342 | } |
3343 | 3343 | ||
3344 | /** | 3344 | /** |
3345 | * _scsih_temp_threshold_events - display temperature threshold exceeded events | ||
3346 | * @ioc: per adapter object | ||
3347 | * @event_data: the temp threshold event data | ||
3348 | * Context: interrupt time. | ||
3349 | * | ||
3350 | * Return nothing. | ||
3351 | */ | ||
3352 | static void | ||
3353 | _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc, | ||
3354 | Mpi2EventDataTemperature_t *event_data) | ||
3355 | { | ||
3356 | if (ioc->temp_sensors_count >= event_data->SensorNum) { | ||
3357 | pr_err(MPT3SAS_FMT "Temperature Threshold flags %s%s%s%s" | ||
3358 | " exceeded for Sensor: %d !!!\n", ioc->name, | ||
3359 | ((le16_to_cpu(event_data->Status) & 0x1) == 1) ? "0 " : " ", | ||
3360 | ((le16_to_cpu(event_data->Status) & 0x2) == 2) ? "1 " : " ", | ||
3361 | ((le16_to_cpu(event_data->Status) & 0x4) == 4) ? "2 " : " ", | ||
3362 | ((le16_to_cpu(event_data->Status) & 0x8) == 8) ? "3 " : " ", | ||
3363 | event_data->SensorNum); | ||
3364 | pr_err(MPT3SAS_FMT "Current Temp In Celsius: %d\n", | ||
3365 | ioc->name, event_data->CurrentTemperature); | ||
3366 | } | ||
3367 | } | ||
3368 | |||
3369 | /** | ||
3345 | * _scsih_flush_running_cmds - completing outstanding commands. | 3370 | * _scsih_flush_running_cmds - completing outstanding commands. |
3346 | * @ioc: per adapter object | 3371 | * @ioc: per adapter object |
3347 | * | 3372 | * |
@@ -7194,6 +7219,12 @@ mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index, | |||
7194 | case MPI2_EVENT_IR_PHYSICAL_DISK: | 7219 | case MPI2_EVENT_IR_PHYSICAL_DISK: |
7195 | break; | 7220 | break; |
7196 | 7221 | ||
7222 | case MPI2_EVENT_TEMP_THRESHOLD: | ||
7223 | _scsih_temp_threshold_events(ioc, | ||
7224 | (Mpi2EventDataTemperature_t *) | ||
7225 | mpi_reply->EventData); | ||
7226 | break; | ||
7227 | |||
7197 | default: /* ignore the rest */ | 7228 | default: /* ignore the rest */ |
7198 | return 1; | 7229 | return 1; |
7199 | } | 7230 | } |