Lines Matching refs:ipr_cmd

575  * @ipr_cmd:	ipr command struct
582 static void ipr_trc_hook(struct ipr_cmnd *ipr_cmd,
586 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
592 trace_entry->op_code = ipr_cmd->ioarcb.cmd_pkt.cdb[0];
594 trace_entry->cmd_index = ipr_cmd->cmd_index & 0xff;
595 trace_entry->res_handle = ipr_cmd->ioarcb.res_handle;
600 #define ipr_trc_hook(ipr_cmd, type, add_data) do { } while (0)
605 * @ipr_cmd: ipr command struct
610 static void ipr_lock_and_done(struct ipr_cmnd *ipr_cmd)
613 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
616 ipr_cmd->done(ipr_cmd);
622 * @ipr_cmd: ipr command struct
627 static void ipr_reinit_ipr_cmnd(struct ipr_cmnd *ipr_cmd)
629 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
630 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
631 dma_addr_t dma_addr = ipr_cmd->dma_addr;
642 if (ipr_cmd->ioa_cfg->sis64) {
653 ipr_cmd->scsi_cmd = NULL;
654 ipr_cmd->sense_buffer[0] = 0;
655 ipr_cmd->dma_use_sg = 0;
660 * @ipr_cmd: ipr command struct
666 static void ipr_init_ipr_cmnd(struct ipr_cmnd *ipr_cmd,
669 ipr_reinit_ipr_cmnd(ipr_cmd);
670 ipr_cmd->u.scratch = 0;
671 ipr_cmd->sibling = NULL;
672 ipr_cmd->eh_comp = NULL;
673 ipr_cmd->fast_done = fast_done;
674 timer_setup(&ipr_cmd->timer, NULL, 0);
687 struct ipr_cmnd *ipr_cmd = NULL;
690 ipr_cmd = list_entry(hrrq->hrrq_free_q.next,
692 list_del(&ipr_cmd->queue);
696 return ipr_cmd;
709 struct ipr_cmnd *ipr_cmd =
711 ipr_init_ipr_cmnd(ipr_cmd, ipr_lock_and_done);
712 return ipr_cmd;
804 * @ipr_cmd: ipr command struct
812 static void __ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
814 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
818 scsi_dma_unmap(ipr_cmd->scsi_cmd);
820 if (ipr_cmd->eh_comp)
821 complete(ipr_cmd->eh_comp);
822 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
827 * @ipr_cmd: ipr command struct
835 static void ipr_scsi_eh_done(struct ipr_cmnd *ipr_cmd)
838 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
841 __ipr_scsi_eh_done(ipr_cmd);
856 struct ipr_cmnd *ipr_cmd, *temp;
862 list_for_each_entry_safe(ipr_cmd,
864 list_del(&ipr_cmd->queue);
866 ipr_cmd->s.ioasa.hdr.ioasc =
868 ipr_cmd->s.ioasa.hdr.ilid =
871 if (ipr_cmd->scsi_cmd)
872 ipr_cmd->done = __ipr_scsi_eh_done;
874 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH,
876 del_timer(&ipr_cmd->timer);
877 ipr_cmd->done(ipr_cmd);
886 * @ipr_cmd: ipr command struct
895 static void ipr_send_command(struct ipr_cmnd *ipr_cmd)
897 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
898 dma_addr_t send_dma_addr = ipr_cmd->dma_addr;
906 if (ipr_cmd->dma_use_sg * sizeof(struct ipr_ioadl64_desc) > 128 )
915 * @ipr_cmd: ipr command struct
926 static void ipr_do_req(struct ipr_cmnd *ipr_cmd,
930 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
932 ipr_cmd->done = done;
934 ipr_cmd->timer.expires = jiffies + timeout;
935 ipr_cmd->timer.function = timeout_func;
937 add_timer(&ipr_cmd->timer);
939 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, 0);
941 ipr_send_command(ipr_cmd);
946 * @ipr_cmd: ipr command struct
954 static void ipr_internal_cmd_done(struct ipr_cmnd *ipr_cmd)
956 if (ipr_cmd->sibling)
957 ipr_cmd->sibling = NULL;
959 complete(&ipr_cmd->completion);
964 * @ipr_cmd: ipr command struct
975 static void ipr_init_ioadl(struct ipr_cmnd *ipr_cmd, dma_addr_t dma_addr,
978 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
979 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
981 ipr_cmd->dma_use_sg = 1;
983 if (ipr_cmd->ioa_cfg->sis64) {
988 ipr_cmd->ioarcb.ioadl_len =
990 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len);
996 ipr_cmd->ioarcb.read_ioadl_len =
998 ipr_cmd->ioarcb.read_data_transfer_length = cpu_to_be32(len);
1000 ipr_cmd->ioarcb.ioadl_len =
1002 ipr_cmd->ioarcb.data_transfer_length = cpu_to_be32(len);
1009 * @ipr_cmd: ipr command struct
1016 static void ipr_send_blocking_cmd(struct ipr_cmnd *ipr_cmd,
1020 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1022 init_completion(&ipr_cmd->completion);
1023 ipr_do_req(ipr_cmd, ipr_internal_cmd_done, timeout_func, timeout);
1026 wait_for_completion(&ipr_cmd->completion);
1059 struct ipr_cmnd *ipr_cmd;
1063 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
1064 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
1067 ipr_cmd->u.hostrcb = hostrcb;
1068 ioarcb = &ipr_cmd->ioarcb;
1077 ipr_init_ioadl(ipr_cmd, hostrcb->hostrcb_dma,
1081 ipr_cmd->done = ipr_process_ccn;
1083 ipr_cmd->done = ipr_process_error;
1085 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_IOA_RES_ADDR);
1087 ipr_send_command(ipr_cmd);
1401 * @ipr_cmd: ipr command struct
1409 static void ipr_process_ccn(struct ipr_cmnd *ipr_cmd)
1411 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
1412 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
1413 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
1416 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
2539 * @ipr_cmd: ipr command struct
2548 static void ipr_process_error(struct ipr_cmnd *ipr_cmd)
2550 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2551 struct ipr_hostrcb *hostrcb = ipr_cmd->u.hostrcb;
2552 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
2561 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
2592 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
2594 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2606 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd)
2625 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
2627 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
2639 if (!ioa_cfg->in_reset_reload || ioa_cfg->reset_cmd == ipr_cmd) {
3862 * @ipr_cmd: ipr command struct
3868 static void ipr_build_ucode_ioadl64(struct ipr_cmnd *ipr_cmd,
3871 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3872 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
3877 ipr_cmd->dma_use_sg = sglist->num_dma_sg;
3882 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
3883 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
3894 * @ipr_cmd: ipr command struct
3900 static void ipr_build_ucode_ioadl(struct ipr_cmnd *ipr_cmd,
3903 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
3904 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
3909 ipr_cmd->dma_use_sg = sglist->num_dma_sg;
3914 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
3916 for_each_sg(scatterlist, sg, ipr_cmd->dma_use_sg, i) {
4864 * @ipr_cmd: ipr command struct
4870 static int ipr_match_lun(struct ipr_cmnd *ipr_cmd, void *device)
4872 if (ipr_cmd->scsi_cmd && ipr_cmd->scsi_cmd->device == device)
4879 * @ipr_cmd: ipr command struct
4884 static bool ipr_cmnd_is_free(struct ipr_cmnd *ipr_cmd)
4888 list_for_each_entry(loop_cmd, &ipr_cmd->hrrq->hrrq_free_q, queue) {
4889 if (loop_cmd == ipr_cmd)
4908 struct ipr_cmnd *ipr_cmd;
4922 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
4923 if (!ipr_cmnd_is_free(ipr_cmd)) {
4924 if (match(ipr_cmd, device)) {
4925 ipr_cmd->eh_comp = ∁
4942 ipr_cmd = ioa_cfg->ipr_cmnd_list[i];
4943 if (!ipr_cmnd_is_free(ipr_cmd)) {
4944 if (match(ipr_cmd, device)) {
4945 ipr_cmd->eh_comp = NULL;
5016 struct ipr_cmnd *ipr_cmd;
5022 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5023 ioarcb = &ipr_cmd->ioarcb;
5026 if (ipr_cmd->ioa_cfg->sis64)
5033 ipr_send_blocking_cmd(ipr_cmd, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);
5034 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5035 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5107 * @ipr_cmd: ipr command struct
5114 static void ipr_bus_reset_done(struct ipr_cmnd *ipr_cmd)
5116 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5122 if (res->res_handle == ipr_cmd->ioarcb.res_handle) {
5132 if (ipr_cmd->sibling->sibling)
5133 ipr_cmd->sibling->sibling = NULL;
5135 ipr_cmd->sibling->done(ipr_cmd->sibling);
5137 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5154 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
5156 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
5162 if (ipr_cmd->completion.done || ioa_cfg->in_reset_reload) {
5167 sdev_printk(KERN_ERR, ipr_cmd->u.sdev, "Abort timed out. Resetting bus.\n");
5169 ipr_cmd->sibling = reset_cmd;
5170 reset_cmd->sibling = ipr_cmd;
5171 reset_cmd->ioarcb.res_handle = ipr_cmd->ioarcb.res_handle;
5193 struct ipr_cmnd *ipr_cmd;
5241 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
5242 ipr_cmd->ioarcb.res_handle = res->res_handle;
5243 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5246 ipr_cmd->u.sdev = scsi_cmd->device;
5250 ipr_send_blocking_cmd(ipr_cmd, ipr_abort_timeout, IPR_CANCEL_ALL_TIMEOUT);
5251 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5262 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5421 struct ipr_cmnd *ipr_cmd;
5444 ipr_cmd = ioa_cfg->ipr_cmnd_list[cmd_index];
5445 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5447 ipr_trc_hook(ipr_cmd, IPR_TRACE_FINISH, ioasc);
5449 list_move_tail(&ipr_cmd->queue, doneq);
5468 struct ipr_cmnd *ipr_cmd, *temp;
5482 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5483 list_del(&ipr_cmd->queue);
5484 del_timer(&ipr_cmd->timer);
5485 ipr_cmd->fast_done(ipr_cmd);
5507 struct ipr_cmnd *ipr_cmd, *temp;
5551 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5552 list_del(&ipr_cmd->queue);
5553 del_timer(&ipr_cmd->timer);
5554 ipr_cmd->fast_done(ipr_cmd);
5572 struct ipr_cmnd *ipr_cmd, *temp;
5601 list_for_each_entry_safe(ipr_cmd, temp, &doneq, queue) {
5602 list_del(&ipr_cmd->queue);
5603 del_timer(&ipr_cmd->timer);
5604 ipr_cmd->fast_done(ipr_cmd);
5612 * @ipr_cmd: ipr command struct
5618 struct ipr_cmnd *ipr_cmd)
5624 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5625 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5626 struct ipr_ioadl64_desc *ioadl64 = ipr_cmd->i.ioadl64;
5639 ipr_cmd->dma_use_sg = nseg;
5643 cpu_to_be32(sizeof(struct ipr_ioadl64_desc) * ipr_cmd->dma_use_sg);
5651 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) {
5664 * @ipr_cmd: ipr command struct
5670 struct ipr_cmnd *ipr_cmd)
5676 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5677 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5678 struct ipr_ioadl_desc *ioadl = ipr_cmd->i.ioadl;
5690 ipr_cmd->dma_use_sg = nseg;
5697 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
5702 cpu_to_be32(sizeof(struct ipr_ioadl_desc) * ipr_cmd->dma_use_sg);
5705 if (ipr_cmd->dma_use_sg <= ARRAY_SIZE(ioarcb->u.add_data.u.ioadl)) {
5707 ioarcb->write_ioadl_addr = cpu_to_be32((ipr_cmd->dma_addr) +
5712 scsi_for_each_sg(scsi_cmd, sg, ipr_cmd->dma_use_sg, i) {
5724 * @ipr_cmd: ipr command struct
5732 static void __ipr_erp_done(struct ipr_cmnd *ipr_cmd)
5734 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5736 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5743 memcpy(scsi_cmd->sense_buffer, ipr_cmd->sense_buffer,
5752 scsi_dma_unmap(ipr_cmd->scsi_cmd);
5754 if (ipr_cmd->eh_comp)
5755 complete(ipr_cmd->eh_comp);
5756 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
5761 * @ipr_cmd: ipr command struct
5769 static void ipr_erp_done(struct ipr_cmnd *ipr_cmd)
5771 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
5775 __ipr_erp_done(ipr_cmd);
5781 * @ipr_cmd: ipr command struct
5786 static void ipr_reinit_ipr_cmnd_for_erp(struct ipr_cmnd *ipr_cmd)
5788 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
5789 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
5790 dma_addr_t dma_addr = ipr_cmd->dma_addr;
5800 if (ipr_cmd->ioa_cfg->sis64)
5812 * @ipr_cmd: ipr command struct
5820 static void __ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
5822 struct ipr_cmd_pkt *cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5823 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
5826 __ipr_erp_done(ipr_cmd);
5830 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
5839 ipr_init_ioadl(ipr_cmd, ipr_cmd->sense_buffer_dma,
5842 ipr_do_req(ipr_cmd, ipr_erp_done, ipr_timeout,
5848 * @ipr_cmd: ipr command struct
5856 static void ipr_erp_request_sense(struct ipr_cmnd *ipr_cmd)
5858 struct ipr_hrr_queue *hrrq = ipr_cmd->hrrq;
5862 __ipr_erp_request_sense(ipr_cmd);
5868 * @ipr_cmd: ipr command struct
5878 static void ipr_erp_cancel_all(struct ipr_cmnd *ipr_cmd)
5880 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
5886 ipr_reinit_ipr_cmnd_for_erp(ipr_cmd);
5889 __ipr_erp_request_sense(ipr_cmd);
5893 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
5897 ipr_do_req(ipr_cmd, ipr_erp_request_sense, ipr_timeout,
5904 * @ipr_cmd: ipr command struct
5915 struct ipr_cmnd *ipr_cmd, struct ipr_resource_entry *res)
5920 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
5971 * @ipr_cmd: ipr command struct
5976 static void ipr_gen_sense(struct ipr_cmnd *ipr_cmd)
5979 u8 *sense_buf = ipr_cmd->scsi_cmd->sense_buffer;
5980 struct ipr_resource_entry *res = ipr_cmd->scsi_cmd->device->hostdata;
5981 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
5989 ipr_cmd->scsi_cmd->result = SAM_STAT_CHECK_CONDITION;
6061 * @ipr_cmd: ipr command struct
6069 static int ipr_get_autosense(struct ipr_cmnd *ipr_cmd)
6071 struct ipr_ioasa *ioasa = &ipr_cmd->s.ioasa;
6072 struct ipr_ioasa64 *ioasa64 = &ipr_cmd->s.ioasa64;
6077 if (ipr_cmd->ioa_cfg->sis64)
6078 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa64->auto_sense.data,
6082 memcpy(ipr_cmd->scsi_cmd->sense_buffer, ioasa->auto_sense.data,
6091 * @ipr_cmd: ipr command struct
6100 struct ipr_cmnd *ipr_cmd)
6102 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6104 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6108 __ipr_scsi_eh_done(ipr_cmd);
6113 ipr_gen_sense(ipr_cmd);
6115 ipr_dump_ioasa(ioa_cfg, ipr_cmd, res);
6162 if (!ipr_get_autosense(ipr_cmd)) {
6164 ipr_erp_cancel_all(ipr_cmd);
6189 scsi_dma_unmap(ipr_cmd->scsi_cmd);
6191 if (ipr_cmd->eh_comp)
6192 complete(ipr_cmd->eh_comp);
6193 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6198 * @ipr_cmd: ipr command struct
6206 static void ipr_scsi_done(struct ipr_cmnd *ipr_cmd)
6208 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6209 struct scsi_cmnd *scsi_cmd = ipr_cmd->scsi_cmd;
6210 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6213 scsi_set_resid(scsi_cmd, be32_to_cpu(ipr_cmd->s.ioasa.hdr.residual_data_len));
6218 spin_lock_irqsave(ipr_cmd->hrrq->lock, lock_flags);
6220 if (ipr_cmd->eh_comp)
6221 complete(ipr_cmd->eh_comp);
6222 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6223 spin_unlock_irqrestore(ipr_cmd->hrrq->lock, lock_flags);
6226 spin_lock(&ipr_cmd->hrrq->_lock);
6227 ipr_erp_start(ioa_cfg, ipr_cmd);
6228 spin_unlock(&ipr_cmd->hrrq->_lock);
6251 struct ipr_cmnd *ipr_cmd;
6285 ipr_cmd = __ipr_get_free_ipr_cmnd(hrrq);
6286 if (ipr_cmd == NULL) {
6292 ipr_init_ipr_cmnd(ipr_cmd, ipr_scsi_done);
6293 ioarcb = &ipr_cmd->ioarcb;
6296 ipr_cmd->scsi_cmd = scsi_cmd;
6297 ipr_cmd->done = ipr_scsi_eh_done;
6331 rc = ipr_build_ioadl64(ioa_cfg, ipr_cmd);
6333 rc = ipr_build_ioadl(ioa_cfg, ipr_cmd);
6337 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
6345 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_free_q);
6356 list_add_tail(&ipr_cmd->queue, &hrrq->hrrq_pending_q);
6357 ipr_trc_hook(ipr_cmd, IPR_TRACE_START, IPR_GET_RES_PHYS_LOC(res));
6358 ipr_send_command(ipr_cmd);
6420 * @ipr_cmd: ipr command struct
6428 static int ipr_ioa_bringdown_done(struct ipr_cmnd *ipr_cmd)
6430 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6449 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6458 * @ipr_cmd: ipr command struct
6467 static int ipr_ioa_reset_done(struct ipr_cmnd *ipr_cmd)
6469 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6508 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6538 * @ipr_cmd: ipr command struct
6545 static int ipr_set_supported_devs(struct ipr_cmnd *ipr_cmd)
6547 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6549 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6550 struct ipr_resource_entry *res = ipr_cmd->u.res;
6552 ipr_cmd->job_step = ipr_ioa_reset_done;
6558 ipr_cmd->u.res = res;
6570 ipr_init_ioadl(ipr_cmd,
6576 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
6580 ipr_cmd->job_step = ipr_set_supported_devs;
6737 * @ipr_cmd: ipr command struct
6746 static void ipr_build_mode_select(struct ipr_cmnd *ipr_cmd,
6750 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6759 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_WRITE_LAST);
6764 * @ipr_cmd: ipr command struct
6772 static int ipr_ioafp_mode_select_page28(struct ipr_cmnd *ipr_cmd)
6774 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6785 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
6789 ipr_cmd->job_step = ipr_set_supported_devs;
6790 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
6792 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6800 * @ipr_cmd: ipr command struct
6809 static void ipr_build_mode_sense(struct ipr_cmnd *ipr_cmd,
6813 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
6821 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST);
6826 * @ipr_cmd: ipr command struct
6833 static int ipr_reset_cmd_failed(struct ipr_cmnd *ipr_cmd)
6835 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6836 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6840 ipr_cmd->ioarcb.cmd_pkt.cdb[0], ioasc);
6843 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
6849 * @ipr_cmd: ipr command struct
6857 static int ipr_reset_mode_sense_failed(struct ipr_cmnd *ipr_cmd)
6859 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6860 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6863 ipr_cmd->job_step = ipr_set_supported_devs;
6864 ipr_cmd->u.res = list_entry(ioa_cfg->used_res_q.next,
6869 return ipr_reset_cmd_failed(ipr_cmd);
6874 * @ipr_cmd: ipr command struct
6882 static int ipr_ioafp_mode_sense_page28(struct ipr_cmnd *ipr_cmd)
6884 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6887 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
6892 ipr_cmd->job_step = ipr_ioafp_mode_select_page28;
6893 ipr_cmd->job_step_failed = ipr_reset_mode_sense_failed;
6895 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6903 * @ipr_cmd: ipr command struct
6910 static int ipr_ioafp_mode_select_page24(struct ipr_cmnd *ipr_cmd)
6912 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6927 ipr_build_mode_select(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE), 0x11,
6931 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
6932 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6940 * @ipr_cmd: ipr command struct
6948 static int ipr_reset_mode_sense_page24_failed(struct ipr_cmnd *ipr_cmd)
6950 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
6953 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
6957 return ipr_reset_cmd_failed(ipr_cmd);
6962 * @ipr_cmd: ipr command struct
6970 static int ipr_ioafp_mode_sense_page24(struct ipr_cmnd *ipr_cmd)
6972 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
6975 ipr_build_mode_sense(ipr_cmd, cpu_to_be32(IPR_IOA_RES_HANDLE),
6980 ipr_cmd->job_step = ipr_ioafp_mode_select_page24;
6981 ipr_cmd->job_step_failed = ipr_reset_mode_sense_page24_failed;
6983 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
6991 * @ipr_cmd: ipr command struct
7001 static int ipr_init_res_table(struct ipr_cmnd *ipr_cmd)
7003 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7074 ipr_cmd->job_step = ipr_ioafp_mode_sense_page24;
7076 ipr_cmd->job_step = ipr_ioafp_mode_sense_page28;
7084 * @ipr_cmd: ipr command struct
7092 static int ipr_ioafp_query_ioa_cfg(struct ipr_cmnd *ipr_cmd)
7094 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7095 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7113 ipr_init_ioadl(ipr_cmd, ioa_cfg->cfg_table_dma, ioa_cfg->cfg_table_size,
7116 ipr_cmd->job_step = ipr_init_res_table;
7118 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7124 static int ipr_ioa_service_action_failed(struct ipr_cmnd *ipr_cmd)
7126 u32 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
7131 return ipr_reset_cmd_failed(ipr_cmd);
7134 static void ipr_build_ioa_service_action(struct ipr_cmnd *ipr_cmd,
7137 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7148 * @ipr_cmd: ipr command struct
7153 static int ipr_ioafp_set_caching_parameters(struct ipr_cmnd *ipr_cmd)
7155 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7156 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7161 ipr_cmd->job_step = ipr_ioafp_query_ioa_cfg;
7164 ipr_build_ioa_service_action(ipr_cmd,
7170 ipr_cmd->job_step_failed = ipr_ioa_service_action_failed;
7171 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
7184 * @ipr_cmd: ipr command struct
7195 static void ipr_ioafp_inquiry(struct ipr_cmnd *ipr_cmd, u8 flags, u8 page,
7198 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7209 ipr_init_ioadl(ipr_cmd, dma_addr, xfer_len, IPR_IOADL_FLAGS_READ_LAST);
7211 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, IPR_INTERNAL_TIMEOUT);
7238 * @ipr_cmd: ipr command struct
7246 static int ipr_ioafp_pageC4_inquiry(struct ipr_cmnd *ipr_cmd)
7248 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7253 ipr_cmd->job_step = ipr_ioafp_set_caching_parameters;
7257 ipr_ioafp_inquiry(ipr_cmd, 1, 0xC4,
7271 * @ipr_cmd: ipr command struct
7279 static int ipr_ioafp_cap_inquiry(struct ipr_cmnd *ipr_cmd)
7281 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7286 ipr_cmd->job_step = ipr_ioafp_pageC4_inquiry;
7290 ipr_ioafp_inquiry(ipr_cmd, 1, 0xD0,
7302 * @ipr_cmd: ipr command struct
7310 static int ipr_ioafp_page3_inquiry(struct ipr_cmnd *ipr_cmd)
7312 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7316 ipr_cmd->job_step = ipr_ioafp_cap_inquiry;
7318 ipr_ioafp_inquiry(ipr_cmd, 1, 3,
7328 * @ipr_cmd: ipr command struct
7336 static int ipr_ioafp_page0_inquiry(struct ipr_cmnd *ipr_cmd)
7338 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7348 ipr_cmd->job_step = ipr_ioafp_page3_inquiry;
7350 ipr_ioafp_inquiry(ipr_cmd, 1, 0,
7360 * @ipr_cmd: ipr command struct
7367 static int ipr_ioafp_std_inquiry(struct ipr_cmnd *ipr_cmd)
7369 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7372 ipr_cmd->job_step = ipr_ioafp_page0_inquiry;
7374 ipr_ioafp_inquiry(ipr_cmd, 0, 0,
7384 * @ipr_cmd: ipr command struct
7392 static int ipr_ioafp_identify_hrrq(struct ipr_cmnd *ipr_cmd)
7394 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7395 struct ipr_ioarcb *ioarcb = &ipr_cmd->ioarcb;
7399 ipr_cmd->job_step = ipr_ioafp_std_inquiry;
7450 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
7454 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7479 struct ipr_cmnd *ipr_cmd = from_timer(ipr_cmd, t, timer);
7480 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7485 if (ioa_cfg->reset_cmd == ipr_cmd) {
7486 list_del(&ipr_cmd->queue);
7487 ipr_cmd->done(ipr_cmd);
7495 * @ipr_cmd: ipr command struct
7507 static void ipr_reset_start_timer(struct ipr_cmnd *ipr_cmd,
7512 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7513 ipr_cmd->done = ipr_reset_ioa_job;
7515 ipr_cmd->timer.expires = jiffies + timeout;
7516 ipr_cmd->timer.function = ipr_reset_timer_done;
7517 add_timer(&ipr_cmd->timer);
7556 * @ipr_cmd: ipr command struct
7561 static int ipr_reset_next_stage(struct ipr_cmnd *ipr_cmd)
7566 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7587 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7591 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7600 ipr_cmd->timer.expires = jiffies + stage_time * HZ;
7601 ipr_cmd->timer.function = ipr_oper_timeout;
7602 ipr_cmd->done = ipr_reset_ioa_job;
7603 add_timer(&ipr_cmd->timer);
7605 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7612 * @ipr_cmd: ipr command struct
7620 static int ipr_reset_enable_ioa(struct ipr_cmnd *ipr_cmd)
7622 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7628 ipr_cmd->job_step = ipr_ioafp_identify_hrrq;
7666 ipr_cmd->job_step = ipr_reset_next_stage;
7670 ipr_cmd->timer.expires = jiffies + (ioa_cfg->transop_timeout * HZ);
7671 ipr_cmd->timer.function = ipr_oper_timeout;
7672 ipr_cmd->done = ipr_reset_ioa_job;
7673 add_timer(&ipr_cmd->timer);
7674 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
7682 * @ipr_cmd: ipr command struct
7690 static int ipr_reset_wait_for_dump(struct ipr_cmnd *ipr_cmd)
7692 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7700 ipr_cmd->job_step = ipr_reset_alert;
7789 * @ipr_cmd: ipr command struct
7796 static int ipr_reset_get_unit_check_job(struct ipr_cmnd *ipr_cmd)
7798 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7803 ipr_cmd->job_step = ipr_reset_alert;
7804 ipr_reset_start_timer(ipr_cmd, 0);
7810 static int ipr_dump_mailbox_wait(struct ipr_cmnd *ipr_cmd)
7812 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7819 if (!ioa_cfg->sis64 || !ipr_cmd->u.time_left ||
7823 if (!ipr_cmd->u.time_left)
7830 ipr_reset_start_timer(ipr_cmd, IPR_SIS64_DUMP_TIMEOUT);
7832 ipr_reset_start_timer(ipr_cmd, IPR_SIS32_DUMP_TIMEOUT);
7833 ipr_cmd->job_step = ipr_reset_wait_for_dump;
7837 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
7838 ipr_reset_start_timer(ipr_cmd,
7848 * @ipr_cmd: ipr command struct
7857 static int ipr_reset_restore_cfg_space(struct ipr_cmnd *ipr_cmd)
7859 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7866 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
7880 ipr_cmd->job_step = ipr_reset_get_unit_check_job;
7881 ipr_reset_start_timer(ipr_cmd, IPR_DUMP_DELAY_TIMEOUT);
7886 ipr_cmd->job_step = ipr_reset_alert;
7887 ipr_reset_start_timer(ipr_cmd, 0);
7893 ipr_cmd->job_step = ipr_ioa_bringdown_done;
7895 ipr_cmd->job_step = ipr_dump_mailbox_wait;
7896 ipr_cmd->u.time_left = IPR_WAIT_FOR_MAILBOX;
7898 ipr_cmd->job_step = ipr_reset_enable_ioa;
7907 * @ipr_cmd: ipr command struct
7914 static int ipr_reset_bist_done(struct ipr_cmnd *ipr_cmd)
7916 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7922 ipr_cmd->job_step = ipr_reset_restore_cfg_space;
7929 * @ipr_cmd: ipr command struct
7936 static int ipr_reset_start_bist(struct ipr_cmnd *ipr_cmd)
7938 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
7949 ipr_cmd->job_step = ipr_reset_bist_done;
7950 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
7954 pci_cfg_access_unlock(ipr_cmd->ioa_cfg->pdev);
7956 ipr_cmd->s.ioasa.hdr.ioasc = cpu_to_be32(IPR_IOASC_PCI_ACCESS_ERROR);
7966 * @ipr_cmd: ipr command struct
7973 static int ipr_reset_slot_reset_done(struct ipr_cmnd *ipr_cmd)
7976 ipr_cmd->job_step = ipr_reset_bist_done;
7977 ipr_reset_start_timer(ipr_cmd, IPR_WAIT_FOR_BIST_TIMEOUT);
7991 struct ipr_cmnd *ipr_cmd = container_of(work, struct ipr_cmnd, work);
7992 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8002 if (ioa_cfg->reset_cmd == ipr_cmd)
8003 ipr_reset_ioa_job(ipr_cmd);
8010 * @ipr_cmd: ipr command struct
8017 static int ipr_reset_slot_reset(struct ipr_cmnd *ipr_cmd)
8019 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8022 INIT_WORK(&ipr_cmd->work, ipr_reset_reset_work);
8023 queue_work(ioa_cfg->reset_work_q, &ipr_cmd->work);
8024 ipr_cmd->job_step = ipr_reset_slot_reset_done;
8031 * @ipr_cmd: ipr command struct
8038 static int ipr_reset_block_config_access_wait(struct ipr_cmnd *ipr_cmd)
8040 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8045 ipr_cmd->job_step = ioa_cfg->reset;
8047 if (ipr_cmd->u.time_left) {
8049 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8050 ipr_reset_start_timer(ipr_cmd,
8053 ipr_cmd->job_step = ioa_cfg->reset;
8064 * @ipr_cmd: ipr command struct
8071 static int ipr_reset_block_config_access(struct ipr_cmnd *ipr_cmd)
8073 ipr_cmd->ioa_cfg->cfg_locked = 0;
8074 ipr_cmd->job_step = ipr_reset_block_config_access_wait;
8075 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
8096 * @ipr_cmd: ipr command struct
8109 static int ipr_reset_wait_to_start_bist(struct ipr_cmnd *ipr_cmd)
8111 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8114 if (!ipr_reset_allowed(ioa_cfg) && ipr_cmd->u.time_left) {
8115 ipr_cmd->u.time_left -= IPR_CHECK_FOR_RESET_TIMEOUT;
8116 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
8118 ipr_cmd->job_step = ipr_reset_block_config_access;
8127 * @ipr_cmd: ipr command struct
8137 static int ipr_reset_alert(struct ipr_cmnd *ipr_cmd)
8139 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8149 ipr_cmd->job_step = ipr_reset_wait_to_start_bist;
8151 ipr_cmd->job_step = ipr_reset_block_config_access;
8154 ipr_cmd->u.time_left = IPR_WAIT_FOR_RESET_TIMEOUT;
8155 ipr_reset_start_timer(ipr_cmd, IPR_CHECK_FOR_RESET_TIMEOUT);
8163 * @ipr_cmd: ipr command struct
8170 static int ipr_reset_quiesce_done(struct ipr_cmnd *ipr_cmd)
8172 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8175 ipr_cmd->job_step = ipr_ioa_bringdown_done;
8183 * @ipr_cmd: ipr command struct
8191 static int ipr_reset_cancel_hcam_done(struct ipr_cmnd *ipr_cmd)
8193 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8200 ipr_cmd->job_step = ipr_reset_quiesce_done;
8207 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
8223 * @ipr_cmd: ipr command struct
8230 static int ipr_reset_cancel_hcam(struct ipr_cmnd *ipr_cmd)
8232 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8239 ipr_cmd->job_step = ipr_reset_cancel_hcam_done;
8247 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
8248 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
8249 cmd_pkt = &ipr_cmd->ioarcb.cmd_pkt;
8262 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
8266 ipr_cmd->job_step = ipr_reset_cancel_hcam;
8271 ipr_cmd->job_step = ipr_reset_alert;
8279 * @ipr_cmd: ipr command struct
8286 static int ipr_reset_ucode_download_done(struct ipr_cmnd *ipr_cmd)
8288 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8294 ipr_cmd->job_step = ipr_reset_alert;
8300 * @ipr_cmd: ipr command struct
8308 static int ipr_reset_ucode_download(struct ipr_cmnd *ipr_cmd)
8310 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8314 ipr_cmd->job_step = ipr_reset_alert;
8319 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
8320 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_SCSICDB;
8321 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = WRITE_BUFFER;
8322 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_WR_BUF_DOWNLOAD_AND_SAVE;
8323 ipr_cmd->ioarcb.cmd_pkt.cdb[6] = (sglist->buffer_len & 0xff0000) >> 16;
8324 ipr_cmd->ioarcb.cmd_pkt.cdb[7] = (sglist->buffer_len & 0x00ff00) >> 8;
8325 ipr_cmd->ioarcb.cmd_pkt.cdb[8] = sglist->buffer_len & 0x0000ff;
8328 ipr_build_ucode_ioadl64(ipr_cmd, sglist);
8330 ipr_build_ucode_ioadl(ipr_cmd, sglist);
8331 ipr_cmd->job_step = ipr_reset_ucode_download_done;
8333 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout,
8342 * @ipr_cmd: ipr command struct
8351 static int ipr_reset_shutdown_ioa(struct ipr_cmnd *ipr_cmd)
8353 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8354 enum ipr_shutdown_type shutdown_type = ipr_cmd->u.shutdown_type;
8360 ipr_cmd->job_step = ipr_reset_cancel_hcam;
8363 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
8364 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
8365 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
8366 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = shutdown_type;
8377 ipr_do_req(ipr_cmd, ipr_reset_ioa_job, ipr_timeout, timeout);
8380 ipr_cmd->job_step = ipr_reset_ucode_download;
8382 ipr_cmd->job_step = ipr_reset_alert;
8390 * @ipr_cmd: ipr command struct
8397 static void ipr_reset_ioa_job(struct ipr_cmnd *ipr_cmd)
8400 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8403 ioasc = be32_to_cpu(ipr_cmd->s.ioasa.hdr.ioasc);
8405 if (ioa_cfg->reset_cmd != ipr_cmd) {
8410 list_add_tail(&ipr_cmd->queue,
8411 &ipr_cmd->hrrq->hrrq_free_q);
8416 rc = ipr_cmd->job_step_failed(ipr_cmd);
8421 ipr_reinit_ipr_cmnd(ipr_cmd);
8422 ipr_cmd->job_step_failed = ipr_reset_cmd_failed;
8423 rc = ipr_cmd->job_step(ipr_cmd);
8445 struct ipr_cmnd *ipr_cmd;
8461 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
8462 ioa_cfg->reset_cmd = ipr_cmd;
8463 ipr_cmd->job_step = job_step;
8464 ipr_cmd->u.shutdown_type = shutdown_type;
8466 ipr_reset_ioa_job(ipr_cmd);
8531 * @ipr_cmd: ipr command struct
8537 static int ipr_reset_freeze(struct ipr_cmnd *ipr_cmd)
8539 struct ipr_ioa_cfg *ioa_cfg = ipr_cmd->ioa_cfg;
8549 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_pending_q);
8550 ipr_cmd->done = ipr_reset_ioa_job;
8826 struct ipr_cmnd *ipr_cmd;
8881 ipr_cmd = dma_pool_zalloc(ioa_cfg->ipr_cmd_pool,
8884 if (!ipr_cmd) {
8889 ioa_cfg->ipr_cmnd_list[i] = ipr_cmd;
8892 ioarcb = &ipr_cmd->ioarcb;
8893 ipr_cmd->dma_addr = dma_addr;
8913 ipr_cmd->cmd_index = i;
8914 ipr_cmd->ioa_cfg = ioa_cfg;
8915 ipr_cmd->sense_buffer_dma = dma_addr +
8918 ipr_cmd->ioarcb.cmd_pkt.hrrq_id = hrrq_id;
8919 ipr_cmd->hrrq = &ioa_cfg->hrrq[hrrq_id];
8920 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
9978 * @ipr_cmd: ipr command struct
9983 static void ipr_halt_done(struct ipr_cmnd *ipr_cmd)
9985 list_add_tail(&ipr_cmd->queue, &ipr_cmd->hrrq->hrrq_free_q);
9999 struct ipr_cmnd *ipr_cmd;
10016 ipr_cmd = ipr_get_free_ipr_cmnd(ioa_cfg);
10017 ipr_cmd->ioarcb.res_handle = cpu_to_be32(IPR_IOA_RES_HANDLE);
10018 ipr_cmd->ioarcb.cmd_pkt.request_type = IPR_RQTYPE_IOACMD;
10019 ipr_cmd->ioarcb.cmd_pkt.cdb[0] = IPR_IOA_SHUTDOWN;
10020 ipr_cmd->ioarcb.cmd_pkt.cdb[1] = IPR_SHUTDOWN_PREPARE_FOR_NORMAL;
10022 ipr_do_req(ipr_cmd, ipr_halt_done, ipr_timeout, IPR_DEVICE_RESET_TIMEOUT);