Lines Matching +full:- +full:- +full:-

5  * Copyright (c) 2009-2012 Hannes Reinecke, SUSE Labs
27 #include "hw/qdev-properties.h"
31 #include "qemu/main-loop.h"
38 #include "migration/qemu-file-types.h"
62 uint32_t state = s->intr_status & ~(s->intr_mask | MPI_HIS_IOP_DOORBELL_STATUS); in mptsas_update_interrupt()
77 if ((s->state & MPI_IOC_STATE_FAULT) == 0) { in mptsas_set_fault()
78 s->state = MPI_IOC_STATE_FAULT | code; in mptsas_set_fault()
83 ((s)->name##_head > ARRAY_SIZE((s)->name) || \
84 (s)->name##_tail > ARRAY_SIZE((s)->name))
87 ((s)->name##_head == (s)->name##_tail)
90 ((s)->name##_head == ((s)->name##_tail + 1) % ARRAY_SIZE((s)->name))
93 uint32_t _val = (s)->name[(s)->name##_head++]; \
94 (s)->name##_head %= ARRAY_SIZE((s)->name); \
99 (s)->name[(s)->name##_tail++] = (val); \
100 (s)->name##_tail %= ARRAY_SIZE((s)->name); \
115 pci_dma_write(pci, addr_lo | s->host_mfa_high_addr, reply, in mptsas_post_reply()
116 MIN(s->reply_frame_size, 4 * reply->MsgLength)); in mptsas_post_reply()
120 s->intr_status |= MPI_HIS_REPLY_MESSAGE_INTERRUPT; in mptsas_post_reply()
121 if (s->doorbell_state == DOORBELL_WRITE) { in mptsas_post_reply()
122 s->doorbell_state = DOORBELL_NONE; in mptsas_post_reply()
123 s->intr_status |= MPI_HIS_DOORBELL_INTERRUPT; in mptsas_post_reply()
130 if (s->doorbell_state == DOORBELL_WRITE) { in mptsas_reply()
134 s->doorbell_state = DOORBELL_READ; in mptsas_reply()
135 s->doorbell_reply_idx = 0; in mptsas_reply()
136 s->doorbell_reply_size = reply->MsgLength * 2; in mptsas_reply()
137 memcpy(s->doorbell_reply, reply, s->doorbell_reply_size * 2); in mptsas_reply()
138 s->intr_status |= MPI_HIS_DOORBELL_INTERRUPT; in mptsas_reply()
155 s->intr_status |= MPI_HIS_REPLY_MESSAGE_INTERRUPT; in mptsas_turbo_reply()
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()
233 left -= len; in mptsas_build_sgl()
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()
278 if (target >= s->max_devices) { in mptsas_scsi_device_find()
282 *sdev = scsi_device_find(&s->bus, bus, target, lun[1]); in mptsas_scsi_device_find()
301 trace_mptsas_process_scsi_io_request(s, scsi_io->Bus, scsi_io->TargetID, in mptsas_process_scsi_io_request()
302 scsi_io->LUN[1], scsi_io->DataLength); in mptsas_process_scsi_io_request()
304 status = mptsas_scsi_device_find(s, scsi_io->Bus, scsi_io->TargetID, in mptsas_process_scsi_io_request()
305 scsi_io->LUN, &sdev); 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()
319 if (req->qsg.size < scsi_io->DataLength) { in mptsas_process_scsi_io_request()
320 trace_mptsas_sgl_overflow(s, scsi_io->MsgContext, 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()
327 scsi_io->LUN[1], scsi_io->CDB, 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()
333 switch (scsi_io->Control & MPI_SCSIIO_CONTROL_DATADIRECTION_MASK) { 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()
360 scsi_io->DataLength); in mptsas_process_scsi_io_request()
366 reply.TargetID = scsi_io->TargetID; in mptsas_process_scsi_io_request()
367 reply.Bus = scsi_io->Bus; in mptsas_process_scsi_io_request()
369 reply.Function = scsi_io->Function; in mptsas_process_scsi_io_request()
370 reply.CDBLength = scsi_io->CDBLength; in mptsas_process_scsi_io_request()
371 reply.SenseBufferLength = scsi_io->SenseBufferLength; in mptsas_process_scsi_io_request()
372 reply.MsgContext = scsi_io->MsgContext; in mptsas_process_scsi_io_request()
395 if (++n->reply->TerminationCount == n->reply->IOCLogInfo) { in mptsas_cancel_notify()
396 n->reply->IOCLogInfo = 0; in mptsas_cancel_notify()
397 mptsas_fix_scsi_task_mgmt_reply_endianness(n->reply); in mptsas_cancel_notify()
398 mptsas_post_reply(n->s, (MPIDefaultReply *)n->reply); in mptsas_cancel_notify()
399 g_free(n->reply); in mptsas_cancel_notify()
416 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_scsi_task_mgmt()
417 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply)); 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()
441 QTAILQ_FOREACH_SAFE(r, &sdev->requests, next, next) { in mptsas_process_scsi_task_mgmt()
442 MPTSASRequest *cmd_req = r->hba_private; in mptsas_process_scsi_task_mgmt()
443 if (cmd_req && cmd_req->scsi_io.MsgContext == req->TaskMsgContext) { in mptsas_process_scsi_task_mgmt()
452 assert(r->hba_private); in mptsas_process_scsi_task_mgmt()
453 if (req->TaskType == MPI_SCSITASKMGMT_TASKTYPE_QUERY_TASK) { in mptsas_process_scsi_task_mgmt()
462 reply_async->IOCLogInfo = INT_MAX; in mptsas_process_scsi_task_mgmt()
466 notifier->s = s; in mptsas_process_scsi_task_mgmt()
467 notifier->reply = reply_async; in mptsas_process_scsi_task_mgmt()
468 notifier->notifier.notify = mptsas_cancel_notify; in mptsas_process_scsi_task_mgmt()
469 scsi_req_cancel_async(r, &notifier->notifier); 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()
489 reply_async->IOCLogInfo = INT_MAX; in mptsas_process_scsi_task_mgmt()
492 QTAILQ_FOREACH_SAFE(r, &sdev->requests, next, next) { in mptsas_process_scsi_task_mgmt()
493 if (r->hba_private) { in mptsas_process_scsi_task_mgmt()
498 notifier->s = s; in mptsas_process_scsi_task_mgmt()
499 notifier->reply = reply_async; in mptsas_process_scsi_task_mgmt()
500 notifier->notifier.notify = mptsas_cancel_notify; in mptsas_process_scsi_task_mgmt()
501 scsi_req_cancel_async(r, &notifier->notifier); in mptsas_process_scsi_task_mgmt()
506 if (reply_async->TerminationCount < count) { in mptsas_process_scsi_task_mgmt()
507 reply_async->IOCLogInfo = count; 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()
525 device_cold_reset(&sdev->qdev); 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()
538 QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) { in mptsas_process_scsi_task_mgmt()
539 sdev = SCSI_DEVICE(kid->child); in mptsas_process_scsi_task_mgmt()
540 if (sdev->channel == 0 && sdev->id == req->TargetID) { in mptsas_process_scsi_task_mgmt()
541 device_cold_reset(kid->child); in mptsas_process_scsi_task_mgmt()
547 bus_cold_reset(BUS(&s->bus)); in mptsas_process_scsi_task_mgmt()
567 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_ioc_init()
568 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply)); 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()
577 if (s->state == MPI_IOC_STATE_READY) { in mptsas_process_ioc_init()
578 s->state = MPI_IOC_STATE_OPERATIONAL; in mptsas_process_ioc_init()
582 reply.WhoInit = s->who_init; in mptsas_process_ioc_init()
584 reply.Function = req->Function; in mptsas_process_ioc_init()
585 reply.MaxDevices = s->max_devices; in mptsas_process_ioc_init()
586 reply.MaxBuses = s->max_buses; in mptsas_process_ioc_init()
587 reply.MsgContext = req->MsgContext; in mptsas_process_ioc_init()
601 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_ioc_facts()
602 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply)); 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()
610 reply.WhoInit = s->who_init; in mptsas_process_ioc_facts()
612 reply.ReplyQueueDepth = ARRAY_SIZE(s->reply_post) - 1; in mptsas_process_ioc_facts()
613 QEMU_BUILD_BUG_ON(ARRAY_SIZE(s->reply_post) != ARRAY_SIZE(s->reply_free)); in mptsas_process_ioc_facts()
617 reply.CurrentHostMfaHighAddr = s->host_mfa_high_addr >> 32; in mptsas_process_ioc_facts()
618 reply.GlobalCredits = ARRAY_SIZE(s->request_post) - 1; in mptsas_process_ioc_facts()
620 reply.CurrentSenseBufferHighAddr = s->sense_buffer_high_addr >> 32; in mptsas_process_ioc_facts()
621 reply.CurReplyFrameSize = s->reply_frame_size; in mptsas_process_ioc_facts()
622 reply.MaxDevices = s->max_devices; in mptsas_process_ioc_facts()
623 reply.MaxBuses = s->max_buses; in mptsas_process_ioc_facts()
641 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_port_facts()
642 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply)); 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()
669 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_port_enable()
670 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply)); 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()
690 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_msg) < sizeof(*req)); in mptsas_process_event_notification()
691 QEMU_BUILD_BUG_ON(sizeof(s->doorbell_reply) < sizeof(reply)); 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()
715 trace_mptsas_process_message(s, req->Function, req->MsgContext); in mptsas_process_message()
716 switch (req->Function) { in mptsas_process_message()
746 trace_mptsas_unhandled_cmd(s, req->Function, 0); in mptsas_process_message()
761 addr = s->host_mfa_high_addr | MPTSAS_FIFO_GET(s, request_post); in mptsas_fetch_request()
764 if (hdr->Function < ARRAY_SIZE(mpi_request_sizes) && in mptsas_fetch_request()
765 mpi_request_sizes[hdr->Function]) { in mptsas_fetch_request()
770 size = mpi_request_sizes[hdr->Function]; in mptsas_fetch_request()
773 size - sizeof(*hdr)); in mptsas_fetch_request()
776 if (hdr->Function == MPI_FUNCTION_SCSI_IO_REQUEST) { in mptsas_fetch_request()
790 if (s->state != MPI_IOC_STATE_OPERATIONAL) { in mptsas_fetch_requests()
806 save_mask = s->intr_mask; in mptsas_soft_reset()
807 s->intr_mask = MPI_HIM_DIM | MPI_HIM_RIM; in mptsas_soft_reset()
810 bus_cold_reset(BUS(&s->bus)); in mptsas_soft_reset()
811 s->intr_status = 0; in mptsas_soft_reset()
812 s->intr_mask = save_mask; in mptsas_soft_reset()
814 s->reply_free_tail = 0; in mptsas_soft_reset()
815 s->reply_free_head = 0; in mptsas_soft_reset()
816 s->reply_post_tail = 0; in mptsas_soft_reset()
817 s->reply_post_head = 0; in mptsas_soft_reset()
818 s->request_post_tail = 0; in mptsas_soft_reset()
819 s->request_post_head = 0; in mptsas_soft_reset()
820 qemu_bh_cancel(s->request_bh); in mptsas_soft_reset()
822 s->state = MPI_IOC_STATE_READY; in mptsas_soft_reset()
829 ret = (s->who_init << MPI_DOORBELL_WHO_INIT_SHIFT) & MPI_DOORBELL_WHO_INIT_MASK; in mptsas_doorbell_read()
830 ret |= s->state; in mptsas_doorbell_read()
831 switch (s->doorbell_state) { in mptsas_doorbell_read()
843 assert(s->intr_status & MPI_HIS_DOORBELL_INTERRUPT); in mptsas_doorbell_read()
844 assert(s->doorbell_reply_idx <= s->doorbell_reply_size); in mptsas_doorbell_read()
847 if (s->doorbell_reply_idx < s->doorbell_reply_size) { in mptsas_doorbell_read()
850 * fw_cfg_data_mem_read() / _write()", 2015-01-16). in mptsas_doorbell_read()
852 ret |= le16_to_cpu(s->doorbell_reply[s->doorbell_reply_idx++]); in mptsas_doorbell_read()
865 if (s->doorbell_state == DOORBELL_WRITE) { in mptsas_doorbell_write()
866 if (s->doorbell_idx < s->doorbell_cnt) { in mptsas_doorbell_write()
869 * fw_cfg_data_mem_read() / _write()", 2015-01-16). in mptsas_doorbell_write()
871 s->doorbell_msg[s->doorbell_idx++] = cpu_to_le32(val); in mptsas_doorbell_write()
872 if (s->doorbell_idx == s->doorbell_cnt) { in mptsas_doorbell_write()
873 mptsas_process_message(s, (MPIRequestHeader *)s->doorbell_msg); in mptsas_doorbell_write()
886 s->doorbell_state = DOORBELL_WRITE; in mptsas_doorbell_write()
887 s->doorbell_idx = 0; in mptsas_doorbell_write()
888 s->doorbell_cnt = (val & MPI_DOORBELL_ADD_DWORDS_MASK) in mptsas_doorbell_write()
890 s->intr_status |= MPI_HIS_DOORBELL_INTERRUPT; in mptsas_doorbell_write()
902 * will disable it. Otherwise, the guest has to do a magic five-write in mptsas_write_sequence_write()
905 if (s->diagnostic & MPI_DIAG_DRWE) { in mptsas_write_sequence_write()
909 switch (s->diagnostic_idx) { in mptsas_write_sequence_write()
937 s->diagnostic |= MPI_DIAG_DRWE; in mptsas_write_sequence_write()
940 s->diagnostic_idx++; in mptsas_write_sequence_write()
944 s->diagnostic &= ~MPI_DIAG_DRWE; in mptsas_write_sequence_write()
945 s->diagnostic_idx = 0; in mptsas_write_sequence_write()
952 s->intr_mask = MPI_HIM_DIM | MPI_HIM_RIM; in mptsas_hard_reset()
954 s->host_mfa_high_addr = 0; in mptsas_hard_reset()
955 s->sense_buffer_high_addr = 0; in mptsas_hard_reset()
956 s->reply_frame_size = 0; in mptsas_hard_reset()
957 s->max_devices = MPTSAS_NUM_PORTS; in mptsas_hard_reset()
958 s->max_buses = 1; in mptsas_hard_reset()
965 switch (s->doorbell_state) { in mptsas_interrupt_status_write()
968 s->intr_status &= ~MPI_HIS_DOORBELL_INTERRUPT; in mptsas_interrupt_status_write()
973 assert(s->intr_status & MPI_HIS_DOORBELL_INTERRUPT); in mptsas_interrupt_status_write()
974 if (s->doorbell_reply_idx == s->doorbell_reply_size) { in mptsas_interrupt_status_write()
975 s->doorbell_state = DOORBELL_NONE; in mptsas_interrupt_status_write()
992 ret = -1; in mptsas_reply_post_read()
993 s->intr_status &= ~MPI_HIS_REPLY_MESSAGE_INTERRUPT; in mptsas_reply_post_read()
1012 ret = s->diagnostic; in mptsas_mmio_read()
1016 ret = s->intr_status; in mptsas_mmio_read()
1020 ret = s->intr_mask; in mptsas_mmio_read()
1061 s->intr_mask = val & (MPI_HIM_RIM | MPI_HIM_DIM); in mptsas_mmio_write()
1070 qemu_bh_schedule(s->request_bh); in mptsas_mmio_write()
1135 MPTSASRequest *req = sreq->hba_private; in mptsas_get_sg_list()
1137 return &req->qsg; in mptsas_get_sg_list()
1143 MPTSASRequest *req = sreq->hba_private; in mptsas_command_complete()
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()
1152 sreq->status, resid); in mptsas_command_complete()
1157 MIN(req->scsi_io.SenseBufferLength, sense_len)); in mptsas_command_complete()
1160 if (sreq->status != GOOD || resid || 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()
1173 reply.SCSIStatus = sreq->status; in mptsas_command_complete()
1174 if (sreq->status == GOOD) { 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()
1196 MPTSASRequest *req = sreq->hba_private; in mptsas_request_cancelled()
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()
1218 MPTSASRequest *req = sreq->hba_private; in mptsas_save_request()
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()
1231 SCSIBus *bus = sreq->bus; 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()
1280 dev->config[PCI_LATENCY_TIMER] = 0; in mptsas_scsi_realize()
1281 dev->config[PCI_INTERRUPT_PIN] = 0x01; in mptsas_scsi_realize()
1283 if (s->msi != ON_OFF_AUTO_OFF) { in mptsas_scsi_realize()
1285 /* Any error other than -ENOTSUP(board's MSI support is broken) in mptsas_scsi_realize()
1287 assert(!ret || ret == -ENOTSUP); in mptsas_scsi_realize()
1288 if (ret && s->msi == ON_OFF_AUTO_ON) { in mptsas_scsi_realize()
1295 assert(!err || s->msi == ON_OFF_AUTO_AUTO); in mptsas_scsi_realize()
1300 s->msi_in_use = (ret == 0); in mptsas_scsi_realize()
1303 memory_region_init_io(&s->mmio_io, OBJECT(s), &mptsas_mmio_ops, s, in mptsas_scsi_realize()
1304 "mptsas-mmio", 0x4000); in mptsas_scsi_realize()
1305 memory_region_init_io(&s->port_io, OBJECT(s), &mptsas_port_ops, s, in mptsas_scsi_realize()
1306 "mptsas-io", 256); in mptsas_scsi_realize()
1307 memory_region_init_io(&s->diag_io, OBJECT(s), &mptsas_diag_ops, s, in mptsas_scsi_realize()
1308 "mptsas-diag", 0x10000); in mptsas_scsi_realize()
1310 pci_register_bar(dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->port_io); in mptsas_scsi_realize()
1312 PCI_BASE_ADDRESS_MEM_TYPE_32, &s->mmio_io); in mptsas_scsi_realize()
1314 PCI_BASE_ADDRESS_MEM_TYPE_32, &s->diag_io); in mptsas_scsi_realize()
1316 if (!s->sas_addr) { in mptsas_scsi_realize()
1317 s->sas_addr = ((NAA_LOCALLY_ASSIGNED_ID << 24) | in mptsas_scsi_realize()
1319 s->sas_addr |= (pci_dev_bus_num(dev) << 16); in mptsas_scsi_realize()
1320 s->sas_addr |= (PCI_SLOT(dev->devfn) << 8); in mptsas_scsi_realize()
1321 s->sas_addr |= PCI_FUNC(dev->devfn); in mptsas_scsi_realize()
1323 s->max_devices = MPTSAS_NUM_PORTS; in mptsas_scsi_realize()
1325 s->request_bh = qemu_bh_new_guarded(mptsas_fetch_requests, s, in mptsas_scsi_realize()
1326 &DEVICE(dev)->mem_reentrancy_guard); in mptsas_scsi_realize()
1328 scsi_bus_init(&s->bus, sizeof(s->bus), &dev->qdev, &mptsas_scsi_info); in mptsas_scsi_realize()
1335 qemu_bh_delete(s->request_bh); in mptsas_scsi_uninit()
1350 if (s->doorbell_idx > s->doorbell_cnt || in mptsas_post_load()
1351 s->doorbell_cnt > ARRAY_SIZE(s->doorbell_msg) || in mptsas_post_load()
1352 s->doorbell_reply_idx > s->doorbell_reply_size || in mptsas_post_load()
1353 s->doorbell_reply_size > ARRAY_SIZE(s->doorbell_reply) || in mptsas_post_load()
1357 s->diagnostic_idx > 4) { in mptsas_post_load()
1358 return -EINVAL; in mptsas_post_load()
1424 pc->realize = mptsas_scsi_realize; in mptsas1068_class_init()
1425 pc->exit = mptsas_scsi_uninit; in mptsas1068_class_init()
1426 pc->romfile = 0; in mptsas1068_class_init()
1427 pc->vendor_id = PCI_VENDOR_ID_LSI_LOGIC; in mptsas1068_class_init()
1428 pc->device_id = PCI_DEVICE_ID_LSI_SAS1068; in mptsas1068_class_init()
1429 pc->subsystem_vendor_id = PCI_VENDOR_ID_LSI_LOGIC; in mptsas1068_class_init()
1430 pc->subsystem_id = 0x8000; in mptsas1068_class_init()
1431 pc->class_id = PCI_CLASS_STORAGE_SCSI; in mptsas1068_class_init()
1434 dc->vmsd = &vmstate_mptsas; in mptsas1068_class_init()
1435 dc->desc = "LSI SAS 1068"; in mptsas1068_class_init()
1436 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); in mptsas1068_class_init()