Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
rth7680 committed Jul 14, 2023
2 parents 3dd9e54 + 2eb5599 commit 4633c1e
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 43 deletions.
1 change: 1 addition & 0 deletions configs/devices/s390x-softmmu/default.mak
Expand Up @@ -7,6 +7,7 @@
#CONFIG_VFIO_CCW=n
#CONFIG_VIRTIO_PCI=n
#CONFIG_WDT_DIAG288=n
#CONFIG_PCIE_DEVICES=n

# Boards:
#
Expand Down
2 changes: 1 addition & 1 deletion hw/ide/piix.c
Expand Up @@ -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)
Expand Down
4 changes: 2 additions & 2 deletions hw/net/Kconfig
Expand Up @@ -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
Expand Down
3 changes: 3 additions & 0 deletions hw/pci/Kconfig
Expand Up @@ -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
Expand Down
3 changes: 2 additions & 1 deletion hw/s390x/Kconfig
Expand Up @@ -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
Expand Down
78 changes: 40 additions & 38 deletions hw/scsi/scsi-bus.c
Expand Up @@ -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;

Expand Down Expand Up @@ -412,19 +413,35 @@ static const struct SCSIReqOps reqops_invalid_opcode = {

/* SCSIReqOps implementation for unit attention conditions. */

static int32_t scsi_unit_attention(SCSIRequest *req, uint8_t *buf)
static void scsi_fetch_unit_attention_sense(SCSIRequest *req)
{
SCSISense *ua = NULL;

if (req->dev->unit_attention.key == UNIT_ATTENTION) {
scsi_req_build_sense(req, req->dev->unit_attention);
ua = &req->dev->unit_attention;
} else if (req->bus->unit_attention.key == UNIT_ATTENTION) {
scsi_req_build_sense(req, req->bus->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)
{
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
};

Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion hw/usb/Kconfig
Expand Up @@ -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

Expand Down
1 change: 1 addition & 0 deletions include/hw/scsi/scsi.h
Expand Up @@ -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);
Expand Down

0 comments on commit 4633c1e

Please sign in to comment.