Lines Matching +full:async +full:- +full:enum

12 #include "qemu/error-report.h"
15 #include "qemu/config-file.h"
19 #include "hw/qdev-properties.h"
40 enum {
182 USBPacket *p = s->packet; in usb_msd_packet_complete()
185 * Set s->packet to NULL before calling usb_packet_complete in usb_msd_packet_complete()
190 p->status = status; in usb_msd_packet_complete()
191 s->packet = NULL; in usb_msd_packet_complete()
192 usb_packet_complete(&s->dev, p); in usb_msd_packet_complete()
199 if (s->packet) { in usb_msd_fatal_error()
208 s->needs_reset = true; in usb_msd_fatal_error()
214 len = p->iov.size - p->actual_length; in usb_msd_copy_data()
215 if (len > s->scsi_len) in usb_msd_copy_data()
216 len = s->scsi_len; in usb_msd_copy_data()
217 usb_packet_copy(p, scsi_req_get_buf(s->req) + s->scsi_off, len); in usb_msd_copy_data()
218 s->scsi_len -= len; in usb_msd_copy_data()
219 s->scsi_off += len; in usb_msd_copy_data()
220 if (len > s->data_len) { in usb_msd_copy_data()
221 len = s->data_len; in usb_msd_copy_data()
223 s->data_len -= len; in usb_msd_copy_data()
224 if (s->scsi_len == 0 || s->data_len == 0) { in usb_msd_copy_data()
225 scsi_req_continue(s->req); in usb_msd_copy_data()
233 trace_usb_msd_send_status(s->csw.status, le32_to_cpu(s->csw.tag), in usb_msd_send_status()
234 p->iov.size); in usb_msd_send_status()
236 assert(s->csw.sig == cpu_to_le32(0x53425355)); in usb_msd_send_status()
237 len = MIN(sizeof(s->csw), p->iov.size); in usb_msd_send_status()
238 usb_packet_copy(p, &s->csw, len); in usb_msd_send_status()
239 memset(&s->csw, 0, sizeof(s->csw)); in usb_msd_send_status()
244 MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); in usb_msd_transfer_data()
245 USBPacket *p = s->packet; in usb_msd_transfer_data()
247 if ((s->mode == USB_MSDM_DATAOUT) != (req->cmd.mode == SCSI_XFER_TO_DEV)) { in usb_msd_transfer_data()
252 s->scsi_len = len; in usb_msd_transfer_data()
253 s->scsi_off = 0; in usb_msd_transfer_data()
256 p = s->packet; in usb_msd_transfer_data()
257 if (p && p->actual_length == p->iov.size) { in usb_msd_transfer_data()
258 /* USB_RET_SUCCESS status clears previous ASYNC status */ in usb_msd_transfer_data()
266 MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); in usb_msd_command_complete()
267 USBPacket *p = s->packet; in usb_msd_command_complete()
269 trace_usb_msd_cmd_complete(req->status, req->tag); in usb_msd_command_complete()
271 s->csw.sig = cpu_to_le32(0x53425355); in usb_msd_command_complete()
272 s->csw.tag = cpu_to_le32(req->tag); in usb_msd_command_complete()
273 s->csw.residue = cpu_to_le32(s->data_len); in usb_msd_command_complete()
274 s->csw.status = req->status != 0; in usb_msd_command_complete()
276 if (s->packet) { in usb_msd_command_complete()
277 if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) { in usb_msd_command_complete()
281 s->mode = USB_MSDM_CBW; in usb_msd_command_complete()
282 } else if (s->mode == USB_MSDM_CSW) { in usb_msd_command_complete()
284 s->mode = USB_MSDM_CBW; in usb_msd_command_complete()
286 if (s->data_len) { in usb_msd_command_complete()
287 int len = (p->iov.size - p->actual_length); in usb_msd_command_complete()
289 if (len > s->data_len) { in usb_msd_command_complete()
290 len = s->data_len; in usb_msd_command_complete()
292 s->data_len -= len; in usb_msd_command_complete()
294 if (s->data_len == 0) { in usb_msd_command_complete()
295 s->mode = USB_MSDM_CSW; in usb_msd_command_complete()
298 /* USB_RET_SUCCESS status clears previous ASYNC status */ in usb_msd_command_complete()
300 } else if (s->data_len == 0) { in usb_msd_command_complete()
301 s->mode = USB_MSDM_CSW; in usb_msd_command_complete()
304 s->req = NULL; in usb_msd_command_complete()
309 MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); in usb_msd_request_cancelled()
311 trace_usb_msd_cmd_cancel(req->tag); in usb_msd_request_cancelled()
313 if (req == s->req) { in usb_msd_request_cancelled()
314 s->csw.sig = cpu_to_le32(0x53425355); in usb_msd_request_cancelled()
315 s->csw.tag = cpu_to_le32(req->tag); in usb_msd_request_cancelled()
316 s->csw.status = 1; /* error */ in usb_msd_request_cancelled()
318 scsi_req_unref(s->req); in usb_msd_request_cancelled()
319 s->req = NULL; in usb_msd_request_cancelled()
320 s->scsi_len = 0; in usb_msd_request_cancelled()
329 if (s->req) { in usb_msd_handle_reset()
330 scsi_req_cancel(s->req); in usb_msd_handle_reset()
332 assert(s->req == NULL); in usb_msd_handle_reset()
334 if (s->packet) { in usb_msd_handle_reset()
338 memset(&s->csw, 0, sizeof(s->csw)); in usb_msd_handle_reset()
339 s->mode = USB_MSDM_CBW; in usb_msd_handle_reset()
341 s->needs_reset = false; in usb_msd_handle_reset()
362 s->mode = USB_MSDM_CBW; in usb_msd_handle_control()
367 scsi_dev = scsi_device_find(&s->bus, 0, 0, maxlun+1); in usb_msd_handle_control()
371 if (scsi_dev->lun != maxlun+1) { in usb_msd_handle_control()
378 p->actual_length = 1; in usb_msd_handle_control()
381 p->status = USB_RET_STALL; in usb_msd_handle_control()
390 assert(s->packet == p); in usb_msd_cancel_io()
391 s->packet = NULL; in usb_msd_cancel_io()
393 if (s->req) { in usb_msd_cancel_io()
394 scsi_req_cancel(s->req); in usb_msd_cancel_io()
403 uint8_t devep = p->ep->nr; in usb_msd_handle_data()
407 if (s->needs_reset) { in usb_msd_handle_data()
408 p->status = USB_RET_STALL; in usb_msd_handle_data()
412 switch (p->pid) { in usb_msd_handle_data()
417 switch (s->mode) { in usb_msd_handle_data()
419 if (p->iov.size != 31) { in usb_msd_handle_data()
420 error_report("usb-msd: Bad CBW size"); in usb_msd_handle_data()
425 error_report("usb-msd: Bad signature %08x", in usb_msd_handle_data()
429 scsi_dev = scsi_device_find(&s->bus, 0, 0, cbw.lun); in usb_msd_handle_data()
431 error_report("usb-msd: Bad LUN %d", cbw.lun); in usb_msd_handle_data()
435 s->data_len = le32_to_cpu(cbw.data_len); in usb_msd_handle_data()
436 if (s->data_len == 0) { in usb_msd_handle_data()
437 s->mode = USB_MSDM_CSW; in usb_msd_handle_data()
439 s->mode = USB_MSDM_DATAIN; in usb_msd_handle_data()
441 s->mode = USB_MSDM_DATAOUT; in usb_msd_handle_data()
444 cbw.cmd_len, s->data_len); in usb_msd_handle_data()
445 assert(le32_to_cpu(s->csw.residue) == 0); in usb_msd_handle_data()
446 s->scsi_len = 0; in usb_msd_handle_data()
447 s->req = scsi_req_new(scsi_dev, tag, cbw.lun, cbw.cmd, cbw.cmd_len, NULL); in usb_msd_handle_data()
448 if (s->commandlog) { in usb_msd_handle_data()
449 scsi_req_print(s->req); in usb_msd_handle_data()
451 len = scsi_req_enqueue(s->req); in usb_msd_handle_data()
453 scsi_req_continue(s->req); in usb_msd_handle_data()
458 trace_usb_msd_data_out(p->iov.size, s->data_len); in usb_msd_handle_data()
459 if (p->iov.size > s->data_len) { in usb_msd_handle_data()
463 if (s->scsi_len) { in usb_msd_handle_data()
466 if (le32_to_cpu(s->csw.residue)) { in usb_msd_handle_data()
467 len = p->iov.size - p->actual_length; in usb_msd_handle_data()
470 if (len > s->data_len) { in usb_msd_handle_data()
471 len = s->data_len; in usb_msd_handle_data()
473 s->data_len -= len; in usb_msd_handle_data()
474 if (s->data_len == 0) { in usb_msd_handle_data()
475 s->mode = USB_MSDM_CSW; in usb_msd_handle_data()
479 if (p->actual_length < p->iov.size) { in usb_msd_handle_data()
481 s->packet = p; in usb_msd_handle_data()
482 p->status = USB_RET_ASYNC; in usb_msd_handle_data()
495 switch (s->mode) { in usb_msd_handle_data()
497 if (s->data_len != 0 || p->iov.size < 13) { in usb_msd_handle_data()
502 s->packet = p; in usb_msd_handle_data()
503 p->status = USB_RET_ASYNC; in usb_msd_handle_data()
507 if (p->iov.size < 13) { in usb_msd_handle_data()
511 if (s->req) { in usb_msd_handle_data()
514 s->packet = p; in usb_msd_handle_data()
515 p->status = USB_RET_ASYNC; in usb_msd_handle_data()
518 s->mode = USB_MSDM_CBW; in usb_msd_handle_data()
523 trace_usb_msd_data_in(p->iov.size, s->data_len, s->scsi_len); in usb_msd_handle_data()
524 if (s->scsi_len) { in usb_msd_handle_data()
527 if (le32_to_cpu(s->csw.residue)) { in usb_msd_handle_data()
528 len = p->iov.size - p->actual_length; in usb_msd_handle_data()
531 if (len > s->data_len) { in usb_msd_handle_data()
532 len = s->data_len; in usb_msd_handle_data()
534 s->data_len -= len; in usb_msd_handle_data()
535 if (s->data_len == 0) { in usb_msd_handle_data()
536 s->mode = USB_MSDM_CSW; in usb_msd_handle_data()
540 if (p->actual_length < p->iov.size && s->mode == USB_MSDM_DATAIN) { in usb_msd_handle_data()
542 s->packet = p; in usb_msd_handle_data()
543 p->status = USB_RET_ASYNC; in usb_msd_handle_data()
554 p->status = USB_RET_STALL; in usb_msd_handle_data()
561 MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); in usb_msd_load_request()
564 assert(s->req == NULL); in usb_msd_load_request()
566 s->req = req; in usb_msd_load_request()
571 .name = "usb-storage",
593 uc->product_desc = "QEMU USB MSD"; in usb_msd_class_initfn_common()
594 uc->usb_desc = &desc; in usb_msd_class_initfn_common()
595 uc->cancel_packet = usb_msd_cancel_io; in usb_msd_class_initfn_common()
596 uc->handle_attach = usb_desc_attach; in usb_msd_class_initfn_common()
597 uc->handle_reset = usb_msd_handle_reset; in usb_msd_class_initfn_common()
598 uc->handle_control = usb_msd_handle_control; in usb_msd_class_initfn_common()
599 uc->handle_data = usb_msd_handle_data; in usb_msd_class_initfn_common()
600 set_bit(DEVICE_CATEGORY_STORAGE, dc->categories); in usb_msd_class_initfn_common()
601 dc->fw_name = "storage"; in usb_msd_class_initfn_common()
602 dc->vmsd = &vmstate_usb_msd; in usb_msd_class_initfn_common()