diff options
Diffstat (limited to 'drivers/scsi/mpt2sas')
-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 |
4 files changed, 80 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 | } |