* 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_VFIO_CCW=n
|
||||||
#CONFIG_VIRTIO_PCI=n
|
#CONFIG_VIRTIO_PCI=n
|
||||||
#CONFIG_WDT_DIAG288=n
|
#CONFIG_WDT_DIAG288=n
|
||||||
|
#CONFIG_PCIE_DEVICES=n
|
||||||
|
|
||||||
# Boards:
|
# 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_COMMAND, 0x0000);
|
||||||
pci_set_word(pci_conf + PCI_STATUS,
|
pci_set_word(pci_conf + PCI_STATUS,
|
||||||
PCI_STATUS_DEVSEL_MEDIUM | PCI_STATUS_FAST_BACK);
|
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)
|
static bool pci_piix_init_bus(PCIIDEState *d, unsigned i, Error **errp)
|
||||||
|
@ -41,12 +41,12 @@ config E1000_PCI
|
|||||||
|
|
||||||
config E1000E_PCI_EXPRESS
|
config E1000E_PCI_EXPRESS
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES || PCIE_DEVICES
|
||||||
depends on PCI_EXPRESS && MSI_NONBROKEN
|
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||||
|
|
||||||
config IGB_PCI_EXPRESS
|
config IGB_PCI_EXPRESS
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES || PCIE_DEVICES
|
||||||
depends on PCI_EXPRESS && MSI_NONBROKEN
|
depends on PCI_EXPRESS && MSI_NONBROKEN
|
||||||
|
|
||||||
config RTL8139_PCI
|
config RTL8139_PCI
|
||||||
|
@ -8,6 +8,9 @@ config PCI_EXPRESS
|
|||||||
config PCI_DEVICES
|
config PCI_DEVICES
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config PCIE_DEVICES
|
||||||
|
bool
|
||||||
|
|
||||||
config MSI_NONBROKEN
|
config MSI_NONBROKEN
|
||||||
# selected by interrupt controllers that do not support MSI,
|
# selected by interrupt controllers that do not support MSI,
|
||||||
# or support it and have a good implementation. See commit
|
# or support it and have a good implementation. See commit
|
||||||
|
@ -5,7 +5,8 @@ config S390_CCW_VIRTIO
|
|||||||
imply VFIO_AP
|
imply VFIO_AP
|
||||||
imply VFIO_CCW
|
imply VFIO_CCW
|
||||||
imply WDT_DIAG288
|
imply WDT_DIAG288
|
||||||
select PCI
|
imply PCIE_DEVICES
|
||||||
|
select PCI_EXPRESS
|
||||||
select S390_FLIC
|
select S390_FLIC
|
||||||
select SCLPCONSOLE
|
select SCLPCONSOLE
|
||||||
select VIRTIO_CCW
|
select VIRTIO_CCW
|
||||||
|
@ -22,6 +22,7 @@ static char *scsibus_get_fw_dev_path(DeviceState *dev);
|
|||||||
static void scsi_req_dequeue(SCSIRequest *req);
|
static void scsi_req_dequeue(SCSIRequest *req);
|
||||||
static uint8_t *scsi_target_alloc_buf(SCSIRequest *req, size_t len);
|
static uint8_t *scsi_target_alloc_buf(SCSIRequest *req, size_t len);
|
||||||
static void scsi_target_free_buf(SCSIRequest *req);
|
static void scsi_target_free_buf(SCSIRequest *req);
|
||||||
|
static void scsi_clear_reported_luns_changed(SCSIRequest *req);
|
||||||
|
|
||||||
static int next_scsi_bus;
|
static int next_scsi_bus;
|
||||||
|
|
||||||
@ -412,19 +413,35 @@ static const struct SCSIReqOps reqops_invalid_opcode = {
|
|||||||
|
|
||||||
/* SCSIReqOps implementation for unit attention conditions. */
|
/* 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)
|
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);
|
scsi_req_complete(req, CHECK_CONDITION);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct SCSIReqOps reqops_unit_attention = {
|
static const struct SCSIReqOps reqops_unit_attention = {
|
||||||
.size = sizeof(SCSIRequest),
|
.size = sizeof(SCSIRequest),
|
||||||
|
.init_req = scsi_fetch_unit_attention_sense,
|
||||||
.send_command = scsi_unit_attention
|
.send_command = scsi_unit_attention
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -502,6 +519,14 @@ static bool scsi_target_emulate_report_luns(SCSITargetReq *r)
|
|||||||
|
|
||||||
/* store the LUN list length */
|
/* store the LUN list length */
|
||||||
stl_be_p(&r->buf[0], len - 8);
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -699,6 +724,11 @@ SCSIRequest *scsi_req_alloc(const SCSIReqOps *reqops, SCSIDevice *d,
|
|||||||
object_ref(OBJECT(d));
|
object_ref(OBJECT(d));
|
||||||
object_ref(OBJECT(qbus->parent));
|
object_ref(OBJECT(qbus->parent));
|
||||||
notifier_list_init(&req->cancel_notifiers);
|
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);
|
trace_scsi_req_alloc(req->dev->id, req->lun, req->tag);
|
||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
@ -795,43 +825,22 @@ uint8_t *scsi_req_get_buf(SCSIRequest *req)
|
|||||||
return req->ops->get_buf(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;
|
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) {
|
if (req->dev->unit_attention.key == UNIT_ATTENTION) {
|
||||||
ua = &req->dev->unit_attention;
|
ua = &req->dev->unit_attention;
|
||||||
} else {
|
} else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
|
||||||
ua = &req->bus->unit_attention;
|
ua = &req->bus->unit_attention;
|
||||||
}
|
} else {
|
||||||
|
|
||||||
/*
|
|
||||||
* 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)) {
|
|
||||||
return;
|
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)
|
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;
|
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_ref(req);
|
||||||
scsi_req_dequeue(req);
|
scsi_req_dequeue(req);
|
||||||
req->bus->info->complete(req, req->residual);
|
req->bus->info->complete(req, req->residual);
|
||||||
|
@ -36,7 +36,7 @@ config USB_XHCI
|
|||||||
|
|
||||||
config USB_XHCI_PCI
|
config USB_XHCI_PCI
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES || PCIE_DEVICES
|
||||||
depends on PCI
|
depends on PCI
|
||||||
select USB_XHCI
|
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 */
|
/* scsi-bus.c */
|
||||||
struct SCSIReqOps {
|
struct SCSIReqOps {
|
||||||
size_t size;
|
size_t size;
|
||||||
|
void (*init_req)(SCSIRequest *req);
|
||||||
void (*free_req)(SCSIRequest *req);
|
void (*free_req)(SCSIRequest *req);
|
||||||
int32_t (*send_command)(SCSIRequest *req, uint8_t *buf);
|
int32_t (*send_command)(SCSIRequest *req, uint8_t *buf);
|
||||||
void (*read_data)(SCSIRequest *req);
|
void (*read_data)(SCSIRequest *req);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user