* SCSI unit attention fix
* add PCIe devices to s390x emulator * IDE unplug fix for Xen -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmSxEWkUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroPDrAf/SyGEcBr1U2v0HBwfqGcHOVPwx5Dc jk9628klLgRF9EqEoffFfJTf9LU5Su4WsjtGLvH+GBCV0thfaPrvQJxD4KWvxgUl SKX5zepw9GY+uiTmbyuStLo5a8ksL6z5Zvw92gKh2PEKwuicerJL7OnK8drTMXXS haL/UL3v3Qa3OwkxBIIq9uXdZjUiSib6PQD9/u7OoY67F6/ThmtUozgcMpqR/39Q 0AdNibteN2XlUrysS9hreC0pAmqB6luAdo7wcUR53NV7Yp0yOa1jySJRxiNvHGrB gK7jpHL/UBjTTkBodfZD21q5Ih4Vpya2FWpg4ZZlrIEJQc2AyxCl3zw3Bg== =Ai1b -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * SCSI unit attention fix * add PCIe devices to s390x emulator * IDE unplug fix for Xen # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmSxEWkUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroPDrAf/SyGEcBr1U2v0HBwfqGcHOVPwx5Dc # jk9628klLgRF9EqEoffFfJTf9LU5Su4WsjtGLvH+GBCV0thfaPrvQJxD4KWvxgUl # SKX5zepw9GY+uiTmbyuStLo5a8ksL6z5Zvw92gKh2PEKwuicerJL7OnK8drTMXXS # haL/UL3v3Qa3OwkxBIIq9uXdZjUiSib6PQD9/u7OoY67F6/ThmtUozgcMpqR/39Q # 0AdNibteN2XlUrysS9hreC0pAmqB6luAdo7wcUR53NV7Yp0yOa1jySJRxiNvHGrB # gK7jpHL/UBjTTkBodfZD21q5Ih4Vpya2FWpg4ZZlrIEJQc2AyxCl3zw3Bg== # =Ai1b # -----END PGP SIGNATURE----- # gpg: Signature made Fri 14 Jul 2023 10:12:09 AM BST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [undefined] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: scsi: clear unit attention only for REPORT LUNS commands scsi: cleanup scsi_clear_unit_attention() scsi: fetch unit attention when creating the request kconfig: Add PCIe devices to s390x machines hw/ide/piix: properly initialize the BMIBA register Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
4633c1e2c5
@ -7,6 +7,7 @@
|
||||
#CONFIG_VFIO_CCW=n
|
||||
#CONFIG_VIRTIO_PCI=n
|
||||
#CONFIG_WDT_DIAG288=n
|
||||
#CONFIG_PCIE_DEVICES=n
|
||||
|
||||
# Boards:
|
||||
#
|
||||
|
@ -117,7 +117,7 @@ static void piix_ide_reset(DeviceState *dev)
|
||||
pci_set_word(pci_conf + PCI_COMMAND, 0x0000);
|
||||
pci_set_word(pci_conf + PCI_STATUS,
|
||||
PCI_STATUS_DEVSEL_MEDIUM | PCI_STATUS_FAST_BACK);
|
||||
pci_set_byte(pci_conf + 0x20, 0x01); /* BMIBA: 20-23h */
|
||||
pci_set_long(pci_conf + 0x20, 0x1); /* BMIBA: 20-23h */
|
||||
}
|
||||
|
||||
static bool pci_piix_init_bus(PCIIDEState *d, unsigned i, Error **errp)
|
||||
|
@ -41,12 +41,12 @@ config E1000_PCI
|
||||
|
||||
config E1000E_PCI_EXPRESS
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
default y if PCI_DEVICES || PCIE_DEVICES
|
||||
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||
|
||||
config IGB_PCI_EXPRESS
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
default y if PCI_DEVICES || PCIE_DEVICES
|
||||
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||
|
||||
config RTL8139_PCI
|
||||
|
@ -8,6 +8,9 @@ config PCI_EXPRESS
|
||||
config PCI_DEVICES
|
||||
bool
|
||||
|
||||
config PCIE_DEVICES
|
||||
bool
|
||||
|
||||
config MSI_NONBROKEN
|
||||
# selected by interrupt controllers that do not support MSI,
|
||||
# or support it and have a good implementation. See commit
|
||||
|
@ -5,7 +5,8 @@ config S390_CCW_VIRTIO
|
||||
imply VFIO_AP
|
||||
imply VFIO_CCW
|
||||
imply WDT_DIAG288
|
||||
select PCI
|
||||
imply PCIE_DEVICES
|
||||
select PCI_EXPRESS
|
||||
select S390_FLIC
|
||||
select SCLPCONSOLE
|
||||
select VIRTIO_CCW
|
||||
|
@ -22,6 +22,7 @@ static char *scsibus_get_fw_dev_path(DeviceState *dev);
|
||||
static void scsi_req_dequeue(SCSIRequest *req);
|
||||
static uint8_t *scsi_target_alloc_buf(SCSIRequest *req, size_t len);
|
||||
static void scsi_target_free_buf(SCSIRequest *req);
|
||||
static void scsi_clear_reported_luns_changed(SCSIRequest *req);
|
||||
|
||||
static int next_scsi_bus;
|
||||
|
||||
@ -412,19 +413,35 @@ static const struct SCSIReqOps reqops_invalid_opcode = {
|
||||
|
||||
/* SCSIReqOps implementation for unit attention conditions. */
|
||||
|
||||
static void scsi_fetch_unit_attention_sense(SCSIRequest *req)
|
||||
{
|
||||
SCSISense *ua = NULL;
|
||||
|
||||
if (req->dev->unit_attention.key == UNIT_ATTENTION) {
|
||||
ua = &req->dev->unit_attention;
|
||||
} else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
|
||||
ua = &req->bus->unit_attention;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fetch the unit attention sense immediately so that another
|
||||
* scsi_req_new does not use reqops_unit_attention.
|
||||
*/
|
||||
if (ua) {
|
||||
scsi_req_build_sense(req, *ua);
|
||||
*ua = SENSE_CODE(NO_SENSE);
|
||||
}
|
||||
}
|
||||
|
||||
static int32_t scsi_unit_attention(SCSIRequest *req, uint8_t *buf)
|
||||
{
|
||||
if (req->dev->unit_attention.key == UNIT_ATTENTION) {
|
||||
scsi_req_build_sense(req, req->dev->unit_attention);
|
||||
} else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
|
||||
scsi_req_build_sense(req, req->bus->unit_attention);
|
||||
}
|
||||
scsi_req_complete(req, CHECK_CONDITION);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct SCSIReqOps reqops_unit_attention = {
|
||||
.size = sizeof(SCSIRequest),
|
||||
.init_req = scsi_fetch_unit_attention_sense,
|
||||
.send_command = scsi_unit_attention
|
||||
};
|
||||
|
||||
@ -502,6 +519,14 @@ static bool scsi_target_emulate_report_luns(SCSITargetReq *r)
|
||||
|
||||
/* store the LUN list length */
|
||||
stl_be_p(&r->buf[0], len - 8);
|
||||
|
||||
/*
|
||||
* If a REPORT LUNS command enters the enabled command state, [...]
|
||||
* the device server shall clear any pending unit attention condition
|
||||
* with an additional sense code of REPORTED LUNS DATA HAS CHANGED.
|
||||
*/
|
||||
scsi_clear_reported_luns_changed(&r->req);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -699,6 +724,11 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
|
||||
object_ref(OBJECT(d));
|
||||
object_ref(OBJECT(qbus->parent));
|
||||
notifier_list_init(&req->cancel_notifiers);
|
||||
|
||||
if (reqops->init_req) {
|
||||
reqops->init_req(req);
|
||||
}
|
||||
|
||||
trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
|
||||
return req;
|
||||
}
|
||||
@ -795,43 +825,22 @@ uint8_t *scsi_req_get_buf(SCSIRequest *req)
|
||||
return req->ops->get_buf(req);
|
||||
}
|
||||
|
||||
static void scsi_clear_unit_attention(SCSIRequest *req)
|
||||
static void scsi_clear_reported_luns_changed(SCSIRequest *req)
|
||||
{
|
||||
SCSISense *ua;
|
||||
if (req->dev->unit_attention.key != UNIT_ATTENTION &&
|
||||
req->bus->unit_attention.key != UNIT_ATTENTION) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* If an INQUIRY command enters the enabled command state,
|
||||
* the device server shall [not] clear any unit attention condition;
|
||||
* See also MMC-6, paragraphs 6.5 and 6.6.2.
|
||||
*/
|
||||
if (req->cmd.buf[0] == INQUIRY ||
|
||||
req->cmd.buf[0] == GET_CONFIGURATION ||
|
||||
req->cmd.buf[0] == GET_EVENT_STATUS_NOTIFICATION) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (req->dev->unit_attention.key == UNIT_ATTENTION) {
|
||||
ua = &req->dev->unit_attention;
|
||||
} else {
|
||||
} else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
|
||||
ua = &req->bus->unit_attention;
|
||||
}
|
||||
|
||||
/*
|
||||
* If a REPORT LUNS command enters the enabled command state, [...]
|
||||
* the device server shall clear any pending unit attention condition
|
||||
* with an additional sense code of REPORTED LUNS DATA HAS CHANGED.
|
||||
*/
|
||||
if (req->cmd.buf[0] == REPORT_LUNS &&
|
||||
!(ua->asc == SENSE_CODE(REPORTED_LUNS_CHANGED).asc &&
|
||||
ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq)) {
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
*ua = SENSE_CODE(NO_SENSE);
|
||||
if (ua->asc == SENSE_CODE(REPORTED_LUNS_CHANGED).asc &&
|
||||
ua->ascq == SENSE_CODE(REPORTED_LUNS_CHANGED).ascq) {
|
||||
*ua = SENSE_CODE(NO_SENSE);
|
||||
}
|
||||
}
|
||||
|
||||
int scsi_req_get_sense(SCSIRequest *req, uint8_t *buf, int len)
|
||||
@ -1514,13 +1523,6 @@ void scsi_req_complete(SCSIRequest *req, int status)
|
||||
req->dev->sense_is_ua = false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Unit attention state is now stored in the device's sense buffer
|
||||
* if the HBA didn't do autosense. Clear the pending unit attention
|
||||
* flags.
|
||||
*/
|
||||
scsi_clear_unit_attention(req);
|
||||
|
||||
scsi_req_ref(req);
|
||||
scsi_req_dequeue(req);
|
||||
req->bus->info->complete(req, req->residual);
|
||||
|
@ -36,7 +36,7 @@ config USB_XHCI
|
||||
|
||||
config USB_XHCI_PCI
|
||||
bool
|
||||
default y if PCI_DEVICES
|
||||
default y if PCI_DEVICES || PCIE_DEVICES
|
||||
depends on PCI
|
||||
select USB_XHCI
|
||||
|
||||
|
@ -108,6 +108,7 @@ int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num);
|
||||
/* scsi-bus.c */
|
||||
struct SCSIReqOps {
|
||||
size_t size;
|
||||
void (*init_req)(SCSIRequest *req);
|
||||
void (*free_req)(SCSIRequest *req);
|
||||
int32_t (*send_command)(SCSIRequest *req, uint8_t *buf);
|
||||
void (*read_data)(SCSIRequest *req);
|
||||
|
Loading…
Reference in New Issue
Block a user