aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/mpt2sas
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/mpt2sas')
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_base.c7
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_base.h6
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_config.c36
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_scsih.c31
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 */
799struct MPT2SAS_ADAPTER { 801struct 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);
1121int mpt2sas_config_set_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t 1125int 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);
1127int mpt2sas_config_get_iounit_pg8(struct MPT2SAS_ADAPTER *ioc,
1128 Mpi2ConfigReply_t *mpi_reply, Mpi2IOUnitPage8_t *config_page);
1123int mpt2sas_config_get_iounit_pg3(struct MPT2SAS_ADAPTER *ioc, 1129int 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);
1125int mpt2sas_config_get_sas_iounit_pg1(struct MPT2SAS_ADAPTER *ioc, Mpi2ConfigReply_t 1131int 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 */
730int
731mpt2sas_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 */
3657static 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 }