Lines Matching refs:req
195 static int mptsas_build_sgl(MPTSASState *s, MPTSASRequest *req, hwaddr req_addr) in mptsas_build_sgl() argument
203 chain_offset = req->scsi_io.ChainOffset; in mptsas_build_sgl()
206 pci_dma_sglist_init(&req->qsg, pci, 4); in mptsas_build_sgl()
207 left = req->scsi_io.DataLength; in mptsas_build_sgl()
232 qemu_sglist_add(&req->qsg, addr, len); in mptsas_build_sgl()
260 static void mptsas_free_request(MPTSASRequest *req) in mptsas_free_request() argument
262 if (req->sreq != NULL) { in mptsas_free_request()
263 req->sreq->hba_private = NULL; in mptsas_free_request()
264 scsi_req_unref(req->sreq); in mptsas_free_request()
265 req->sreq = NULL; in mptsas_free_request()
267 qemu_sglist_destroy(&req->qsg); in mptsas_free_request()
268 g_free(req); in mptsas_free_request()
294 MPTSASRequest *req; in mptsas_process_scsi_io_request() local
310 req = g_new0(MPTSASRequest, 1); in mptsas_process_scsi_io_request()
311 req->scsi_io = *scsi_io; in mptsas_process_scsi_io_request()
312 req->dev = s; in mptsas_process_scsi_io_request()
314 status = mptsas_build_sgl(s, req, addr); in mptsas_process_scsi_io_request()
319 if (req->qsg.size < scsi_io->DataLength) { in mptsas_process_scsi_io_request()
321 req->qsg.size); in mptsas_process_scsi_io_request()
326 req->sreq = scsi_req_new(sdev, scsi_io->MsgContext, in mptsas_process_scsi_io_request()
328 scsi_io->CDBLength, req); in mptsas_process_scsi_io_request()
330 if (req->sreq->cmd.xfer > scsi_io->DataLength) { in mptsas_process_scsi_io_request()
335 if (req->sreq->cmd.mode != SCSI_XFER_NONE) { in mptsas_process_scsi_io_request()
341 if (req->sreq->cmd.mode != SCSI_XFER_TO_DEV) { in mptsas_process_scsi_io_request()
347 if (req->sreq->cmd.mode != SCSI_XFER_FROM_DEV) { in mptsas_process_scsi_io_request()
353 if (scsi_req_enqueue(req->sreq)) { in mptsas_process_scsi_io_request()
354 scsi_req_continue(req->sreq); in mptsas_process_scsi_io_request()
359 trace_mptsas_scsi_overflow(s, scsi_io->MsgContext, req->sreq->cmd.xfer, in mptsas_process_scsi_io_request()
363 mptsas_free_request(req); in mptsas_process_scsi_io_request()
404 static void mptsas_process_scsi_task_mgmt(MPTSASState *s, MPIMsgSCSITaskMgmt *req) in mptsas_process_scsi_task_mgmt() argument
413 mptsas_fix_scsi_task_mgmt_endianness(req); in mptsas_process_scsi_task_mgmt()
415 QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req)); in mptsas_process_scsi_task_mgmt()
416 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_scsi_task_mgmt()
420 reply.TargetID = req->TargetID; in mptsas_process_scsi_task_mgmt()
421 reply.Bus = req->Bus; in mptsas_process_scsi_task_mgmt()
423 reply.Function = req->Function; in mptsas_process_scsi_task_mgmt()
424 reply.TaskType = req->TaskType; in mptsas_process_scsi_task_mgmt()
425 reply.MsgContext = req->MsgContext; in mptsas_process_scsi_task_mgmt()
427 switch (req->TaskType) { in mptsas_process_scsi_task_mgmt()
430 status = mptsas_scsi_device_find(s, req->Bus, req->TargetID, in mptsas_process_scsi_task_mgmt()
431 req->LUN, &sdev); in mptsas_process_scsi_task_mgmt()
436 if (sdev->lun != req->LUN[1]) { in mptsas_process_scsi_task_mgmt()
443 if (cmd_req && cmd_req->scsi_io.MsgContext == req->TaskMsgContext) { in mptsas_process_scsi_task_mgmt()
453 if (req->TaskType == MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK) { in mptsas_process_scsi_task_mgmt()
477 status = mptsas_scsi_device_find(s, req->Bus, req->TargetID, in mptsas_process_scsi_task_mgmt()
478 req->LUN, &sdev); in mptsas_process_scsi_task_mgmt()
483 if (sdev->lun != req->LUN[1]) { in mptsas_process_scsi_task_mgmt()
515 status = mptsas_scsi_device_find(s, req->Bus, req->TargetID, in mptsas_process_scsi_task_mgmt()
516 req->LUN, &sdev); in mptsas_process_scsi_task_mgmt()
521 if (sdev->lun != req->LUN[1]) { in mptsas_process_scsi_task_mgmt()
529 if (req->Bus != 0) { in mptsas_process_scsi_task_mgmt()
533 if (req->TargetID > s->max_devices) { in mptsas_process_scsi_task_mgmt()
540 if (sdev->channel == 0 && sdev->id == req->TargetID) { in mptsas_process_scsi_task_mgmt()
560 static void mptsas_process_ioc_init(MPTSASState *s, MPIMsgIOCInit *req) in mptsas_process_ioc_init() argument
564 mptsas_fix_ioc_init_endianness(req); in mptsas_process_ioc_init()
566 QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req)); in mptsas_process_ioc_init()
567 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_ioc_init()
570 s->who_init = req->WhoInit; in mptsas_process_ioc_init()
571 s->reply_frame_size = req->ReplyFrameSize; in mptsas_process_ioc_init()
572 s->max_buses = req->MaxBuses; in mptsas_process_ioc_init()
573 s->max_devices = req->MaxDevices ? req->MaxDevices : 256; in mptsas_process_ioc_init()
574 s->host_mfa_high_addr = (hwaddr)req->HostMfaHighAddr << 32; in mptsas_process_ioc_init()
575 s->sense_buffer_high_addr = (hwaddr)req->SenseBufferHighAddr << 32; in mptsas_process_ioc_init()
584 reply.Function = req->Function; in mptsas_process_ioc_init()
587 reply.MsgContext = req->MsgContext; in mptsas_process_ioc_init()
594 MPIMsgIOCFacts *req) in mptsas_process_ioc_facts() argument
598 mptsas_fix_ioc_facts_endianness(req); in mptsas_process_ioc_facts()
600 QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req)); in mptsas_process_ioc_facts()
601 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_ioc_facts()
607 reply.Function = req->Function; in mptsas_process_ioc_facts()
608 reply.MsgContext = req->MsgContext; in mptsas_process_ioc_facts()
634 MPIMsgPortFacts *req) in mptsas_process_port_facts() argument
638 mptsas_fix_port_facts_endianness(req); in mptsas_process_port_facts()
640 QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req)); in mptsas_process_port_facts()
641 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_port_facts()
646 reply.Function = req->Function; in mptsas_process_port_facts()
647 reply.PortNumber = req->PortNumber; in mptsas_process_port_facts()
648 reply.MsgContext = req->MsgContext; in mptsas_process_port_facts()
650 if (req->PortNumber < MPTSAS_NUM_PORTS) { in mptsas_process_port_facts()
662 MPIMsgPortEnable *req) in mptsas_process_port_enable() argument
666 mptsas_fix_port_enable_endianness(req); in mptsas_process_port_enable()
668 QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req)); in mptsas_process_port_enable()
669 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_port_enable()
674 reply.PortNumber = req->PortNumber; in mptsas_process_port_enable()
675 reply.Function = req->Function; in mptsas_process_port_enable()
676 reply.MsgContext = req->MsgContext; in mptsas_process_port_enable()
683 MPIMsgEventNotify *req) in mptsas_process_event_notification() argument
687 mptsas_fix_event_notification_endianness(req); in mptsas_process_event_notification()
689 QEMU_BUILD_BUG_ON(MPTSAS_MAX_REQUEST_SIZE < sizeof(*req)); in mptsas_process_event_notification()
690 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_event_notification()
700 reply.Function = req->Function; in mptsas_process_event_notification()
705 reply.MsgContext = req->MsgContext; in mptsas_process_event_notification()
707 reply.Data[0] = !!req->Switch; in mptsas_process_event_notification()
713 static void mptsas_process_message(MPTSASState *s, MPIRequestHeader *req) in mptsas_process_message() argument
715 trace_mptsas_process_message(s, req->Function, req->MsgContext); in mptsas_process_message()
716 switch (req->Function) { in mptsas_process_message()
718 mptsas_process_scsi_task_mgmt(s, (MPIMsgSCSITaskMgmt *)req); in mptsas_process_message()
722 mptsas_process_ioc_init(s, (MPIMsgIOCInit *)req); in mptsas_process_message()
726 mptsas_process_ioc_facts(s, (MPIMsgIOCFacts *)req); in mptsas_process_message()
730 mptsas_process_port_facts(s, (MPIMsgPortFacts *)req); in mptsas_process_message()
734 mptsas_process_port_enable(s, (MPIMsgPortEnable *)req); in mptsas_process_message()
738 mptsas_process_event_notification(s, (MPIMsgEventNotify *)req); in mptsas_process_message()
742 mptsas_process_config(s, (MPIMsgConfig *)req); in mptsas_process_message()
746 trace_mptsas_unhandled_cmd(s, req->Function, 0); in mptsas_process_message()
755 char req[MPTSAS_MAX_REQUEST_SIZE]; in mptsas_fetch_request() local
756 MPIRequestHeader *hdr = (MPIRequestHeader *)req; in mptsas_fetch_request()
762 pci_dma_read(pci, addr, req, sizeof(*hdr)); in mptsas_fetch_request()
772 pci_dma_read(pci, addr + sizeof(*hdr), &req[sizeof(*hdr)], in mptsas_fetch_request()
780 mptsas_process_scsi_io_request(s, (MPIMsgSCSIIORequest *)req, addr); in mptsas_fetch_request()
782 mptsas_process_message(s, (MPIRequestHeader *)req); in mptsas_fetch_request()
1135 MPTSASRequest *req = sreq->hba_private; in mptsas_get_sg_list() local
1137 return &req->qsg; in mptsas_get_sg_list()
1143 MPTSASRequest *req = sreq->hba_private; in mptsas_command_complete() local
1144 MPTSASState *s = req->dev; in mptsas_command_complete()
1148 hwaddr sense_buffer_addr = req->dev->sense_buffer_high_addr | in mptsas_command_complete()
1149 req->scsi_io.SenseBufferLowAddr; in mptsas_command_complete()
1151 trace_mptsas_command_complete(s, req->scsi_io.MsgContext, in mptsas_command_complete()
1157 MIN(req->scsi_io.SenseBufferLength, sense_len)); in mptsas_command_complete()
1161 req->dev->doorbell_state == DOORBELL_WRITE) { in mptsas_command_complete()
1165 reply.TargetID = req->scsi_io.TargetID; in mptsas_command_complete()
1166 reply.Bus = req->scsi_io.Bus; in mptsas_command_complete()
1168 reply.Function = req->scsi_io.Function; in mptsas_command_complete()
1169 reply.CDBLength = req->scsi_io.CDBLength; in mptsas_command_complete()
1170 reply.SenseBufferLength = req->scsi_io.SenseBufferLength; in mptsas_command_complete()
1171 reply.MsgFlags = req->scsi_io.MsgFlags; in mptsas_command_complete()
1172 reply.MsgContext = req->scsi_io.MsgContext; in mptsas_command_complete()
1175 reply.TransferCount = req->scsi_io.DataLength - resid; in mptsas_command_complete()
1186 mptsas_post_reply(req->dev, (MPIDefaultReply *)&reply); in mptsas_command_complete()
1188 mptsas_turbo_reply(req->dev, req->scsi_io.MsgContext); in mptsas_command_complete()
1191 mptsas_free_request(req); in mptsas_command_complete()
1196 MPTSASRequest *req = sreq->hba_private; in mptsas_request_cancelled() local
1200 reply.TargetID = req->scsi_io.TargetID; in mptsas_request_cancelled()
1201 reply.Bus = req->scsi_io.Bus; in mptsas_request_cancelled()
1203 reply.Function = req->scsi_io.Function; in mptsas_request_cancelled()
1204 reply.CDBLength = req->scsi_io.CDBLength; in mptsas_request_cancelled()
1205 reply.SenseBufferLength = req->scsi_io.SenseBufferLength; in mptsas_request_cancelled()
1206 reply.MsgFlags = req->scsi_io.MsgFlags; in mptsas_request_cancelled()
1207 reply.MsgContext = req->scsi_io.MsgContext; in mptsas_request_cancelled()
1212 mptsas_post_reply(req->dev, (MPIDefaultReply *)&reply); in mptsas_request_cancelled()
1213 mptsas_free_request(req); in mptsas_request_cancelled()
1218 MPTSASRequest *req = sreq->hba_private; in mptsas_save_request() local
1221 qemu_put_buffer(f, (unsigned char *)&req->scsi_io, sizeof(req->scsi_io)); in mptsas_save_request()
1222 qemu_put_be32(f, req->qsg.nsg); in mptsas_save_request()
1223 for (i = 0; i < req->qsg.nsg; i++) { in mptsas_save_request()
1224 qemu_put_be64(f, req->qsg.sg[i].base); in mptsas_save_request()
1225 qemu_put_be64(f, req->qsg.sg[i].len); in mptsas_save_request()
1234 MPTSASRequest *req; in mptsas_load_request() local
1237 req = g_new(MPTSASRequest, 1); in mptsas_load_request()
1238 qemu_get_buffer(f, (unsigned char *)&req->scsi_io, sizeof(req->scsi_io)); in mptsas_load_request()
1248 pci_dma_sglist_init(&req->qsg, pci, n); in mptsas_load_request()
1252 qemu_sglist_add(&req->qsg, base, len); in mptsas_load_request()
1256 req->sreq = sreq; in mptsas_load_request()
1257 req->dev = s; in mptsas_load_request()
1259 return req; in mptsas_load_request()