Lines Matching defs:ipr_cmd

578  * @ipr_cmd:	ipr command struct
585 static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
589 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
595 trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0];
597 trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff;
598 trace_entry->res_handle = ipr_cmd->ioarcb.res_handle;
603 #define ipr_trc_hook(ipr_cmd, type, add_data) do { } while (0)
608 * @ipr_cmd: ipr command struct
613 static void ipr_lock_and_done(struct ipr_cmnd *ipr_cmd)
616 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
619 ipr_cmd->done(ipr_cmd);
625 * @ipr_cmd: ipr command struct
630 static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
632 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
633 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
634 dma_addr_t dma_addr = ipr_cmd->dma_addr;
645 if (ipr_cmd->ioa_cfg->sis64) {
656 ipr_cmd->scsi_cmd = NULL;
657 ipr_cmd->sense_buffer[0] = 0;
658 ipr_cmd->dma_use_sg = 0;
663 * @ipr_cmd: ipr command struct
669 static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd,
672 ipr_reinit_ipr_cmnd(ipr_cmd);
673 ipr_cmd->u.scratch = 0;
674 ipr_cmd->sibling = NULL;
675 ipr_cmd->eh_comp = NULL;
676 ipr_cmd->fast_done = fast_done;
677 timer_setup(&ipr_cmd->timer, NULL, 0);
690 struct ipr_cmnd *ipr_cmd = NULL;
693 ipr_cmd = list_entry(hrrq->hrrq_free_q.next,
695 list_del(&ipr_cmd->queue);
699 return ipr_cmd;
712 struct ipr_cmnd *ipr_cmd =
714 ipr_init_ipr_cmnd(ipr_cmd, ipr_lock_and_done);
715 return ipr_cmd;
803 * @ipr_cmd: ipr command struct
811 static void __ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
813 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
817 scsi_dma_unmap(ipr_cmd->scsi_cmd);
819 if (ipr_cmd->eh_comp)
820 complete(ipr_cmd->eh_comp);
821 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
826 * @ipr_cmd: ipr command struct
834 static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
837 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
840 __ipr_scsi_eh_done(ipr_cmd);
855 struct ipr_cmnd *ipr_cmd, *temp;
861 list_for_each_entry_safe(ipr_cmd,
863 list_del(&ipr_cmd->queue);
865 ipr_cmd->s.ioasa.hdr.ioasc =
867 ipr_cmd->s.ioasa.hdr.ilid =
870 if (ipr_cmd->scsi_cmd)
871 ipr_cmd->done = __ipr_scsi_eh_done;
873 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH,
875 del_timer(&ipr_cmd->timer);
876 ipr_cmd->done(ipr_cmd);
885 * @ipr_cmd: ipr command struct
894 static void ipr_send_command(struct ipr_cmnd *ipr_cmd)
896 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
897 dma_addr_t send_dma_addr = ipr_cmd->dma_addr;
905 if (ipr_cmd->dma_use_sg * sizeof(struct ipr_ioadl64_desc) > 128 )
914 * @ipr_cmd: ipr command struct
925 static void ipr_do_req(struct ipr_cmnd *ipr_cmd,
929 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
931 ipr_cmd->done = done;
933 ipr_cmd->timer.expires = jiffies + timeout;
934 ipr_cmd->timer.function = timeout_func;
936 add_timer(&ipr_cmd->timer);
938 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, 0);
940 ipr_send_command(ipr_cmd);
945 * @ipr_cmd: ipr command struct
953 static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd)
955 if (ipr_cmd->sibling)
956 ipr_cmd->sibling = NULL;
958 complete(&ipr_cmd->completion);
963 * @ipr_cmd: ipr command struct
974 static void ipr_init_ioadl(struct ipr_cmnd *ipr_cmd, dma_addr_t dma_addr,
977 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
978 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
980 ipr_cmd->dma_use_sg = 1;
982 if (ipr_cmd->ioa_cfg->sis64) {
987 ipr_cmd->ioarcb.ioadl_len =
989 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len);
995 ipr_cmd->ioarcb.read_ioadl_len =
997 ipr_cmd->ioarcb.read_data_transfer_length = cpu_to_be32(len);
999 ipr_cmd->ioarcb.ioadl_len =
1001 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len);
1008 * @ipr_cmd: ipr command struct
1015 static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd,
1019 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1021 init_completion(&ipr_cmd->completion);
1022 ipr_do_req(ipr_cmd, ipr_internal_cmd_done, timeout_func, timeout);
1025 wait_for_completion(&ipr_cmd->completion);
1058 struct ipr_cmnd *ipr_cmd;
1062 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
1063 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
1066 ipr_cmd->u.hostrcb = hostrcb;
1067 ioarcb = &ipr_cmd->ioarcb;
1076 ipr_init_ioadl(ipr_cmd, hostrcb->hostrcb_dma,
1080 ipr_cmd->done = ipr_process_ccn;
1082 ipr_cmd->done = ipr_process_error;
1084 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_IOA_RES_ADDR);
1086 ipr_send_command(ipr_cmd);
1400 * @ipr_cmd: ipr command struct
1408 static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
1410 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1411 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
1412 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
1415 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
2538 * @ipr_cmd: ipr command struct
2547 static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
2549 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2550 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
2551 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
2560 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
2591 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
2593 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2605 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd)
2624 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
2626 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2638 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) {
3861 * @ipr_cmd: ipr command struct
3867 static void ipr_build_ucode_ioadl64(struct ipr_cmnd *ipr_cmd,
3870 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3871 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
3876 ipr_cmd->dma_use_sg = sglist->num_dma_sg;
3881 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
3882 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
3893 * @ipr_cmd: ipr command struct
3899 static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd,
3902 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3903 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
3908 ipr_cmd->dma_use_sg = sglist->num_dma_sg;
3913 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
3915 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
4861 * @ipr_cmd: ipr command struct
4867 static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device)
4869 if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device)
4876 * @ipr_cmd: ipr command struct
4881 static bool ipr_cmnd_is_free(struct ipr_cmnd *ipr_cmd)
4885 list_for_each_entry(loop_cmd, &ipr_cmd->hrrq->hrrq_free_q, queue) {
4886 if (loop_cmd == ipr_cmd)
4905 struct ipr_cmnd *ipr_cmd;
4919 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
4920 if (!ipr_cmnd_is_free(ipr_cmd)) {
4921 if (match(ipr_cmd, device)) {
4922 ipr_cmd->eh_comp = ∁
4939 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
4940 if (!ipr_cmnd_is_free(ipr_cmd)) {
4941 if (match(ipr_cmd, device)) {
4942 ipr_cmd->eh_comp = NULL;
5013 struct ipr_cmnd *ipr_cmd;
5019 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5020 ioarcb = &ipr_cmd->ioarcb;
5023 if (ipr_cmd->ioa_cfg->sis64)
5030 ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
5031 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5032 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5104 * @ipr_cmd: ipr command struct
5111 static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd)
5113 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5119 if (res->res_handle == ipr_cmd->ioarcb.res_handle) {
5129 if (ipr_cmd->sibling->sibling)
5130 ipr_cmd->sibling->sibling = NULL;
5132 ipr_cmd->sibling->done(ipr_cmd->sibling);
5134 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5151 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
5153 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5159 if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) {
5164 sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n");
5166 ipr_cmd->sibling = reset_cmd;
5167 reset_cmd->sibling = ipr_cmd;
5168 reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle;
5190 struct ipr_cmnd *ipr_cmd;
5238 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5239 ipr_cmd->ioarcb.res_handle = res->res_handle;
5240 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5243 ipr_cmd->u.sdev = scsi_cmd->device;
5247 ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT);
5248 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5259 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5418 struct ipr_cmnd *ipr_cmd;
5441 ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index];
5442 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5444 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, ioasc);
5446 list_move_tail(&ipr_cmd->queue, doneq);
5465 struct ipr_cmnd *ipr_cmd, *temp;
5479 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5480 list_del(&ipr_cmd->queue);
5481 del_timer(&ipr_cmd->timer);
5482 ipr_cmd->fast_done(ipr_cmd);
5504 struct ipr_cmnd *ipr_cmd, *temp;
5548 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5549 list_del(&ipr_cmd->queue);
5550 del_timer(&ipr_cmd->timer);
5551 ipr_cmd->fast_done(ipr_cmd);
5569 struct ipr_cmnd *ipr_cmd, *temp;
5598 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5599 list_del(&ipr_cmd->queue);
5600 del_timer(&ipr_cmd->timer);
5601 ipr_cmd->fast_done(ipr_cmd);
5609 * @ipr_cmd: ipr command struct
5615 struct ipr_cmnd *ipr_cmd)
5621 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5622 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5623 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
5636 ipr_cmd->dma_use_sg = nseg;
5640 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
5648 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) {
5661 * @ipr_cmd: ipr command struct
5667 struct ipr_cmnd *ipr_cmd)
5673 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5674 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5675 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
5687 ipr_cmd->dma_use_sg = nseg;
5694 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
5699 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
5702 if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->u.add_data.u.ioadl)) {
5704 ioarcb->write_ioadl_addr = cpu_to_be32((ipr_cmd->dma_addr) +
5709 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) {
5721 * @ipr_cmd: ipr command struct
5729 static void __ipr_erp_done(struct ipr_cmnd *ipr_cmd)
5731 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5733 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5740 memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer,
5749 scsi_dma_unmap(ipr_cmd->scsi_cmd);
5751 if (ipr_cmd->eh_comp)
5752 complete(ipr_cmd->eh_comp);
5753 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5758 * @ipr_cmd: ipr command struct
5766 static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
5768 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
5772 __ipr_erp_done(ipr_cmd);
5778 * @ipr_cmd: ipr command struct
5783 static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd)
5785 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5786 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
5787 dma_addr_t dma_addr = ipr_cmd->dma_addr;
5797 if (ipr_cmd->ioa_cfg->sis64)
5809 * @ipr_cmd: ipr command struct
5817 static void __ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
5819 struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5820 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5823 __ipr_erp_done(ipr_cmd);
5827 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
5836 ipr_init_ioadl(ipr_cmd, ipr_cmd->sense_buffer_dma,
5839 ipr_do_req(ipr_cmd, ipr_erp_done, ipr_timeout,
5845 * @ipr_cmd: ipr command struct
5853 static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
5855 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
5859 __ipr_erp_request_sense(ipr_cmd);
5865 * @ipr_cmd: ipr command struct
5875 static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd)
5877 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5883 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
5886 __ipr_erp_request_sense(ipr_cmd);
5890 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5894 ipr_do_req(ipr_cmd, ipr_erp_request_sense, ipr_timeout,
5901 * @ipr_cmd: ipr command struct
5912 struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res)
5917 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
5968 * @ipr_cmd: ipr command struct
5973 static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd)
5976 u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer;
5977 struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata;
5978 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
5986 ipr_cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION;
6058 * @ipr_cmd: ipr command struct
6066 static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
6068 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
6069 struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64;
6074 if (ipr_cmd->ioa_cfg->sis64)
6075 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa64->auto_sense.data,
6079 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
6088 * @ipr_cmd: ipr command struct
6097 struct ipr_cmnd *ipr_cmd)
6099 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6101 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6105 __ipr_scsi_eh_done(ipr_cmd);
6110 ipr_gen_sense(ipr_cmd);
6112 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
6159 if (!ipr_get_autosense(ipr_cmd)) {
6161 ipr_erp_cancel_all(ipr_cmd);
6186 scsi_dma_unmap(ipr_cmd->scsi_cmd);
6188 if (ipr_cmd->eh_comp)
6189 complete(ipr_cmd->eh_comp);
6190 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6195 * @ipr_cmd: ipr command struct
6203 static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
6205 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6206 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6207 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6210 scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len));
6215 spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags);
6217 if (ipr_cmd->eh_comp)
6218 complete(ipr_cmd->eh_comp);
6219 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6220 spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
6223 spin_lock(&ipr_cmd->hrrq->_lock);
6224 ipr_erp_start(ioa_cfg, ipr_cmd);
6225 spin_unlock(&ipr_cmd->hrrq->_lock);
6248 struct ipr_cmnd *ipr_cmd;
6282 ipr_cmd = __ipr_get_free_ipr_cmnd(hrrq);
6283 if (ipr_cmd == NULL) {
6289 ipr_init_ipr_cmnd(ipr_cmd, ipr_scsi_done);
6290 ioarcb = &ipr_cmd->ioarcb;
6293 ipr_cmd->scsi_cmd = scsi_cmd;
6294 ipr_cmd->done = ipr_scsi_eh_done;
6328 rc = ipr_build_ioadl64(ioa_cfg, ipr_cmd);
6330 rc = ipr_build_ioadl(ioa_cfg, ipr_cmd);
6334 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
6342 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
6353 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_pending_q);
6354 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res));
6355 ipr_send_command(ipr_cmd);
6456 * @ipr_cmd: ipr command struct
6464 static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
6466 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6485 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6494 * @ipr_cmd: ipr command struct
6503 static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
6505 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6544 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6574 * @ipr_cmd: ipr command struct
6581 static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd)
6583 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6585 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6586 struct ipr_resource_entry *res = ipr_cmd->u.res;
6588 ipr_cmd->job_step = ipr_ioa_reset_done;
6594 ipr_cmd->u.res = res;
6606 ipr_init_ioadl(ipr_cmd,
6612 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
6616 ipr_cmd->job_step = ipr_set_supported_devs;
6773 * @ipr_cmd: ipr command struct
6782 static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd,
6786 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6795 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_WRITE_LAST);
6800 * @ipr_cmd: ipr command struct
6808 static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd)
6810 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6821 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
6825 ipr_cmd->job_step = ipr_set_supported_devs;
6826 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
6828 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6836 * @ipr_cmd: ipr command struct
6845 static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd,
6849 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6857 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST);
6862 * @ipr_cmd: ipr command struct
6869 static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd)
6871 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6872 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6876 ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc);
6879 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6885 * @ipr_cmd: ipr command struct
6893 static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd)
6895 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6896 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6899 ipr_cmd->job_step = ipr_set_supported_devs;
6900 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
6905 return ipr_reset_cmd_failed(ipr_cmd);
6910 * @ipr_cmd: ipr command struct
6918 static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd)
6920 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6923 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
6928 ipr_cmd->job_step = ipr_ioafp_mode_select_page28;
6929 ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed;
6931 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6939 * @ipr_cmd: ipr command struct
6946 static int ipr_ioafp_mode_select_page24(struct ipr_cmnd *ipr_cmd)
6948 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6963 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
6967 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
6968 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6976 * @ipr_cmd: ipr command struct
6984 static int ipr_reset_mode_sense_page24_failed(struct ipr_cmnd *ipr_cmd)
6986 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6989 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
6993 return ipr_reset_cmd_failed(ipr_cmd);
6998 * @ipr_cmd: ipr command struct
7006 static int ipr_ioafp_mode_sense_page24(struct ipr_cmnd *ipr_cmd)
7008 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7011 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
7016 ipr_cmd->job_step = ipr_ioafp_mode_select_page24;
7017 ipr_cmd->job_step_failed = ipr_reset_mode_sense_page24_failed;
7019 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7027 * @ipr_cmd: ipr command struct
7037 static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd)
7039 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7110 ipr_cmd->job_step = ipr_ioafp_mode_sense_page24;
7112 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
7120 * @ipr_cmd: ipr command struct
7128 static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd)
7130 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7131 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7149 ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size,
7152 ipr_cmd->job_step = ipr_init_res_table;
7154 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7160 static int ipr_ioa_service_action_failed(struct ipr_cmnd *ipr_cmd)
7162 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
7167 return ipr_reset_cmd_failed(ipr_cmd);
7170 static void ipr_build_ioa_service_action(struct ipr_cmnd *ipr_cmd,
7173 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7184 * @ipr_cmd: ipr command struct
7189 static int ipr_ioafp_set_caching_parameters(struct ipr_cmnd *ipr_cmd)
7191 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7192 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7197 ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg;
7200 ipr_build_ioa_service_action(ipr_cmd,
7206 ipr_cmd->job_step_failed = ipr_ioa_service_action_failed;
7207 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
7220 * @ipr_cmd: ipr command struct
7231 static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page,
7234 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7245 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST);
7247 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7274 * @ipr_cmd: ipr command struct
7282 static int ipr_ioafp_pageC4_inquiry(struct ipr_cmnd *ipr_cmd)
7284 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7289 ipr_cmd->job_step = ipr_ioafp_set_caching_parameters;
7293 ipr_ioafp_inquiry(ipr_cmd, 1, 0xC4,
7307 * @ipr_cmd: ipr command struct
7315 static int ipr_ioafp_cap_inquiry(struct ipr_cmnd *ipr_cmd)
7317 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7322 ipr_cmd->job_step = ipr_ioafp_pageC4_inquiry;
7326 ipr_ioafp_inquiry(ipr_cmd, 1, 0xD0,
7338 * @ipr_cmd: ipr command struct
7346 static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd)
7348 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7352 ipr_cmd->job_step = ipr_ioafp_cap_inquiry;
7354 ipr_ioafp_inquiry(ipr_cmd, 1, 3,
7364 * @ipr_cmd: ipr command struct
7372 static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd)
7374 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7391 list_add_tail(&ipr_cmd->queue,
7397 ipr_cmd->job_step = ipr_ioafp_page3_inquiry;
7399 ipr_ioafp_inquiry(ipr_cmd, 1, 0,
7409 * @ipr_cmd: ipr command struct
7416 static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd)
7418 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7421 ipr_cmd->job_step = ipr_ioafp_page0_inquiry;
7423 ipr_ioafp_inquiry(ipr_cmd, 0, 0,
7433 * @ipr_cmd: ipr command struct
7441 static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd)
7443 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7444 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7448 ipr_cmd->job_step = ipr_ioafp_std_inquiry;
7499 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
7503 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7528 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
7529 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7534 if (ioa_cfg->reset_cmd == ipr_cmd) {
7535 list_del(&ipr_cmd->queue);
7536 ipr_cmd->done(ipr_cmd);
7544 * @ipr_cmd: ipr command struct
7556 static void ipr_reset_start_timer(struct ipr_cmnd *ipr_cmd,
7561 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7562 ipr_cmd->done = ipr_reset_ioa_job;
7564 ipr_cmd->timer.expires = jiffies + timeout;
7565 ipr_cmd->timer.function = ipr_reset_timer_done;
7566 add_timer(&ipr_cmd->timer);
7605 * @ipr_cmd: ipr command struct
7610 static int ipr_reset_next_stage(struct ipr_cmnd *ipr_cmd)
7615 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7636 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7640 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7649 ipr_cmd->timer.expires = jiffies + stage_time * HZ;
7650 ipr_cmd->timer.function = ipr_oper_timeout;
7651 ipr_cmd->done = ipr_reset_ioa_job;
7652 add_timer(&ipr_cmd->timer);
7654 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7661 * @ipr_cmd: ipr command struct
7669 static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd)
7671 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7677 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7715 ipr_cmd->job_step = ipr_reset_next_stage;
7719 ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ);
7720 ipr_cmd->timer.function = ipr_oper_timeout;
7721 ipr_cmd->done = ipr_reset_ioa_job;
7722 add_timer(&ipr_cmd->timer);
7723 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7731 * @ipr_cmd: ipr command struct
7739 static int ipr_reset_wait_for_dump(struct ipr_cmnd *ipr_cmd)
7741 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7749 ipr_cmd->job_step = ipr_reset_alert;
7838 * @ipr_cmd: ipr command struct
7845 static int ipr_reset_get_unit_check_job(struct ipr_cmnd *ipr_cmd)
7847 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7852 ipr_cmd->job_step = ipr_reset_alert;
7853 ipr_reset_start_timer(ipr_cmd, 0);
7859 static int ipr_dump_mailbox_wait(struct ipr_cmnd *ipr_cmd)
7861 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7868 if (!ioa_cfg->sis64 || !ipr_cmd->u.time_left ||
7872 if (!ipr_cmd->u.time_left)
7879 ipr_reset_start_timer(ipr_cmd, IPR_SIS64_DUMP_TIMEOUT);
7881 ipr_reset_start_timer(ipr_cmd, IPR_SIS32_DUMP_TIMEOUT);
7882 ipr_cmd->job_step = ipr_reset_wait_for_dump;
7886 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
7887 ipr_reset_start_timer(ipr_cmd,
7897 * @ipr_cmd: ipr command struct
7906 static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
7908 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7915 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
7929 ipr_cmd->job_step = ipr_reset_get_unit_check_job;
7930 ipr_reset_start_timer(ipr_cmd, IPR_DUMP_DELAY_TIMEOUT);
7935 ipr_cmd->job_step = ipr_reset_alert;
7936 ipr_reset_start_timer(ipr_cmd, 0);
7942 ipr_cmd->job_step = ipr_ioa_bringdown_done;
7944 ipr_cmd->job_step = ipr_dump_mailbox_wait;
7945 ipr_cmd->u.time_left = IPR_WAIT_FOR_MAILBOX;
7947 ipr_cmd->job_step = ipr_reset_enable_ioa;
7956 * @ipr_cmd: ipr command struct
7963 static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd)
7965 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7971 ipr_cmd->job_step = ipr_reset_restore_cfg_space;
7978 * @ipr_cmd: ipr command struct
7985 static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
7987 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7998 ipr_cmd->job_step = ipr_reset_bist_done;
7999 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
8003 pci_cfg_access_unlock(ipr_cmd->ioa_cfg->pdev);
8005 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
8015 * @ipr_cmd: ipr command struct
8022 static int ipr_reset_slot_reset_done(struct ipr_cmnd *ipr_cmd)
8025 ipr_cmd->job_step = ipr_reset_bist_done;
8026 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
8040 struct ipr_cmnd *ipr_cmd = container_of(work, struct ipr_cmnd, work);
8041 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8051 if (ioa_cfg->reset_cmd == ipr_cmd)
8052 ipr_reset_ioa_job(ipr_cmd);
8059 * @ipr_cmd: ipr command struct
8066 static int ipr_reset_slot_reset(struct ipr_cmnd *ipr_cmd)
8068 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8071 INIT_WORK(&ipr_cmd->work, ipr_reset_reset_work);
8072 queue_work(ioa_cfg->reset_work_q, &ipr_cmd->work);
8073 ipr_cmd->job_step = ipr_reset_slot_reset_done;
8080 * @ipr_cmd: ipr command struct
8087 static int ipr_reset_block_config_access_wait(struct ipr_cmnd *ipr_cmd)
8089 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8094 ipr_cmd->job_step = ioa_cfg->reset;
8096 if (ipr_cmd->u.time_left) {
8098 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8099 ipr_reset_start_timer(ipr_cmd,
8102 ipr_cmd->job_step = ioa_cfg->reset;
8113 * @ipr_cmd: ipr command struct
8120 static int ipr_reset_block_config_access(struct ipr_cmnd *ipr_cmd)
8122 ipr_cmd->ioa_cfg->cfg_locked = 0;
8123 ipr_cmd->job_step = ipr_reset_block_config_access_wait;
8124 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
8145 * @ipr_cmd: ipr command struct
8158 static int ipr_reset_wait_to_start_bist(struct ipr_cmnd *ipr_cmd)
8160 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8163 if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) {
8164 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8165 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
8167 ipr_cmd->job_step = ipr_reset_block_config_access;
8176 * @ipr_cmd: ipr command struct
8186 static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd)
8188 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8198 ipr_cmd->job_step = ipr_reset_wait_to_start_bist;
8200 ipr_cmd->job_step = ipr_reset_block_config_access;
8203 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
8204 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
8212 * @ipr_cmd: ipr command struct
8219 static int ipr_reset_quiesce_done(struct ipr_cmnd *ipr_cmd)
8221 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8224 ipr_cmd->job_step = ipr_ioa_bringdown_done;
8232 * @ipr_cmd: ipr command struct
8240 static int ipr_reset_cancel_hcam_done(struct ipr_cmnd *ipr_cmd)
8242 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8249 ipr_cmd->job_step = ipr_reset_quiesce_done;
8256 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
8272 * @ipr_cmd: ipr command struct
8279 static int ipr_reset_cancel_hcam(struct ipr_cmnd *ipr_cmd)
8281 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8288 ipr_cmd->job_step = ipr_reset_cancel_hcam_done;
8296 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
8297 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
8298 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
8311 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
8315 ipr_cmd->job_step = ipr_reset_cancel_hcam;
8320 ipr_cmd->job_step = ipr_reset_alert;
8328 * @ipr_cmd: ipr command struct
8335 static int ipr_reset_ucode_download_done(struct ipr_cmnd *ipr_cmd)
8337 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8343 ipr_cmd->job_step = ipr_reset_alert;
8349 * @ipr_cmd: ipr command struct
8357 static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd)
8359 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8363 ipr_cmd->job_step = ipr_reset_alert;
8368 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
8369 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
8370 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = WRITE_BUFFER;
8371 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_WR_BUF_DOWNLOAD_AND_SAVE;
8372 ipr_cmd->ioarcb.cmd_pkt.cdb[6] = (sglist->buffer_len & 0xff0000) >> 16;
8373 ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8;
8374 ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff;
8377 ipr_build_ucode_ioadl64(ipr_cmd, sglist);
8379 ipr_build_ucode_ioadl(ipr_cmd, sglist);
8380 ipr_cmd->job_step = ipr_reset_ucode_download_done;
8382 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
8391 * @ipr_cmd: ipr command struct
8400 static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd)
8402 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8403 enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type;
8409 ipr_cmd->job_step = ipr_reset_cancel_hcam;
8412 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
8413 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
8414 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
8415 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = shutdown_type;
8426 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, timeout);
8429 ipr_cmd->job_step = ipr_reset_ucode_download;
8431 ipr_cmd->job_step = ipr_reset_alert;
8439 * @ipr_cmd: ipr command struct
8446 static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
8449 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8452 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
8454 if (ioa_cfg->reset_cmd != ipr_cmd) {
8459 list_add_tail(&ipr_cmd->queue,
8460 &ipr_cmd->hrrq->hrrq_free_q);
8465 rc = ipr_cmd->job_step_failed(ipr_cmd);
8470 ipr_reinit_ipr_cmnd(ipr_cmd);
8471 ipr_cmd->job_step_failed = ipr_reset_cmd_failed;
8472 rc = ipr_cmd->job_step(ipr_cmd);
8494 struct ipr_cmnd *ipr_cmd;
8510 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
8511 ioa_cfg->reset_cmd = ipr_cmd;
8512 ipr_cmd->job_step = job_step;
8513 ipr_cmd->u.shutdown_type = shutdown_type;
8515 ipr_reset_ioa_job(ipr_cmd);
8580 * @ipr_cmd: ipr command struct
8586 static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd)
8588 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8598 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
8599 ipr_cmd->done = ipr_reset_ioa_job;
8875 struct ipr_cmnd *ipr_cmd;
8930 ipr_cmd = dma_pool_zalloc(ioa_cfg->ipr_cmd_pool,
8933 if (!ipr_cmd) {
8938 ioa_cfg->ipr_cmnd_list[i] = ipr_cmd;
8941 ioarcb = &ipr_cmd->ioarcb;
8942 ipr_cmd->dma_addr = dma_addr;
8962 ipr_cmd->cmd_index = i;
8963 ipr_cmd->ioa_cfg = ioa_cfg;
8964 ipr_cmd->sense_buffer_dma = dma_addr +
8967 ipr_cmd->ioarcb.cmd_pkt.hrrq_id = hrrq_id;
8968 ipr_cmd->hrrq = &ioa_cfg->hrrq[hrrq_id];
8969 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
10027 * @ipr_cmd: ipr command struct
10032 static void ipr_halt_done(struct ipr_cmnd *ipr_cmd)
10034 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
10048 struct ipr_cmnd *ipr_cmd;
10065 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
10066 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
10067 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
10068 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
10069 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL;
10071 ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);