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

9  * http://lists.gnu.org/archive/html/qemu-devel/2011-08/msg00729.html
17 * See the COPYING file in the top-level directory.
19 * NOTE about MSI-X:
20 * MSI-X support has been removed for the moment because it leads Windows OS
22 * MSI-X shared memory to be part of the same BAR used for rings state
24 * BAR created from MSI-X purposes. Windows driver fails to deal with 2 BARs.
30 #include "qemu/main-loop.h"
36 #include "hw/qdev-properties.h"
54 ldl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \
55 (m)->rs_pa + offsetof(struct PVSCSIRingsState, field), \
58 (stl_le_pci_dma(&container_of(m, PVSCSIState, rings)->parent_obj, \
59 (m)->rs_pa + offsetof(struct PVSCSIRingsState, field), val, \
153 m->rs_pa = ri->ringsStatePPN << VMW_PAGE_SHIFT; in pvscsi_ring_init_data()
155 req_ring_size = ri->reqRingNumPages * PVSCSI_MAX_NUM_REQ_ENTRIES_PER_PAGE; in pvscsi_ring_init_data()
156 cmp_ring_size = ri->cmpRingNumPages * PVSCSI_MAX_NUM_CMP_ENTRIES_PER_PAGE; in pvscsi_ring_init_data()
157 txr_len_log2 = pvscsi_log2(req_ring_size - 1); in pvscsi_ring_init_data()
158 rxr_len_log2 = pvscsi_log2(cmp_ring_size - 1); in pvscsi_ring_init_data()
160 m->txr_len_mask = MASK(txr_len_log2); in pvscsi_ring_init_data()
161 m->rxr_len_mask = MASK(rxr_len_log2); in pvscsi_ring_init_data()
163 m->consumed_ptr = 0; in pvscsi_ring_init_data()
164 m->filled_cmp_ptr = 0; in pvscsi_ring_init_data()
166 for (i = 0; i < ri->reqRingNumPages; i++) { in pvscsi_ring_init_data()
167 m->req_ring_pages_pa[i] = ri->reqRingPPNs[i] << VMW_PAGE_SHIFT; in pvscsi_ring_init_data()
170 for (i = 0; i < ri->cmpRingNumPages; i++) { in pvscsi_ring_init_data()
171 m->cmp_ring_pages_pa[i] = ri->cmpRingPPNs[i] << VMW_PAGE_SHIFT; in pvscsi_ring_init_data()
195 if (!ri->numPages || ri->numPages > PVSCSI_SETUP_MSG_RING_MAX_NUM_PAGES) { in pvscsi_ring_init_msg()
196 return -1; in pvscsi_ring_init_msg()
198 ring_size = ri->numPages * PVSCSI_MAX_NUM_MSG_ENTRIES_PER_PAGE; in pvscsi_ring_init_msg()
199 len_log2 = pvscsi_log2(ring_size - 1); in pvscsi_ring_init_msg()
201 m->msg_len_mask = MASK(len_log2); in pvscsi_ring_init_msg()
203 m->filled_msg_ptr = 0; in pvscsi_ring_init_msg()
205 for (i = 0; i < ri->numPages; i++) { in pvscsi_ring_init_msg()
206 m->msg_ring_pages_pa[i] = ri->ringPPNs[i] << VMW_PAGE_SHIFT; in pvscsi_ring_init_msg()
224 mgr->rs_pa = 0; in pvscsi_ring_cleanup()
225 mgr->txr_len_mask = 0; in pvscsi_ring_cleanup()
226 mgr->rxr_len_mask = 0; in pvscsi_ring_cleanup()
227 mgr->msg_len_mask = 0; in pvscsi_ring_cleanup()
228 mgr->consumed_ptr = 0; in pvscsi_ring_cleanup()
229 mgr->filled_cmp_ptr = 0; in pvscsi_ring_cleanup()
230 mgr->filled_msg_ptr = 0; in pvscsi_ring_cleanup()
231 memset(mgr->req_ring_pages_pa, 0, sizeof(mgr->req_ring_pages_pa)); in pvscsi_ring_cleanup()
232 memset(mgr->cmp_ring_pages_pa, 0, sizeof(mgr->cmp_ring_pages_pa)); in pvscsi_ring_cleanup()
233 memset(mgr->msg_ring_pages_pa, 0, sizeof(mgr->msg_ring_pages_pa)); in pvscsi_ring_cleanup()
244 if (ready_ptr != mgr->consumed_ptr in pvscsi_ring_pop_req_descr()
245 && ready_ptr - mgr->consumed_ptr < ring_size) { in pvscsi_ring_pop_req_descr()
247 mgr->consumed_ptr++ & mgr->txr_len_mask; in pvscsi_ring_pop_req_descr()
253 return mgr->req_ring_pages_pa[next_ready_page] + in pvscsi_ring_pop_req_descr()
263 RS_SET_FIELD(mgr, reqConsIdx, mgr->consumed_ptr); in pvscsi_ring_flush_req()
278 mgr->filled_cmp_ptr++ & mgr->rxr_len_mask; in pvscsi_ring_pop_cmp_descr()
283 return mgr->cmp_ring_pages_pa[free_cmp_page] + in pvscsi_ring_pop_cmp_descr()
291 mgr->filled_msg_ptr++ & mgr->msg_len_mask; in pvscsi_ring_pop_msg_descr()
296 return mgr->msg_ring_pages_pa[free_msg_page] + in pvscsi_ring_pop_msg_descr()
306 trace_pvscsi_ring_flush_cmp(mgr->filled_cmp_ptr); in pvscsi_ring_flush_cmp()
308 RS_SET_FIELD(mgr, cmpProdIdx, mgr->filled_cmp_ptr); in pvscsi_ring_flush_cmp()
320 return (prodIdx - consIdx) < (mgr->msg_len_mask + 1); in pvscsi_ring_msg_has_room()
329 trace_pvscsi_ring_flush_msg(mgr->filled_msg_ptr); in pvscsi_ring_flush_msg()
331 RS_SET_FIELD(mgr, msgProdIdx, mgr->filled_msg_ptr); in pvscsi_ring_flush_msg()
337 s->curr_cmd = PVSCSI_CMD_FIRST; in pvscsi_reset_state()
338 s->curr_cmd_data_cntr = 0; in pvscsi_reset_state()
339 s->reg_command_status = PVSCSI_COMMAND_PROCESSING_SUCCEEDED; in pvscsi_reset_state()
340 s->reg_interrupt_status = 0; in pvscsi_reset_state()
341 pvscsi_ring_cleanup(&s->rings); in pvscsi_reset_state()
342 s->rings_info_valid = FALSE; in pvscsi_reset_state()
343 s->msg_ring_info_valid = FALSE; in pvscsi_reset_state()
344 QTAILQ_INIT(&s->pending_queue); in pvscsi_reset_state()
345 QTAILQ_INIT(&s->completion_queue); in pvscsi_reset_state()
352 bool should_raise = s->reg_interrupt_enabled & s->reg_interrupt_status; in pvscsi_update_irq_status()
354 trace_pvscsi_update_irq_level(should_raise, s->reg_interrupt_enabled, in pvscsi_update_irq_status()
355 s->reg_interrupt_status); in pvscsi_update_irq_status()
371 s->reg_interrupt_status |= PVSCSI_INTR_CMPL_0; in pvscsi_raise_completion_interrupt()
382 s->reg_interrupt_status |= PVSCSI_INTR_MSG_0; in pvscsi_raise_message_interrupt()
395 cmp_descr_pa = pvscsi_ring_pop_cmp_descr(&s->rings); in pvscsi_cmp_ring_put()
405 msg_descr_pa = pvscsi_ring_pop_msg_descr(&s->rings); in pvscsi_msg_ring_put()
417 while (!QTAILQ_EMPTY(&s->completion_queue)) { in pvscsi_process_completion_queue()
418 pvscsi_req = QTAILQ_FIRST(&s->completion_queue); in pvscsi_process_completion_queue()
419 QTAILQ_REMOVE(&s->completion_queue, pvscsi_req, next); in pvscsi_process_completion_queue()
420 pvscsi_cmp_ring_put(s, &pvscsi_req->cmp); in pvscsi_process_completion_queue()
426 pvscsi_ring_flush_cmp(&s->rings); in pvscsi_process_completion_queue()
434 s->resetting++; in pvscsi_reset_adapter()
435 bus_cold_reset(BUS(&s->bus)); in pvscsi_reset_adapter()
436 s->resetting--; in pvscsi_reset_adapter()
438 assert(QTAILQ_EMPTY(&s->pending_queue)); in pvscsi_reset_adapter()
446 if (!QTAILQ_EMPTY(&s->completion_queue)) { in pvscsi_schedule_completion_processing()
447 qemu_bh_schedule(s->completion_worker); in pvscsi_schedule_completion_processing()
454 assert(!r->completed); in pvscsi_complete_request()
456 trace_pvscsi_complete_request(r->cmp.context, r->cmp.dataLen, in pvscsi_complete_request()
457 r->sense_key); in pvscsi_complete_request()
458 if (r->sreq != NULL) { in pvscsi_complete_request()
459 scsi_req_unref(r->sreq); in pvscsi_complete_request()
460 r->sreq = NULL; in pvscsi_complete_request()
462 r->completed = 1; in pvscsi_complete_request()
463 QTAILQ_REMOVE(&s->pending_queue, r, next); in pvscsi_complete_request()
464 QTAILQ_INSERT_TAIL(&s->completion_queue, r, next); in pvscsi_complete_request()
470 PVSCSIRequest *req = r->hba_private; in pvscsi_get_sg_list()
472 trace_pvscsi_get_sg_list(req->sgl.nsg, req->sgl.size); in pvscsi_get_sg_list()
474 return &req->sgl; in pvscsi_get_sg_list()
482 cpu_physical_memory_read(sg->elemAddr, &elem, sizeof(elem)); in pvscsi_get_next_sg_elem()
493 sg->elemAddr += sizeof(elem); in pvscsi_get_next_sg_elem()
494 sg->dataAddr = elem.addr; in pvscsi_get_next_sg_elem()
495 sg->resid = elem.length; in pvscsi_get_next_sg_elem()
501 r->cmp.senseLen = MIN(r->req.senseLen, len); in pvscsi_write_sense()
502 r->sense_key = sense[(sense[0] & 2) ? 1 : 2]; in pvscsi_write_sense()
503 cpu_physical_memory_write(r->req.senseAddr, sense, r->cmp.senseLen); in pvscsi_write_sense()
509 PVSCSIRequest *pvscsi_req = req->hba_private; in pvscsi_command_failed()
513 trace_pvscsi_command_complete_not_found(req->tag); in pvscsi_command_failed()
516 s = pvscsi_req->dev; in pvscsi_command_failed()
518 switch (req->host_status) { in pvscsi_command_failed()
520 pvscsi_req->cmp.hostStatus = BTSTAT_LUNMISMATCH; in pvscsi_command_failed()
523 pvscsi_req->cmp.hostStatus = BTSTAT_ABORTQUEUE; in pvscsi_command_failed()
527 pvscsi_req->cmp.hostStatus = BTSTAT_SENTRST; in pvscsi_command_failed()
530 pvscsi_req->cmp.hostStatus = BTSTAT_SELTIMEO; in pvscsi_command_failed()
533 pvscsi_req->cmp.hostStatus = BTSTAT_BUSRESET; in pvscsi_command_failed()
536 pvscsi_req->cmp.hostStatus = BTSTAT_HASOFTWARE; in pvscsi_command_failed()
539 pvscsi_req->cmp.scsiStatus = GOOD; in pvscsi_command_failed()
540 qemu_sglist_destroy(&pvscsi_req->sgl); in pvscsi_command_failed()
547 PVSCSIRequest *pvscsi_req = req->hba_private; in pvscsi_command_complete()
551 trace_pvscsi_command_complete_not_found(req->tag); in pvscsi_command_complete()
554 s = pvscsi_req->dev; in pvscsi_command_complete()
559 pvscsi_req->cmp.hostStatus = BTSTAT_DATARUN; in pvscsi_command_complete()
562 pvscsi_req->cmp.scsiStatus = req->status; in pvscsi_command_complete()
563 if (pvscsi_req->cmp.scsiStatus == CHECK_CONDITION) { in pvscsi_command_complete()
566 scsi_req_get_sense(pvscsi_req->sreq, sense, sizeof(sense)); in pvscsi_command_complete()
571 qemu_sglist_destroy(&pvscsi_req->sgl); in pvscsi_command_complete()
578 if (s->msg_ring_info_valid && pvscsi_ring_msg_has_room(&s->rings)) { in pvscsi_send_msg()
582 msg.bus = dev->channel; in pvscsi_send_msg()
583 msg.target = dev->id; in pvscsi_send_msg()
584 msg.lun[1] = dev->lun; in pvscsi_send_msg()
587 pvscsi_ring_flush_msg(&s->rings); in pvscsi_send_msg()
612 PVSCSIRequest *pvscsi_req = req->hba_private; in pvscsi_request_cancelled()
613 PVSCSIState *s = pvscsi_req->dev; in pvscsi_request_cancelled()
615 if (pvscsi_req->completed) { in pvscsi_request_cancelled()
619 if (pvscsi_req->dev->resetting) { in pvscsi_request_cancelled()
620 pvscsi_req->cmp.hostStatus = BTSTAT_BUSRESET; in pvscsi_request_cancelled()
622 pvscsi_req->cmp.hostStatus = BTSTAT_ABORTQUEUE; in pvscsi_request_cancelled()
638 return scsi_device_find(&s->bus, channel, target, *target_lun); in pvscsi_device_find()
650 pvscsi_req->dev = s; in pvscsi_queue_pending_descriptor()
651 pvscsi_req->req = *descr; in pvscsi_queue_pending_descriptor()
652 pvscsi_req->cmp.context = pvscsi_req->req.context; in pvscsi_queue_pending_descriptor()
653 QTAILQ_INSERT_TAIL(&s->pending_queue, pvscsi_req, next); in pvscsi_queue_pending_descriptor()
655 *d = pvscsi_device_find(s, descr->bus, descr->target, descr->lun, &lun); in pvscsi_queue_pending_descriptor()
657 pvscsi_req->lun = lun; in pvscsi_queue_pending_descriptor()
667 uint64_t data_length = r->req.dataLen; in pvscsi_convert_sglist()
668 PVSCSISGState sg = r->sg; in pvscsi_convert_sglist()
672 trace_pvscsi_convert_sglist(r->req.context, r->sg.dataAddr, in pvscsi_convert_sglist()
673 r->sg.resid); in pvscsi_convert_sglist()
677 qemu_sglist_add(&r->sgl, sg.dataAddr, chunk_size); in pvscsi_convert_sglist()
681 data_length -= chunk_size; in pvscsi_convert_sglist()
682 sg.resid -= chunk_size; in pvscsi_convert_sglist()
691 pci_dma_sglist_init(&r->sgl, d, 1); in pvscsi_build_sglist()
692 if (r->req.flags & PVSCSI_FLAG_CMD_WITH_SG_LIST) { in pvscsi_build_sglist()
695 qemu_sglist_add(&r->sgl, r->req.dataAddr, r->req.dataLen); in pvscsi_build_sglist()
707 trace_pvscsi_process_req_descr(descr->cdb[0], descr->context); in pvscsi_process_request_descriptor()
710 r->cmp.hostStatus = BTSTAT_SELTIMEO; in pvscsi_process_request_descriptor()
716 if (descr->flags & PVSCSI_FLAG_CMD_WITH_SG_LIST) { in pvscsi_process_request_descriptor()
717 r->sg.elemAddr = descr->dataAddr; in pvscsi_process_request_descriptor()
720 r->sreq = scsi_req_new(d, descr->context, r->lun, descr->cdb, descr->cdbLen, r); in pvscsi_process_request_descriptor()
721 if (r->sreq->cmd.mode == SCSI_XFER_FROM_DEV && in pvscsi_process_request_descriptor()
722 (descr->flags & PVSCSI_FLAG_CMD_DIR_TODEVICE)) { in pvscsi_process_request_descriptor()
723 r->cmp.hostStatus = BTSTAT_BADMSG; in pvscsi_process_request_descriptor()
725 scsi_req_cancel(r->sreq); in pvscsi_process_request_descriptor()
728 if (r->sreq->cmd.mode == SCSI_XFER_TO_DEV && in pvscsi_process_request_descriptor()
729 (descr->flags & PVSCSI_FLAG_CMD_DIR_TOHOST)) { in pvscsi_process_request_descriptor()
730 r->cmp.hostStatus = BTSTAT_BADMSG; in pvscsi_process_request_descriptor()
732 scsi_req_cancel(r->sreq); in pvscsi_process_request_descriptor()
737 n = scsi_req_enqueue(r->sreq); in pvscsi_process_request_descriptor()
740 scsi_req_continue(r->sreq); in pvscsi_process_request_descriptor()
750 if (!s->rings_info_valid) { in pvscsi_process_io()
754 while ((next_descr_pa = pvscsi_ring_pop_req_descr(&s->rings)) != 0) { in pvscsi_process_io()
764 pvscsi_ring_flush_req(&s->rings); in pvscsi_process_io()
771 trace_pvscsi_tx_rings_ppn("Rings State", rc->ringsStatePPN); in pvscsi_dbg_dump_tx_rings_config()
773 trace_pvscsi_tx_rings_num_pages("Request Ring", rc->reqRingNumPages); in pvscsi_dbg_dump_tx_rings_config()
774 for (i = 0; i < rc->reqRingNumPages; i++) { in pvscsi_dbg_dump_tx_rings_config()
775 trace_pvscsi_tx_rings_ppn("Request Ring", rc->reqRingPPNs[i]); in pvscsi_dbg_dump_tx_rings_config()
778 trace_pvscsi_tx_rings_num_pages("Confirm Ring", rc->cmpRingNumPages); in pvscsi_dbg_dump_tx_rings_config()
779 for (i = 0; i < rc->cmpRingNumPages; i++) { in pvscsi_dbg_dump_tx_rings_config()
780 trace_pvscsi_tx_rings_ppn("Confirm Ring", rc->cmpRingPPNs[i]); in pvscsi_dbg_dump_tx_rings_config()
809 (PVSCSICmdDescSetupRings *) s->curr_cmd_data; in pvscsi_on_cmd_setup_rings()
813 if (!rc->reqRingNumPages in pvscsi_on_cmd_setup_rings()
814 || rc->reqRingNumPages > PVSCSI_SETUP_RINGS_MAX_NUM_PAGES in pvscsi_on_cmd_setup_rings()
815 || !rc->cmpRingNumPages in pvscsi_on_cmd_setup_rings()
816 || rc->cmpRingNumPages > PVSCSI_SETUP_RINGS_MAX_NUM_PAGES) { in pvscsi_on_cmd_setup_rings()
821 pvscsi_ring_init_data(&s->rings, rc); in pvscsi_on_cmd_setup_rings()
823 s->rings_info_valid = TRUE; in pvscsi_on_cmd_setup_rings()
830 PVSCSICmdDescAbortCmd *cmd = (PVSCSICmdDescAbortCmd *) s->curr_cmd_data; in pvscsi_on_cmd_abort()
833 trace_pvscsi_on_cmd_abort(cmd->context, cmd->target); in pvscsi_on_cmd_abort()
835 QTAILQ_FOREACH_SAFE(r, &s->pending_queue, next, next) { in pvscsi_on_cmd_abort()
836 if (r->req.context == cmd->context) { in pvscsi_on_cmd_abort()
841 assert(!r->completed); in pvscsi_on_cmd_abort()
842 r->cmp.hostStatus = BTSTAT_ABORTQUEUE; in pvscsi_on_cmd_abort()
843 scsi_req_cancel(r->sreq); in pvscsi_on_cmd_abort()
852 trace_pvscsi_on_cmd_unknown_data(s->curr_cmd_data[0]); in pvscsi_on_cmd_unknown()
861 (struct PVSCSICmdDescResetDevice *) s->curr_cmd_data; in pvscsi_on_cmd_reset_device()
864 sdev = pvscsi_device_find(s, 0, cmd->target, cmd->lun, &target_lun); in pvscsi_on_cmd_reset_device()
866 trace_pvscsi_on_cmd_reset_dev(cmd->target, (int) target_lun, sdev); in pvscsi_on_cmd_reset_device()
869 s->resetting++; in pvscsi_on_cmd_reset_device()
870 device_cold_reset(&sdev->qdev); in pvscsi_on_cmd_reset_device()
871 s->resetting--; in pvscsi_on_cmd_reset_device()
883 s->resetting++; in pvscsi_on_cmd_reset_bus()
884 bus_cold_reset(BUS(&s->bus)); in pvscsi_on_cmd_reset_bus()
885 s->resetting--; in pvscsi_on_cmd_reset_bus()
893 (PVSCSICmdDescSetupMsgRing *) s->curr_cmd_data; in pvscsi_on_cmd_setup_msg_ring()
897 if (!s->use_msg) { in pvscsi_on_cmd_setup_msg_ring()
901 if (s->rings_info_valid) { in pvscsi_on_cmd_setup_msg_ring()
902 if (pvscsi_ring_init_msg(&s->rings, rc) < 0) { in pvscsi_on_cmd_setup_msg_ring()
905 s->msg_ring_info_valid = TRUE; in pvscsi_on_cmd_setup_msg_ring()
980 size_t bytes_arrived = s->curr_cmd_data_cntr * sizeof(uint32_t); in pvscsi_do_command_processing()
982 assert(s->curr_cmd < PVSCSI_CMD_LAST); in pvscsi_do_command_processing()
983 if (bytes_arrived >= pvscsi_commands[s->curr_cmd].data_size) { in pvscsi_do_command_processing()
984 s->reg_command_status = pvscsi_commands[s->curr_cmd].handler_fn(s); in pvscsi_do_command_processing()
985 s->curr_cmd = PVSCSI_CMD_FIRST; in pvscsi_do_command_processing()
986 s->curr_cmd_data_cntr = 0; in pvscsi_do_command_processing()
993 size_t bytes_arrived = s->curr_cmd_data_cntr * sizeof(uint32_t); in pvscsi_on_command_data()
995 assert(bytes_arrived < sizeof(s->curr_cmd_data)); in pvscsi_on_command_data()
996 s->curr_cmd_data[s->curr_cmd_data_cntr++] = value; in pvscsi_on_command_data()
1005 s->curr_cmd = cmd_id; in pvscsi_on_command()
1007 s->curr_cmd = PVSCSI_CMD_FIRST; in pvscsi_on_command()
1011 s->curr_cmd_data_cntr = 0; in pvscsi_on_command()
1012 s->reg_command_status = PVSCSI_COMMAND_NOT_ENOUGH_DATA; in pvscsi_on_command()
1034 s->reg_interrupt_status &= ~val; in pvscsi_io_write()
1041 s->reg_interrupt_enabled = val; in pvscsi_io_write()
1074 s->reg_interrupt_status); in pvscsi_io_read()
1075 return s->reg_interrupt_status; in pvscsi_io_read()
1079 s->reg_interrupt_status); in pvscsi_io_read()
1080 return s->reg_interrupt_enabled; in pvscsi_io_read()
1084 s->reg_interrupt_status); in pvscsi_io_read()
1085 return s->reg_command_status; in pvscsi_io_read()
1104 s->msi_used = false; in pvscsi_init_msi()
1106 s->msi_used = true; in pvscsi_init_msi()
1148 pci_set_word(pci_dev->config + PCI_SUBSYSTEM_VENDOR_ID, in pvscsi_realizefn()
1150 pci_set_word(pci_dev->config + PCI_SUBSYSTEM_ID, in pvscsi_realizefn()
1152 pci_config_set_revision(pci_dev->config, 0x2); in pvscsi_realizefn()
1155 pci_dev->config[PCI_LATENCY_TIMER] = 0xff; in pvscsi_realizefn()
1158 pci_config_set_interrupt_pin(pci_dev->config, 1); in pvscsi_realizefn()
1160 memory_region_init_io(&s->io_space, OBJECT(s), &pvscsi_ops, s, in pvscsi_realizefn()
1161 "pvscsi-io", PVSCSI_MEM_SPACE_SIZE); in pvscsi_realizefn()
1162 pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->io_space); in pvscsi_realizefn()
1170 s->completion_worker = qemu_bh_new_guarded(pvscsi_process_completion_queue, s, in pvscsi_realizefn()
1171 &DEVICE(pci_dev)->mem_reentrancy_guard); in pvscsi_realizefn()
1173 scsi_bus_init(&s->bus, sizeof(s->bus), DEVICE(pci_dev), &pvscsi_scsi_info); in pvscsi_realizefn()
1174 /* override default SCSI bus hotplug-handler, with pvscsi's one */ in pvscsi_realizefn()
1175 qbus_set_hotplug_handler(BUS(&s->bus), OBJECT(s)); in pvscsi_realizefn()
1185 qemu_bh_delete(s->completion_worker); in pvscsi_uninit()
1207 assert(QTAILQ_EMPTY(&s->pending_queue)); in pvscsi_pre_save()
1208 assert(QTAILQ_EMPTY(&s->completion_queue)); in pvscsi_pre_save()
1243 ARRAY_SIZE(((PVSCSIState *)NULL)->curr_cmd_data)),
1272 PCI_DEVICE(obj)->cap_present |= QEMU_PCI_CAP_EXPRESS; in pvscsi_instance_init()
1281 k->realize = pvscsi_realizefn; in pvscsi_class_init()
1282 k->exit = pvscsi_uninit; in pvscsi_class_init()
1283 k->vendor_id = PCI_VENDOR_ID_VMWARE; in pvscsi_class_init()
1284 k->device_id = PCI_DEVICE_ID_VMWARE_PVSCSI; in pvscsi_class_init()
1285 k->class_id = PCI_CLASS_STORAGE_SCSI; in pvscsi_class_init()
1286 k->subsystem_id = 0x1000; in pvscsi_class_init()
1288 dc->vmsd = &vmstate_pvscsi; in pvscsi_class_init()
1290 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); in pvscsi_class_init()
1291 hc->unplug = pvscsi_hot_unplug; in pvscsi_class_init()
1292 hc->plug = pvscsi_hotplug; in pvscsi_class_init()