Lines Matching refs:req

101 static union viosrp_iu *req_iu(vscsi_req *req)  in req_iu()  argument
103 return (union viosrp_iu *)req->viosrp_iu_buf; in req_iu()
108 vscsi_req *req; in vscsi_get_req() local
112 req = &s->reqs[i]; in vscsi_get_req()
113 if (!req->active) { in vscsi_get_req()
114 memset(req, 0, sizeof(*req)); in vscsi_get_req()
115 req->qtag = i; in vscsi_get_req()
116 req->active = 1; in vscsi_get_req()
117 return req; in vscsi_get_req()
125 vscsi_req *req; in vscsi_find_req() local
129 req = &s->reqs[i]; in vscsi_find_req()
130 if (req_iu(req)->srp.cmd.tag == srp_tag) { in vscsi_find_req()
131 return req; in vscsi_find_req()
137 static void vscsi_put_req(vscsi_req *req) in vscsi_put_req() argument
139 if (req->sreq != NULL) { in vscsi_put_req()
140 scsi_req_unref(req->sreq); in vscsi_put_req()
142 req->sreq = NULL; in vscsi_put_req()
143 req->active = 0; in vscsi_put_req()
180 static int vscsi_send_iu(VSCSIState *s, vscsi_req *req, in vscsi_send_iu() argument
188 rc = spapr_vio_dma_write(&s->vdev, req->crq.s.IU_data_ptr, in vscsi_send_iu()
189 &req->viosrp_iu_buf, length); in vscsi_send_iu()
194 req->crq.s.valid = 0x80; in vscsi_send_iu()
195 req->crq.s.format = format; in vscsi_send_iu()
196 req->crq.s.reserved = 0x00; in vscsi_send_iu()
197 req->crq.s.timeout = cpu_to_be16(0x0000); in vscsi_send_iu()
198 req->crq.s.IU_length = cpu_to_be16(length); in vscsi_send_iu()
199 req->crq.s.IU_data_ptr = req_iu(req)->srp.rsp.tag; /* right byte order */ in vscsi_send_iu()
202 req->crq.s.status = VIOSRP_OK; in vscsi_send_iu()
204 req->crq.s.status = VIOSRP_ADAPTER_FAIL; in vscsi_send_iu()
207 rc1 = spapr_vio_send_crq(&s->vdev, req->crq.raw); in vscsi_send_iu()
216 static void vscsi_makeup_sense(VSCSIState *s, vscsi_req *req, in vscsi_makeup_sense() argument
219 req->senselen = SRP_RSP_SENSE_DATA_LEN; in vscsi_makeup_sense()
222 req->sense[0] = (0x1 << 7 | 0x70); in vscsi_makeup_sense()
224 req->sense[2] = key; in vscsi_makeup_sense()
226 req->sense[7] = 0xa; /* 10 bytes */ in vscsi_makeup_sense()
228 req->sense[12] = asc; in vscsi_makeup_sense()
229 req->sense[13] = ascq; in vscsi_makeup_sense()
232 static int vscsi_send_rsp(VSCSIState *s, vscsi_req *req, in vscsi_send_rsp() argument
235 union viosrp_iu *iu = req_iu(req); in vscsi_send_rsp()
271 if (req->senselen) { in vscsi_send_rsp()
272 int sense_data_len = MIN(req->senselen, SRP_MAX_IU_DATA_LEN); in vscsi_send_rsp()
276 memcpy(iu->srp.rsp.data, req->sense, sense_data_len); in vscsi_send_rsp()
283 vscsi_send_iu(s, req, total_len, VIOSRP_SRP_FORMAT); in vscsi_send_rsp()
294 static int vscsi_fetch_desc(VSCSIState *s, struct vscsi_req *req, in vscsi_fetch_desc() argument
298 struct srp_cmd *cmd = &req_iu(req)->srp.cmd; in vscsi_fetch_desc()
300 switch (req->dma_fmt) { in vscsi_fetch_desc()
306 memcpy(ret, cmd->add_data + req->cdb_offset, sizeof(*ret)); in vscsi_fetch_desc()
307 assert(req->cur_desc_num == 0); in vscsi_fetch_desc()
313 (cmd->add_data + req->cdb_offset); in vscsi_fetch_desc()
314 if (n < req->local_desc) { in vscsi_fetch_desc()
316 trace_spapr_vscsi_fetch_desc_indirect(req->qtag, n, in vscsi_fetch_desc()
317 req->local_desc); in vscsi_fetch_desc()
318 } else if (n < req->total_desc) { in vscsi_fetch_desc()
333 trace_spapr_vscsi_fetch_desc_indirect_seg_ext(req->qtag, n, in vscsi_fetch_desc()
334 req->total_desc, in vscsi_fetch_desc()
344 fprintf(stderr, "VSCSI: Unknown format %x\n", req->dma_fmt); in vscsi_fetch_desc()
351 req->cur_desc_num, in vscsi_fetch_desc()
358 trace_spapr_vscsi_fetch_desc_done(req->cur_desc_num, req->cur_desc_offset, in vscsi_fetch_desc()
364 static int vscsi_srp_direct_data(VSCSIState *s, vscsi_req *req, in vscsi_srp_direct_data() argument
371 rc = vscsi_fetch_desc(s, req, req->cur_desc_num, req->cur_desc_offset, &md); in vscsi_srp_direct_data()
380 if (req->writing) { /* writing = to device = reading from memory */ in vscsi_srp_direct_data()
390 req->cur_desc_offset += llen; in vscsi_srp_direct_data()
395 static int vscsi_srp_indirect_data(VSCSIState *s, vscsi_req *req, in vscsi_srp_indirect_data() argument
406 rc = vscsi_fetch_desc(s, req, req->cur_desc_num, req->cur_desc_offset, &md); in vscsi_srp_indirect_data()
415 if (req->writing) { /* writing = to device = reading from memory */ in vscsi_srp_indirect_data()
421 trace_spapr_vscsi_srp_indirect_data_rw(req->writing, rc); in vscsi_srp_indirect_data()
432 req->cur_desc_offset += llen; in vscsi_srp_indirect_data()
435 ++req->cur_desc_num; in vscsi_srp_indirect_data()
436 req->cur_desc_offset = 0; in vscsi_srp_indirect_data()
443 static int vscsi_srp_transfer_data(VSCSIState *s, vscsi_req *req, in vscsi_srp_transfer_data() argument
448 switch (req->dma_fmt) { in vscsi_srp_transfer_data()
453 err = vscsi_srp_direct_data(s, req, buf, len); in vscsi_srp_transfer_data()
456 err = vscsi_srp_indirect_data(s, req, buf, len); in vscsi_srp_transfer_data()
484 static int vscsi_preprocess_desc(vscsi_req *req) in vscsi_preprocess_desc() argument
486 struct srp_cmd *cmd = &req_iu(req)->srp.cmd; in vscsi_preprocess_desc()
488 req->cdb_offset = cmd->add_cdb_len & ~3; in vscsi_preprocess_desc()
490 if (req->writing) { in vscsi_preprocess_desc()
491 req->dma_fmt = cmd->buf_fmt >> 4; in vscsi_preprocess_desc()
493 req->cdb_offset += data_out_desc_size(cmd); in vscsi_preprocess_desc()
494 req->dma_fmt = cmd->buf_fmt & ((1U << 4) - 1); in vscsi_preprocess_desc()
497 switch (req->dma_fmt) { in vscsi_preprocess_desc()
501 req->total_desc = req->local_desc = 1; in vscsi_preprocess_desc()
505 (cmd->add_data + req->cdb_offset); in vscsi_preprocess_desc()
507 req->total_desc = be32_to_cpu(ind_tmp->table_desc.len) / in vscsi_preprocess_desc()
509 req->local_desc = req->writing ? cmd->data_out_desc_cnt : in vscsi_preprocess_desc()
515 "vscsi_preprocess_desc: Unknown format %x\n", req->dma_fmt); in vscsi_preprocess_desc()
526 vscsi_req *req = sreq->hba_private; in vscsi_transfer_data() local
530 trace_spapr_vscsi_transfer_data(sreq->tag, len, req); in vscsi_transfer_data()
531 if (req == NULL) { in vscsi_transfer_data()
538 rc = vscsi_srp_transfer_data(s, req, req->writing, buf, len); in vscsi_transfer_data()
542 req->dma_error = true; in vscsi_transfer_data()
543 scsi_req_cancel(req->sreq); in vscsi_transfer_data()
548 req->data_len -= rc; in vscsi_transfer_data()
556 vscsi_req *req = sreq->hba_private; in vscsi_command_complete() local
559 trace_spapr_vscsi_command_complete(sreq->tag, sreq->status, req); in vscsi_command_complete()
560 if (req == NULL) { in vscsi_command_complete()
566 req->senselen = scsi_req_get_sense(req->sreq, req->sense, in vscsi_command_complete()
567 sizeof(req->sense)); in vscsi_command_complete()
568 trace_spapr_vscsi_command_complete_sense_data1(req->senselen, in vscsi_command_complete()
569 req->sense[0], req->sense[1], req->sense[2], req->sense[3], in vscsi_command_complete()
570 req->sense[4], req->sense[5], req->sense[6], req->sense[7]); in vscsi_command_complete()
572 req->sense[8], req->sense[9], req->sense[10], req->sense[11], in vscsi_command_complete()
573 req->sense[12], req->sense[13], req->sense[14], req->sense[15]); in vscsi_command_complete()
581 if (req->writing) { in vscsi_command_complete()
582 res_out = req->data_len; in vscsi_command_complete()
584 res_in = req->data_len; in vscsi_command_complete()
587 vscsi_send_rsp(s, req, sreq->status, res_in, res_out); in vscsi_command_complete()
588 vscsi_put_req(req); in vscsi_command_complete()
593 vscsi_req *req = sreq->hba_private; in vscsi_request_cancelled() local
595 if (req->dma_error) { in vscsi_request_cancelled()
598 vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0); in vscsi_request_cancelled()
599 vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); in vscsi_request_cancelled()
601 vscsi_put_req(req); in vscsi_request_cancelled()
630 vscsi_req *req = sreq->hba_private; in vscsi_save_request() local
631 assert(req->active); in vscsi_save_request()
633 vmstate_save_state(f, &vmstate_spapr_vscsi_req, req, NULL); in vscsi_save_request()
635 trace_spapr_vscsi_save_request(req->qtag, req->cur_desc_num, in vscsi_save_request()
636 req->cur_desc_offset); in vscsi_save_request()
643 vscsi_req *req; in vscsi_load_request() local
647 req = &s->reqs[sreq->tag]; in vscsi_load_request()
648 assert(!req->active); in vscsi_load_request()
650 memset(req, 0, sizeof(*req)); in vscsi_load_request()
651 rc = vmstate_load_state(f, &vmstate_spapr_vscsi_req, req, 1); in vscsi_load_request()
656 assert(req->active); in vscsi_load_request()
658 req->sreq = scsi_req_ref(sreq); in vscsi_load_request()
660 trace_spapr_vscsi_load_request(req->qtag, req->cur_desc_num, in vscsi_load_request()
661 req->cur_desc_offset); in vscsi_load_request()
663 return req; in vscsi_load_request()
666 static void vscsi_process_login(VSCSIState *s, vscsi_req *req) in vscsi_process_login() argument
668 union viosrp_iu *iu = req_iu(req); in vscsi_process_login()
689 vscsi_send_iu(s, req, sizeof(*rsp), VIOSRP_SRP_FORMAT); in vscsi_process_login()
692 static void vscsi_inquiry_no_target(VSCSIState *s, vscsi_req *req) in vscsi_inquiry_no_target() argument
694 uint8_t *cdb = req_iu(req)->srp.cmd.cdb; in vscsi_inquiry_no_target()
701 vscsi_makeup_sense(s, req, ILLEGAL_REQUEST, 0x24, 0); in vscsi_inquiry_no_target()
702 vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); in vscsi_inquiry_no_target()
719 req->writing = 0; in vscsi_inquiry_no_target()
720 vscsi_preprocess_desc(req); in vscsi_inquiry_no_target()
721 rc = vscsi_srp_transfer_data(s, req, 0, resp_data, len); in vscsi_inquiry_no_target()
723 vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0); in vscsi_inquiry_no_target()
724 vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); in vscsi_inquiry_no_target()
726 vscsi_send_rsp(s, req, 0, 36 - rc, 0); in vscsi_inquiry_no_target()
730 static void vscsi_report_luns(VSCSIState *s, vscsi_req *req) in vscsi_report_luns() argument
770 vscsi_preprocess_desc(req); in vscsi_report_luns()
771 rc = vscsi_srp_transfer_data(s, req, 0, resp_data, len); in vscsi_report_luns()
774 vscsi_makeup_sense(s, req, HARDWARE_ERROR, 0, 0); in vscsi_report_luns()
775 vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); in vscsi_report_luns()
777 vscsi_send_rsp(s, req, 0, len - rc, 0); in vscsi_report_luns()
781 static int vscsi_queue_cmd(VSCSIState *s, vscsi_req *req) in vscsi_queue_cmd() argument
783 union srp_iu *srp = &req_iu(req)->srp; in vscsi_queue_cmd()
790 vscsi_report_luns(s, req); in vscsi_queue_cmd()
798 vscsi_inquiry_no_target(s, req); in vscsi_queue_cmd()
800 vscsi_makeup_sense(s, req, ILLEGAL_REQUEST, 0x24, 0x00); in vscsi_queue_cmd()
801 vscsi_send_rsp(s, req, CHECK_CONDITION, 0, 0); in vscsi_queue_cmd()
805 req->sreq = scsi_req_new(sdev, req->qtag, lun, srp->cmd.cdb, cdb_len, req); in vscsi_queue_cmd()
806 n = scsi_req_enqueue(req->sreq); in vscsi_queue_cmd()
808 trace_spapr_vscsi_queue_cmd(req->qtag, srp->cmd.cdb[0], in vscsi_queue_cmd()
815 req->writing = (n < 1); in vscsi_queue_cmd()
818 vscsi_preprocess_desc(req); in vscsi_queue_cmd()
822 req->data_len = n; in vscsi_queue_cmd()
824 req->data_len = -n; in vscsi_queue_cmd()
826 scsi_req_continue(req->sreq); in vscsi_queue_cmd()
833 static int vscsi_process_tsk_mgmt(VSCSIState *s, vscsi_req *req) in vscsi_process_tsk_mgmt() argument
835 union viosrp_iu *iu = req_iu(req); in vscsi_process_tsk_mgmt()
844 be64_to_cpu(req_iu(req)->srp.tsk_mgmt.lun), &lun); in vscsi_process_tsk_mgmt()
855 tmpreq = vscsi_find_req(s, req_iu(req)->srp.tsk_mgmt.task_tag); in vscsi_process_tsk_mgmt()
881 != req_iu(req)->srp.tsk_mgmt.lun) { in vscsi_process_tsk_mgmt()
919 vscsi_send_iu(s, req, sizeof(iu->srp.rsp) + 4, VIOSRP_SRP_FORMAT); in vscsi_process_tsk_mgmt()
924 static int vscsi_handle_srp_req(VSCSIState *s, vscsi_req *req) in vscsi_handle_srp_req() argument
926 union srp_iu *srp = &req_iu(req)->srp; in vscsi_handle_srp_req()
932 vscsi_process_login(s, req); in vscsi_handle_srp_req()
935 done = vscsi_process_tsk_mgmt(s, req); in vscsi_handle_srp_req()
938 done = vscsi_queue_cmd(s, req); in vscsi_handle_srp_req()
957 static int vscsi_send_adapter_info(VSCSIState *s, vscsi_req *req) in vscsi_send_adapter_info() argument
963 sinfo = &req_iu(req)->mad.adapter_info; in vscsi_send_adapter_info()
988 return vscsi_send_iu(s, req, sizeof(*sinfo), VIOSRP_MAD_FORMAT); in vscsi_send_adapter_info()
991 static int vscsi_send_capabilities(VSCSIState *s, vscsi_req *req) in vscsi_send_capabilities() argument
999 vcap = &req_iu(req)->mad.capabilities; in vscsi_send_capabilities()
1039 return vscsi_send_iu(s, req, sizeof(*vcap), VIOSRP_MAD_FORMAT); in vscsi_send_capabilities()
1042 static int vscsi_handle_mad_req(VSCSIState *s, vscsi_req *req) in vscsi_handle_mad_req() argument
1044 union mad_iu *mad = &req_iu(req)->mad; in vscsi_handle_mad_req()
1058 vscsi_send_adapter_info(s, req); in vscsi_handle_mad_req()
1065 vscsi_send_capabilities(s, req); in vscsi_handle_mad_req()
1081 vscsi_send_iu(s, req, retlen, VIOSRP_MAD_FORMAT); in vscsi_handle_mad_req()
1089 vscsi_req *req; in vscsi_got_payload() local
1092 req = vscsi_get_req(s); in vscsi_got_payload()
1093 if (req == NULL) { in vscsi_got_payload()
1106 vscsi_put_req(req); in vscsi_got_payload()
1111 if (spapr_vio_dma_read(&s->vdev, crq->s.IU_data_ptr, &req->viosrp_iu_buf, in vscsi_got_payload()
1114 vscsi_put_req(req); in vscsi_got_payload()
1117 memcpy(&req->crq, crq, sizeof(vscsi_crq)); in vscsi_got_payload()
1120 done = vscsi_handle_mad_req(s, req); in vscsi_got_payload()
1122 done = vscsi_handle_srp_req(s, req); in vscsi_got_payload()
1126 vscsi_put_req(req); in vscsi_got_payload()