Lines Matching refs:ipr_cmd
582 static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd, in ipr_trc_hook() argument
586 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_trc_hook()
592 trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0]; in ipr_trc_hook()
594 trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff; in ipr_trc_hook()
595 trace_entry->res_handle = ipr_cmd->ioarcb.res_handle; in ipr_trc_hook()
600 #define ipr_trc_hook(ipr_cmd, type, add_data) do { } while (0) argument
610 static void ipr_lock_and_done(struct ipr_cmnd *ipr_cmd) in ipr_lock_and_done() argument
613 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_lock_and_done()
616 ipr_cmd->done(ipr_cmd); in ipr_lock_and_done()
627 static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd) in ipr_reinit_ipr_cmnd() argument
629 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_reinit_ipr_cmnd()
630 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_reinit_ipr_cmnd()
631 dma_addr_t dma_addr = ipr_cmd->dma_addr; in ipr_reinit_ipr_cmnd()
642 if (ipr_cmd->ioa_cfg->sis64) { in ipr_reinit_ipr_cmnd()
653 ipr_cmd->scsi_cmd = NULL; in ipr_reinit_ipr_cmnd()
654 ipr_cmd->sense_buffer[0] = 0; in ipr_reinit_ipr_cmnd()
655 ipr_cmd->dma_use_sg = 0; in ipr_reinit_ipr_cmnd()
666 static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd, in ipr_init_ipr_cmnd() argument
669 ipr_reinit_ipr_cmnd(ipr_cmd); in ipr_init_ipr_cmnd()
670 ipr_cmd->u.scratch = 0; in ipr_init_ipr_cmnd()
671 ipr_cmd->sibling = NULL; in ipr_init_ipr_cmnd()
672 ipr_cmd->eh_comp = NULL; in ipr_init_ipr_cmnd()
673 ipr_cmd->fast_done = fast_done; in ipr_init_ipr_cmnd()
674 timer_setup(&ipr_cmd->timer, NULL, 0); in ipr_init_ipr_cmnd()
687 struct ipr_cmnd *ipr_cmd = NULL; in __ipr_get_free_ipr_cmnd() local
690 ipr_cmd = list_entry(hrrq->hrrq_free_q.next, in __ipr_get_free_ipr_cmnd()
692 list_del(&ipr_cmd->queue); in __ipr_get_free_ipr_cmnd()
696 return ipr_cmd; in __ipr_get_free_ipr_cmnd()
709 struct ipr_cmnd *ipr_cmd = in ipr_get_free_ipr_cmnd() local
711 ipr_init_ipr_cmnd(ipr_cmd, ipr_lock_and_done); in ipr_get_free_ipr_cmnd()
712 return ipr_cmd; in ipr_get_free_ipr_cmnd()
812 static void __ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd) in __ipr_scsi_eh_done() argument
814 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in __ipr_scsi_eh_done()
818 scsi_dma_unmap(ipr_cmd->scsi_cmd); in __ipr_scsi_eh_done()
820 if (ipr_cmd->eh_comp) in __ipr_scsi_eh_done()
821 complete(ipr_cmd->eh_comp); in __ipr_scsi_eh_done()
822 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in __ipr_scsi_eh_done()
835 static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd) in ipr_scsi_eh_done() argument
838 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq; in ipr_scsi_eh_done()
841 __ipr_scsi_eh_done(ipr_cmd); in ipr_scsi_eh_done()
856 struct ipr_cmnd *ipr_cmd, *temp; in ipr_fail_all_ops() local
862 list_for_each_entry_safe(ipr_cmd, in ipr_fail_all_ops()
864 list_del(&ipr_cmd->queue); in ipr_fail_all_ops()
866 ipr_cmd->s.ioasa.hdr.ioasc = in ipr_fail_all_ops()
868 ipr_cmd->s.ioasa.hdr.ilid = in ipr_fail_all_ops()
871 if (ipr_cmd->scsi_cmd) in ipr_fail_all_ops()
872 ipr_cmd->done = __ipr_scsi_eh_done; in ipr_fail_all_ops()
874 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, in ipr_fail_all_ops()
876 timer_delete(&ipr_cmd->timer); in ipr_fail_all_ops()
877 ipr_cmd->done(ipr_cmd); in ipr_fail_all_ops()
895 static void ipr_send_command(struct ipr_cmnd *ipr_cmd) in ipr_send_command() argument
897 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_send_command()
898 dma_addr_t send_dma_addr = ipr_cmd->dma_addr; in ipr_send_command()
906 if (ipr_cmd->dma_use_sg * sizeof(struct ipr_ioadl64_desc) > 128 ) in ipr_send_command()
926 static void ipr_do_req(struct ipr_cmnd *ipr_cmd, in ipr_do_req() argument
930 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_do_req()
932 ipr_cmd->done = done; in ipr_do_req()
934 ipr_cmd->timer.expires = jiffies + timeout; in ipr_do_req()
935 ipr_cmd->timer.function = timeout_func; in ipr_do_req()
937 add_timer(&ipr_cmd->timer); in ipr_do_req()
939 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, 0); in ipr_do_req()
941 ipr_send_command(ipr_cmd); in ipr_do_req()
954 static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd) in ipr_internal_cmd_done() argument
956 if (ipr_cmd->sibling) in ipr_internal_cmd_done()
957 ipr_cmd->sibling = NULL; in ipr_internal_cmd_done()
959 complete(&ipr_cmd->completion); in ipr_internal_cmd_done()
975 static void ipr_init_ioadl(struct ipr_cmnd *ipr_cmd, dma_addr_t dma_addr, in ipr_init_ioadl() argument
978 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; in ipr_init_ioadl()
979 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; in ipr_init_ioadl()
981 ipr_cmd->dma_use_sg = 1; in ipr_init_ioadl()
983 if (ipr_cmd->ioa_cfg->sis64) { in ipr_init_ioadl()
988 ipr_cmd->ioarcb.ioadl_len = in ipr_init_ioadl()
990 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len); in ipr_init_ioadl()
996 ipr_cmd->ioarcb.read_ioadl_len = in ipr_init_ioadl()
998 ipr_cmd->ioarcb.read_data_transfer_length = cpu_to_be32(len); in ipr_init_ioadl()
1000 ipr_cmd->ioarcb.ioadl_len = in ipr_init_ioadl()
1002 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len); in ipr_init_ioadl()
1016 static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd, in ipr_send_blocking_cmd() argument
1020 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_send_blocking_cmd()
1022 init_completion(&ipr_cmd->completion); in ipr_send_blocking_cmd()
1023 ipr_do_req(ipr_cmd, ipr_internal_cmd_done, timeout_func, timeout); in ipr_send_blocking_cmd()
1026 wait_for_completion(&ipr_cmd->completion); in ipr_send_blocking_cmd()
1059 struct ipr_cmnd *ipr_cmd; in ipr_send_hcam() local
1063 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_send_hcam()
1064 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_send_hcam()
1067 ipr_cmd->u.hostrcb = hostrcb; in ipr_send_hcam()
1068 ioarcb = &ipr_cmd->ioarcb; in ipr_send_hcam()
1077 ipr_init_ioadl(ipr_cmd, hostrcb->hostrcb_dma, in ipr_send_hcam()
1081 ipr_cmd->done = ipr_process_ccn; in ipr_send_hcam()
1083 ipr_cmd->done = ipr_process_error; in ipr_send_hcam()
1085 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_IOA_RES_ADDR); in ipr_send_hcam()
1087 ipr_send_command(ipr_cmd); in ipr_send_hcam()
1409 static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd) in ipr_process_ccn() argument
1411 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_process_ccn()
1412 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb; in ipr_process_ccn()
1413 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_process_ccn()
1416 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_process_ccn()
2548 static void ipr_process_error(struct ipr_cmnd *ipr_cmd) in ipr_process_error() argument
2550 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_process_error()
2551 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb; in ipr_process_error()
2552 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_process_error()
2561 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_process_error()
2592 struct ipr_cmnd *ipr_cmd = timer_container_of(ipr_cmd, t, timer); in ipr_timeout() local
2594 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_timeout()
2606 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) in ipr_timeout()
2625 struct ipr_cmnd *ipr_cmd = timer_container_of(ipr_cmd, t, timer); in ipr_oper_timeout() local
2627 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_oper_timeout()
2639 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) { in ipr_oper_timeout()
3868 static void ipr_build_ucode_ioadl64(struct ipr_cmnd *ipr_cmd, in ipr_build_ucode_ioadl64() argument
3871 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ucode_ioadl64()
3872 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; in ipr_build_ucode_ioadl64()
3877 ipr_cmd->dma_use_sg = sglist->num_dma_sg; in ipr_build_ucode_ioadl64()
3882 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg); in ipr_build_ucode_ioadl64()
3883 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ucode_ioadl64()
3900 static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd, in ipr_build_ucode_ioadl() argument
3903 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ucode_ioadl()
3904 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; in ipr_build_ucode_ioadl()
3909 ipr_cmd->dma_use_sg = sglist->num_dma_sg; in ipr_build_ucode_ioadl()
3914 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); in ipr_build_ucode_ioadl()
3916 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ucode_ioadl()
4870 static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device) in ipr_match_lun() argument
4872 if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device) in ipr_match_lun()
4884 static bool ipr_cmnd_is_free(struct ipr_cmnd *ipr_cmd) in ipr_cmnd_is_free() argument
4888 list_for_each_entry(loop_cmd, &ipr_cmd->hrrq->hrrq_free_q, queue) { in ipr_cmnd_is_free()
4889 if (loop_cmd == ipr_cmd) in ipr_cmnd_is_free()
4908 struct ipr_cmnd *ipr_cmd; in ipr_wait_for_ops() local
4922 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in ipr_wait_for_ops()
4923 if (!ipr_cmnd_is_free(ipr_cmd)) { in ipr_wait_for_ops()
4924 if (match(ipr_cmd, device)) { in ipr_wait_for_ops()
4925 ipr_cmd->eh_comp = ∁ in ipr_wait_for_ops()
4942 ipr_cmd = ioa_cfg->ipr_cmnd_list[i]; in ipr_wait_for_ops()
4943 if (!ipr_cmnd_is_free(ipr_cmd)) { in ipr_wait_for_ops()
4944 if (match(ipr_cmd, device)) { in ipr_wait_for_ops()
4945 ipr_cmd->eh_comp = NULL; in ipr_wait_for_ops()
5016 struct ipr_cmnd *ipr_cmd; in ipr_device_reset() local
5022 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_device_reset()
5023 ioarcb = &ipr_cmd->ioarcb; in ipr_device_reset()
5026 if (ipr_cmd->ioa_cfg->sis64) in ipr_device_reset()
5033 ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); in ipr_device_reset()
5034 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_device_reset()
5035 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_device_reset()
5114 static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd) in ipr_bus_reset_done() argument
5116 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_bus_reset_done()
5122 if (res->res_handle == ipr_cmd->ioarcb.res_handle) { in ipr_bus_reset_done()
5132 if (ipr_cmd->sibling->sibling) in ipr_bus_reset_done()
5133 ipr_cmd->sibling->sibling = NULL; in ipr_bus_reset_done()
5135 ipr_cmd->sibling->done(ipr_cmd->sibling); in ipr_bus_reset_done()
5137 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_bus_reset_done()
5154 struct ipr_cmnd *ipr_cmd = timer_container_of(ipr_cmd, t, timer); in ipr_abort_timeout() local
5156 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_abort_timeout()
5162 if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) { in ipr_abort_timeout()
5167 sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n"); in ipr_abort_timeout()
5169 ipr_cmd->sibling = reset_cmd; in ipr_abort_timeout()
5170 reset_cmd->sibling = ipr_cmd; in ipr_abort_timeout()
5171 reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle; in ipr_abort_timeout()
5193 struct ipr_cmnd *ipr_cmd; in ipr_cancel_op() local
5241 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_cancel_op()
5242 ipr_cmd->ioarcb.res_handle = res->res_handle; in ipr_cancel_op()
5243 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in ipr_cancel_op()
5246 ipr_cmd->u.sdev = scsi_cmd->device; in ipr_cancel_op()
5250 ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT); in ipr_cancel_op()
5251 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_cancel_op()
5262 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_cancel_op()
5421 struct ipr_cmnd *ipr_cmd; in ipr_process_hrrq() local
5444 ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index]; in ipr_process_hrrq()
5445 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_process_hrrq()
5447 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, ioasc); in ipr_process_hrrq()
5449 list_move_tail(&ipr_cmd->queue, doneq); in ipr_process_hrrq()
5468 struct ipr_cmnd *ipr_cmd, *temp; in ipr_iopoll() local
5482 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) { in ipr_iopoll()
5483 list_del(&ipr_cmd->queue); in ipr_iopoll()
5484 timer_delete(&ipr_cmd->timer); in ipr_iopoll()
5485 ipr_cmd->fast_done(ipr_cmd); in ipr_iopoll()
5507 struct ipr_cmnd *ipr_cmd, *temp; in ipr_isr() local
5551 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) { in ipr_isr()
5552 list_del(&ipr_cmd->queue); in ipr_isr()
5553 timer_delete(&ipr_cmd->timer); in ipr_isr()
5554 ipr_cmd->fast_done(ipr_cmd); in ipr_isr()
5572 struct ipr_cmnd *ipr_cmd, *temp; in ipr_isr_mhrrq() local
5601 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) { in ipr_isr_mhrrq()
5602 list_del(&ipr_cmd->queue); in ipr_isr_mhrrq()
5603 timer_delete(&ipr_cmd->timer); in ipr_isr_mhrrq()
5604 ipr_cmd->fast_done(ipr_cmd); in ipr_isr_mhrrq()
5618 struct ipr_cmnd *ipr_cmd) in ipr_build_ioadl64() argument
5624 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_build_ioadl64()
5625 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ioadl64()
5626 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64; in ipr_build_ioadl64()
5639 ipr_cmd->dma_use_sg = nseg; in ipr_build_ioadl64()
5643 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg); in ipr_build_ioadl64()
5651 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ioadl64()
5670 struct ipr_cmnd *ipr_cmd) in ipr_build_ioadl() argument
5676 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_build_ioadl()
5677 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ioadl()
5678 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl; in ipr_build_ioadl()
5690 ipr_cmd->dma_use_sg = nseg; in ipr_build_ioadl()
5697 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); in ipr_build_ioadl()
5702 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg); in ipr_build_ioadl()
5705 if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->u.add_data.u.ioadl)) { in ipr_build_ioadl()
5707 ioarcb->write_ioadl_addr = cpu_to_be32((ipr_cmd->dma_addr) + in ipr_build_ioadl()
5712 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) { in ipr_build_ioadl()
5732 static void __ipr_erp_done(struct ipr_cmnd *ipr_cmd) in __ipr_erp_done() argument
5734 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in __ipr_erp_done()
5736 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in __ipr_erp_done()
5743 memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer, in __ipr_erp_done()
5752 scsi_dma_unmap(ipr_cmd->scsi_cmd); in __ipr_erp_done()
5754 if (ipr_cmd->eh_comp) in __ipr_erp_done()
5755 complete(ipr_cmd->eh_comp); in __ipr_erp_done()
5756 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in __ipr_erp_done()
5769 static void ipr_erp_done(struct ipr_cmnd *ipr_cmd) in ipr_erp_done() argument
5771 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq; in ipr_erp_done()
5775 __ipr_erp_done(ipr_cmd); in ipr_erp_done()
5786 static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd) in ipr_reinit_ipr_cmnd_for_erp() argument
5788 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_reinit_ipr_cmnd_for_erp()
5789 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_reinit_ipr_cmnd_for_erp()
5790 dma_addr_t dma_addr = ipr_cmd->dma_addr; in ipr_reinit_ipr_cmnd_for_erp()
5800 if (ipr_cmd->ioa_cfg->sis64) in ipr_reinit_ipr_cmnd_for_erp()
5820 static void __ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd) in __ipr_erp_request_sense() argument
5822 struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in __ipr_erp_request_sense()
5823 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in __ipr_erp_request_sense()
5826 __ipr_erp_done(ipr_cmd); in __ipr_erp_request_sense()
5830 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd); in __ipr_erp_request_sense()
5839 ipr_init_ioadl(ipr_cmd, ipr_cmd->sense_buffer_dma, in __ipr_erp_request_sense()
5842 ipr_do_req(ipr_cmd, ipr_erp_done, ipr_timeout, in __ipr_erp_request_sense()
5856 static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd) in ipr_erp_request_sense() argument
5858 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq; in ipr_erp_request_sense()
5862 __ipr_erp_request_sense(ipr_cmd); in ipr_erp_request_sense()
5878 static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd) in ipr_erp_cancel_all() argument
5880 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_erp_cancel_all()
5886 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd); in ipr_erp_cancel_all()
5889 __ipr_erp_request_sense(ipr_cmd); in ipr_erp_cancel_all()
5893 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in ipr_erp_cancel_all()
5897 ipr_do_req(ipr_cmd, ipr_erp_request_sense, ipr_timeout, in ipr_erp_cancel_all()
5915 struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res) in ipr_dump_ioasa() argument
5920 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_dump_ioasa()
5976 static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd) in ipr_gen_sense() argument
5979 u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer; in ipr_gen_sense()
5980 struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata; in ipr_gen_sense()
5981 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_gen_sense()
5989 ipr_cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION; in ipr_gen_sense()
6069 static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd) in ipr_get_autosense() argument
6071 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa; in ipr_get_autosense()
6072 struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64; in ipr_get_autosense()
6077 if (ipr_cmd->ioa_cfg->sis64) in ipr_get_autosense()
6078 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa64->auto_sense.data, in ipr_get_autosense()
6082 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data, in ipr_get_autosense()
6100 struct ipr_cmnd *ipr_cmd) in ipr_erp_start() argument
6102 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_erp_start()
6104 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_erp_start()
6108 __ipr_scsi_eh_done(ipr_cmd); in ipr_erp_start()
6113 ipr_gen_sense(ipr_cmd); in ipr_erp_start()
6115 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res); in ipr_erp_start()
6162 if (!ipr_get_autosense(ipr_cmd)) { in ipr_erp_start()
6164 ipr_erp_cancel_all(ipr_cmd); in ipr_erp_start()
6189 scsi_dma_unmap(ipr_cmd->scsi_cmd); in ipr_erp_start()
6191 if (ipr_cmd->eh_comp) in ipr_erp_start()
6192 complete(ipr_cmd->eh_comp); in ipr_erp_start()
6193 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_erp_start()
6206 static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd) in ipr_scsi_done() argument
6208 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_scsi_done()
6209 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd; in ipr_scsi_done()
6210 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_scsi_done()
6213 scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len)); in ipr_scsi_done()
6218 spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags); in ipr_scsi_done()
6220 if (ipr_cmd->eh_comp) in ipr_scsi_done()
6221 complete(ipr_cmd->eh_comp); in ipr_scsi_done()
6222 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_scsi_done()
6223 spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags); in ipr_scsi_done()
6226 spin_lock(&ipr_cmd->hrrq->_lock); in ipr_scsi_done()
6227 ipr_erp_start(ioa_cfg, ipr_cmd); in ipr_scsi_done()
6228 spin_unlock(&ipr_cmd->hrrq->_lock); in ipr_scsi_done()
6251 struct ipr_cmnd *ipr_cmd; in ipr_queuecommand() local
6285 ipr_cmd = __ipr_get_free_ipr_cmnd(hrrq); in ipr_queuecommand()
6286 if (ipr_cmd == NULL) { in ipr_queuecommand()
6292 ipr_init_ipr_cmnd(ipr_cmd, ipr_scsi_done); in ipr_queuecommand()
6293 ioarcb = &ipr_cmd->ioarcb; in ipr_queuecommand()
6296 ipr_cmd->scsi_cmd = scsi_cmd; in ipr_queuecommand()
6297 ipr_cmd->done = ipr_scsi_eh_done; in ipr_queuecommand()
6331 rc = ipr_build_ioadl64(ioa_cfg, ipr_cmd); in ipr_queuecommand()
6333 rc = ipr_build_ioadl(ioa_cfg, ipr_cmd); in ipr_queuecommand()
6337 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q); in ipr_queuecommand()
6345 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q); in ipr_queuecommand()
6356 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_pending_q); in ipr_queuecommand()
6357 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res)); in ipr_queuecommand()
6358 ipr_send_command(ipr_cmd); in ipr_queuecommand()
6428 static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd) in ipr_ioa_bringdown_done() argument
6430 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioa_bringdown_done()
6449 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_ioa_bringdown_done()
6467 static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd) in ipr_ioa_reset_done() argument
6469 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioa_reset_done()
6508 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_ioa_reset_done()
6545 static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd) in ipr_set_supported_devs() argument
6547 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_set_supported_devs()
6549 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_set_supported_devs()
6550 struct ipr_resource_entry *res = ipr_cmd->u.res; in ipr_set_supported_devs()
6552 ipr_cmd->job_step = ipr_ioa_reset_done; in ipr_set_supported_devs()
6558 ipr_cmd->u.res = res; in ipr_set_supported_devs()
6570 ipr_init_ioadl(ipr_cmd, in ipr_set_supported_devs()
6576 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, in ipr_set_supported_devs()
6580 ipr_cmd->job_step = ipr_set_supported_devs; in ipr_set_supported_devs()
6746 static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd, in ipr_build_mode_select() argument
6750 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_mode_select()
6759 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_WRITE_LAST); in ipr_build_mode_select()
6772 static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_mode_select_page28() argument
6774 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_select_page28()
6785 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11, in ipr_ioafp_mode_select_page28()
6789 ipr_cmd->job_step = ipr_set_supported_devs; in ipr_ioafp_mode_select_page28()
6790 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, in ipr_ioafp_mode_select_page28()
6792 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); in ipr_ioafp_mode_select_page28()
6809 static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd, in ipr_build_mode_sense() argument
6813 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_mode_sense()
6821 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST); in ipr_build_mode_sense()
6833 static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd) in ipr_reset_cmd_failed() argument
6835 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cmd_failed()
6836 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_cmd_failed()
6840 ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc); in ipr_reset_cmd_failed()
6843 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_reset_cmd_failed()
6857 static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd) in ipr_reset_mode_sense_failed() argument
6859 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_mode_sense_failed()
6860 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_mode_sense_failed()
6863 ipr_cmd->job_step = ipr_set_supported_devs; in ipr_reset_mode_sense_failed()
6864 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next, in ipr_reset_mode_sense_failed()
6869 return ipr_reset_cmd_failed(ipr_cmd); in ipr_reset_mode_sense_failed()
6882 static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_mode_sense_page28() argument
6884 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_sense_page28()
6887 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), in ipr_ioafp_mode_sense_page28()
6892 ipr_cmd->job_step = ipr_ioafp_mode_select_page28; in ipr_ioafp_mode_sense_page28()
6893 ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed; in ipr_ioafp_mode_sense_page28()
6895 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); in ipr_ioafp_mode_sense_page28()
6910 static int ipr_ioafp_mode_select_page24(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_mode_select_page24() argument
6912 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_select_page24()
6927 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11, in ipr_ioafp_mode_select_page24()
6931 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28; in ipr_ioafp_mode_select_page24()
6932 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); in ipr_ioafp_mode_select_page24()
6948 static int ipr_reset_mode_sense_page24_failed(struct ipr_cmnd *ipr_cmd) in ipr_reset_mode_sense_page24_failed() argument
6950 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_mode_sense_page24_failed()
6953 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28; in ipr_reset_mode_sense_page24_failed()
6957 return ipr_reset_cmd_failed(ipr_cmd); in ipr_reset_mode_sense_page24_failed()
6970 static int ipr_ioafp_mode_sense_page24(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_mode_sense_page24() argument
6972 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_mode_sense_page24()
6975 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), in ipr_ioafp_mode_sense_page24()
6980 ipr_cmd->job_step = ipr_ioafp_mode_select_page24; in ipr_ioafp_mode_sense_page24()
6981 ipr_cmd->job_step_failed = ipr_reset_mode_sense_page24_failed; in ipr_ioafp_mode_sense_page24()
6983 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); in ipr_ioafp_mode_sense_page24()
7001 static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd) in ipr_init_res_table() argument
7003 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_init_res_table()
7074 ipr_cmd->job_step = ipr_ioafp_mode_sense_page24; in ipr_init_res_table()
7076 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28; in ipr_init_res_table()
7092 static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_query_ioa_cfg() argument
7094 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_query_ioa_cfg()
7095 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_query_ioa_cfg()
7113 ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size, in ipr_ioafp_query_ioa_cfg()
7116 ipr_cmd->job_step = ipr_init_res_table; in ipr_ioafp_query_ioa_cfg()
7118 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); in ipr_ioafp_query_ioa_cfg()
7124 static int ipr_ioa_service_action_failed(struct ipr_cmnd *ipr_cmd) in ipr_ioa_service_action_failed() argument
7126 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_ioa_service_action_failed()
7131 return ipr_reset_cmd_failed(ipr_cmd); in ipr_ioa_service_action_failed()
7134 static void ipr_build_ioa_service_action(struct ipr_cmnd *ipr_cmd, in ipr_build_ioa_service_action() argument
7137 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_build_ioa_service_action()
7153 static int ipr_ioafp_set_caching_parameters(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_set_caching_parameters() argument
7155 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_set_caching_parameters()
7156 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_set_caching_parameters()
7161 ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg; in ipr_ioafp_set_caching_parameters()
7164 ipr_build_ioa_service_action(ipr_cmd, in ipr_ioafp_set_caching_parameters()
7170 ipr_cmd->job_step_failed = ipr_ioa_service_action_failed; in ipr_ioafp_set_caching_parameters()
7171 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, in ipr_ioafp_set_caching_parameters()
7195 static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page, in ipr_ioafp_inquiry() argument
7198 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_inquiry()
7209 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST); in ipr_ioafp_inquiry()
7211 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT); in ipr_ioafp_inquiry()
7246 static int ipr_ioafp_pageC4_inquiry(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_pageC4_inquiry() argument
7248 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_pageC4_inquiry()
7253 ipr_cmd->job_step = ipr_ioafp_set_caching_parameters; in ipr_ioafp_pageC4_inquiry()
7257 ipr_ioafp_inquiry(ipr_cmd, 1, 0xC4, in ipr_ioafp_pageC4_inquiry()
7279 static int ipr_ioafp_cap_inquiry(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_cap_inquiry() argument
7281 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_cap_inquiry()
7286 ipr_cmd->job_step = ipr_ioafp_pageC4_inquiry; in ipr_ioafp_cap_inquiry()
7290 ipr_ioafp_inquiry(ipr_cmd, 1, 0xD0, in ipr_ioafp_cap_inquiry()
7310 static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_page3_inquiry() argument
7312 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_page3_inquiry()
7316 ipr_cmd->job_step = ipr_ioafp_cap_inquiry; in ipr_ioafp_page3_inquiry()
7318 ipr_ioafp_inquiry(ipr_cmd, 1, 3, in ipr_ioafp_page3_inquiry()
7336 static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_page0_inquiry() argument
7338 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_page0_inquiry()
7348 ipr_cmd->job_step = ipr_ioafp_page3_inquiry; in ipr_ioafp_page0_inquiry()
7350 ipr_ioafp_inquiry(ipr_cmd, 1, 0, in ipr_ioafp_page0_inquiry()
7367 static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_std_inquiry() argument
7369 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_std_inquiry()
7372 ipr_cmd->job_step = ipr_ioafp_page0_inquiry; in ipr_ioafp_std_inquiry()
7374 ipr_ioafp_inquiry(ipr_cmd, 0, 0, in ipr_ioafp_std_inquiry()
7392 static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd) in ipr_ioafp_identify_hrrq() argument
7394 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_ioafp_identify_hrrq()
7395 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb; in ipr_ioafp_identify_hrrq()
7399 ipr_cmd->job_step = ipr_ioafp_std_inquiry; in ipr_ioafp_identify_hrrq()
7450 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, in ipr_ioafp_identify_hrrq()
7454 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_ioafp_identify_hrrq()
7479 struct ipr_cmnd *ipr_cmd = timer_container_of(ipr_cmd, t, timer); in ipr_reset_timer_done() local
7480 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_timer_done()
7485 if (ioa_cfg->reset_cmd == ipr_cmd) { in ipr_reset_timer_done()
7486 list_del(&ipr_cmd->queue); in ipr_reset_timer_done()
7487 ipr_cmd->done(ipr_cmd); in ipr_reset_timer_done()
7507 static void ipr_reset_start_timer(struct ipr_cmnd *ipr_cmd, in ipr_reset_start_timer() argument
7512 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_start_timer()
7513 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_start_timer()
7515 ipr_cmd->timer.expires = jiffies + timeout; in ipr_reset_start_timer()
7516 ipr_cmd->timer.function = ipr_reset_timer_done; in ipr_reset_start_timer()
7517 add_timer(&ipr_cmd->timer); in ipr_reset_start_timer()
7561 static int ipr_reset_next_stage(struct ipr_cmnd *ipr_cmd) in ipr_reset_next_stage() argument
7566 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_next_stage()
7587 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_reset_next_stage()
7591 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_reset_next_stage()
7600 ipr_cmd->timer.expires = jiffies + stage_time * HZ; in ipr_reset_next_stage()
7601 ipr_cmd->timer.function = ipr_oper_timeout; in ipr_reset_next_stage()
7602 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_next_stage()
7603 add_timer(&ipr_cmd->timer); in ipr_reset_next_stage()
7605 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_next_stage()
7620 static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd) in ipr_reset_enable_ioa() argument
7622 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_enable_ioa()
7628 ipr_cmd->job_step = ipr_ioafp_identify_hrrq; in ipr_reset_enable_ioa()
7666 ipr_cmd->job_step = ipr_reset_next_stage; in ipr_reset_enable_ioa()
7670 ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ); in ipr_reset_enable_ioa()
7671 ipr_cmd->timer.function = ipr_oper_timeout; in ipr_reset_enable_ioa()
7672 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_enable_ioa()
7673 add_timer(&ipr_cmd->timer); in ipr_reset_enable_ioa()
7674 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_enable_ioa()
7690 static int ipr_reset_wait_for_dump(struct ipr_cmnd *ipr_cmd) in ipr_reset_wait_for_dump() argument
7692 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_wait_for_dump()
7700 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_wait_for_dump()
7796 static int ipr_reset_get_unit_check_job(struct ipr_cmnd *ipr_cmd) in ipr_reset_get_unit_check_job() argument
7798 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_get_unit_check_job()
7803 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_get_unit_check_job()
7804 ipr_reset_start_timer(ipr_cmd, 0); in ipr_reset_get_unit_check_job()
7810 static int ipr_dump_mailbox_wait(struct ipr_cmnd *ipr_cmd) in ipr_dump_mailbox_wait() argument
7812 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_dump_mailbox_wait()
7819 if (!ioa_cfg->sis64 || !ipr_cmd->u.time_left || in ipr_dump_mailbox_wait()
7823 if (!ipr_cmd->u.time_left) in ipr_dump_mailbox_wait()
7830 ipr_reset_start_timer(ipr_cmd, IPR_SIS64_DUMP_TIMEOUT); in ipr_dump_mailbox_wait()
7832 ipr_reset_start_timer(ipr_cmd, IPR_SIS32_DUMP_TIMEOUT); in ipr_dump_mailbox_wait()
7833 ipr_cmd->job_step = ipr_reset_wait_for_dump; in ipr_dump_mailbox_wait()
7837 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT; in ipr_dump_mailbox_wait()
7838 ipr_reset_start_timer(ipr_cmd, in ipr_dump_mailbox_wait()
7881 static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd) in ipr_reset_restore_cfg_space() argument
7883 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_restore_cfg_space()
7889 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR); in ipr_reset_restore_cfg_space()
7904 ipr_cmd->job_step = ipr_reset_get_unit_check_job; in ipr_reset_restore_cfg_space()
7905 ipr_reset_start_timer(ipr_cmd, IPR_DUMP_DELAY_TIMEOUT); in ipr_reset_restore_cfg_space()
7910 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_restore_cfg_space()
7911 ipr_reset_start_timer(ipr_cmd, 0); in ipr_reset_restore_cfg_space()
7917 ipr_cmd->job_step = ipr_ioa_bringdown_done; in ipr_reset_restore_cfg_space()
7919 ipr_cmd->job_step = ipr_dump_mailbox_wait; in ipr_reset_restore_cfg_space()
7920 ipr_cmd->u.time_left = IPR_WAIT_FOR_MAILBOX; in ipr_reset_restore_cfg_space()
7922 ipr_cmd->job_step = ipr_reset_enable_ioa; in ipr_reset_restore_cfg_space()
7938 static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd) in ipr_reset_bist_done() argument
7940 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_bist_done()
7946 ipr_cmd->job_step = ipr_reset_restore_cfg_space; in ipr_reset_bist_done()
7960 static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd) in ipr_reset_start_bist() argument
7962 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_start_bist()
7974 ipr_cmd->job_step = ipr_reset_bist_done; in ipr_reset_start_bist()
7975 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT); in ipr_reset_start_bist()
7979 pci_cfg_access_unlock(ipr_cmd->ioa_cfg->pdev); in ipr_reset_start_bist()
7981 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR); in ipr_reset_start_bist()
7998 static int ipr_reset_slot_reset_done(struct ipr_cmnd *ipr_cmd) in ipr_reset_slot_reset_done() argument
8001 ipr_cmd->job_step = ipr_reset_bist_done; in ipr_reset_slot_reset_done()
8002 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT); in ipr_reset_slot_reset_done()
8016 struct ipr_cmnd *ipr_cmd = container_of(work, struct ipr_cmnd, work); in ipr_reset_reset_work() local
8017 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_reset_work()
8027 if (ioa_cfg->reset_cmd == ipr_cmd) in ipr_reset_reset_work()
8028 ipr_reset_ioa_job(ipr_cmd); in ipr_reset_reset_work()
8042 static int ipr_reset_slot_reset(struct ipr_cmnd *ipr_cmd) in ipr_reset_slot_reset() argument
8044 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_slot_reset()
8047 INIT_WORK(&ipr_cmd->work, ipr_reset_reset_work); in ipr_reset_slot_reset()
8048 queue_work(ioa_cfg->reset_work_q, &ipr_cmd->work); in ipr_reset_slot_reset()
8049 ipr_cmd->job_step = ipr_reset_slot_reset_done; in ipr_reset_slot_reset()
8063 static int ipr_reset_block_config_access_wait(struct ipr_cmnd *ipr_cmd) in ipr_reset_block_config_access_wait() argument
8065 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_block_config_access_wait()
8070 ipr_cmd->job_step = ioa_cfg->reset; in ipr_reset_block_config_access_wait()
8072 if (ipr_cmd->u.time_left) { in ipr_reset_block_config_access_wait()
8074 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT; in ipr_reset_block_config_access_wait()
8075 ipr_reset_start_timer(ipr_cmd, in ipr_reset_block_config_access_wait()
8078 ipr_cmd->job_step = ioa_cfg->reset; in ipr_reset_block_config_access_wait()
8096 static int ipr_reset_block_config_access(struct ipr_cmnd *ipr_cmd) in ipr_reset_block_config_access() argument
8098 ipr_cmd->ioa_cfg->cfg_locked = 0; in ipr_reset_block_config_access()
8099 ipr_cmd->job_step = ipr_reset_block_config_access_wait; in ipr_reset_block_config_access()
8100 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT; in ipr_reset_block_config_access()
8134 static int ipr_reset_wait_to_start_bist(struct ipr_cmnd *ipr_cmd) in ipr_reset_wait_to_start_bist() argument
8136 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_wait_to_start_bist()
8139 if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) { in ipr_reset_wait_to_start_bist()
8140 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT; in ipr_reset_wait_to_start_bist()
8141 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT); in ipr_reset_wait_to_start_bist()
8143 ipr_cmd->job_step = ipr_reset_block_config_access; in ipr_reset_wait_to_start_bist()
8162 static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd) in ipr_reset_alert() argument
8164 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_alert()
8174 ipr_cmd->job_step = ipr_reset_wait_to_start_bist; in ipr_reset_alert()
8176 ipr_cmd->job_step = ipr_reset_block_config_access; in ipr_reset_alert()
8179 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT; in ipr_reset_alert()
8180 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT); in ipr_reset_alert()
8195 static int ipr_reset_quiesce_done(struct ipr_cmnd *ipr_cmd) in ipr_reset_quiesce_done() argument
8197 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_quiesce_done()
8200 ipr_cmd->job_step = ipr_ioa_bringdown_done; in ipr_reset_quiesce_done()
8216 static int ipr_reset_cancel_hcam_done(struct ipr_cmnd *ipr_cmd) in ipr_reset_cancel_hcam_done() argument
8218 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cancel_hcam_done()
8225 ipr_cmd->job_step = ipr_reset_quiesce_done; in ipr_reset_cancel_hcam_done()
8232 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_reset_cancel_hcam_done()
8255 static int ipr_reset_cancel_hcam(struct ipr_cmnd *ipr_cmd) in ipr_reset_cancel_hcam() argument
8257 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_cancel_hcam()
8264 ipr_cmd->job_step = ipr_reset_cancel_hcam_done; in ipr_reset_cancel_hcam()
8272 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_reset_cancel_hcam()
8273 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_reset_cancel_hcam()
8274 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt; in ipr_reset_cancel_hcam()
8287 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, in ipr_reset_cancel_hcam()
8291 ipr_cmd->job_step = ipr_reset_cancel_hcam; in ipr_reset_cancel_hcam()
8296 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_cancel_hcam()
8311 static int ipr_reset_ucode_download_done(struct ipr_cmnd *ipr_cmd) in ipr_reset_ucode_download_done() argument
8313 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ucode_download_done()
8319 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_ucode_download_done()
8333 static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd) in ipr_reset_ucode_download() argument
8335 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ucode_download()
8339 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_ucode_download()
8344 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_reset_ucode_download()
8345 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_SCSICDB; in ipr_reset_ucode_download()
8346 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = WRITE_BUFFER; in ipr_reset_ucode_download()
8347 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_WR_BUF_DOWNLOAD_AND_SAVE; in ipr_reset_ucode_download()
8348 ipr_cmd->ioarcb.cmd_pkt.cdb[6] = (sglist->buffer_len & 0xff0000) >> 16; in ipr_reset_ucode_download()
8349 ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8; in ipr_reset_ucode_download()
8350 ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff; in ipr_reset_ucode_download()
8353 ipr_build_ucode_ioadl64(ipr_cmd, sglist); in ipr_reset_ucode_download()
8355 ipr_build_ucode_ioadl(ipr_cmd, sglist); in ipr_reset_ucode_download()
8356 ipr_cmd->job_step = ipr_reset_ucode_download_done; in ipr_reset_ucode_download()
8358 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, in ipr_reset_ucode_download()
8376 static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd) in ipr_reset_shutdown_ioa() argument
8378 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_shutdown_ioa()
8379 enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type; in ipr_reset_shutdown_ioa()
8385 ipr_cmd->job_step = ipr_reset_cancel_hcam; in ipr_reset_shutdown_ioa()
8388 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_reset_shutdown_ioa()
8389 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_reset_shutdown_ioa()
8390 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; in ipr_reset_shutdown_ioa()
8391 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = shutdown_type; in ipr_reset_shutdown_ioa()
8402 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, timeout); in ipr_reset_shutdown_ioa()
8405 ipr_cmd->job_step = ipr_reset_ucode_download; in ipr_reset_shutdown_ioa()
8407 ipr_cmd->job_step = ipr_reset_alert; in ipr_reset_shutdown_ioa()
8422 static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd) in ipr_reset_ioa_job() argument
8425 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_ioa_job()
8428 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc); in ipr_reset_ioa_job()
8430 if (ioa_cfg->reset_cmd != ipr_cmd) { in ipr_reset_ioa_job()
8435 list_add_tail(&ipr_cmd->queue, in ipr_reset_ioa_job()
8436 &ipr_cmd->hrrq->hrrq_free_q); in ipr_reset_ioa_job()
8441 rc = ipr_cmd->job_step_failed(ipr_cmd); in ipr_reset_ioa_job()
8446 ipr_reinit_ipr_cmnd(ipr_cmd); in ipr_reset_ioa_job()
8447 ipr_cmd->job_step_failed = ipr_reset_cmd_failed; in ipr_reset_ioa_job()
8448 rc = ipr_cmd->job_step(ipr_cmd); in ipr_reset_ioa_job()
8470 struct ipr_cmnd *ipr_cmd; in _ipr_initiate_ioa_reset() local
8486 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in _ipr_initiate_ioa_reset()
8487 ioa_cfg->reset_cmd = ipr_cmd; in _ipr_initiate_ioa_reset()
8488 ipr_cmd->job_step = job_step; in _ipr_initiate_ioa_reset()
8489 ipr_cmd->u.shutdown_type = shutdown_type; in _ipr_initiate_ioa_reset()
8491 ipr_reset_ioa_job(ipr_cmd); in _ipr_initiate_ioa_reset()
8562 static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd) in ipr_reset_freeze() argument
8564 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg; in ipr_reset_freeze()
8574 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q); in ipr_reset_freeze()
8575 ipr_cmd->done = ipr_reset_ioa_job; in ipr_reset_freeze()
8851 struct ipr_cmnd *ipr_cmd; in ipr_alloc_cmd_blks() local
8907 ipr_cmd = dma_pool_zalloc(ioa_cfg->ipr_cmd_pool, in ipr_alloc_cmd_blks()
8910 if (!ipr_cmd) { in ipr_alloc_cmd_blks()
8915 ioa_cfg->ipr_cmnd_list[i] = ipr_cmd; in ipr_alloc_cmd_blks()
8918 ioarcb = &ipr_cmd->ioarcb; in ipr_alloc_cmd_blks()
8919 ipr_cmd->dma_addr = dma_addr; in ipr_alloc_cmd_blks()
8939 ipr_cmd->cmd_index = i; in ipr_alloc_cmd_blks()
8940 ipr_cmd->ioa_cfg = ioa_cfg; in ipr_alloc_cmd_blks()
8941 ipr_cmd->sense_buffer_dma = dma_addr + in ipr_alloc_cmd_blks()
8944 ipr_cmd->ioarcb.cmd_pkt.hrrq_id = hrrq_id; in ipr_alloc_cmd_blks()
8945 ipr_cmd->hrrq = &ioa_cfg->hrrq[hrrq_id]; in ipr_alloc_cmd_blks()
8946 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_alloc_cmd_blks()
10007 static void ipr_halt_done(struct ipr_cmnd *ipr_cmd) in ipr_halt_done() argument
10009 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q); in ipr_halt_done()
10023 struct ipr_cmnd *ipr_cmd; in ipr_halt() local
10040 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg); in ipr_halt()
10041 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE); in ipr_halt()
10042 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD; in ipr_halt()
10043 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN; in ipr_halt()
10044 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL; in ipr_halt()
10046 ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT); in ipr_halt()