Lines Matching refs:cmd

308 void pmcraid_init_cmdblk(struct pmcraid_cmd *cmd, int index)  in pmcraid_init_cmdblk()  argument
310 struct pmcraid_ioarcb *ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_init_cmdblk()
311 dma_addr_t dma_addr = cmd->ioa_cb_bus_addr; in pmcraid_init_cmdblk()
318 cmd->index = index; in pmcraid_init_cmdblk()
327 memset(&cmd->ioa_cb->ioarcb.cdb, 0, PMCRAID_MAX_CDB_LEN); in pmcraid_init_cmdblk()
338 cmd->ioa_cb->ioasa.ioasc = 0; in pmcraid_init_cmdblk()
339 cmd->ioa_cb->ioasa.residual_data_length = 0; in pmcraid_init_cmdblk()
340 cmd->time_left = 0; in pmcraid_init_cmdblk()
343 cmd->cmd_done = NULL; in pmcraid_init_cmdblk()
344 cmd->scsi_cmd = NULL; in pmcraid_init_cmdblk()
345 cmd->release = 0; in pmcraid_init_cmdblk()
346 cmd->completion_req = 0; in pmcraid_init_cmdblk()
347 cmd->sense_buffer = 0; in pmcraid_init_cmdblk()
348 cmd->sense_buffer_dma = 0; in pmcraid_init_cmdblk()
349 cmd->dma_handle = 0; in pmcraid_init_cmdblk()
350 init_timer(&cmd->timer); in pmcraid_init_cmdblk()
361 static void pmcraid_reinit_cmdblk(struct pmcraid_cmd *cmd) in pmcraid_reinit_cmdblk() argument
363 pmcraid_init_cmdblk(cmd, -1); in pmcraid_reinit_cmdblk()
377 struct pmcraid_cmd *cmd = NULL; in pmcraid_get_free_cmd() local
384 cmd = list_entry(pinstance->free_cmd_pool.next, in pmcraid_get_free_cmd()
386 list_del(&cmd->free_list); in pmcraid_get_free_cmd()
391 if (cmd != NULL) in pmcraid_get_free_cmd()
392 pmcraid_reinit_cmdblk(cmd); in pmcraid_get_free_cmd()
393 return cmd; in pmcraid_get_free_cmd()
403 void pmcraid_return_cmd(struct pmcraid_cmd *cmd) in pmcraid_return_cmd() argument
405 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_return_cmd()
409 list_add_tail(&cmd->free_list, &pinstance->free_cmd_pool); in pmcraid_return_cmd()
559 static void pmcraid_bist_done(struct pmcraid_cmd *cmd) in pmcraid_bist_done() argument
561 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_bist_done()
570 cmd->time_left > 0) { in pmcraid_bist_done()
572 cmd->timer.expires = jiffies + cmd->time_left; in pmcraid_bist_done()
573 cmd->time_left = 0; in pmcraid_bist_done()
574 cmd->timer.data = (unsigned long)cmd; in pmcraid_bist_done()
575 cmd->timer.function = in pmcraid_bist_done()
577 add_timer(&cmd->timer); in pmcraid_bist_done()
579 cmd->time_left = 0; in pmcraid_bist_done()
582 pmcraid_ioa_reset(cmd); in pmcraid_bist_done()
593 static void pmcraid_start_bist(struct pmcraid_cmd *cmd) in pmcraid_start_bist() argument
595 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_start_bist()
606 cmd->time_left = msecs_to_jiffies(PMCRAID_BIST_TIMEOUT); in pmcraid_start_bist()
607 cmd->timer.data = (unsigned long)cmd; in pmcraid_start_bist()
608 cmd->timer.expires = jiffies + msecs_to_jiffies(PMCRAID_BIST_TIMEOUT); in pmcraid_start_bist()
609 cmd->timer.function = (void (*)(unsigned long))pmcraid_bist_done; in pmcraid_start_bist()
610 add_timer(&cmd->timer); in pmcraid_start_bist()
619 static void pmcraid_reset_alert_done(struct pmcraid_cmd *cmd) in pmcraid_reset_alert_done() argument
621 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_reset_alert_done()
630 cmd->time_left <= 0) { in pmcraid_reset_alert_done()
633 pmcraid_ioa_reset(cmd); in pmcraid_reset_alert_done()
638 cmd->time_left -= PMCRAID_CHECK_FOR_RESET_TIMEOUT; in pmcraid_reset_alert_done()
639 cmd->timer.data = (unsigned long)cmd; in pmcraid_reset_alert_done()
640 cmd->timer.expires = jiffies + PMCRAID_CHECK_FOR_RESET_TIMEOUT; in pmcraid_reset_alert_done()
641 cmd->timer.function = in pmcraid_reset_alert_done()
643 add_timer(&cmd->timer); in pmcraid_reset_alert_done()
657 static void pmcraid_reset_alert(struct pmcraid_cmd *cmd) in pmcraid_reset_alert() argument
659 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_reset_alert()
677 cmd->time_left = PMCRAID_RESET_TIMEOUT; in pmcraid_reset_alert()
678 cmd->timer.data = (unsigned long)cmd; in pmcraid_reset_alert()
679 cmd->timer.expires = jiffies + PMCRAID_CHECK_FOR_RESET_TIMEOUT; in pmcraid_reset_alert()
680 cmd->timer.function = in pmcraid_reset_alert()
682 add_timer(&cmd->timer); in pmcraid_reset_alert()
692 pmcraid_start_bist(cmd); in pmcraid_reset_alert()
706 static void pmcraid_timeout_handler(struct pmcraid_cmd *cmd) in pmcraid_timeout_handler() argument
708 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_timeout_handler()
713 cmd->ioa_cb->ioarcb.cdb[0]); in pmcraid_timeout_handler()
724 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_timeout_handler()
729 if (cmd == NULL) { in pmcraid_timeout_handler()
736 pinstance->reset_cmd = cmd; in pmcraid_timeout_handler()
741 if (pinstance->reset_cmd != cmd) { in pmcraid_timeout_handler()
754 if (cmd == pinstance->reset_cmd) in pmcraid_timeout_handler()
755 cmd->cmd_done = pmcraid_ioa_reset; in pmcraid_timeout_handler()
766 pmcraid_reset_alert(cmd); in pmcraid_timeout_handler()
778 static void pmcraid_internal_done(struct pmcraid_cmd *cmd) in pmcraid_internal_done() argument
781 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_internal_done()
782 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_internal_done()
789 if (cmd->completion_req) { in pmcraid_internal_done()
790 cmd->completion_req = 0; in pmcraid_internal_done()
791 complete(&cmd->wait_for_completion); in pmcraid_internal_done()
798 if (cmd->release) { in pmcraid_internal_done()
799 cmd->release = 0; in pmcraid_internal_done()
800 pmcraid_return_cmd(cmd); in pmcraid_internal_done()
816 static void pmcraid_reinit_cfgtable_done(struct pmcraid_cmd *cmd) in pmcraid_reinit_cfgtable_done() argument
819 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_reinit_cfgtable_done()
820 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_reinit_cfgtable_done()
822 if (cmd->release) { in pmcraid_reinit_cfgtable_done()
823 cmd->release = 0; in pmcraid_reinit_cfgtable_done()
824 pmcraid_return_cmd(cmd); in pmcraid_reinit_cfgtable_done()
827 schedule_work(&cmd->drv_inst->worker_q); in pmcraid_reinit_cfgtable_done()
840 static void pmcraid_erp_done(struct pmcraid_cmd *cmd) in pmcraid_erp_done() argument
842 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_erp_done()
843 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_erp_done()
844 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_erp_done()
850 cmd->ioa_cb->ioarcb.cdb[0], ioasc); in pmcraid_erp_done()
856 if (cmd->sense_buffer != NULL) { in pmcraid_erp_done()
858 cmd->sense_buffer, in pmcraid_erp_done()
862 cmd->sense_buffer, cmd->sense_buffer_dma); in pmcraid_erp_done()
863 cmd->sense_buffer = NULL; in pmcraid_erp_done()
864 cmd->sense_buffer_dma = 0; in pmcraid_erp_done()
868 pmcraid_return_cmd(cmd); in pmcraid_erp_done()
883 static void _pmcraid_fire_command(struct pmcraid_cmd *cmd) in _pmcraid_fire_command() argument
885 struct pmcraid_instance *pinstance = cmd->drv_inst; in _pmcraid_fire_command()
894 list_add_tail(&cmd->free_list, &pinstance->pending_cmd_pool); in _pmcraid_fire_command()
900 iowrite32(le32_to_cpu(cmd->ioa_cb->ioarcb.ioarcb_bus_addr), in _pmcraid_fire_command()
919 struct pmcraid_cmd *cmd, in pmcraid_send_cmd() argument
926 cmd->cmd_done = cmd_done; in pmcraid_send_cmd()
930 cmd->timer.data = (unsigned long)cmd; in pmcraid_send_cmd()
931 cmd->timer.expires = jiffies + timeout; in pmcraid_send_cmd()
932 cmd->timer.function = (void (*)(unsigned long))timeout_func; in pmcraid_send_cmd()
933 add_timer(&cmd->timer); in pmcraid_send_cmd()
937 _pmcraid_fire_command(cmd); in pmcraid_send_cmd()
947 static void pmcraid_ioa_shutdown_done(struct pmcraid_cmd *cmd) in pmcraid_ioa_shutdown_done() argument
949 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_ioa_shutdown_done()
953 pmcraid_ioa_reset(cmd); in pmcraid_ioa_shutdown_done()
965 static void pmcraid_ioa_shutdown(struct pmcraid_cmd *cmd) in pmcraid_ioa_shutdown() argument
968 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_ioa_shutdown()
969 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_ioa_shutdown()
974 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_shutdown()
975 cmd->ioa_cb->ioarcb.request_type = REQ_TYPE_IOACMD; in pmcraid_ioa_shutdown()
976 cmd->ioa_cb->ioarcb.resource_handle = in pmcraid_ioa_shutdown()
978 cmd->ioa_cb->ioarcb.cdb[0] = PMCRAID_IOA_SHUTDOWN; in pmcraid_ioa_shutdown()
979 cmd->ioa_cb->ioarcb.cdb[1] = PMCRAID_SHUTDOWN_NORMAL; in pmcraid_ioa_shutdown()
983 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle)); in pmcraid_ioa_shutdown()
985 pmcraid_notify_ioastate(cmd->drv_inst, PMC_DEVICE_EVENT_SHUTDOWN_START); in pmcraid_ioa_shutdown()
987 pmcraid_send_cmd(cmd, pmcraid_ioa_shutdown_done, in pmcraid_ioa_shutdown()
1002 static void pmcraid_get_fwversion_done(struct pmcraid_cmd *cmd) in pmcraid_get_fwversion_done() argument
1004 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_get_fwversion_done()
1005 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_get_fwversion_done()
1016 pmcraid_reset_alert(cmd); in pmcraid_get_fwversion_done()
1019 pmcraid_querycfg(cmd); in pmcraid_get_fwversion_done()
1031 static void pmcraid_get_fwversion(struct pmcraid_cmd *cmd) in pmcraid_get_fwversion() argument
1033 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_get_fwversion()
1035 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_get_fwversion()
1038 pmcraid_reinit_cmdblk(cmd); in pmcraid_get_fwversion()
1049 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_get_fwversion()
1062 pmcraid_send_cmd(cmd, pmcraid_get_fwversion_done, in pmcraid_get_fwversion()
1073 static void pmcraid_identify_hrrq(struct pmcraid_cmd *cmd) in pmcraid_identify_hrrq() argument
1075 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_identify_hrrq()
1076 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_identify_hrrq()
1077 int index = cmd->hrrq_index; in pmcraid_identify_hrrq()
1082 pmcraid_reinit_cmdblk(cmd); in pmcraid_identify_hrrq()
1083 cmd->hrrq_index = index + 1; in pmcraid_identify_hrrq()
1085 if (cmd->hrrq_index < pinstance->num_hrrq) { in pmcraid_identify_hrrq()
1088 cmd->hrrq_index = 0; in pmcraid_identify_hrrq()
1114 pmcraid_send_cmd(cmd, done_function, in pmcraid_identify_hrrq()
1119 static void pmcraid_process_ccn(struct pmcraid_cmd *cmd);
1120 static void pmcraid_process_ldn(struct pmcraid_cmd *cmd);
1130 static void pmcraid_send_hcam_cmd(struct pmcraid_cmd *cmd) in pmcraid_send_hcam_cmd() argument
1132 if (cmd->ioa_cb->ioarcb.cdb[1] == PMCRAID_HCAM_CODE_CONFIG_CHANGE) in pmcraid_send_hcam_cmd()
1133 atomic_set(&(cmd->drv_inst->ccn.ignore), 0); in pmcraid_send_hcam_cmd()
1135 atomic_set(&(cmd->drv_inst->ldn.ignore), 0); in pmcraid_send_hcam_cmd()
1137 pmcraid_send_cmd(cmd, cmd->cmd_done, 0, NULL); in pmcraid_send_hcam_cmd()
1155 struct pmcraid_cmd *cmd; in pmcraid_init_hcam() local
1163 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_init_hcam()
1165 if (!cmd) { in pmcraid_init_hcam()
1167 return cmd; in pmcraid_init_hcam()
1183 hcam->cmd = cmd; in pmcraid_init_hcam()
1185 ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_init_hcam()
1186 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_init_hcam()
1206 cmd->cmd_done = cmd_done; in pmcraid_init_hcam()
1207 return cmd; in pmcraid_init_hcam()
1222 struct pmcraid_cmd *cmd = pmcraid_init_hcam(pinstance, type); in pmcraid_send_hcam() local
1223 pmcraid_send_hcam_cmd(cmd); in pmcraid_send_hcam()
1234 struct pmcraid_cmd *cmd, in pmcraid_prepare_cancel_cmd() argument
1238 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_prepare_cancel_cmd()
1265 struct pmcraid_cmd *cmd, in pmcraid_cancel_hcam() argument
1273 pinstance = cmd->drv_inst; in pmcraid_cancel_hcam()
1280 if (hcam->cmd == NULL) in pmcraid_cancel_hcam()
1283 pmcraid_prepare_cancel_cmd(cmd, hcam->cmd); in pmcraid_cancel_hcam()
1288 pmcraid_send_cmd(cmd, cmd_done, in pmcraid_cancel_hcam()
1298 static void pmcraid_cancel_ccn(struct pmcraid_cmd *cmd) in pmcraid_cancel_ccn() argument
1301 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_cancel_ccn()
1302 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_cancel_ccn()
1304 pmcraid_reinit_cmdblk(cmd); in pmcraid_cancel_ccn()
1306 pmcraid_cancel_hcam(cmd, in pmcraid_cancel_ccn()
1316 static void pmcraid_cancel_ldn(struct pmcraid_cmd *cmd) in pmcraid_cancel_ldn() argument
1318 pmcraid_cancel_hcam(cmd, in pmcraid_cancel_ldn()
1547 struct pmcraid_cmd *cmd; in pmcraid_handle_config_change() local
1686 cmd = pmcraid_init_hcam(pinstance, PMCRAID_HCAM_CODE_CONFIG_CHANGE); in pmcraid_handle_config_change()
1687 if (cmd) in pmcraid_handle_config_change()
1688 pmcraid_send_hcam_cmd(cmd); in pmcraid_handle_config_change()
1712 void pmcraid_ioasc_logger(u32 ioasc, struct pmcraid_cmd *cmd) in pmcraid_ioasc_logger() argument
1717 cmd->drv_inst->current_log_level < error_info->log_level) in pmcraid_ioasc_logger()
1722 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_ioasc_logger()
1723 cmd->ioa_cb->ioarcb.resource_handle, in pmcraid_ioasc_logger()
1784 static void pmcraid_process_ccn(struct pmcraid_cmd *cmd) in pmcraid_process_ccn() argument
1786 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_process_ccn()
1787 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_process_ccn()
1790 pinstance->ccn.cmd = NULL; in pmcraid_process_ccn()
1791 pmcraid_return_cmd(cmd); in pmcraid_process_ccn()
1819 static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd);
1821 static void pmcraid_process_ldn(struct pmcraid_cmd *cmd) in pmcraid_process_ldn() argument
1823 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_process_ldn()
1826 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_process_ldn()
1831 pinstance->ldn.cmd = NULL; in pmcraid_process_ldn()
1832 pmcraid_return_cmd(cmd); in pmcraid_process_ldn()
1853 pmcraid_set_timestamp(cmd); in pmcraid_process_ldn()
1863 cmd = pmcraid_init_hcam(pinstance, PMCRAID_HCAM_CODE_LOG_DATA); in pmcraid_process_ldn()
1864 if (cmd) in pmcraid_process_ldn()
1865 pmcraid_send_hcam_cmd(cmd); in pmcraid_process_ldn()
1886 static void pmcraid_unregister_hcams(struct pmcraid_cmd *cmd) in pmcraid_unregister_hcams() argument
1888 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_unregister_hcams()
1907 pmcraid_reset_alert(cmd); in pmcraid_unregister_hcams()
1915 pmcraid_cancel_ldn(cmd); in pmcraid_unregister_hcams()
1956 static void pmcraid_soft_reset(struct pmcraid_cmd *cmd) in pmcraid_soft_reset() argument
1958 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_soft_reset()
1966 cmd->cmd_done = pmcraid_ioa_reset; in pmcraid_soft_reset()
1967 cmd->timer.data = (unsigned long)cmd; in pmcraid_soft_reset()
1968 cmd->timer.expires = jiffies + in pmcraid_soft_reset()
1970 cmd->timer.function = (void (*)(unsigned long))pmcraid_timeout_handler; in pmcraid_soft_reset()
1972 if (!timer_pending(&cmd->timer)) in pmcraid_soft_reset()
1973 add_timer(&cmd->timer); in pmcraid_soft_reset()
2026 struct pmcraid_cmd *cmd, *temp; in pmcraid_fail_outstanding_cmds() local
2033 list_for_each_entry_safe(cmd, temp, &pinstance->pending_cmd_pool, in pmcraid_fail_outstanding_cmds()
2035 list_del(&cmd->free_list); in pmcraid_fail_outstanding_cmds()
2038 cmd->ioa_cb->ioasa.ioasc = in pmcraid_fail_outstanding_cmds()
2040 cmd->ioa_cb->ioasa.ilid = in pmcraid_fail_outstanding_cmds()
2044 del_timer(&cmd->timer); in pmcraid_fail_outstanding_cmds()
2051 if (cmd->scsi_cmd) { in pmcraid_fail_outstanding_cmds()
2053 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_fail_outstanding_cmds()
2054 __le32 resp = cmd->ioa_cb->ioarcb.response_handle; in pmcraid_fail_outstanding_cmds()
2059 pmcraid_return_cmd(cmd); in pmcraid_fail_outstanding_cmds()
2063 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_fail_outstanding_cmds()
2066 } else if (cmd->cmd_done == pmcraid_internal_done || in pmcraid_fail_outstanding_cmds()
2067 cmd->cmd_done == pmcraid_erp_done) { in pmcraid_fail_outstanding_cmds()
2068 cmd->cmd_done(cmd); in pmcraid_fail_outstanding_cmds()
2069 } else if (cmd->cmd_done != pmcraid_ioa_reset && in pmcraid_fail_outstanding_cmds()
2070 cmd->cmd_done != pmcraid_ioa_shutdown_done) { in pmcraid_fail_outstanding_cmds()
2071 pmcraid_return_cmd(cmd); in pmcraid_fail_outstanding_cmds()
2096 static void pmcraid_ioa_reset(struct pmcraid_cmd *cmd) in pmcraid_ioa_reset() argument
2098 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_ioa_reset()
2103 if (pinstance->reset_cmd != cmd) { in pmcraid_ioa_reset()
2105 pinstance->reset_cmd = cmd; in pmcraid_ioa_reset()
2109 pinstance->ioa_state, cmd); in pmcraid_ioa_reset()
2129 pmcraid_reset_alert(cmd); in pmcraid_ioa_reset()
2147 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_reset()
2148 pmcraid_identify_hrrq(cmd); in pmcraid_ioa_reset()
2151 pmcraid_soft_reset(cmd); in pmcraid_ioa_reset()
2158 pmcraid_reset_alert(cmd); in pmcraid_ioa_reset()
2169 pmcraid_start_bist(cmd); in pmcraid_ioa_reset()
2206 pmcraid_reset_alert(cmd); in pmcraid_ioa_reset()
2230 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_reset()
2231 pmcraid_identify_hrrq(cmd); in pmcraid_ioa_reset()
2234 pmcraid_soft_reset(cmd); in pmcraid_ioa_reset()
2250 pmcraid_identify_hrrq(cmd); in pmcraid_ioa_reset()
2276 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_reset()
2277 pmcraid_unregister_hcams(cmd); in pmcraid_ioa_reset()
2293 pmcraid_return_cmd(cmd); in pmcraid_ioa_reset()
2320 struct pmcraid_cmd *cmd; in pmcraid_initiate_reset() local
2327 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_initiate_reset()
2329 if (cmd == NULL) { in pmcraid_initiate_reset()
2335 pinstance->reset_cmd = cmd; in pmcraid_initiate_reset()
2339 pmcraid_ioa_reset(cmd); in pmcraid_initiate_reset()
2462 static void pmcraid_request_sense(struct pmcraid_cmd *cmd) in pmcraid_request_sense() argument
2464 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_request_sense()
2468 cmd->sense_buffer = pci_alloc_consistent(cmd->drv_inst->pdev, in pmcraid_request_sense()
2470 &cmd->sense_buffer_dma); in pmcraid_request_sense()
2472 if (cmd->sense_buffer == NULL) { in pmcraid_request_sense()
2475 pmcraid_erp_done(cmd); in pmcraid_request_sense()
2480 memset(&cmd->ioa_cb->ioasa, 0, sizeof(struct pmcraid_ioasa)); in pmcraid_request_sense()
2489 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_request_sense()
2496 ioadl->address = cpu_to_le64(cmd->sense_buffer_dma); in pmcraid_request_sense()
2505 pmcraid_send_cmd(cmd, pmcraid_erp_done, in pmcraid_request_sense()
2517 static void pmcraid_cancel_all(struct pmcraid_cmd *cmd, u32 sense) in pmcraid_cancel_all() argument
2519 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_cancel_all()
2520 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_cancel_all()
2541 pmcraid_send_cmd(cmd, cmd_done, in pmcraid_cancel_all()
2554 static void pmcraid_frame_auto_sense(struct pmcraid_cmd *cmd) in pmcraid_frame_auto_sense() argument
2556 u8 *sense_buf = cmd->scsi_cmd->sense_buffer; in pmcraid_frame_auto_sense()
2557 struct pmcraid_resource_entry *res = cmd->scsi_cmd->device->hostdata; in pmcraid_frame_auto_sense()
2558 struct pmcraid_ioasa *ioasa = &cmd->ioa_cb->ioasa; in pmcraid_frame_auto_sense()
2563 cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION; in pmcraid_frame_auto_sense()
2626 static int pmcraid_error_handler(struct pmcraid_cmd *cmd) in pmcraid_error_handler() argument
2628 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_error_handler()
2630 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_error_handler()
2631 struct pmcraid_ioasa *ioasa = &cmd->ioa_cb->ioasa; in pmcraid_error_handler()
2649 pmcraid_frame_auto_sense(cmd); in pmcraid_error_handler()
2653 pmcraid_ioasc_logger(ioasc, cmd); in pmcraid_error_handler()
2710 pmcraid_cancel_all(cmd, sense_copied); in pmcraid_error_handler()
2712 pmcraid_erp_done(cmd); in pmcraid_error_handler()
2714 pmcraid_request_sense(cmd); in pmcraid_error_handler()
2748 struct pmcraid_cmd *cmd; in pmcraid_reset_device() local
2783 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_reset_device()
2785 if (cmd == NULL) { in pmcraid_reset_device()
2791 ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_reset_device()
2802 init_completion(&cmd->wait_for_completion); in pmcraid_reset_device()
2803 cmd->completion_req = 1; in pmcraid_reset_device()
2806 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_reset_device()
2807 le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle), in pmcraid_reset_device()
2808 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2); in pmcraid_reset_device()
2810 pmcraid_send_cmd(cmd, in pmcraid_reset_device()
2821 wait_for_completion(&cmd->wait_for_completion); in pmcraid_reset_device()
2826 pmcraid_return_cmd(cmd); in pmcraid_reset_device()
2828 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_reset_device()
2850 static int _pmcraid_io_done(struct pmcraid_cmd *cmd, int reslen, int ioasc) in _pmcraid_io_done() argument
2852 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in _pmcraid_io_done()
2858 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2, in _pmcraid_io_done()
2859 cmd->ioa_cb->ioarcb.cdb[0], in _pmcraid_io_done()
2863 rc = pmcraid_error_handler(cmd); in _pmcraid_io_done()
2885 static void pmcraid_io_done(struct pmcraid_cmd *cmd) in pmcraid_io_done() argument
2887 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_io_done()
2888 u32 reslen = le32_to_cpu(cmd->ioa_cb->ioasa.residual_data_length); in pmcraid_io_done()
2890 if (_pmcraid_io_done(cmd, reslen, ioasc) == 0) in pmcraid_io_done()
2891 pmcraid_return_cmd(cmd); in pmcraid_io_done()
2902 static struct pmcraid_cmd *pmcraid_abort_cmd(struct pmcraid_cmd *cmd) in pmcraid_abort_cmd() argument
2908 pinstance = (struct pmcraid_instance *)cmd->drv_inst; in pmcraid_abort_cmd()
2909 res = cmd->scsi_cmd->device->hostdata; in pmcraid_abort_cmd()
2918 pmcraid_prepare_cancel_cmd(cancel_cmd, cmd); in pmcraid_abort_cmd()
2921 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_abort_cmd()
2922 cmd->ioa_cb->ioarcb.response_handle >> 2); in pmcraid_abort_cmd()
2988 struct pmcraid_cmd *cmd; in pmcraid_eh_abort_handler() local
3027 list_for_each_entry(cmd, &pinstance->pending_cmd_pool, free_list) { in pmcraid_eh_abort_handler()
3029 if (cmd->scsi_cmd == scsi_cmd) { in pmcraid_eh_abort_handler()
3042 cancel_cmd = pmcraid_abort_cmd(cmd); in pmcraid_eh_abort_handler()
3048 cancel_cmd->res = cmd->scsi_cmd->device->hostdata; in pmcraid_eh_abort_handler()
3140 pmcraid_init_ioadls(struct pmcraid_cmd *cmd, int sgcount) in pmcraid_init_ioadls() argument
3143 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_init_ioadls()
3159 cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_init_ioadls()
3165 cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_init_ioadls()
3190 struct pmcraid_cmd *cmd in pmcraid_build_ioadl() argument
3196 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_build_ioadl()
3197 struct pmcraid_ioarcb *ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_build_ioadl()
3223 ioadl = pmcraid_init_ioadls(cmd, nseg); in pmcraid_build_ioadl()
3418 struct pmcraid_cmd *cmd; in pmcraid_queuecommand_lck() local
3453 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_queuecommand_lck()
3455 if (cmd == NULL) { in pmcraid_queuecommand_lck()
3460 cmd->scsi_cmd = scsi_cmd; in pmcraid_queuecommand_lck()
3461 ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_queuecommand_lck()
3473 cmd->cmd_done = pmcraid_io_done; in pmcraid_queuecommand_lck()
3493 rc = pmcraid_build_ioadl(pinstance, cmd); in pmcraid_queuecommand_lck()
3508 _pmcraid_fire_command(cmd); in pmcraid_queuecommand_lck()
3511 pmcraid_return_cmd(cmd); in pmcraid_queuecommand_lck()
3569 struct pmcraid_cmd *cmd, in pmcraid_build_passthrough_ioadls() argument
3576 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_build_passthrough_ioadls()
3587 sglist->num_dma_sg = pci_map_sg(cmd->drv_inst->pdev, in pmcraid_build_passthrough_ioadls()
3592 dev_err(&cmd->drv_inst->pdev->dev, in pmcraid_build_passthrough_ioadls()
3598 cmd->sglist = sglist; in pmcraid_build_passthrough_ioadls()
3601 ioadl = pmcraid_init_ioadls(cmd, sglist->num_dma_sg); in pmcraid_build_passthrough_ioadls()
3628 struct pmcraid_cmd *cmd, in pmcraid_release_passthrough_ioadls() argument
3633 struct pmcraid_sglist *sglist = cmd->sglist; in pmcraid_release_passthrough_ioadls()
3636 pci_unmap_sg(cmd->drv_inst->pdev, in pmcraid_release_passthrough_ioadls()
3641 cmd->sglist = NULL; in pmcraid_release_passthrough_ioadls()
3664 struct pmcraid_cmd *cmd; in pmcraid_ioctl_passthrough() local
3750 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_ioctl_passthrough()
3752 if (!cmd) { in pmcraid_ioctl_passthrough()
3758 cmd->scsi_cmd = NULL; in pmcraid_ioctl_passthrough()
3759 ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_ioctl_passthrough()
3789 rc = pmcraid_build_passthrough_ioadls(cmd, in pmcraid_ioctl_passthrough()
3805 rc = pmcraid_copy_sglist(cmd->sglist, in pmcraid_ioctl_passthrough()
3818 cmd->cmd_done = pmcraid_internal_done; in pmcraid_ioctl_passthrough()
3819 init_completion(&cmd->wait_for_completion); in pmcraid_ioctl_passthrough()
3820 cmd->completion_req = 1; in pmcraid_ioctl_passthrough()
3823 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2, in pmcraid_ioctl_passthrough()
3824 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_ioctl_passthrough()
3825 le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle)); in pmcraid_ioctl_passthrough()
3828 _pmcraid_fire_command(cmd); in pmcraid_ioctl_passthrough()
3844 wait_for_completion(&cmd->wait_for_completion); in pmcraid_ioctl_passthrough()
3846 &cmd->wait_for_completion, in pmcraid_ioctl_passthrough()
3850 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle >> 2), in pmcraid_ioctl_passthrough()
3851 cmd->ioa_cb->ioarcb.cdb[0]); in pmcraid_ioctl_passthrough()
3854 cancel_cmd = pmcraid_abort_cmd(cmd); in pmcraid_ioctl_passthrough()
3881 &cmd->wait_for_completion, in pmcraid_ioctl_passthrough()
3883 pmcraid_reset_bringup(cmd->drv_inst); in pmcraid_ioctl_passthrough()
3893 if (copy_to_user(ioasa, &cmd->ioa_cb->ioasa, in pmcraid_ioctl_passthrough()
3903 rc = pmcraid_copy_sglist(cmd->sglist, in pmcraid_ioctl_passthrough()
3914 pmcraid_release_passthrough_ioadls(cmd, request_size, direction); in pmcraid_ioctl_passthrough()
3915 pmcraid_return_cmd(cmd); in pmcraid_ioctl_passthrough()
3939 unsigned int cmd, in pmcraid_ioctl_driver() argument
3946 if (!access_ok(VERIFY_READ, user_buffer, _IOC_SIZE(cmd))) { in pmcraid_ioctl_driver()
3951 switch (cmd) { in pmcraid_ioctl_driver()
3977 int cmd, in pmcraid_check_ioctl_buffer() argument
4000 if ((_IOC_DIR(cmd) & _IOC_READ) == _IOC_READ) in pmcraid_check_ioctl_buffer()
4020 unsigned int cmd, in pmcraid_chr_ioctl() argument
4035 retval = pmcraid_check_ioctl_buffer(cmd, (void *)arg, hdr); in pmcraid_chr_ioctl()
4051 switch (_IOC_TYPE(cmd)) { in pmcraid_chr_ioctl()
4057 if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE) in pmcraid_chr_ioctl()
4061 cmd, in pmcraid_chr_ioctl()
4065 if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE) in pmcraid_chr_ioctl()
4072 cmd, in pmcraid_chr_ioctl()
4536 struct pmcraid_cmd *cmd = NULL; in pmcraid_tasklet_function() local
4552 cmd = pinstance->cmd_list[cmd_index]; in pmcraid_tasklet_function()
4557 list_del(&cmd->free_list); in pmcraid_tasklet_function()
4560 del_timer(&cmd->timer); in pmcraid_tasklet_function()
4563 if (cmd->cmd_done == pmcraid_ioa_reset) { in pmcraid_tasklet_function()
4566 cmd->cmd_done(cmd); in pmcraid_tasklet_function()
4569 } else if (cmd->cmd_done != NULL) { in pmcraid_tasklet_function()
4570 cmd->cmd_done(cmd); in pmcraid_tasklet_function()
5498 static void pmcraid_complete_ioa_reset(struct pmcraid_cmd *cmd) in pmcraid_complete_ioa_reset() argument
5500 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_complete_ioa_reset()
5504 pmcraid_ioa_reset(cmd); in pmcraid_complete_ioa_reset()
5518 static void pmcraid_set_supported_devs(struct pmcraid_cmd *cmd) in pmcraid_set_supported_devs() argument
5520 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_set_supported_devs()
5523 pmcraid_reinit_cmdblk(cmd); in pmcraid_set_supported_devs()
5534 if (cmd->drv_inst->reinit_cfg_table) { in pmcraid_set_supported_devs()
5535 cmd->drv_inst->reinit_cfg_table = 0; in pmcraid_set_supported_devs()
5536 cmd->release = 1; in pmcraid_set_supported_devs()
5544 pmcraid_send_cmd(cmd, in pmcraid_set_supported_devs()
5559 static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd) in pmcraid_set_timestamp() argument
5561 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_set_timestamp()
5562 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_set_timestamp()
5579 pmcraid_reinit_cmdblk(cmd); in pmcraid_set_timestamp()
5586 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_set_timestamp()
5603 pmcraid_send_cmd(cmd, pmcraid_set_supported_devs, in pmcraid_set_timestamp()
5606 pmcraid_send_cmd(cmd, pmcraid_return_cmd, in pmcraid_set_timestamp()
5625 static void pmcraid_init_res_table(struct pmcraid_cmd *cmd) in pmcraid_init_res_table() argument
5627 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_init_res_table()
5724 pmcraid_set_timestamp(cmd); in pmcraid_init_res_table()
5737 static void pmcraid_querycfg(struct pmcraid_cmd *cmd) in pmcraid_querycfg() argument
5739 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_querycfg()
5741 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_querycfg()
5763 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_querycfg()
5778 pmcraid_send_cmd(cmd, pmcraid_init_res_table, in pmcraid_querycfg()