Revision 4480de19
b/hw/scsi-disk.c | ||
---|---|---|
65 | 65 |
uint32_t removable; |
66 | 66 |
bool media_changed; |
67 | 67 |
bool media_event; |
68 |
bool eject_request; |
|
68 | 69 |
QEMUBH *bh; |
69 | 70 |
char *version; |
70 | 71 |
char *serial; |
... | ... | |
671 | 672 |
|
672 | 673 |
/* Event notification descriptor */ |
673 | 674 |
event_code = MEC_NO_CHANGE; |
674 |
if (media_status != MS_TRAY_OPEN && s->media_event) { |
|
675 |
event_code = MEC_NEW_MEDIA; |
|
676 |
s->media_event = false; |
|
675 |
if (media_status != MS_TRAY_OPEN) { |
|
676 |
if (s->media_event) { |
|
677 |
event_code = MEC_NEW_MEDIA; |
|
678 |
s->media_event = false; |
|
679 |
} else if (s->eject_request) { |
|
680 |
event_code = MEC_EJECT_REQUESTED; |
|
681 |
s->eject_request = false; |
|
682 |
} |
|
677 | 683 |
} |
678 | 684 |
|
679 | 685 |
outbuf[0] = event_code; |
... | ... | |
1470 | 1476 |
s->tray_open = !load; |
1471 | 1477 |
s->qdev.unit_attention = SENSE_CODE(UNIT_ATTENTION_NO_MEDIUM); |
1472 | 1478 |
s->media_event = true; |
1479 |
s->eject_request = false; |
|
1480 |
} |
|
1481 |
|
|
1482 |
static void scsi_cd_eject_request_cb(void *opaque, bool force) |
|
1483 |
{ |
|
1484 |
SCSIDiskState *s = opaque; |
|
1485 |
|
|
1486 |
s->eject_request = true; |
|
1487 |
if (force) { |
|
1488 |
s->tray_locked = false; |
|
1489 |
} |
|
1473 | 1490 |
} |
1474 | 1491 |
|
1475 | 1492 |
static bool scsi_cd_is_tray_open(void *opaque) |
... | ... | |
1484 | 1501 |
|
1485 | 1502 |
static const BlockDevOps scsi_cd_block_ops = { |
1486 | 1503 |
.change_media_cb = scsi_cd_change_media_cb, |
1504 |
.eject_request_cb = scsi_cd_eject_request_cb, |
|
1487 | 1505 |
.is_tray_open = scsi_cd_is_tray_open, |
1488 | 1506 |
.is_medium_locked = scsi_cd_is_medium_locked, |
1489 | 1507 |
}; |
Also available in: Unified diff