Lines Matching +full:mctp +full:- +full:controller
6 * Copyright (C) 2012-2014 LSI Corporation
7 * Copyright (C) 2013-2014 Avago Technologies
8 * (mailto: MPT-FusionLinux.pdl@avagotech.com)
23 * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
42 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
69 * enum block_state - blocking state
82 * _ctl_display_some_debug - debug routine
99 if (!(ioc->logging_level & MPT_DEBUG_IOCTL)) in _ctl_display_some_debug()
103 switch (mpi_request->Function) { in _ctl_display_some_debug()
109 snprintf(ioc->tmp_string, MPT_STRING_LENGTH, in _ctl_display_some_debug()
111 scsi_request->CDB.CDB32[0], in _ctl_display_some_debug()
112 le16_to_cpu(scsi_request->IoFlags) & 0xF); in _ctl_display_some_debug()
113 desc = ioc->tmp_string; in _ctl_display_some_debug()
130 snprintf(ioc->tmp_string, MPT_STRING_LENGTH, in _ctl_display_some_debug()
132 (config_request->Header.PageType & in _ctl_display_some_debug()
133 MPI2_CONFIG_PAGETYPE_MASK), config_request->ExtPageType, in _ctl_display_some_debug()
134 config_request->Header.PageNumber); in _ctl_display_some_debug()
135 desc = ioc->tmp_string; in _ctl_display_some_debug()
161 snprintf(ioc->tmp_string, MPT_STRING_LENGTH, in _ctl_display_some_debug()
163 scsi_request->CDB.CDB32[0], in _ctl_display_some_debug()
164 le16_to_cpu(scsi_request->IoFlags) & 0xF); in _ctl_display_some_debug()
165 desc = ioc->tmp_string; in _ctl_display_some_debug()
202 if (mpi_reply->IOCStatus || mpi_reply->IOCLogInfo) in _ctl_display_some_debug()
204 le16_to_cpu(mpi_reply->IOCStatus), in _ctl_display_some_debug()
205 le32_to_cpu(mpi_reply->IOCLogInfo)); in _ctl_display_some_debug()
207 if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || in _ctl_display_some_debug()
208 mpi_request->Function == in _ctl_display_some_debug()
216 le16_to_cpu(scsi_reply->DevHandle)); in _ctl_display_some_debug()
219 (u64)sas_device->sas_address, in _ctl_display_some_debug()
220 sas_device->phy); in _ctl_display_some_debug()
222 (u64)sas_device->enclosure_logical_id, in _ctl_display_some_debug()
223 sas_device->slot); in _ctl_display_some_debug()
228 le16_to_cpu(scsi_reply->DevHandle)); in _ctl_display_some_debug()
231 (unsigned long long)pcie_device->wwid, in _ctl_display_some_debug()
232 pcie_device->port_num); in _ctl_display_some_debug()
233 if (pcie_device->enclosure_handle != 0) in _ctl_display_some_debug()
235 (u64)pcie_device->enclosure_logical_id, in _ctl_display_some_debug()
236 pcie_device->slot); in _ctl_display_some_debug()
240 if (scsi_reply->SCSIState || scsi_reply->SCSIStatus) in _ctl_display_some_debug()
242 scsi_reply->SCSIState, in _ctl_display_some_debug()
243 scsi_reply->SCSIStatus); in _ctl_display_some_debug()
248 * mpt3sas_ctl_done - ctl module completion routine
255 * The callback handler when using ioc->ctl_cb_idx.
270 if (ioc->ctl_cmds.status == MPT3_CMD_NOT_USED) in mpt3sas_ctl_done()
272 if (ioc->ctl_cmds.smid != smid) in mpt3sas_ctl_done()
274 ioc->ctl_cmds.status |= MPT3_CMD_COMPLETE; in mpt3sas_ctl_done()
277 memcpy(ioc->ctl_cmds.reply, mpi_reply, mpi_reply->MsgLength*4); in mpt3sas_ctl_done()
278 ioc->ctl_cmds.status |= MPT3_CMD_REPLY_VALID; in mpt3sas_ctl_done()
280 if (mpi_reply->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || in mpt3sas_ctl_done()
281 mpi_reply->Function == in mpt3sas_ctl_done()
284 if (scsiio_reply->SCSIState & in mpt3sas_ctl_done()
287 le32_to_cpu(scsiio_reply->SenseCount)); in mpt3sas_ctl_done()
290 memcpy(ioc->ctl_cmds.sense, sense_data, sz); in mpt3sas_ctl_done()
297 if (mpi_reply->Function == MPI2_FUNCTION_NVME_ENCAPSULATED) { in mpt3sas_ctl_done()
301 le16_to_cpu(nvme_error_reply->ErrorResponseCount)); in mpt3sas_ctl_done()
303 memcpy(ioc->ctl_cmds.sense, sense_data, sz); in mpt3sas_ctl_done()
308 ioc->ctl_cmds.status &= ~MPT3_CMD_PENDING; in mpt3sas_ctl_done()
309 complete(&ioc->ctl_cmds.done); in mpt3sas_ctl_done()
314 * _ctl_check_event_type - determines when an event needs logging
318 * The bitmask in ioc->event_type[] indicates which events should be
329 if (event >= 128 || !event || !ioc->event_log) in _ctl_check_event_type()
336 return desired_event & ioc->event_type[i]; in _ctl_check_event_type()
340 * mpt3sas_ctl_add_to_event_log - add event
354 if (!ioc->event_log) in mpt3sas_ctl_add_to_event_log()
357 event = le16_to_cpu(mpi_reply->Event); in mpt3sas_ctl_add_to_event_log()
362 i = ioc->event_context % MPT3SAS_CTL_EVENT_LOG_SIZE; in mpt3sas_ctl_add_to_event_log()
363 event_log = ioc->event_log; in mpt3sas_ctl_add_to_event_log()
365 event_log[i].context = ioc->event_context++; in mpt3sas_ctl_add_to_event_log()
367 event_data_sz = le16_to_cpu(mpi_reply->EventDataLength)*4; in mpt3sas_ctl_add_to_event_log()
370 memcpy(event_log[i].data, mpi_reply->EventData, sz); in mpt3sas_ctl_add_to_event_log()
379 (send_aen && !ioc->aen_event_read_flag)) { in mpt3sas_ctl_add_to_event_log()
380 ioc->aen_event_read_flag = 1; in mpt3sas_ctl_add_to_event_log()
388 * mpt3sas_ctl_event_callback - firmware event handler (called at ISR time)
394 * This function merely adds a new work task into ioc->firmware_event_thread.
413 * _ctl_verify_adapter - validates ioc_number passed from application
419 * Return: (-1) means error, else ioc_number.
427 /* global ioc lock to protect controller on list operations */ in _ctl_verify_adapter()
430 if (ioc->id != ioc_number) in _ctl_verify_adapter()
435 version = ioc->hba_mpi_version_belonged; in _ctl_verify_adapter()
456 return -1; in _ctl_verify_adapter()
460 * mpt3sas_ctl_pre_reset_handler - reset callback handler (for ctl)
472 if (!(ioc->diag_buffer_status[i] & in mpt3sas_ctl_pre_reset_handler()
475 if ((ioc->diag_buffer_status[i] & in mpt3sas_ctl_pre_reset_handler()
485 ioc->htb_rel.buffer_rel_condition = in mpt3sas_ctl_pre_reset_handler()
492 * mpt3sas_ctl_clear_outstanding_ioctls - clears outstanding ioctl cmd.
501 if (ioc->ctl_cmds.status & MPT3_CMD_PENDING) { in mpt3sas_ctl_clear_outstanding_ioctls()
502 ioc->ctl_cmds.status |= MPT3_CMD_RESET; in mpt3sas_ctl_clear_outstanding_ioctls()
503 mpt3sas_base_free_smid(ioc, ioc->ctl_cmds.smid); in mpt3sas_ctl_clear_outstanding_ioctls()
504 complete(&ioc->ctl_cmds.done); in mpt3sas_ctl_clear_outstanding_ioctls()
509 * mpt3sas_ctl_reset_done_handler - reset callback handler (for ctl)
521 if (!(ioc->diag_buffer_status[i] & in mpt3sas_ctl_reset_done_handler()
524 if ((ioc->diag_buffer_status[i] & in mpt3sas_ctl_reset_done_handler()
527 ioc->diag_buffer_status[i] |= in mpt3sas_ctl_reset_done_handler()
533 * _ctl_fasync -
547 * _ctl_poll -
559 /* global ioc lock to protect controller on list operations */ in _ctl_poll()
562 if (ioc->aen_event_read_flag) { in _ctl_poll()
572 * _ctl_set_task_mid - assign an active smid to tm request
594 if (tm_request->TaskType == MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK) in _ctl_set_task_mid()
596 else if (tm_request->TaskType == MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK) in _ctl_set_task_mid()
601 lun = scsilun_to_int((struct scsi_lun *)tm_request->LUN); in _ctl_set_task_mid()
603 handle = le16_to_cpu(tm_request->DevHandle); in _ctl_set_task_mid()
604 for (smid = ioc->scsiio_depth; smid && !found; smid--) { in _ctl_set_task_mid()
611 if (lun != scmd->device->lun) in _ctl_set_task_mid()
613 priv_data = scmd->device->hostdata; in _ctl_set_task_mid()
614 if (priv_data->sas_target == NULL) in _ctl_set_task_mid()
616 if (priv_data->sas_target->handle != handle) in _ctl_set_task_mid()
625 task_mid = cpu_to_le16(st->smid); in _ctl_set_task_mid()
626 if (!tm_request->TaskMID) in _ctl_set_task_mid()
627 tm_request->TaskMID = task_mid; in _ctl_set_task_mid()
628 found = tm_request->TaskMID == task_mid; in _ctl_set_task_mid()
634 desc, le16_to_cpu(tm_request->DevHandle), in _ctl_set_task_mid()
636 tm_reply = ioc->ctl_cmds.reply; in _ctl_set_task_mid()
637 tm_reply->DevHandle = tm_request->DevHandle; in _ctl_set_task_mid()
638 tm_reply->Function = MPI2_FUNCTION_SCSI_TASK_MGMT; in _ctl_set_task_mid()
639 tm_reply->TaskType = tm_request->TaskType; in _ctl_set_task_mid()
640 tm_reply->MsgLength = sizeof(Mpi2SCSITaskManagementReply_t)/4; in _ctl_set_task_mid()
641 tm_reply->VP_ID = tm_request->VP_ID; in _ctl_set_task_mid()
642 tm_reply->VF_ID = tm_request->VF_ID; in _ctl_set_task_mid()
643 sz = min_t(u32, karg->max_reply_bytes, ioc->reply_sz); in _ctl_set_task_mid()
644 if (copy_to_user(karg->reply_frame_buf_ptr, ioc->ctl_cmds.reply, in _ctl_set_task_mid()
653 desc, le16_to_cpu(tm_request->DevHandle), lun, in _ctl_set_task_mid()
654 le16_to_cpu(tm_request->TaskMID))); in _ctl_set_task_mid()
659 * _ctl_send_mctp_passthru_req - Send an MCTP passthru request
661 * @mctp_passthru_req: MPI mctp passhthru request from caller
678 mctp_passthru_req->H2DLength = data_out_sz; in _ctl_send_mctp_passthru_req()
679 mctp_passthru_req->D2HLength = data_in_sz; in _ctl_send_mctp_passthru_req()
682 ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, 0, 0); in _ctl_send_mctp_passthru_req()
684 psge += ioc->sge_size_ieee; in _ctl_send_mctp_passthru_req()
687 ioc->build_sg(ioc, psge, 0, 0, data_in_dma, data_in_sz); in _ctl_send_mctp_passthru_req()
689 ioc->put_smid_default(ioc, smid); in _ctl_send_mctp_passthru_req()
693 * _ctl_do_mpt_command - main handler for MPT3COMMAND opcode
723 if (ioc->ctl_cmds.status != MPT3_CMD_NOT_USED) { in _ctl_do_mpt_command()
725 ret = -EAGAIN; in _ctl_do_mpt_command()
733 mpi_request = kzalloc(ioc->request_sz, GFP_KERNEL); in _ctl_do_mpt_command()
737 ret = -ENOMEM; in _ctl_do_mpt_command()
742 if (karg.data_sge_offset * 4 > ioc->request_sz || in _ctl_do_mpt_command()
744 ret = -EINVAL; in _ctl_do_mpt_command()
752 ret = -EFAULT; in _ctl_do_mpt_command()
756 if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) { in _ctl_do_mpt_command()
757 smid = mpt3sas_base_get_smid_hpr(ioc, ioc->ctl_cb_idx); in _ctl_do_mpt_command()
760 ret = -EAGAIN; in _ctl_do_mpt_command()
765 smid = ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT + 1; in _ctl_do_mpt_command()
769 ioc->ctl_cmds.status = MPT3_CMD_PENDING; in _ctl_do_mpt_command()
770 memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); in _ctl_do_mpt_command()
772 memset(request, 0, ioc->request_sz); in _ctl_do_mpt_command()
774 ioc->ctl_cmds.smid = smid; in _ctl_do_mpt_command()
778 if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || in _ctl_do_mpt_command()
779 mpi_request->Function == MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || in _ctl_do_mpt_command()
780 mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT || in _ctl_do_mpt_command()
781 mpi_request->Function == MPI2_FUNCTION_SATA_PASSTHROUGH || in _ctl_do_mpt_command()
782 mpi_request->Function == MPI2_FUNCTION_NVME_ENCAPSULATED) { in _ctl_do_mpt_command()
784 device_handle = le16_to_cpu(mpi_request->FunctionDependent1); in _ctl_do_mpt_command()
786 ioc->facts.MaxDevHandle)) { in _ctl_do_mpt_command()
787 ret = -EINVAL; in _ctl_do_mpt_command()
793 /* obtain dma-able memory for data transfer */ in _ctl_do_mpt_command()
795 data_out = dma_alloc_coherent(&ioc->pdev->dev, data_out_sz, in _ctl_do_mpt_command()
800 ret = -ENOMEM; in _ctl_do_mpt_command()
808 ret = -EFAULT; in _ctl_do_mpt_command()
815 data_in = dma_alloc_coherent(&ioc->pdev->dev, data_in_sz, in _ctl_do_mpt_command()
820 ret = -ENOMEM; in _ctl_do_mpt_command()
831 init_completion(&ioc->ctl_cmds.done); in _ctl_do_mpt_command()
832 switch (mpi_request->Function) { in _ctl_do_mpt_command()
838 if (!(ioc->facts.IOCCapabilities & MPI26_IOCFACTS_CAPABILITY_MCTP_PASSTHRU)) { in _ctl_do_mpt_command()
839 ioc_err(ioc, "%s: MCTP Passthrough request not supported\n", in _ctl_do_mpt_command()
842 ret = -EINVAL; in _ctl_do_mpt_command()
853 if (!ioc->pcie_sg_lookup) { in _ctl_do_mpt_command()
858 if (ioc->logging_level & MPT_DEBUG_TM) in _ctl_do_mpt_command()
860 ioc->request_sz/4); in _ctl_do_mpt_command()
862 ret = -EINVAL; in _ctl_do_mpt_command()
874 nvme_encap_request->ErrorResponseBaseAddress = in _ctl_do_mpt_command()
875 cpu_to_le64(ioc->sense_dma & 0xFFFFFFFF00000000UL); in _ctl_do_mpt_command()
876 nvme_encap_request->ErrorResponseBaseAddress |= in _ctl_do_mpt_command()
879 nvme_encap_request->ErrorResponseAllocationLength = in _ctl_do_mpt_command()
881 memset(ioc->ctl_cmds.sense, 0, NVME_ERROR_RESPONSE_SIZE); in _ctl_do_mpt_command()
882 ioc->build_nvme_prp(ioc, smid, nvme_encap_request, in _ctl_do_mpt_command()
884 if (test_bit(device_handle, ioc->device_remove_in_progress)) { in _ctl_do_mpt_command()
889 ret = -EINVAL; in _ctl_do_mpt_command()
900 scsiio_request->SenseBufferLength = SCSI_SENSE_BUFFERSIZE; in _ctl_do_mpt_command()
901 scsiio_request->SenseBufferLowAddress = in _ctl_do_mpt_command()
903 memset(ioc->ctl_cmds.sense, 0, SCSI_SENSE_BUFFERSIZE); in _ctl_do_mpt_command()
904 if (test_bit(device_handle, ioc->device_remove_in_progress)) { in _ctl_do_mpt_command()
909 ret = -EINVAL; in _ctl_do_mpt_command()
912 ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, in _ctl_do_mpt_command()
914 if (mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST) in _ctl_do_mpt_command()
915 ioc->put_smid_scsi_io(ioc, smid, device_handle); in _ctl_do_mpt_command()
917 ioc->put_smid_default(ioc, smid); in _ctl_do_mpt_command()
927 le16_to_cpu(tm_request->DevHandle), in _ctl_do_mpt_command()
928 tm_request->TaskType)); in _ctl_do_mpt_command()
929 ioc->got_task_abort_from_ioctl = 1; in _ctl_do_mpt_command()
930 if (tm_request->TaskType == in _ctl_do_mpt_command()
932 tm_request->TaskType == in _ctl_do_mpt_command()
936 ioc->got_task_abort_from_ioctl = 0; in _ctl_do_mpt_command()
940 ioc->got_task_abort_from_ioctl = 0; in _ctl_do_mpt_command()
942 if (test_bit(device_handle, ioc->device_remove_in_progress)) { in _ctl_do_mpt_command()
947 ret = -EINVAL; in _ctl_do_mpt_command()
951 tm_request->DevHandle)); in _ctl_do_mpt_command()
952 ioc->build_sg_mpi(ioc, psge, data_out_dma, data_out_sz, in _ctl_do_mpt_command()
954 ioc->put_smid_hi_priority(ioc, smid, 0); in _ctl_do_mpt_command()
963 if (!ioc->multipath_on_hba) { in _ctl_do_mpt_command()
965 smp_request->PhysicalPort = 0xFF; in _ctl_do_mpt_command()
967 if (smp_request->PassthroughFlags & in _ctl_do_mpt_command()
969 data = (u8 *)&smp_request->SGL; in _ctl_do_mpt_command()
975 ret = -EINVAL; in _ctl_do_mpt_command()
982 ioc->ioc_link_reset_in_progress = 1; in _ctl_do_mpt_command()
983 ioc->ignore_loginfos = 1; in _ctl_do_mpt_command()
985 ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, data_in_dma, in _ctl_do_mpt_command()
987 ioc->put_smid_default(ioc, smid); in _ctl_do_mpt_command()
992 if (test_bit(device_handle, ioc->device_remove_in_progress)) { in _ctl_do_mpt_command()
997 ret = -EINVAL; in _ctl_do_mpt_command()
1000 ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, data_in_dma, in _ctl_do_mpt_command()
1002 ioc->put_smid_default(ioc, smid); in _ctl_do_mpt_command()
1007 if (ioc->pdev->vendor == MPI2_MFGPAGE_VENDORID_ATTO) { in _ctl_do_mpt_command()
1009 ret = -EPERM; in _ctl_do_mpt_command()
1016 ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, data_in_dma, in _ctl_do_mpt_command()
1018 ioc->put_smid_default(ioc, smid); in _ctl_do_mpt_command()
1026 if ((toolbox_request->Tool == MPI2_TOOLBOX_DIAGNOSTIC_CLI_TOOL) in _ctl_do_mpt_command()
1027 || (toolbox_request->Tool == in _ctl_do_mpt_command()
1029 ioc->build_sg(ioc, psge, data_out_dma, data_out_sz, in _ctl_do_mpt_command()
1031 else if (toolbox_request->Tool == in _ctl_do_mpt_command()
1037 ioc->build_sg_mpi(ioc, psge, data_out_dma, in _ctl_do_mpt_command()
1041 (Mpi2SGESimple64_t *)&mem_move_request->SGL; in _ctl_do_mpt_command()
1042 src = (void *)dst + ioc->sge_size; in _ctl_do_mpt_command()
1044 memcpy(&tmp, src, ioc->sge_size); in _ctl_do_mpt_command()
1045 memcpy(src, dst, ioc->sge_size); in _ctl_do_mpt_command()
1046 memcpy(dst, &tmp, ioc->sge_size); in _ctl_do_mpt_command()
1048 if (ioc->logging_level & MPT_DEBUG_TM) { in _ctl_do_mpt_command()
1052 ioc->request_sz/4); in _ctl_do_mpt_command()
1055 ioc->build_sg_mpi(ioc, psge, data_out_dma, data_out_sz, in _ctl_do_mpt_command()
1057 ioc->put_smid_default(ioc, smid); in _ctl_do_mpt_command()
1065 if (sasiounit_request->Operation == MPI2_SAS_OP_PHY_HARD_RESET in _ctl_do_mpt_command()
1066 || sasiounit_request->Operation == in _ctl_do_mpt_command()
1068 ioc->ioc_link_reset_in_progress = 1; in _ctl_do_mpt_command()
1069 ioc->ignore_loginfos = 1; in _ctl_do_mpt_command()
1075 ioc->build_sg_mpi(ioc, psge, data_out_dma, data_out_sz, in _ctl_do_mpt_command()
1077 ioc->put_smid_default(ioc, smid); in _ctl_do_mpt_command()
1085 wait_for_completion_timeout(&ioc->ctl_cmds.done, timeout*HZ); in _ctl_do_mpt_command()
1086 if (mpi_request->Function == MPI2_FUNCTION_SCSI_TASK_MGMT) { in _ctl_do_mpt_command()
1090 tm_request->DevHandle)); in _ctl_do_mpt_command()
1092 } else if ((mpi_request->Function == MPI2_FUNCTION_SMP_PASSTHROUGH || in _ctl_do_mpt_command()
1093 mpi_request->Function == MPI2_FUNCTION_SAS_IO_UNIT_CONTROL) && in _ctl_do_mpt_command()
1094 ioc->ioc_link_reset_in_progress) { in _ctl_do_mpt_command()
1095 ioc->ioc_link_reset_in_progress = 0; in _ctl_do_mpt_command()
1096 ioc->ignore_loginfos = 0; in _ctl_do_mpt_command()
1098 if (!(ioc->ctl_cmds.status & MPT3_CMD_COMPLETE)) { in _ctl_do_mpt_command()
1100 ioc->ctl_cmds.status, mpi_request, in _ctl_do_mpt_command()
1105 mpi_reply = ioc->ctl_cmds.reply; in _ctl_do_mpt_command()
1107 if (mpi_reply->Function == MPI2_FUNCTION_SCSI_TASK_MGMT && in _ctl_do_mpt_command()
1108 (ioc->logging_level & MPT_DEBUG_TM)) { in _ctl_do_mpt_command()
1113 le16_to_cpu(tm_reply->IOCStatus), in _ctl_do_mpt_command()
1114 le32_to_cpu(tm_reply->IOCLogInfo), in _ctl_do_mpt_command()
1115 le32_to_cpu(tm_reply->TerminationCount)); in _ctl_do_mpt_command()
1124 ret = -ENODATA; in _ctl_do_mpt_command()
1131 sz = min_t(u32, karg.max_reply_bytes, ioc->reply_sz); in _ctl_do_mpt_command()
1132 if (copy_to_user(karg.reply_frame_buf_ptr, ioc->ctl_cmds.reply, in _ctl_do_mpt_command()
1136 ret = -ENODATA; in _ctl_do_mpt_command()
1142 if (karg.max_sense_bytes && (mpi_request->Function == in _ctl_do_mpt_command()
1143 MPI2_FUNCTION_SCSI_IO_REQUEST || mpi_request->Function == in _ctl_do_mpt_command()
1144 MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH || mpi_request->Function == in _ctl_do_mpt_command()
1150 sz_arg = (mpi_request->Function == in _ctl_do_mpt_command()
1154 if (copy_to_user(karg.sense_data_ptr, ioc->ctl_cmds.sense, in _ctl_do_mpt_command()
1158 ret = -ENODATA; in _ctl_do_mpt_command()
1165 ret = -ENODATA; in _ctl_do_mpt_command()
1166 if ((mpi_request->Function == MPI2_FUNCTION_SCSI_IO_REQUEST || in _ctl_do_mpt_command()
1167 mpi_request->Function == in _ctl_do_mpt_command()
1169 mpi_request->Function == MPI2_FUNCTION_SATA_PASSTHROUGH)) { in _ctl_do_mpt_command()
1171 le16_to_cpu(mpi_request->FunctionDependent1)); in _ctl_do_mpt_command()
1174 le16_to_cpu(mpi_request->FunctionDependent1)); in _ctl_do_mpt_command()
1175 if (pcie_device && (!ioc->tm_custom_handling) && in _ctl_do_mpt_command()
1177 pcie_device->device_info)))) in _ctl_do_mpt_command()
1179 le16_to_cpu(mpi_request->FunctionDependent1), in _ctl_do_mpt_command()
1182 0, pcie_device->reset_timeout, in _ctl_do_mpt_command()
1186 le16_to_cpu(mpi_request->FunctionDependent1), in _ctl_do_mpt_command()
1194 le16_to_cpu(mpi_request->FunctionDependent1)); in _ctl_do_mpt_command()
1207 dma_free_coherent(&ioc->pdev->dev, data_in_sz, data_in, in _ctl_do_mpt_command()
1211 dma_free_coherent(&ioc->pdev->dev, data_out_sz, data_out, in _ctl_do_mpt_command()
1215 ioc->ctl_cmds.status = MPT3_CMD_NOT_USED; in _ctl_do_mpt_command()
1220 * _ctl_getiocinfo - main handler for MPT3IOCINFO opcode
1233 if (ioc->pfacts) in _ctl_getiocinfo()
1234 karg.port_number = ioc->pfacts[0].PortNumber; in _ctl_getiocinfo()
1235 karg.hw_rev = ioc->pdev->revision; in _ctl_getiocinfo()
1236 karg.pci_id = ioc->pdev->device; in _ctl_getiocinfo()
1237 karg.subsystem_device = ioc->pdev->subsystem_device; in _ctl_getiocinfo()
1238 karg.subsystem_vendor = ioc->pdev->subsystem_vendor; in _ctl_getiocinfo()
1239 karg.pci_information.u.bits.bus = ioc->pdev->bus->number; in _ctl_getiocinfo()
1240 karg.pci_information.u.bits.device = PCI_SLOT(ioc->pdev->devfn); in _ctl_getiocinfo()
1241 karg.pci_information.u.bits.function = PCI_FUNC(ioc->pdev->devfn); in _ctl_getiocinfo()
1242 karg.pci_information.segment_id = pci_domain_nr(ioc->pdev->bus); in _ctl_getiocinfo()
1243 karg.firmware_version = ioc->facts.FWVersion.Word; in _ctl_getiocinfo()
1244 strcpy(karg.driver_version, ioc->driver_name); in _ctl_getiocinfo()
1245 strcat(karg.driver_version, "-"); in _ctl_getiocinfo()
1246 switch (ioc->hba_mpi_version_belonged) { in _ctl_getiocinfo()
1248 if (ioc->is_warpdrive) in _ctl_getiocinfo()
1256 if (ioc->is_gen35_ioc) in _ctl_getiocinfo()
1263 karg.bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion); in _ctl_getiocinfo()
1270 return -EFAULT; in _ctl_getiocinfo()
1276 * _ctl_eventquery - main handler for MPT3EVENTQUERY opcode
1288 return -EFAULT; in _ctl_eventquery()
1295 memcpy(karg.event_types, ioc->event_type, in _ctl_eventquery()
1301 return -EFAULT; in _ctl_eventquery()
1307 * _ctl_eventenable - main handler for MPT3EVENTENABLE opcode
1319 return -EFAULT; in _ctl_eventenable()
1325 memcpy(ioc->event_type, karg.event_types, in _ctl_eventenable()
1327 mpt3sas_base_validate_event_type(ioc, ioc->event_type); in _ctl_eventenable()
1329 if (ioc->event_log) in _ctl_eventenable()
1332 ioc->event_context = 0; in _ctl_eventenable()
1333 ioc->aen_event_read_flag = 0; in _ctl_eventenable()
1334 ioc->event_log = kcalloc(MPT3SAS_CTL_EVENT_LOG_SIZE, in _ctl_eventenable()
1336 if (!ioc->event_log) { in _ctl_eventenable()
1339 return -ENOMEM; in _ctl_eventenable()
1345 * _ctl_eventreport - main handler for MPT3EVENTREPORT opcode
1359 return -EFAULT; in _ctl_eventreport()
1365 number_bytes = karg.hdr.max_data_size - in _ctl_eventreport()
1373 if (!max || !ioc->event_log) in _ctl_eventreport()
1374 return -ENODATA; in _ctl_eventreport()
1377 if (copy_to_user(uarg->event_data, ioc->event_log, number_bytes)) { in _ctl_eventreport()
1380 return -EFAULT; in _ctl_eventreport()
1384 ioc->aen_event_read_flag = 0; in _ctl_eventreport()
1389 * _ctl_do_reset - main handler for MPT3HARDRESET opcode
1402 return -EFAULT; in _ctl_do_reset()
1405 if (ioc->shost_recovery || ioc->pci_error_recovery || in _ctl_do_reset()
1406 ioc->is_driver_loading) in _ctl_do_reset()
1407 return -EAGAIN; in _ctl_do_reset()
1412 ioc->reset_from_user = 1; in _ctl_do_reset()
1420 * _ctl_btdh_search_sas_device - searching for sas device
1432 if (list_empty(&ioc->sas_device_list)) in _ctl_btdh_search_sas_device()
1435 spin_lock_irqsave(&ioc->sas_device_lock, flags); in _ctl_btdh_search_sas_device()
1436 list_for_each_entry(sas_device, &ioc->sas_device_list, list) { in _ctl_btdh_search_sas_device()
1437 if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF && in _ctl_btdh_search_sas_device()
1438 btdh->handle == sas_device->handle) { in _ctl_btdh_search_sas_device()
1439 btdh->bus = sas_device->channel; in _ctl_btdh_search_sas_device()
1440 btdh->id = sas_device->id; in _ctl_btdh_search_sas_device()
1443 } else if (btdh->bus == sas_device->channel && btdh->id == in _ctl_btdh_search_sas_device()
1444 sas_device->id && btdh->handle == 0xFFFF) { in _ctl_btdh_search_sas_device()
1445 btdh->handle = sas_device->handle; in _ctl_btdh_search_sas_device()
1451 spin_unlock_irqrestore(&ioc->sas_device_lock, flags); in _ctl_btdh_search_sas_device()
1456 * _ctl_btdh_search_pcie_device - searching for pcie device
1468 if (list_empty(&ioc->pcie_device_list)) in _ctl_btdh_search_pcie_device()
1471 spin_lock_irqsave(&ioc->pcie_device_lock, flags); in _ctl_btdh_search_pcie_device()
1472 list_for_each_entry(pcie_device, &ioc->pcie_device_list, list) { in _ctl_btdh_search_pcie_device()
1473 if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF && in _ctl_btdh_search_pcie_device()
1474 btdh->handle == pcie_device->handle) { in _ctl_btdh_search_pcie_device()
1475 btdh->bus = pcie_device->channel; in _ctl_btdh_search_pcie_device()
1476 btdh->id = pcie_device->id; in _ctl_btdh_search_pcie_device()
1479 } else if (btdh->bus == pcie_device->channel && btdh->id == in _ctl_btdh_search_pcie_device()
1480 pcie_device->id && btdh->handle == 0xFFFF) { in _ctl_btdh_search_pcie_device()
1481 btdh->handle = pcie_device->handle; in _ctl_btdh_search_pcie_device()
1487 spin_unlock_irqrestore(&ioc->pcie_device_lock, flags); in _ctl_btdh_search_pcie_device()
1492 * _ctl_btdh_search_raid_device - searching for raid device
1504 if (list_empty(&ioc->raid_device_list)) in _ctl_btdh_search_raid_device()
1507 spin_lock_irqsave(&ioc->raid_device_lock, flags); in _ctl_btdh_search_raid_device()
1508 list_for_each_entry(raid_device, &ioc->raid_device_list, list) { in _ctl_btdh_search_raid_device()
1509 if (btdh->bus == 0xFFFFFFFF && btdh->id == 0xFFFFFFFF && in _ctl_btdh_search_raid_device()
1510 btdh->handle == raid_device->handle) { in _ctl_btdh_search_raid_device()
1511 btdh->bus = raid_device->channel; in _ctl_btdh_search_raid_device()
1512 btdh->id = raid_device->id; in _ctl_btdh_search_raid_device()
1515 } else if (btdh->bus == raid_device->channel && btdh->id == in _ctl_btdh_search_raid_device()
1516 raid_device->id && btdh->handle == 0xFFFF) { in _ctl_btdh_search_raid_device()
1517 btdh->handle = raid_device->handle; in _ctl_btdh_search_raid_device()
1523 spin_unlock_irqrestore(&ioc->raid_device_lock, flags); in _ctl_btdh_search_raid_device()
1528 * _ctl_btdh_mapping - main handler for MPT3BTDHMAPPING opcode
1541 return -EFAULT; in _ctl_btdh_mapping()
1556 return -EFAULT; in _ctl_btdh_mapping()
1562 * _ctl_diag_capability - return diag buffer capability
1575 if (ioc->facts.IOCCapabilities & in _ctl_diag_capability()
1580 if (ioc->facts.IOCCapabilities & in _ctl_diag_capability()
1585 if (ioc->facts.IOCCapabilities & in _ctl_diag_capability()
1594 * _ctl_diag_get_bufftype - return diag buffer type
1607 if (ioc->unique_id[index] == unique_id) in _ctl_diag_get_bufftype()
1615 * _ctl_diag_register_2 - wrapper for registering diag buffer support
1643 rc = -EAGAIN; in _ctl_diag_register_2()
1647 if (ioc->ctl_cmds.status != MPT3_CMD_NOT_USED) { in _ctl_diag_register_2()
1649 rc = -EAGAIN; in _ctl_diag_register_2()
1653 buffer_type = diag_register->buffer_type; in _ctl_diag_register_2()
1657 return -EPERM; in _ctl_diag_register_2()
1660 if (diag_register->unique_id == 0) { in _ctl_diag_register_2()
1663 diag_register->unique_id, buffer_type); in _ctl_diag_register_2()
1664 return -EINVAL; in _ctl_diag_register_2()
1667 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_register_2()
1669 !(ioc->diag_buffer_status[buffer_type] & in _ctl_diag_register_2()
1673 __func__, buffer_type, ioc->unique_id[buffer_type]); in _ctl_diag_register_2()
1674 return -EINVAL; in _ctl_diag_register_2()
1677 if (ioc->diag_buffer_status[buffer_type] & in _ctl_diag_register_2()
1686 * to re-register it, it should be allowed as long as the in _ctl_diag_register_2()
1687 * Unique-Id/Size match. in _ctl_diag_register_2()
1690 if (ioc->unique_id[buffer_type] == MPT3DIAGBUFFUNIQUEID && in _ctl_diag_register_2()
1691 ioc->diag_buffer_sz[buffer_type] == in _ctl_diag_register_2()
1692 diag_register->requested_buffer_size) { in _ctl_diag_register_2()
1694 if (!(ioc->diag_buffer_status[buffer_type] & in _ctl_diag_register_2()
1697 "%s: diag_buffer (%d) ownership changed. old-ID(0x%08x), new-ID(0x%08x)\n", in _ctl_diag_register_2()
1699 ioc->unique_id[buffer_type], in _ctl_diag_register_2()
1700 diag_register->unique_id)); in _ctl_diag_register_2()
1706 ioc->unique_id[buffer_type] = in _ctl_diag_register_2()
1707 diag_register->unique_id; in _ctl_diag_register_2()
1711 } else if (ioc->unique_id[buffer_type] != in _ctl_diag_register_2()
1713 if (ioc->unique_id[buffer_type] != in _ctl_diag_register_2()
1714 diag_register->unique_id || in _ctl_diag_register_2()
1715 ioc->diag_buffer_sz[buffer_type] != in _ctl_diag_register_2()
1716 diag_register->requested_buffer_size || in _ctl_diag_register_2()
1717 !(ioc->diag_buffer_status[buffer_type] & in _ctl_diag_register_2()
1722 return -EINVAL; in _ctl_diag_register_2()
1727 return -EINVAL; in _ctl_diag_register_2()
1729 } else if (ioc->diag_buffer_status[buffer_type] & in _ctl_diag_register_2()
1732 if (ioc->unique_id[buffer_type] != MPT3DIAGBUFFUNIQUEID || in _ctl_diag_register_2()
1733 ioc->diag_buffer_sz[buffer_type] != in _ctl_diag_register_2()
1734 diag_register->requested_buffer_size) { in _ctl_diag_register_2()
1739 ioc->diag_buffer_sz[buffer_type]); in _ctl_diag_register_2()
1740 return -EINVAL; in _ctl_diag_register_2()
1744 if (diag_register->requested_buffer_size % 4) { in _ctl_diag_register_2()
1747 return -EINVAL; in _ctl_diag_register_2()
1750 smid = mpt3sas_base_get_smid(ioc, ioc->ctl_cb_idx); in _ctl_diag_register_2()
1753 rc = -EAGAIN; in _ctl_diag_register_2()
1758 ioc->ctl_cmds.status = MPT3_CMD_PENDING; in _ctl_diag_register_2()
1759 memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); in _ctl_diag_register_2()
1761 memset(mpi_request, 0, ioc->request_sz); in _ctl_diag_register_2()
1762 ioc->ctl_cmds.smid = smid; in _ctl_diag_register_2()
1764 request_data = ioc->diag_buffer[buffer_type]; in _ctl_diag_register_2()
1765 request_data_sz = diag_register->requested_buffer_size; in _ctl_diag_register_2()
1766 ioc->unique_id[buffer_type] = diag_register->unique_id; in _ctl_diag_register_2()
1768 ioc->reset_from_user = 0; in _ctl_diag_register_2()
1769 memset(&ioc->htb_rel, 0, sizeof(struct htb_rel_query)); in _ctl_diag_register_2()
1770 ioc->diag_buffer_status[buffer_type] &= in _ctl_diag_register_2()
1772 memcpy(ioc->product_specific[buffer_type], in _ctl_diag_register_2()
1773 diag_register->product_specific, MPT3_PRODUCT_SPECIFIC_DWORDS); in _ctl_diag_register_2()
1774 ioc->diagnostic_flags[buffer_type] = diag_register->diagnostic_flags; in _ctl_diag_register_2()
1777 request_data_dma = ioc->diag_buffer_dma[buffer_type]; in _ctl_diag_register_2()
1778 if (request_data_sz != ioc->diag_buffer_sz[buffer_type]) { in _ctl_diag_register_2()
1779 dma_free_coherent(&ioc->pdev->dev, in _ctl_diag_register_2()
1780 ioc->diag_buffer_sz[buffer_type], in _ctl_diag_register_2()
1787 ioc->diag_buffer_sz[buffer_type] = 0; in _ctl_diag_register_2()
1788 ioc->diag_buffer_dma[buffer_type] = 0; in _ctl_diag_register_2()
1789 request_data = dma_alloc_coherent(&ioc->pdev->dev, in _ctl_diag_register_2()
1795 rc = -ENOMEM; in _ctl_diag_register_2()
1798 ioc->diag_buffer[buffer_type] = request_data; in _ctl_diag_register_2()
1799 ioc->diag_buffer_sz[buffer_type] = request_data_sz; in _ctl_diag_register_2()
1800 ioc->diag_buffer_dma[buffer_type] = request_data_dma; in _ctl_diag_register_2()
1803 mpi_request->Function = MPI2_FUNCTION_DIAG_BUFFER_POST; in _ctl_diag_register_2()
1804 mpi_request->BufferType = diag_register->buffer_type; in _ctl_diag_register_2()
1805 mpi_request->Flags = cpu_to_le32(diag_register->diagnostic_flags); in _ctl_diag_register_2()
1806 mpi_request->BufferAddress = cpu_to_le64(request_data_dma); in _ctl_diag_register_2()
1807 mpi_request->BufferLength = cpu_to_le32(request_data_sz); in _ctl_diag_register_2()
1808 mpi_request->VF_ID = 0; /* TODO */ in _ctl_diag_register_2()
1809 mpi_request->VP_ID = 0; in _ctl_diag_register_2()
1815 le32_to_cpu(mpi_request->BufferLength))); in _ctl_diag_register_2()
1818 mpi_request->ProductSpecific[i] = in _ctl_diag_register_2()
1819 cpu_to_le32(ioc->product_specific[buffer_type][i]); in _ctl_diag_register_2()
1821 init_completion(&ioc->ctl_cmds.done); in _ctl_diag_register_2()
1822 ioc->put_smid_default(ioc, smid); in _ctl_diag_register_2()
1823 wait_for_completion_timeout(&ioc->ctl_cmds.done, in _ctl_diag_register_2()
1826 if (!(ioc->ctl_cmds.status & MPT3_CMD_COMPLETE)) { in _ctl_diag_register_2()
1828 ioc->ctl_cmds.status, mpi_request, in _ctl_diag_register_2()
1834 if ((ioc->ctl_cmds.status & MPT3_CMD_REPLY_VALID) == 0) { in _ctl_diag_register_2()
1836 rc = -EFAULT; in _ctl_diag_register_2()
1840 mpi_reply = ioc->ctl_cmds.reply; in _ctl_diag_register_2()
1841 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; in _ctl_diag_register_2()
1844 ioc->diag_buffer_status[buffer_type] |= in _ctl_diag_register_2()
1850 ioc_status, le32_to_cpu(mpi_reply->IOCLogInfo)); in _ctl_diag_register_2()
1851 rc = -EFAULT; in _ctl_diag_register_2()
1861 dma_free_coherent(&ioc->pdev->dev, request_data_sz, in _ctl_diag_register_2()
1863 ioc->diag_buffer[buffer_type] = NULL; in _ctl_diag_register_2()
1864 ioc->diag_buffer_status[buffer_type] &= in _ctl_diag_register_2()
1868 ioc->ctl_cmds.status = MPT3_CMD_NOT_USED; in _ctl_diag_register_2()
1873 * mpt3sas_enable_diag_buffer - enabling diag_buffers support driver load time
1885 u32 trace_buff_size = ioc->manu_pg11.HostTraceBufferMaxSizeKB<<10; in mpt3sas_enable_diag_buffer()
1893 ioc->diag_trigger_master.MasterData = in mpt3sas_enable_diag_buffer()
1897 (ioc->hba_mpi_version_belonged == MPI2_VERSION) ? in mpt3sas_enable_diag_buffer()
1903 ioc->manu_pg11.HostTraceBufferMinSizeKB<<10; in mpt3sas_enable_diag_buffer()
1905 ioc->manu_pg11.HostTraceBufferDecrementSizeKB<<10; in mpt3sas_enable_diag_buffer()
1924 trace_buff_size - min_trace_buff_size; in mpt3sas_enable_diag_buffer()
1934 if (ret_val == -ENOMEM && min_trace_buff_size && in mpt3sas_enable_diag_buffer()
1935 (trace_buff_size - decr_trace_buff_size) >= in mpt3sas_enable_diag_buffer()
1938 trace_buff_size -= decr_trace_buff_size; in mpt3sas_enable_diag_buffer()
1945 if (ret_val == -ENOMEM) in mpt3sas_enable_diag_buffer()
1949 else if (ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] in mpt3sas_enable_diag_buffer()
1953 if (ioc->hba_mpi_version_belonged != MPI2_VERSION) in mpt3sas_enable_diag_buffer()
1954 ioc->diag_buffer_status[ in mpt3sas_enable_diag_buffer()
1980 * _ctl_diag_register - application register with driver
1996 return -EFAULT; in _ctl_diag_register()
2001 if (!rc && (ioc->diag_buffer_status[karg.buffer_type] & in _ctl_diag_register()
2003 ioc->diag_buffer_status[karg.buffer_type] |= in _ctl_diag_register()
2010 * _ctl_diag_unregister - application unregister with driver
2029 return -EFAULT; in _ctl_diag_unregister()
2039 return -EINVAL; in _ctl_diag_unregister()
2045 return -EPERM; in _ctl_diag_unregister()
2048 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_unregister()
2052 return -EINVAL; in _ctl_diag_unregister()
2054 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_unregister()
2058 return -EINVAL; in _ctl_diag_unregister()
2061 if (karg.unique_id != ioc->unique_id[buffer_type]) { in _ctl_diag_unregister()
2064 return -EINVAL; in _ctl_diag_unregister()
2067 request_data = ioc->diag_buffer[buffer_type]; in _ctl_diag_unregister()
2071 return -ENOMEM; in _ctl_diag_unregister()
2074 if (ioc->diag_buffer_status[buffer_type] & in _ctl_diag_unregister()
2076 ioc->unique_id[buffer_type] = MPT3DIAGBUFFUNIQUEID; in _ctl_diag_unregister()
2077 ioc->diag_buffer_status[buffer_type] &= in _ctl_diag_unregister()
2079 ioc->diag_buffer_status[buffer_type] &= in _ctl_diag_unregister()
2082 request_data_sz = ioc->diag_buffer_sz[buffer_type]; in _ctl_diag_unregister()
2083 request_data_dma = ioc->diag_buffer_dma[buffer_type]; in _ctl_diag_unregister()
2084 dma_free_coherent(&ioc->pdev->dev, request_data_sz, in _ctl_diag_unregister()
2086 ioc->diag_buffer[buffer_type] = NULL; in _ctl_diag_unregister()
2087 ioc->diag_buffer_status[buffer_type] = 0; in _ctl_diag_unregister()
2093 * _ctl_diag_query - query relevant info associated with diag buffers
2112 return -EFAULT; in _ctl_diag_query()
2124 return -EPERM; in _ctl_diag_query()
2127 if (!(ioc->diag_buffer_status[buffer_type] & in _ctl_diag_query()
2129 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_query()
2133 return -EINVAL; in _ctl_diag_query()
2138 if (karg.unique_id != ioc->unique_id[buffer_type]) { in _ctl_diag_query()
2141 return -EINVAL; in _ctl_diag_query()
2145 request_data = ioc->diag_buffer[buffer_type]; in _ctl_diag_query()
2149 return -ENOMEM; in _ctl_diag_query()
2152 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_query()
2156 if (!(ioc->diag_buffer_status[buffer_type] & in _ctl_diag_query()
2160 if (!(ioc->diag_buffer_status[buffer_type] & in _ctl_diag_query()
2164 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_query()
2170 ioc->product_specific[buffer_type][i]; in _ctl_diag_query()
2172 karg.total_buffer_size = ioc->diag_buffer_sz[buffer_type]; in _ctl_diag_query()
2174 karg.unique_id = ioc->unique_id[buffer_type]; in _ctl_diag_query()
2175 karg.diagnostic_flags = ioc->diagnostic_flags[buffer_type]; in _ctl_diag_query()
2180 return -EFAULT; in _ctl_diag_query()
2186 * mpt3sas_send_diag_release - Diag Release Message
2213 if (ioc->diag_buffer_status[buffer_type] & in mpt3sas_send_diag_release()
2215 ioc->diag_buffer_status[buffer_type] |= in mpt3sas_send_diag_release()
2220 rc = -EAGAIN; in mpt3sas_send_diag_release()
2224 if (ioc->ctl_cmds.status != MPT3_CMD_NOT_USED) { in mpt3sas_send_diag_release()
2226 rc = -EAGAIN; in mpt3sas_send_diag_release()
2230 smid = mpt3sas_base_get_smid(ioc, ioc->ctl_cb_idx); in mpt3sas_send_diag_release()
2233 rc = -EAGAIN; in mpt3sas_send_diag_release()
2237 ioc->ctl_cmds.status = MPT3_CMD_PENDING; in mpt3sas_send_diag_release()
2238 memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); in mpt3sas_send_diag_release()
2240 memset(mpi_request, 0, ioc->request_sz); in mpt3sas_send_diag_release()
2241 ioc->ctl_cmds.smid = smid; in mpt3sas_send_diag_release()
2243 mpi_request->Function = MPI2_FUNCTION_DIAG_RELEASE; in mpt3sas_send_diag_release()
2244 mpi_request->BufferType = buffer_type; in mpt3sas_send_diag_release()
2245 mpi_request->VF_ID = 0; /* TODO */ in mpt3sas_send_diag_release()
2246 mpi_request->VP_ID = 0; in mpt3sas_send_diag_release()
2248 init_completion(&ioc->ctl_cmds.done); in mpt3sas_send_diag_release()
2249 ioc->put_smid_default(ioc, smid); in mpt3sas_send_diag_release()
2250 wait_for_completion_timeout(&ioc->ctl_cmds.done, in mpt3sas_send_diag_release()
2253 if (!(ioc->ctl_cmds.status & MPT3_CMD_COMPLETE)) { in mpt3sas_send_diag_release()
2255 ioc->ctl_cmds.status, mpi_request, in mpt3sas_send_diag_release()
2258 rc = -EFAULT; in mpt3sas_send_diag_release()
2263 if ((ioc->ctl_cmds.status & MPT3_CMD_REPLY_VALID) == 0) { in mpt3sas_send_diag_release()
2265 rc = -EFAULT; in mpt3sas_send_diag_release()
2269 mpi_reply = ioc->ctl_cmds.reply; in mpt3sas_send_diag_release()
2270 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; in mpt3sas_send_diag_release()
2273 ioc->diag_buffer_status[buffer_type] |= in mpt3sas_send_diag_release()
2279 ioc_status, le32_to_cpu(mpi_reply->IOCLogInfo)); in mpt3sas_send_diag_release()
2280 rc = -EFAULT; in mpt3sas_send_diag_release()
2284 ioc->ctl_cmds.status = MPT3_CMD_NOT_USED; in mpt3sas_send_diag_release()
2289 * _ctl_diag_release - request to send Diag Release Message to firmware
2309 return -EFAULT; in _ctl_diag_release()
2319 return -EINVAL; in _ctl_diag_release()
2325 return -EPERM; in _ctl_diag_release()
2328 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_release()
2332 return -EINVAL; in _ctl_diag_release()
2335 if (karg.unique_id != ioc->unique_id[buffer_type]) { in _ctl_diag_release()
2338 return -EINVAL; in _ctl_diag_release()
2341 if (ioc->diag_buffer_status[buffer_type] & in _ctl_diag_release()
2345 return -EINVAL; in _ctl_diag_release()
2348 request_data = ioc->diag_buffer[buffer_type]; in _ctl_diag_release()
2353 return -ENOMEM; in _ctl_diag_release()
2357 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_release()
2359 ioc->diag_buffer_status[buffer_type] |= in _ctl_diag_release()
2361 ioc->diag_buffer_status[buffer_type] &= in _ctl_diag_release()
2377 * _ctl_diag_read_buffer - request for copy of the diag buffer
2399 return -EFAULT; in _ctl_diag_read_buffer()
2409 return -EINVAL; in _ctl_diag_read_buffer()
2415 return -EPERM; in _ctl_diag_read_buffer()
2418 if (karg.unique_id != ioc->unique_id[buffer_type]) { in _ctl_diag_read_buffer()
2421 return -EINVAL; in _ctl_diag_read_buffer()
2424 request_data = ioc->diag_buffer[buffer_type]; in _ctl_diag_read_buffer()
2428 return -ENOMEM; in _ctl_diag_read_buffer()
2431 request_size = ioc->diag_buffer_sz[buffer_type]; in _ctl_diag_read_buffer()
2436 return -EINVAL; in _ctl_diag_read_buffer()
2440 return -EINVAL; in _ctl_diag_read_buffer()
2451 copy_size = request_size - karg.starting_offset; in _ctl_diag_read_buffer()
2455 if (copy_to_user((void __user *)uarg->diagnostic_data, in _ctl_diag_read_buffer()
2459 return -EFAULT; in _ctl_diag_read_buffer()
2468 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_diag_read_buffer()
2478 if (ioc->ctl_cmds.status != MPT3_CMD_NOT_USED) { in _ctl_diag_read_buffer()
2480 rc = -EAGAIN; in _ctl_diag_read_buffer()
2484 smid = mpt3sas_base_get_smid(ioc, ioc->ctl_cb_idx); in _ctl_diag_read_buffer()
2487 rc = -EAGAIN; in _ctl_diag_read_buffer()
2492 ioc->ctl_cmds.status = MPT3_CMD_PENDING; in _ctl_diag_read_buffer()
2493 memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); in _ctl_diag_read_buffer()
2495 memset(mpi_request, 0, ioc->request_sz); in _ctl_diag_read_buffer()
2496 ioc->ctl_cmds.smid = smid; in _ctl_diag_read_buffer()
2498 mpi_request->Function = MPI2_FUNCTION_DIAG_BUFFER_POST; in _ctl_diag_read_buffer()
2499 mpi_request->BufferType = buffer_type; in _ctl_diag_read_buffer()
2500 mpi_request->BufferLength = in _ctl_diag_read_buffer()
2501 cpu_to_le32(ioc->diag_buffer_sz[buffer_type]); in _ctl_diag_read_buffer()
2502 mpi_request->BufferAddress = in _ctl_diag_read_buffer()
2503 cpu_to_le64(ioc->diag_buffer_dma[buffer_type]); in _ctl_diag_read_buffer()
2505 mpi_request->ProductSpecific[i] = in _ctl_diag_read_buffer()
2506 cpu_to_le32(ioc->product_specific[buffer_type][i]); in _ctl_diag_read_buffer()
2507 mpi_request->VF_ID = 0; /* TODO */ in _ctl_diag_read_buffer()
2508 mpi_request->VP_ID = 0; in _ctl_diag_read_buffer()
2510 init_completion(&ioc->ctl_cmds.done); in _ctl_diag_read_buffer()
2511 ioc->put_smid_default(ioc, smid); in _ctl_diag_read_buffer()
2512 wait_for_completion_timeout(&ioc->ctl_cmds.done, in _ctl_diag_read_buffer()
2515 if (!(ioc->ctl_cmds.status & MPT3_CMD_COMPLETE)) { in _ctl_diag_read_buffer()
2517 ioc->ctl_cmds.status, mpi_request, in _ctl_diag_read_buffer()
2523 if ((ioc->ctl_cmds.status & MPT3_CMD_REPLY_VALID) == 0) { in _ctl_diag_read_buffer()
2525 rc = -EFAULT; in _ctl_diag_read_buffer()
2529 mpi_reply = ioc->ctl_cmds.reply; in _ctl_diag_read_buffer()
2530 ioc_status = le16_to_cpu(mpi_reply->IOCStatus) & MPI2_IOCSTATUS_MASK; in _ctl_diag_read_buffer()
2533 ioc->diag_buffer_status[buffer_type] |= in _ctl_diag_read_buffer()
2535 ioc->diag_buffer_status[buffer_type] &= in _ctl_diag_read_buffer()
2541 le32_to_cpu(mpi_reply->IOCLogInfo)); in _ctl_diag_read_buffer()
2542 rc = -EFAULT; in _ctl_diag_read_buffer()
2551 ioc->ctl_cmds.status = MPT3_CMD_NOT_USED; in _ctl_diag_read_buffer()
2556 * _ctl_addnl_diag_query - query relevant info associated with diag buffers
2572 ioc->name, __FILE__, __LINE__, __func__); in _ctl_addnl_diag_query()
2573 return -EFAULT; in _ctl_addnl_diag_query()
2579 return -EPERM; in _ctl_addnl_diag_query()
2585 return -EPERM; in _ctl_addnl_diag_query()
2588 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_addnl_diag_query()
2594 if ((ioc->diag_buffer_status[buffer_type] & in _ctl_addnl_diag_query()
2598 return -EPERM; in _ctl_addnl_diag_query()
2600 memcpy(&karg.rel_query, &ioc->htb_rel, sizeof(karg.rel_query)); in _ctl_addnl_diag_query()
2605 return -EFAULT; in _ctl_addnl_diag_query()
2611 * _ctl_enable_diag_sbr_reload - enable sbr reload bit
2622 if (ioc->shost_recovery || in _ctl_enable_diag_sbr_reload()
2623 ioc->pci_error_recovery || ioc->is_driver_loading || in _ctl_enable_diag_sbr_reload()
2624 ioc->remove_host) in _ctl_enable_diag_sbr_reload()
2625 return -EAGAIN; in _ctl_enable_diag_sbr_reload()
2630 return -EFAULT; in _ctl_enable_diag_sbr_reload()
2632 host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic); in _ctl_enable_diag_sbr_reload()
2637 if (mutex_trylock(&ioc->hostdiag_unlock_mutex)) { in _ctl_enable_diag_sbr_reload()
2639 mutex_unlock(&ioc->hostdiag_unlock_mutex); in _ctl_enable_diag_sbr_reload()
2640 return -EFAULT; in _ctl_enable_diag_sbr_reload()
2643 return -EAGAIN; in _ctl_enable_diag_sbr_reload()
2646 writel(host_diagnostic, &ioc->chip->HostDiagnostic); in _ctl_enable_diag_sbr_reload()
2647 host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic); in _ctl_enable_diag_sbr_reload()
2649 mutex_unlock(&ioc->hostdiag_unlock_mutex); in _ctl_enable_diag_sbr_reload()
2653 return -EFAULT; in _ctl_enable_diag_sbr_reload()
2662 * _ctl_compat_mpt_command - convert 32bit pointers to 64bit.
2667 * MPT3COMMAND32 - Handle 32bit applications running on 64bit os.
2678 return -EINVAL; in _ctl_compat_mpt_command()
2685 return -EFAULT; in _ctl_compat_mpt_command()
2702 return _ctl_do_mpt_command(ioc, karg, &uarg->mf); in _ctl_compat_mpt_command()
2707 * _ctl_ioctl_main - main ioctl entry point
2722 long ret = -ENOIOCTLCMD; in _ctl_ioctl_main()
2729 return -EFAULT; in _ctl_ioctl_main()
2733 &ioc, mpi_version) == -1 || !ioc) in _ctl_ioctl_main()
2734 return -ENODEV; in _ctl_ioctl_main()
2737 mutex_lock(&ioc->pci_access_mutex); in _ctl_ioctl_main()
2739 if (ioc->shost_recovery || ioc->pci_error_recovery || in _ctl_ioctl_main()
2740 ioc->is_driver_loading || ioc->remove_host) { in _ctl_ioctl_main()
2741 ret = -EAGAIN; in _ctl_ioctl_main()
2745 state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING; in _ctl_ioctl_main()
2747 if (!mutex_trylock(&ioc->ctl_cmds.mutex)) { in _ctl_ioctl_main()
2748 ret = -EAGAIN; in _ctl_ioctl_main()
2751 } else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) { in _ctl_ioctl_main()
2752 ret = -ERESTARTSYS; in _ctl_ioctl_main()
2779 ret = -EFAULT; in _ctl_ioctl_main()
2784 ret = -EINVAL; in _ctl_ioctl_main()
2789 ret = _ctl_do_mpt_command(ioc, karg, &uarg->mf); in _ctl_ioctl_main()
2847 mutex_unlock(&ioc->ctl_cmds.mutex); in _ctl_ioctl_main()
2849 mutex_unlock(&ioc->pci_access_mutex); in _ctl_ioctl_main()
2854 * _ctl_get_mpt_mctp_passthru_adapter - Traverse the IOC list and return the IOC at
2855 * dev_index positionthat support MCTP passhtru
2867 /* Traverse ioc list and return number of IOC that support MCTP passthru */ in _ctl_get_mpt_mctp_passthru_adapter()
2869 if (ioc->facts.IOCCapabilities & MPI26_IOCFACTS_CAPABILITY_MCTP_PASSTHRU) { in _ctl_get_mpt_mctp_passthru_adapter()
2882 * mpt3sas_get_device_count - Retrieve the count of MCTP passthrough
2885 * Returns number of devices that support MCTP passthrough.
2894 /* Traverse ioc list and return number of IOC that support MCTP passthru */ in mpt3sas_get_device_count()
2896 if (ioc->facts.IOCCapabilities & MPI26_IOCFACTS_CAPABILITY_MCTP_PASSTHRU) in mpt3sas_get_device_count()
2906 * mpt3sas_send_passthru_cmd - Send an MPI MCTP passthrough command to
2908 * @command: The MPI MCTP passthrough command to send to firmware
2932 ioc = _ctl_get_mpt_mctp_passthru_adapter(command->dev_index); in mpt3sas_send_mctp_passthru_req()
2934 return -ENODEV; in mpt3sas_send_mctp_passthru_req()
2936 mutex_lock(&ioc->pci_access_mutex); in mpt3sas_send_mctp_passthru_req()
2937 if (ioc->shost_recovery || in mpt3sas_send_mctp_passthru_req()
2938 ioc->pci_error_recovery || ioc->is_driver_loading || in mpt3sas_send_mctp_passthru_req()
2939 ioc->remove_host) { in mpt3sas_send_mctp_passthru_req()
2940 ret = -EAGAIN; in mpt3sas_send_mctp_passthru_req()
2945 if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) { in mpt3sas_send_mctp_passthru_req()
2946 ret = -ERESTARTSYS; in mpt3sas_send_mctp_passthru_req()
2950 if (ioc->ctl_cmds.status != MPT3_CMD_NOT_USED) { in mpt3sas_send_mctp_passthru_req()
2952 ret = -EAGAIN; in mpt3sas_send_mctp_passthru_req()
2960 mpi_request = (MPI2RequestHeader_t *)command->mpi_request; in mpt3sas_send_mctp_passthru_req()
2961 if (mpi_request->Function != MPI2_FUNCTION_MCTP_PASSTHROUGH) { in mpt3sas_send_mctp_passthru_req()
2963 __func__, mpi_request->Function); in mpt3sas_send_mctp_passthru_req()
2964 ret = -EINVAL; in mpt3sas_send_mctp_passthru_req()
2969 smid = ioc->scsiio_depth - INTERNAL_SCSIIO_CMDS_COUNT + 1; in mpt3sas_send_mctp_passthru_req()
2971 ioc->ctl_cmds.status = MPT3_CMD_PENDING; in mpt3sas_send_mctp_passthru_req()
2972 memset(ioc->ctl_cmds.reply, 0, ioc->reply_sz); in mpt3sas_send_mctp_passthru_req()
2974 memset(request, 0, ioc->request_sz); in mpt3sas_send_mctp_passthru_req()
2975 memcpy(request, command->mpi_request, sizeof(Mpi26MctpPassthroughRequest_t)); in mpt3sas_send_mctp_passthru_req()
2976 ioc->ctl_cmds.smid = smid; in mpt3sas_send_mctp_passthru_req()
2977 data_out_sz = command->data_out_size; in mpt3sas_send_mctp_passthru_req()
2978 data_in_sz = command->data_in_size; in mpt3sas_send_mctp_passthru_req()
2980 /* obtain dma-able memory for data transfer */ in mpt3sas_send_mctp_passthru_req()
2982 data_out = dma_alloc_coherent(&ioc->pdev->dev, data_out_sz, in mpt3sas_send_mctp_passthru_req()
2985 ret = -ENOMEM; in mpt3sas_send_mctp_passthru_req()
2989 memcpy(data_out, command->data_out_buf_ptr, data_out_sz); in mpt3sas_send_mctp_passthru_req()
2994 data_in = dma_alloc_coherent(&ioc->pdev->dev, data_in_sz, in mpt3sas_send_mctp_passthru_req()
2997 ret = -ENOMEM; in mpt3sas_send_mctp_passthru_req()
3003 psge = &((Mpi26MctpPassthroughRequest_t *)request)->H2DSGL; in mpt3sas_send_mctp_passthru_req()
3005 init_completion(&ioc->ctl_cmds.done); in mpt3sas_send_mctp_passthru_req()
3012 timeout = command->timeout; in mpt3sas_send_mctp_passthru_req()
3016 wait_for_completion_timeout(&ioc->ctl_cmds.done, timeout*HZ); in mpt3sas_send_mctp_passthru_req()
3017 if (!(ioc->ctl_cmds.status & MPT3_CMD_COMPLETE)) { in mpt3sas_send_mctp_passthru_req()
3019 ioc->ctl_cmds.status, mpi_request, in mpt3sas_send_mctp_passthru_req()
3024 mpi_reply = ioc->ctl_cmds.reply; in mpt3sas_send_mctp_passthru_req()
3028 memcpy(command->data_in_buf_ptr, data_in, data_in_sz); in mpt3sas_send_mctp_passthru_req()
3031 if (command->max_reply_bytes) { in mpt3sas_send_mctp_passthru_req()
3032 sz = min_t(u32, command->max_reply_bytes, ioc->reply_sz); in mpt3sas_send_mctp_passthru_req()
3033 memcpy(command->reply_frame_buf_ptr, ioc->ctl_cmds.reply, sz); in mpt3sas_send_mctp_passthru_req()
3038 ret = -ENODATA; in mpt3sas_send_mctp_passthru_req()
3045 dma_free_coherent(&ioc->pdev->dev, data_in_sz, data_in, in mpt3sas_send_mctp_passthru_req()
3049 dma_free_coherent(&ioc->pdev->dev, data_out_sz, data_out, in mpt3sas_send_mctp_passthru_req()
3052 ioc->ctl_cmds.status = MPT3_CMD_NOT_USED; in mpt3sas_send_mctp_passthru_req()
3055 mutex_unlock(&ioc->ctl_cmds.mutex); in mpt3sas_send_mctp_passthru_req()
3058 mutex_unlock(&ioc->pci_access_mutex); in mpt3sas_send_mctp_passthru_req()
3065 * _ctl_ioctl - mpt3ctl main ioctl entry point (unlocked)
3085 * _ctl_mpt2_ioctl - mpt2ctl main ioctl entry point (unlocked)
3103 * _ctl_ioctl_compat - main ioctl entry point (compat)
3121 * _ctl_mpt2_ioctl_compat - main ioctl entry point (compat)
3140 * version_fw_show - firmware version
3145 * A sysfs 'read-only' shost attribute.
3155 (ioc->facts.FWVersion.Word & 0xFF000000) >> 24, in version_fw_show()
3156 (ioc->facts.FWVersion.Word & 0x00FF0000) >> 16, in version_fw_show()
3157 (ioc->facts.FWVersion.Word & 0x0000FF00) >> 8, in version_fw_show()
3158 ioc->facts.FWVersion.Word & 0x000000FF); in version_fw_show()
3163 * version_bios_show - bios version
3168 * A sysfs 'read-only' shost attribute.
3177 u32 version = le32_to_cpu(ioc->bios_pg3.BiosVersion); in version_bios_show()
3188 * version_mpi_show - MPI (message passing interface) version
3193 * A sysfs 'read-only' shost attribute.
3203 ioc->facts.MsgVersion, ioc->facts.HeaderVersion >> 8); in version_mpi_show()
3208 * version_product_show - product name
3213 * A sysfs 'read-only' shost attribute.
3222 return snprintf(buf, 16, "%s\n", ioc->manu_pg0.ChipName); in version_product_show()
3227 * version_nvdata_persistent_show - ndvata persistent version
3232 * A sysfs 'read-only' shost attribute.
3242 le32_to_cpu(ioc->iounit_pg0.NvdataVersionPersistent.Word)); in version_nvdata_persistent_show()
3247 * version_nvdata_default_show - nvdata default version
3252 * A sysfs 'read-only' shost attribute.
3262 le32_to_cpu(ioc->iounit_pg0.NvdataVersionDefault.Word)); in version_nvdata_default_show()
3267 * board_name_show - board name
3272 * A sysfs 'read-only' shost attribute.
3281 return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardName); in board_name_show()
3286 * board_assembly_show - board assembly name
3291 * A sysfs 'read-only' shost attribute.
3300 return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardAssembly); in board_assembly_show()
3305 * board_tracer_show - board tracer number
3310 * A sysfs 'read-only' shost attribute.
3319 return snprintf(buf, 16, "%s\n", ioc->manu_pg0.BoardTracerNumber); in board_tracer_show()
3324 * io_delay_show - io missing delay
3332 * A sysfs 'read-only' shost attribute.
3341 return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->io_missing_delay); in io_delay_show()
3346 * device_delay_show - device missing delay
3354 * A sysfs 'read-only' shost attribute.
3363 return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->device_missing_delay); in device_delay_show()
3368 * fw_queue_depth_show - global credits
3375 * A sysfs 'read-only' shost attribute.
3384 return snprintf(buf, PAGE_SIZE, "%02d\n", ioc->facts.RequestCredit); in fw_queue_depth_show()
3389 * host_sas_address_show - sas address
3394 * This is the controller sas address
3396 * A sysfs 'read-only' shost attribute.
3407 (unsigned long long)ioc->sas_hba.sas_address); in host_sas_address_show()
3412 * logging_level_show - logging level
3426 return snprintf(buf, PAGE_SIZE, "%08xh\n", ioc->logging_level); in logging_level_show()
3437 return -EINVAL; in logging_level_store()
3439 ioc->logging_level = val; in logging_level_store()
3441 ioc->logging_level); in logging_level_store()
3447 * fwfault_debug_show - show/store fwfault_debug
3462 return snprintf(buf, PAGE_SIZE, "%d\n", ioc->fwfault_debug); in fwfault_debug_show()
3473 return -EINVAL; in fwfault_debug_store()
3475 ioc->fwfault_debug = val; in fwfault_debug_store()
3477 ioc->fwfault_debug); in fwfault_debug_store()
3483 * ioc_reset_count_show - ioc reset count
3490 * A sysfs 'read-only' shost attribute.
3499 return snprintf(buf, PAGE_SIZE, "%d\n", ioc->ioc_reset_count); in ioc_reset_count_show()
3504 * reply_queue_count_show - number of reply queues
3511 * A sysfs 'read-only' shost attribute.
3521 if ((ioc->facts.IOCCapabilities & in reply_queue_count_show()
3522 MPI2_IOCFACTS_CAPABILITY_MSI_X_INDEX) && ioc->msix_enable) in reply_queue_count_show()
3523 reply_queue_count = ioc->reply_queue_count; in reply_queue_count_show()
3532 * BRM_status_show - Backup Rail Monitor Status
3539 * A sysfs 'read-only' shost attribute.
3554 if (!ioc->is_warpdrive) { in BRM_status_show()
3560 mutex_lock(&ioc->pci_access_mutex); in BRM_status_show()
3561 if (ioc->pci_error_recovery || ioc->remove_host) in BRM_status_show()
3571 rc = -EINVAL; in BRM_status_show()
3579 rc = -EINVAL; in BRM_status_show()
3586 rc = -EINVAL; in BRM_status_show()
3595 mutex_unlock(&ioc->pci_access_mutex); in BRM_status_show()
3611 * host_trace_buffer_size_show - host buffer size (trace only)
3616 * A sysfs 'read-only' shost attribute.
3627 if (!ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) { in host_trace_buffer_size_show()
3633 if ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_size_show()
3641 ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]; in host_trace_buffer_size_show()
3642 if ((le32_to_cpu(request_data->DiagVersion) == 0x00000000 || in host_trace_buffer_size_show()
3643 le32_to_cpu(request_data->DiagVersion) == 0x01000000 || in host_trace_buffer_size_show()
3644 le32_to_cpu(request_data->DiagVersion) == 0x01010000) && in host_trace_buffer_size_show()
3645 le32_to_cpu(request_data->Reserved3) == 0x4742444c) in host_trace_buffer_size_show()
3646 size = le32_to_cpu(request_data->Size); in host_trace_buffer_size_show()
3648 ioc->ring_buffer_sz = size; in host_trace_buffer_size_show()
3654 * host_trace_buffer_show - firmware ring buffer (trace only)
3674 if (!ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) { in host_trace_buffer_show()
3680 if ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_show()
3687 if (ioc->ring_buffer_offset > ioc->ring_buffer_sz) in host_trace_buffer_show()
3690 size = ioc->ring_buffer_sz - ioc->ring_buffer_offset; in host_trace_buffer_show()
3691 size = (size >= PAGE_SIZE) ? (PAGE_SIZE - 1) : size; in host_trace_buffer_show()
3692 request_data = ioc->diag_buffer[0] + ioc->ring_buffer_offset; in host_trace_buffer_show()
3706 return -EINVAL; in host_trace_buffer_store()
3708 ioc->ring_buffer_offset = val; in host_trace_buffer_store()
3717 * host_trace_buffer_enable_show - firmware ring buffer (trace only)
3733 if ((!ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) || in host_trace_buffer_enable_show()
3734 ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_show()
3737 else if ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_show()
3755 if (ioc->shost_recovery || ioc->remove_host || in host_trace_buffer_enable_store()
3756 ioc->pci_error_recovery || ioc->is_driver_loading) in host_trace_buffer_enable_store()
3757 return -EBUSY; in host_trace_buffer_enable_store()
3760 return -EINVAL; in host_trace_buffer_enable_store()
3764 if ((ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) && in host_trace_buffer_enable_store()
3765 (ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_store()
3767 ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_store()
3774 if (ioc->manu_pg11.HostTraceBufferMaxSizeKB != 0 && in host_trace_buffer_enable_store()
3775 ioc->diag_buffer_sz[MPI2_DIAG_BUF_TYPE_TRACE] != 0) { in host_trace_buffer_enable_store()
3778 ioc->diag_buffer_sz[MPI2_DIAG_BUF_TYPE_TRACE]; in host_trace_buffer_enable_store()
3784 if ((ioc->diag_buffer_sz[MPI2_DIAG_BUF_TYPE_TRACE] != 0) in host_trace_buffer_enable_store()
3786 (ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_store()
3788 dma_free_coherent(&ioc->pdev->dev, in host_trace_buffer_enable_store()
3789 ioc->diag_buffer_sz[MPI2_DIAG_BUF_TYPE_TRACE], in host_trace_buffer_enable_store()
3790 ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE], in host_trace_buffer_enable_store()
3791 ioc->diag_buffer_dma[MPI2_DIAG_BUF_TYPE_TRACE]); in host_trace_buffer_enable_store()
3792 ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE] = in host_trace_buffer_enable_store()
3800 (ioc->hba_mpi_version_belonged == MPI2_VERSION) ? in host_trace_buffer_enable_store()
3802 ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] = 0; in host_trace_buffer_enable_store()
3804 if (ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_store()
3809 if (ioc->hba_mpi_version_belonged != MPI2_VERSION) in host_trace_buffer_enable_store()
3810 ioc->diag_buffer_status[ in host_trace_buffer_enable_store()
3816 if (!ioc->diag_buffer[MPI2_DIAG_BUF_TYPE_TRACE]) in host_trace_buffer_enable_store()
3818 if ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_store()
3821 if ((ioc->diag_buffer_status[MPI2_DIAG_BUF_TYPE_TRACE] & in host_trace_buffer_enable_store()
3825 ioc->htb_rel.buffer_rel_condition = MPT3_DIAG_BUFFER_REL_SYSFS; in host_trace_buffer_enable_store()
3838 * diag_trigger_master_show - show the diag_trigger_master attribute
3855 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_master_show()
3857 memcpy(buf, &ioc->diag_trigger_master, rc); in diag_trigger_master_show()
3858 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_master_show()
3863 * diag_trigger_master_store - store the diag_trigger_master attribute
3885 if (ioc->supports_trigger_pages) { in diag_trigger_master_store()
3889 return -ENOMEM; in diag_trigger_master_store()
3892 if (!master_tg->MasterData) in diag_trigger_master_store()
3897 return -EFAULT; in diag_trigger_master_store()
3902 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_master_store()
3903 memset(&ioc->diag_trigger_master, 0, in diag_trigger_master_store()
3905 memcpy(&ioc->diag_trigger_master, buf, rc); in diag_trigger_master_store()
3906 ioc->diag_trigger_master.MasterData |= in diag_trigger_master_store()
3908 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_master_store()
3915 * diag_trigger_event_show - show the diag_trigger_event attribute
3931 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_event_show()
3933 memcpy(buf, &ioc->diag_trigger_event, rc); in diag_trigger_event_show()
3934 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_event_show()
3939 * diag_trigger_event_store - store the diag_trigger_event attribute
3960 if (ioc->supports_trigger_pages) { in diag_trigger_event_store()
3964 return -ENOMEM; in diag_trigger_event_store()
3967 if (!event_tg->ValidEntries) in diag_trigger_event_store()
3972 return -EFAULT; in diag_trigger_event_store()
3977 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_event_store()
3979 memset(&ioc->diag_trigger_event, 0, in diag_trigger_event_store()
3981 memcpy(&ioc->diag_trigger_event, buf, sz); in diag_trigger_event_store()
3982 if (ioc->diag_trigger_event.ValidEntries > NUM_VALID_ENTRIES) in diag_trigger_event_store()
3983 ioc->diag_trigger_event.ValidEntries = NUM_VALID_ENTRIES; in diag_trigger_event_store()
3984 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_event_store()
3991 * diag_trigger_scsi_show - show the diag_trigger_scsi attribute
4007 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_scsi_show()
4009 memcpy(buf, &ioc->diag_trigger_scsi, rc); in diag_trigger_scsi_show()
4010 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_scsi_show()
4015 * diag_trigger_scsi_store - store the diag_trigger_scsi attribute
4035 if (ioc->supports_trigger_pages) { in diag_trigger_scsi_store()
4039 return -ENOMEM; in diag_trigger_scsi_store()
4042 if (!scsi_tg->ValidEntries) in diag_trigger_scsi_store()
4047 return -EFAULT; in diag_trigger_scsi_store()
4052 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_scsi_store()
4054 memset(&ioc->diag_trigger_scsi, 0, sizeof(ioc->diag_trigger_scsi)); in diag_trigger_scsi_store()
4055 memcpy(&ioc->diag_trigger_scsi, buf, sz); in diag_trigger_scsi_store()
4056 if (ioc->diag_trigger_scsi.ValidEntries > NUM_VALID_ENTRIES) in diag_trigger_scsi_store()
4057 ioc->diag_trigger_scsi.ValidEntries = NUM_VALID_ENTRIES; in diag_trigger_scsi_store()
4058 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_scsi_store()
4065 * diag_trigger_mpi_show - show the diag_trigger_mpi attribute
4081 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_mpi_show()
4083 memcpy(buf, &ioc->diag_trigger_mpi, rc); in diag_trigger_mpi_show()
4084 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_mpi_show()
4089 * diag_trigger_mpi_store - store the diag_trigger_mpi attribute
4109 if (ioc->supports_trigger_pages) { in diag_trigger_mpi_store()
4113 return -ENOMEM; in diag_trigger_mpi_store()
4116 if (!mpi_tg->ValidEntries) in diag_trigger_mpi_store()
4121 return -EFAULT; in diag_trigger_mpi_store()
4126 spin_lock_irqsave(&ioc->diag_trigger_lock, flags); in diag_trigger_mpi_store()
4127 memset(&ioc->diag_trigger_mpi, 0, in diag_trigger_mpi_store()
4128 sizeof(ioc->diag_trigger_mpi)); in diag_trigger_mpi_store()
4129 memcpy(&ioc->diag_trigger_mpi, buf, sz); in diag_trigger_mpi_store()
4130 if (ioc->diag_trigger_mpi.ValidEntries > NUM_VALID_ENTRIES) in diag_trigger_mpi_store()
4131 ioc->diag_trigger_mpi.ValidEntries = NUM_VALID_ENTRIES; in diag_trigger_mpi_store()
4132 spin_unlock_irqrestore(&ioc->diag_trigger_lock, flags); in diag_trigger_mpi_store()
4143 * drv_support_bitmap_show - driver supported feature bitmap
4148 * A sysfs 'read-only' shost attribute.
4157 return snprintf(buf, PAGE_SIZE, "0x%08x\n", ioc->drv_support_bitmap); in drv_support_bitmap_show()
4162 * enable_sdev_max_qd_show - display whether sdev max qd is enabled/disabled
4177 return snprintf(buf, PAGE_SIZE, "%d\n", ioc->enable_sdev_max_qd); in enable_sdev_max_qd_show()
4181 * enable_sdev_max_qd_store - Enable/disable sdev max qd
4206 return -EINVAL; in enable_sdev_max_qd_store()
4210 ioc->enable_sdev_max_qd = 0; in enable_sdev_max_qd_store()
4211 shost_for_each_device(sdev, ioc->shost) { in enable_sdev_max_qd_store()
4212 sas_device_priv_data = sdev->hostdata; in enable_sdev_max_qd_store()
4215 sas_target_priv_data = sas_device_priv_data->sas_target; in enable_sdev_max_qd_store()
4219 if (sas_target_priv_data->flags & in enable_sdev_max_qd_store()
4223 sas_target_priv_data->handle); in enable_sdev_max_qd_store()
4225 switch (raid_device->volume_type) { in enable_sdev_max_qd_store()
4227 if (raid_device->device_info & in enable_sdev_max_qd_store()
4242 } else if (sas_target_priv_data->flags & in enable_sdev_max_qd_store()
4244 qdepth = ioc->max_nvme_qd; in enable_sdev_max_qd_store()
4246 qdepth = (sas_target_priv_data->sas_dev->port_type > 1) ? in enable_sdev_max_qd_store()
4247 ioc->max_wideport_qd : ioc->max_narrowport_qd; in enable_sdev_max_qd_store()
4253 ioc->enable_sdev_max_qd = 1; in enable_sdev_max_qd_store()
4254 shost_for_each_device(sdev, ioc->shost) in enable_sdev_max_qd_store()
4256 shost->can_queue); in enable_sdev_max_qd_store()
4259 return -EINVAL; in enable_sdev_max_qd_store()
4309 * sas_address_show - sas address
4316 * A sysfs 'read-only' shost attribute.
4323 struct MPT3SAS_DEVICE *sas_device_priv_data = sdev->hostdata; in sas_address_show()
4326 (unsigned long long)sas_device_priv_data->sas_target->sas_address); in sas_address_show()
4331 * sas_device_handle_show - device handle
4338 * A sysfs 'read-only' shost attribute.
4345 struct MPT3SAS_DEVICE *sas_device_priv_data = sdev->hostdata; in sas_device_handle_show()
4348 sas_device_priv_data->sas_target->handle); in sas_device_handle_show()
4353 * sas_ncq_prio_supported_show - Indicate if device supports NCQ priority
4358 * A sysfs 'read-only' sdev attribute, only works with SATA
4371 * sas_ncq_prio_enable_show - send prioritized io commands to device
4383 struct MPT3SAS_DEVICE *sas_device_priv_data = sdev->hostdata; in sas_ncq_prio_enable_show()
4386 sas_device_priv_data->ncq_prio_enable); in sas_ncq_prio_enable_show()
4395 struct MPT3SAS_DEVICE *sas_device_priv_data = sdev->hostdata; in sas_ncq_prio_enable_store()
4399 return -EINVAL; in sas_ncq_prio_enable_store()
4402 return -EINVAL; in sas_ncq_prio_enable_store()
4404 sas_device_priv_data->ncq_prio_enable = ncq_prio_enable; in sas_ncq_prio_enable_store()
4461 * mpt3sas_ctl_init - main entry point for ctl.
4489 * mpt3sas_ctl_release - release dma for ctl
4499 if (!ioc->diag_buffer[i]) in mpt3sas_ctl_release()
4501 dma_free_coherent(&ioc->pdev->dev, in mpt3sas_ctl_release()
4502 ioc->diag_buffer_sz[i], in mpt3sas_ctl_release()
4503 ioc->diag_buffer[i], in mpt3sas_ctl_release()
4504 ioc->diag_buffer_dma[i]); in mpt3sas_ctl_release()
4505 ioc->diag_buffer[i] = NULL; in mpt3sas_ctl_release()
4506 ioc->diag_buffer_status[i] = 0; in mpt3sas_ctl_release()
4509 kfree(ioc->event_log); in mpt3sas_ctl_release()
4513 * mpt3sas_ctl_exit - exit point for ctl