Lines Matching refs:cmd

294 static void pmcraid_init_cmdblk(struct pmcraid_cmd *cmd, int index)  in pmcraid_init_cmdblk()  argument
296 struct pmcraid_ioarcb *ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_init_cmdblk()
297 dma_addr_t dma_addr = cmd->ioa_cb_bus_addr; in pmcraid_init_cmdblk()
304 cmd->index = index; in pmcraid_init_cmdblk()
313 memset(&cmd->ioa_cb->ioarcb.cdb, 0, PMCRAID_MAX_CDB_LEN); in pmcraid_init_cmdblk()
324 cmd->ioa_cb->ioasa.ioasc = 0; in pmcraid_init_cmdblk()
325 cmd->ioa_cb->ioasa.residual_data_length = 0; in pmcraid_init_cmdblk()
326 cmd->time_left = 0; in pmcraid_init_cmdblk()
329 cmd->cmd_done = NULL; in pmcraid_init_cmdblk()
330 cmd->scsi_cmd = NULL; in pmcraid_init_cmdblk()
331 cmd->release = 0; in pmcraid_init_cmdblk()
332 cmd->completion_req = 0; in pmcraid_init_cmdblk()
333 cmd->sense_buffer = NULL; in pmcraid_init_cmdblk()
334 cmd->sense_buffer_dma = 0; in pmcraid_init_cmdblk()
335 cmd->dma_handle = 0; in pmcraid_init_cmdblk()
336 timer_setup(&cmd->timer, NULL, 0); in pmcraid_init_cmdblk()
347 static void pmcraid_reinit_cmdblk(struct pmcraid_cmd *cmd) in pmcraid_reinit_cmdblk() argument
349 pmcraid_init_cmdblk(cmd, -1); in pmcraid_reinit_cmdblk()
363 struct pmcraid_cmd *cmd = NULL; in pmcraid_get_free_cmd() local
370 cmd = list_entry(pinstance->free_cmd_pool.next, in pmcraid_get_free_cmd()
372 list_del(&cmd->free_list); in pmcraid_get_free_cmd()
377 if (cmd != NULL) in pmcraid_get_free_cmd()
378 pmcraid_reinit_cmdblk(cmd); in pmcraid_get_free_cmd()
379 return cmd; in pmcraid_get_free_cmd()
389 static void pmcraid_return_cmd(struct pmcraid_cmd *cmd) in pmcraid_return_cmd() argument
391 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_return_cmd()
395 list_add_tail(&cmd->free_list, &pinstance->free_cmd_pool); in pmcraid_return_cmd()
547 struct pmcraid_cmd *cmd = from_timer(cmd, t, timer); in pmcraid_bist_done() local
548 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_bist_done()
557 cmd->time_left > 0) { in pmcraid_bist_done()
559 cmd->timer.expires = jiffies + cmd->time_left; in pmcraid_bist_done()
560 cmd->time_left = 0; in pmcraid_bist_done()
561 add_timer(&cmd->timer); in pmcraid_bist_done()
563 cmd->time_left = 0; in pmcraid_bist_done()
566 pmcraid_ioa_reset(cmd); in pmcraid_bist_done()
577 static void pmcraid_start_bist(struct pmcraid_cmd *cmd) in pmcraid_start_bist() argument
579 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_start_bist()
590 cmd->time_left = msecs_to_jiffies(PMCRAID_BIST_TIMEOUT); in pmcraid_start_bist()
591 cmd->timer.expires = jiffies + msecs_to_jiffies(PMCRAID_BIST_TIMEOUT); in pmcraid_start_bist()
592 cmd->timer.function = pmcraid_bist_done; in pmcraid_start_bist()
593 add_timer(&cmd->timer); in pmcraid_start_bist()
604 struct pmcraid_cmd *cmd = from_timer(cmd, t, timer); in pmcraid_reset_alert_done() local
605 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_reset_alert_done()
614 cmd->time_left <= 0) { in pmcraid_reset_alert_done()
617 pmcraid_ioa_reset(cmd); in pmcraid_reset_alert_done()
622 cmd->time_left -= PMCRAID_CHECK_FOR_RESET_TIMEOUT; in pmcraid_reset_alert_done()
623 cmd->timer.expires = jiffies + PMCRAID_CHECK_FOR_RESET_TIMEOUT; in pmcraid_reset_alert_done()
624 cmd->timer.function = pmcraid_reset_alert_done; in pmcraid_reset_alert_done()
625 add_timer(&cmd->timer); in pmcraid_reset_alert_done()
639 static void pmcraid_reset_alert(struct pmcraid_cmd *cmd) in pmcraid_reset_alert() argument
641 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_reset_alert()
659 cmd->time_left = PMCRAID_RESET_TIMEOUT; in pmcraid_reset_alert()
660 cmd->timer.expires = jiffies + PMCRAID_CHECK_FOR_RESET_TIMEOUT; in pmcraid_reset_alert()
661 cmd->timer.function = pmcraid_reset_alert_done; in pmcraid_reset_alert()
662 add_timer(&cmd->timer); in pmcraid_reset_alert()
672 pmcraid_start_bist(cmd); in pmcraid_reset_alert()
688 struct pmcraid_cmd *cmd = from_timer(cmd, t, timer); in pmcraid_timeout_handler() local
689 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_timeout_handler()
694 cmd->ioa_cb->ioarcb.cdb[0]); in pmcraid_timeout_handler()
705 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_timeout_handler()
710 if (cmd == NULL) { in pmcraid_timeout_handler()
717 pinstance->reset_cmd = cmd; in pmcraid_timeout_handler()
722 if (pinstance->reset_cmd != cmd) { in pmcraid_timeout_handler()
735 if (cmd == pinstance->reset_cmd) in pmcraid_timeout_handler()
736 cmd->cmd_done = pmcraid_ioa_reset; in pmcraid_timeout_handler()
747 pmcraid_reset_alert(cmd); in pmcraid_timeout_handler()
759 static void pmcraid_internal_done(struct pmcraid_cmd *cmd) in pmcraid_internal_done() argument
762 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_internal_done()
763 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_internal_done()
770 if (cmd->completion_req) { in pmcraid_internal_done()
771 cmd->completion_req = 0; in pmcraid_internal_done()
772 complete(&cmd->wait_for_completion); in pmcraid_internal_done()
779 if (cmd->release) { in pmcraid_internal_done()
780 cmd->release = 0; in pmcraid_internal_done()
781 pmcraid_return_cmd(cmd); in pmcraid_internal_done()
797 static void pmcraid_reinit_cfgtable_done(struct pmcraid_cmd *cmd) in pmcraid_reinit_cfgtable_done() argument
800 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_reinit_cfgtable_done()
801 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_reinit_cfgtable_done()
803 if (cmd->release) { in pmcraid_reinit_cfgtable_done()
804 cmd->release = 0; in pmcraid_reinit_cfgtable_done()
805 pmcraid_return_cmd(cmd); in pmcraid_reinit_cfgtable_done()
808 schedule_work(&cmd->drv_inst->worker_q); in pmcraid_reinit_cfgtable_done()
821 static void pmcraid_erp_done(struct pmcraid_cmd *cmd) in pmcraid_erp_done() argument
823 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_erp_done()
824 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_erp_done()
825 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_erp_done()
831 cmd->ioa_cb->ioarcb.cdb[0], ioasc); in pmcraid_erp_done()
834 if (cmd->sense_buffer) { in pmcraid_erp_done()
835 dma_unmap_single(&pinstance->pdev->dev, cmd->sense_buffer_dma, in pmcraid_erp_done()
837 cmd->sense_buffer = NULL; in pmcraid_erp_done()
838 cmd->sense_buffer_dma = 0; in pmcraid_erp_done()
842 pmcraid_return_cmd(cmd); in pmcraid_erp_done()
857 static void _pmcraid_fire_command(struct pmcraid_cmd *cmd) in _pmcraid_fire_command() argument
859 struct pmcraid_instance *pinstance = cmd->drv_inst; in _pmcraid_fire_command()
868 list_add_tail(&cmd->free_list, &pinstance->pending_cmd_pool); in _pmcraid_fire_command()
874 iowrite32(le64_to_cpu(cmd->ioa_cb->ioarcb.ioarcb_bus_addr), pinstance->ioarrin); in _pmcraid_fire_command()
892 struct pmcraid_cmd *cmd, in pmcraid_send_cmd() argument
899 cmd->cmd_done = cmd_done; in pmcraid_send_cmd()
903 cmd->timer.expires = jiffies + timeout; in pmcraid_send_cmd()
904 cmd->timer.function = timeout_func; in pmcraid_send_cmd()
905 add_timer(&cmd->timer); in pmcraid_send_cmd()
909 _pmcraid_fire_command(cmd); in pmcraid_send_cmd()
919 static void pmcraid_ioa_shutdown_done(struct pmcraid_cmd *cmd) in pmcraid_ioa_shutdown_done() argument
921 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_ioa_shutdown_done()
925 pmcraid_ioa_reset(cmd); in pmcraid_ioa_shutdown_done()
937 static void pmcraid_ioa_shutdown(struct pmcraid_cmd *cmd) in pmcraid_ioa_shutdown() argument
940 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_ioa_shutdown()
941 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_ioa_shutdown()
946 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_shutdown()
947 cmd->ioa_cb->ioarcb.request_type = REQ_TYPE_IOACMD; in pmcraid_ioa_shutdown()
948 cmd->ioa_cb->ioarcb.resource_handle = in pmcraid_ioa_shutdown()
950 cmd->ioa_cb->ioarcb.cdb[0] = PMCRAID_IOA_SHUTDOWN; in pmcraid_ioa_shutdown()
951 cmd->ioa_cb->ioarcb.cdb[1] = PMCRAID_SHUTDOWN_NORMAL; in pmcraid_ioa_shutdown()
955 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle)); in pmcraid_ioa_shutdown()
957 pmcraid_notify_ioastate(cmd->drv_inst, PMC_DEVICE_EVENT_SHUTDOWN_START); in pmcraid_ioa_shutdown()
959 pmcraid_send_cmd(cmd, pmcraid_ioa_shutdown_done, in pmcraid_ioa_shutdown()
974 static void pmcraid_get_fwversion_done(struct pmcraid_cmd *cmd) in pmcraid_get_fwversion_done() argument
976 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_get_fwversion_done()
977 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_get_fwversion_done()
988 pmcraid_reset_alert(cmd); in pmcraid_get_fwversion_done()
991 pmcraid_querycfg(cmd); in pmcraid_get_fwversion_done()
1003 static void pmcraid_get_fwversion(struct pmcraid_cmd *cmd) in pmcraid_get_fwversion() argument
1005 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_get_fwversion()
1007 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_get_fwversion()
1010 pmcraid_reinit_cmdblk(cmd); in pmcraid_get_fwversion()
1021 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_get_fwversion()
1034 pmcraid_send_cmd(cmd, pmcraid_get_fwversion_done, in pmcraid_get_fwversion()
1045 static void pmcraid_identify_hrrq(struct pmcraid_cmd *cmd) in pmcraid_identify_hrrq() argument
1047 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_identify_hrrq()
1048 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_identify_hrrq()
1049 int index = cmd->hrrq_index; in pmcraid_identify_hrrq()
1054 pmcraid_reinit_cmdblk(cmd); in pmcraid_identify_hrrq()
1055 cmd->hrrq_index = index + 1; in pmcraid_identify_hrrq()
1057 if (cmd->hrrq_index < pinstance->num_hrrq) { in pmcraid_identify_hrrq()
1060 cmd->hrrq_index = 0; in pmcraid_identify_hrrq()
1086 pmcraid_send_cmd(cmd, done_function, in pmcraid_identify_hrrq()
1091 static void pmcraid_process_ccn(struct pmcraid_cmd *cmd);
1092 static void pmcraid_process_ldn(struct pmcraid_cmd *cmd);
1102 static void pmcraid_send_hcam_cmd(struct pmcraid_cmd *cmd) in pmcraid_send_hcam_cmd() argument
1104 if (cmd->ioa_cb->ioarcb.cdb[1] == PMCRAID_HCAM_CODE_CONFIG_CHANGE) in pmcraid_send_hcam_cmd()
1105 atomic_set(&(cmd->drv_inst->ccn.ignore), 0); in pmcraid_send_hcam_cmd()
1107 atomic_set(&(cmd->drv_inst->ldn.ignore), 0); in pmcraid_send_hcam_cmd()
1109 pmcraid_send_cmd(cmd, cmd->cmd_done, 0, NULL); in pmcraid_send_hcam_cmd()
1127 struct pmcraid_cmd *cmd; in pmcraid_init_hcam() local
1135 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_init_hcam()
1137 if (!cmd) { in pmcraid_init_hcam()
1139 return cmd; in pmcraid_init_hcam()
1155 hcam->cmd = cmd; in pmcraid_init_hcam()
1157 ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_init_hcam()
1158 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_init_hcam()
1178 cmd->cmd_done = cmd_done; in pmcraid_init_hcam()
1179 return cmd; in pmcraid_init_hcam()
1194 struct pmcraid_cmd *cmd = pmcraid_init_hcam(pinstance, type); in pmcraid_send_hcam() local
1195 pmcraid_send_hcam_cmd(cmd); in pmcraid_send_hcam()
1206 struct pmcraid_cmd *cmd, in pmcraid_prepare_cancel_cmd() argument
1210 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_prepare_cancel_cmd()
1238 struct pmcraid_cmd *cmd, in pmcraid_cancel_hcam() argument
1246 pinstance = cmd->drv_inst; in pmcraid_cancel_hcam()
1253 if (hcam->cmd == NULL) in pmcraid_cancel_hcam()
1256 pmcraid_prepare_cancel_cmd(cmd, hcam->cmd); in pmcraid_cancel_hcam()
1261 pmcraid_send_cmd(cmd, cmd_done, in pmcraid_cancel_hcam()
1271 static void pmcraid_cancel_ccn(struct pmcraid_cmd *cmd) in pmcraid_cancel_ccn() argument
1274 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_cancel_ccn()
1275 le32_to_cpu(cmd->ioa_cb->ioasa.ioasc)); in pmcraid_cancel_ccn()
1277 pmcraid_reinit_cmdblk(cmd); in pmcraid_cancel_ccn()
1279 pmcraid_cancel_hcam(cmd, in pmcraid_cancel_ccn()
1289 static void pmcraid_cancel_ldn(struct pmcraid_cmd *cmd) in pmcraid_cancel_ldn() argument
1291 pmcraid_cancel_hcam(cmd, in pmcraid_cancel_ldn()
1515 struct pmcraid_cmd *cmd; in pmcraid_handle_config_change() local
1649 cmd = pmcraid_init_hcam(pinstance, PMCRAID_HCAM_CODE_CONFIG_CHANGE); in pmcraid_handle_config_change()
1650 if (cmd) in pmcraid_handle_config_change()
1651 pmcraid_send_hcam_cmd(cmd); in pmcraid_handle_config_change()
1675 static void pmcraid_ioasc_logger(u32 ioasc, struct pmcraid_cmd *cmd) in pmcraid_ioasc_logger() argument
1680 cmd->drv_inst->current_log_level < error_info->log_level) in pmcraid_ioasc_logger()
1685 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_ioasc_logger()
1686 le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle), in pmcraid_ioasc_logger()
1747 static void pmcraid_process_ccn(struct pmcraid_cmd *cmd) in pmcraid_process_ccn() argument
1749 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_process_ccn()
1750 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_process_ccn()
1753 pinstance->ccn.cmd = NULL; in pmcraid_process_ccn()
1754 pmcraid_return_cmd(cmd); in pmcraid_process_ccn()
1782 static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd);
1784 static void pmcraid_process_ldn(struct pmcraid_cmd *cmd) in pmcraid_process_ldn() argument
1786 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_process_ldn()
1789 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_process_ldn()
1794 pinstance->ldn.cmd = NULL; in pmcraid_process_ldn()
1795 pmcraid_return_cmd(cmd); in pmcraid_process_ldn()
1816 pmcraid_set_timestamp(cmd); in pmcraid_process_ldn()
1826 cmd = pmcraid_init_hcam(pinstance, PMCRAID_HCAM_CODE_LOG_DATA); in pmcraid_process_ldn()
1827 if (cmd) in pmcraid_process_ldn()
1828 pmcraid_send_hcam_cmd(cmd); in pmcraid_process_ldn()
1849 static void pmcraid_unregister_hcams(struct pmcraid_cmd *cmd) in pmcraid_unregister_hcams() argument
1851 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_unregister_hcams()
1870 pmcraid_reset_alert(cmd); in pmcraid_unregister_hcams()
1878 pmcraid_cancel_ldn(cmd); in pmcraid_unregister_hcams()
1919 static void pmcraid_soft_reset(struct pmcraid_cmd *cmd) in pmcraid_soft_reset() argument
1921 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_soft_reset()
1929 cmd->cmd_done = pmcraid_ioa_reset; in pmcraid_soft_reset()
1930 cmd->timer.expires = jiffies + in pmcraid_soft_reset()
1932 cmd->timer.function = pmcraid_timeout_handler; in pmcraid_soft_reset()
1934 if (!timer_pending(&cmd->timer)) in pmcraid_soft_reset()
1935 add_timer(&cmd->timer); in pmcraid_soft_reset()
1988 struct pmcraid_cmd *cmd, *temp; in pmcraid_fail_outstanding_cmds() local
1995 list_for_each_entry_safe(cmd, temp, &pinstance->pending_cmd_pool, in pmcraid_fail_outstanding_cmds()
1997 list_del(&cmd->free_list); in pmcraid_fail_outstanding_cmds()
2000 cmd->ioa_cb->ioasa.ioasc = in pmcraid_fail_outstanding_cmds()
2002 cmd->ioa_cb->ioasa.ilid = in pmcraid_fail_outstanding_cmds()
2006 del_timer(&cmd->timer); in pmcraid_fail_outstanding_cmds()
2013 if (cmd->scsi_cmd) { in pmcraid_fail_outstanding_cmds()
2015 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_fail_outstanding_cmds()
2016 __le32 resp = cmd->ioa_cb->ioarcb.response_handle; in pmcraid_fail_outstanding_cmds()
2021 pmcraid_return_cmd(cmd); in pmcraid_fail_outstanding_cmds()
2025 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_fail_outstanding_cmds()
2028 } else if (cmd->cmd_done == pmcraid_internal_done || in pmcraid_fail_outstanding_cmds()
2029 cmd->cmd_done == pmcraid_erp_done) { in pmcraid_fail_outstanding_cmds()
2030 cmd->cmd_done(cmd); in pmcraid_fail_outstanding_cmds()
2031 } else if (cmd->cmd_done != pmcraid_ioa_reset && in pmcraid_fail_outstanding_cmds()
2032 cmd->cmd_done != pmcraid_ioa_shutdown_done) { in pmcraid_fail_outstanding_cmds()
2033 pmcraid_return_cmd(cmd); in pmcraid_fail_outstanding_cmds()
2058 static void pmcraid_ioa_reset(struct pmcraid_cmd *cmd) in pmcraid_ioa_reset() argument
2060 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_ioa_reset()
2065 if (pinstance->reset_cmd != cmd) { in pmcraid_ioa_reset()
2067 pinstance->reset_cmd = cmd; in pmcraid_ioa_reset()
2071 pinstance->ioa_state, cmd); in pmcraid_ioa_reset()
2091 pmcraid_reset_alert(cmd); in pmcraid_ioa_reset()
2109 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_reset()
2110 pmcraid_identify_hrrq(cmd); in pmcraid_ioa_reset()
2113 pmcraid_soft_reset(cmd); in pmcraid_ioa_reset()
2120 pmcraid_reset_alert(cmd); in pmcraid_ioa_reset()
2131 pmcraid_start_bist(cmd); in pmcraid_ioa_reset()
2168 pmcraid_reset_alert(cmd); in pmcraid_ioa_reset()
2192 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_reset()
2193 pmcraid_identify_hrrq(cmd); in pmcraid_ioa_reset()
2196 pmcraid_soft_reset(cmd); in pmcraid_ioa_reset()
2212 pmcraid_identify_hrrq(cmd); in pmcraid_ioa_reset()
2238 pmcraid_reinit_cmdblk(cmd); in pmcraid_ioa_reset()
2239 pmcraid_unregister_hcams(cmd); in pmcraid_ioa_reset()
2255 pmcraid_return_cmd(cmd); in pmcraid_ioa_reset()
2282 struct pmcraid_cmd *cmd; in pmcraid_initiate_reset() local
2289 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_initiate_reset()
2291 if (cmd == NULL) { in pmcraid_initiate_reset()
2297 pinstance->reset_cmd = cmd; in pmcraid_initiate_reset()
2301 pmcraid_ioa_reset(cmd); in pmcraid_initiate_reset()
2421 static void pmcraid_request_sense(struct pmcraid_cmd *cmd) in pmcraid_request_sense() argument
2423 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_request_sense()
2425 struct device *dev = &cmd->drv_inst->pdev->dev; in pmcraid_request_sense()
2427 cmd->sense_buffer = cmd->scsi_cmd->sense_buffer; in pmcraid_request_sense()
2428 cmd->sense_buffer_dma = dma_map_single(dev, cmd->sense_buffer, in pmcraid_request_sense()
2430 if (dma_mapping_error(dev, cmd->sense_buffer_dma)) { in pmcraid_request_sense()
2433 pmcraid_erp_done(cmd); in pmcraid_request_sense()
2438 memset(&cmd->ioa_cb->ioasa, 0, sizeof(struct pmcraid_ioasa)); in pmcraid_request_sense()
2447 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_request_sense()
2454 ioadl->address = cpu_to_le64(cmd->sense_buffer_dma); in pmcraid_request_sense()
2463 pmcraid_send_cmd(cmd, pmcraid_erp_done, in pmcraid_request_sense()
2475 static void pmcraid_cancel_all(struct pmcraid_cmd *cmd, bool need_sense) in pmcraid_cancel_all() argument
2477 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_cancel_all()
2478 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_cancel_all()
2497 pmcraid_send_cmd(cmd, need_sense ? in pmcraid_cancel_all()
2511 static void pmcraid_frame_auto_sense(struct pmcraid_cmd *cmd) in pmcraid_frame_auto_sense() argument
2513 u8 *sense_buf = cmd->scsi_cmd->sense_buffer; in pmcraid_frame_auto_sense()
2514 struct pmcraid_resource_entry *res = cmd->scsi_cmd->device->hostdata; in pmcraid_frame_auto_sense()
2515 struct pmcraid_ioasa *ioasa = &cmd->ioa_cb->ioasa; in pmcraid_frame_auto_sense()
2520 cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION; in pmcraid_frame_auto_sense()
2583 static int pmcraid_error_handler(struct pmcraid_cmd *cmd) in pmcraid_error_handler() argument
2585 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_error_handler()
2587 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_error_handler()
2588 struct pmcraid_ioasa *ioasa = &cmd->ioa_cb->ioasa; in pmcraid_error_handler()
2606 pmcraid_frame_auto_sense(cmd); in pmcraid_error_handler()
2610 pmcraid_ioasc_logger(ioasc, cmd); in pmcraid_error_handler()
2667 pmcraid_cancel_all(cmd, sense_copied); in pmcraid_error_handler()
2669 pmcraid_erp_done(cmd); in pmcraid_error_handler()
2671 pmcraid_request_sense(cmd); in pmcraid_error_handler()
2705 struct pmcraid_cmd *cmd; in pmcraid_reset_device() local
2740 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_reset_device()
2742 if (cmd == NULL) { in pmcraid_reset_device()
2748 ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_reset_device()
2759 init_completion(&cmd->wait_for_completion); in pmcraid_reset_device()
2760 cmd->completion_req = 1; in pmcraid_reset_device()
2763 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_reset_device()
2764 le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle), in pmcraid_reset_device()
2765 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2); in pmcraid_reset_device()
2767 pmcraid_send_cmd(cmd, in pmcraid_reset_device()
2778 wait_for_completion(&cmd->wait_for_completion); in pmcraid_reset_device()
2783 pmcraid_return_cmd(cmd); in pmcraid_reset_device()
2785 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_reset_device()
2807 static int _pmcraid_io_done(struct pmcraid_cmd *cmd, int reslen, int ioasc) in _pmcraid_io_done() argument
2809 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in _pmcraid_io_done()
2815 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2, in _pmcraid_io_done()
2816 cmd->ioa_cb->ioarcb.cdb[0], in _pmcraid_io_done()
2820 rc = pmcraid_error_handler(cmd); in _pmcraid_io_done()
2842 static void pmcraid_io_done(struct pmcraid_cmd *cmd) in pmcraid_io_done() argument
2844 u32 ioasc = le32_to_cpu(cmd->ioa_cb->ioasa.ioasc); in pmcraid_io_done()
2845 u32 reslen = le32_to_cpu(cmd->ioa_cb->ioasa.residual_data_length); in pmcraid_io_done()
2847 if (_pmcraid_io_done(cmd, reslen, ioasc) == 0) in pmcraid_io_done()
2848 pmcraid_return_cmd(cmd); in pmcraid_io_done()
2859 static struct pmcraid_cmd *pmcraid_abort_cmd(struct pmcraid_cmd *cmd) in pmcraid_abort_cmd() argument
2864 pinstance = (struct pmcraid_instance *)cmd->drv_inst; in pmcraid_abort_cmd()
2873 pmcraid_prepare_cancel_cmd(cancel_cmd, cmd); in pmcraid_abort_cmd()
2876 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_abort_cmd()
2877 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2); in pmcraid_abort_cmd()
2943 struct pmcraid_cmd *cmd; in pmcraid_eh_abort_handler() local
2982 list_for_each_entry(cmd, &pinstance->pending_cmd_pool, free_list) { in pmcraid_eh_abort_handler()
2984 if (cmd->scsi_cmd == scsi_cmd) { in pmcraid_eh_abort_handler()
2997 cancel_cmd = pmcraid_abort_cmd(cmd); in pmcraid_eh_abort_handler()
3003 cancel_cmd->res = cmd->scsi_cmd->device->hostdata; in pmcraid_eh_abort_handler()
3095 pmcraid_init_ioadls(struct pmcraid_cmd *cmd, int sgcount) in pmcraid_init_ioadls() argument
3098 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_init_ioadls()
3113 cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_init_ioadls()
3119 cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_init_ioadls()
3144 struct pmcraid_cmd *cmd in pmcraid_build_ioadl() argument
3150 struct scsi_cmnd *scsi_cmd = cmd->scsi_cmd; in pmcraid_build_ioadl()
3151 struct pmcraid_ioarcb *ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_build_ioadl()
3177 ioadl = pmcraid_init_ioadls(cmd, nseg); in pmcraid_build_ioadl()
3331 struct pmcraid_cmd *cmd; in pmcraid_queuecommand_lck() local
3366 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_queuecommand_lck()
3368 if (cmd == NULL) { in pmcraid_queuecommand_lck()
3373 cmd->scsi_cmd = scsi_cmd; in pmcraid_queuecommand_lck()
3374 ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_queuecommand_lck()
3386 cmd->cmd_done = pmcraid_io_done; in pmcraid_queuecommand_lck()
3406 rc = pmcraid_build_ioadl(pinstance, cmd); in pmcraid_queuecommand_lck()
3421 _pmcraid_fire_command(cmd); in pmcraid_queuecommand_lck()
3424 pmcraid_return_cmd(cmd); in pmcraid_queuecommand_lck()
3482 struct pmcraid_cmd *cmd, in pmcraid_build_passthrough_ioadls() argument
3489 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_build_passthrough_ioadls()
3500 sglist->num_dma_sg = dma_map_sg(&cmd->drv_inst->pdev->dev, in pmcraid_build_passthrough_ioadls()
3505 dev_err(&cmd->drv_inst->pdev->dev, in pmcraid_build_passthrough_ioadls()
3511 cmd->sglist = sglist; in pmcraid_build_passthrough_ioadls()
3514 ioadl = pmcraid_init_ioadls(cmd, sglist->num_dma_sg); in pmcraid_build_passthrough_ioadls()
3541 struct pmcraid_cmd *cmd, in pmcraid_release_passthrough_ioadls() argument
3546 struct pmcraid_sglist *sglist = cmd->sglist; in pmcraid_release_passthrough_ioadls()
3549 dma_unmap_sg(&cmd->drv_inst->pdev->dev, in pmcraid_release_passthrough_ioadls()
3554 cmd->sglist = NULL; in pmcraid_release_passthrough_ioadls()
3577 struct pmcraid_cmd *cmd; in pmcraid_ioctl_passthrough() local
3652 cmd = pmcraid_get_free_cmd(pinstance); in pmcraid_ioctl_passthrough()
3654 if (!cmd) { in pmcraid_ioctl_passthrough()
3660 cmd->scsi_cmd = NULL; in pmcraid_ioctl_passthrough()
3661 ioarcb = &(cmd->ioa_cb->ioarcb); in pmcraid_ioctl_passthrough()
3691 rc = pmcraid_build_passthrough_ioadls(cmd, in pmcraid_ioctl_passthrough()
3704 rc = pmcraid_copy_sglist(cmd->sglist, in pmcraid_ioctl_passthrough()
3717 cmd->cmd_done = pmcraid_internal_done; in pmcraid_ioctl_passthrough()
3718 init_completion(&cmd->wait_for_completion); in pmcraid_ioctl_passthrough()
3719 cmd->completion_req = 1; in pmcraid_ioctl_passthrough()
3722 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2, in pmcraid_ioctl_passthrough()
3723 cmd->ioa_cb->ioarcb.cdb[0], in pmcraid_ioctl_passthrough()
3724 le32_to_cpu(cmd->ioa_cb->ioarcb.resource_handle)); in pmcraid_ioctl_passthrough()
3727 _pmcraid_fire_command(cmd); in pmcraid_ioctl_passthrough()
3743 wait_for_completion(&cmd->wait_for_completion); in pmcraid_ioctl_passthrough()
3745 &cmd->wait_for_completion, in pmcraid_ioctl_passthrough()
3749 le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2, in pmcraid_ioctl_passthrough()
3750 cmd->ioa_cb->ioarcb.cdb[0]); in pmcraid_ioctl_passthrough()
3753 cancel_cmd = pmcraid_abort_cmd(cmd); in pmcraid_ioctl_passthrough()
3780 &cmd->wait_for_completion, in pmcraid_ioctl_passthrough()
3782 pmcraid_reset_bringup(cmd->drv_inst); in pmcraid_ioctl_passthrough()
3792 if (copy_to_user(ioasa, &cmd->ioa_cb->ioasa, in pmcraid_ioctl_passthrough()
3802 rc = pmcraid_copy_sglist(cmd->sglist, in pmcraid_ioctl_passthrough()
3813 pmcraid_release_passthrough_ioadls(cmd, request_size, direction); in pmcraid_ioctl_passthrough()
3816 pmcraid_return_cmd(cmd); in pmcraid_ioctl_passthrough()
3840 unsigned int cmd, in pmcraid_ioctl_driver() argument
3847 switch (cmd) { in pmcraid_ioctl_driver()
3873 int cmd, in pmcraid_check_ioctl_buffer() argument
3902 unsigned int cmd, in pmcraid_chr_ioctl() argument
3918 retval = pmcraid_check_ioctl_buffer(cmd, argp, hdr); in pmcraid_chr_ioctl()
3934 switch (_IOC_TYPE(cmd)) { in pmcraid_chr_ioctl()
3940 if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE) in pmcraid_chr_ioctl()
3943 retval = pmcraid_ioctl_passthrough(pinstance, cmd, in pmcraid_chr_ioctl()
3946 if (cmd == PMCRAID_IOCTL_DOWNLOAD_MICROCODE) in pmcraid_chr_ioctl()
3952 retval = pmcraid_ioctl_driver(pinstance, cmd, in pmcraid_chr_ioctl()
4411 struct pmcraid_cmd *cmd = NULL; in pmcraid_tasklet_function() local
4427 cmd = pinstance->cmd_list[cmd_index]; in pmcraid_tasklet_function()
4432 list_del(&cmd->free_list); in pmcraid_tasklet_function()
4435 del_timer(&cmd->timer); in pmcraid_tasklet_function()
4438 if (cmd->cmd_done == pmcraid_ioa_reset) { in pmcraid_tasklet_function()
4441 cmd->cmd_done(cmd); in pmcraid_tasklet_function()
4444 } else if (cmd->cmd_done != NULL) { in pmcraid_tasklet_function()
4445 cmd->cmd_done(cmd); in pmcraid_tasklet_function()
5354 static void pmcraid_complete_ioa_reset(struct pmcraid_cmd *cmd) in pmcraid_complete_ioa_reset() argument
5356 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_complete_ioa_reset()
5360 pmcraid_ioa_reset(cmd); in pmcraid_complete_ioa_reset()
5374 static void pmcraid_set_supported_devs(struct pmcraid_cmd *cmd) in pmcraid_set_supported_devs() argument
5376 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_set_supported_devs()
5379 pmcraid_reinit_cmdblk(cmd); in pmcraid_set_supported_devs()
5390 if (cmd->drv_inst->reinit_cfg_table) { in pmcraid_set_supported_devs()
5391 cmd->drv_inst->reinit_cfg_table = 0; in pmcraid_set_supported_devs()
5392 cmd->release = 1; in pmcraid_set_supported_devs()
5400 pmcraid_send_cmd(cmd, in pmcraid_set_supported_devs()
5415 static void pmcraid_set_timestamp(struct pmcraid_cmd *cmd) in pmcraid_set_timestamp() argument
5417 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_set_timestamp()
5418 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_set_timestamp()
5432 pmcraid_reinit_cmdblk(cmd); in pmcraid_set_timestamp()
5439 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_set_timestamp()
5456 pmcraid_send_cmd(cmd, pmcraid_set_supported_devs, in pmcraid_set_timestamp()
5459 pmcraid_send_cmd(cmd, pmcraid_return_cmd, in pmcraid_set_timestamp()
5478 static void pmcraid_init_res_table(struct pmcraid_cmd *cmd) in pmcraid_init_res_table() argument
5480 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_init_res_table()
5577 pmcraid_set_timestamp(cmd); in pmcraid_init_res_table()
5590 static void pmcraid_querycfg(struct pmcraid_cmd *cmd) in pmcraid_querycfg() argument
5592 struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb; in pmcraid_querycfg()
5594 struct pmcraid_instance *pinstance = cmd->drv_inst; in pmcraid_querycfg()
5616 ioarcb->ioadl_bus_addr = cpu_to_le64((cmd->ioa_cb_bus_addr) + in pmcraid_querycfg()
5631 pmcraid_send_cmd(cmd, pmcraid_init_res_table, in pmcraid_querycfg()