mirror of https://gitee.com/openkylin/qemu.git
libqos/ahci: fix cmd_sanity for ncq
NCQ commands should not / do not update the byte count in the command header post command, so this field is meaningless for NCQ tests. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 1435016308-6150-10-git-send-email-jsnow@redhat.com
This commit is contained in:
parent
34475239b8
commit
40d29928ca
|
@ -73,6 +73,22 @@ AHCICommandProp ahci_command_properties[] = {
|
||||||
{ .cmd = CMD_FLUSH_CACHE, .data = false }
|
{ .cmd = CMD_FLUSH_CACHE, .data = false }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct AHCICommand {
|
||||||
|
/* Test Management Data */
|
||||||
|
uint8_t name;
|
||||||
|
uint8_t port;
|
||||||
|
uint8_t slot;
|
||||||
|
uint32_t interrupts;
|
||||||
|
uint64_t xbytes;
|
||||||
|
uint32_t prd_size;
|
||||||
|
uint64_t buffer;
|
||||||
|
AHCICommandProp *props;
|
||||||
|
/* Data to be transferred to the guest */
|
||||||
|
AHCICommandHeader header;
|
||||||
|
RegH2DFIS fis;
|
||||||
|
void *atapi_cmd;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate space in the guest using information in the AHCIQState object.
|
* Allocate space in the guest using information in the AHCIQState object.
|
||||||
*/
|
*/
|
||||||
|
@ -462,13 +478,15 @@ void ahci_port_check_pio_sanity(AHCIQState *ahci, uint8_t port,
|
||||||
g_free(pio);
|
g_free(pio);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ahci_port_check_cmd_sanity(AHCIQState *ahci, uint8_t port,
|
void ahci_port_check_cmd_sanity(AHCIQState *ahci, AHCICommand *cmd)
|
||||||
uint8_t slot, size_t buffsize)
|
|
||||||
{
|
{
|
||||||
AHCICommandHeader cmd;
|
AHCICommandHeader cmdh;
|
||||||
|
|
||||||
ahci_get_command_header(ahci, port, slot, &cmd);
|
ahci_get_command_header(ahci, cmd->port, cmd->slot, &cmdh);
|
||||||
g_assert_cmphex(buffsize, ==, cmd.prdbc);
|
/* Physical Region Descriptor Byte Count is not required to work for NCQ. */
|
||||||
|
if (!cmd->props->ncq) {
|
||||||
|
g_assert_cmphex(cmd->xbytes, ==, cmdh.prdbc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the command in #slot of port #port. */
|
/* Get the command in #slot of port #port. */
|
||||||
|
@ -612,22 +630,6 @@ void ahci_guest_io(AHCIQState *ahci, uint8_t port, uint8_t ide_cmd,
|
||||||
ahci_command_free(cmd);
|
ahci_command_free(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AHCICommand {
|
|
||||||
/* Test Management Data */
|
|
||||||
uint8_t name;
|
|
||||||
uint8_t port;
|
|
||||||
uint8_t slot;
|
|
||||||
uint32_t interrupts;
|
|
||||||
uint64_t xbytes;
|
|
||||||
uint32_t prd_size;
|
|
||||||
uint64_t buffer;
|
|
||||||
AHCICommandProp *props;
|
|
||||||
/* Data to be transferred to the guest */
|
|
||||||
AHCICommandHeader header;
|
|
||||||
RegH2DFIS fis;
|
|
||||||
void *atapi_cmd;
|
|
||||||
};
|
|
||||||
|
|
||||||
static AHCICommandProp *ahci_command_find(uint8_t command_name)
|
static AHCICommandProp *ahci_command_find(uint8_t command_name)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -901,7 +903,7 @@ void ahci_command_verify(AHCIQState *ahci, AHCICommand *cmd)
|
||||||
ahci_port_check_error(ahci, port);
|
ahci_port_check_error(ahci, port);
|
||||||
ahci_port_check_interrupts(ahci, port, cmd->interrupts);
|
ahci_port_check_interrupts(ahci, port, cmd->interrupts);
|
||||||
ahci_port_check_nonbusy(ahci, port, slot);
|
ahci_port_check_nonbusy(ahci, port, slot);
|
||||||
ahci_port_check_cmd_sanity(ahci, port, slot, cmd->xbytes);
|
ahci_port_check_cmd_sanity(ahci, cmd);
|
||||||
ahci_port_check_d2h_sanity(ahci, port, slot);
|
ahci_port_check_d2h_sanity(ahci, port, slot);
|
||||||
if (cmd->props->pio) {
|
if (cmd->props->pio) {
|
||||||
ahci_port_check_pio_sanity(ahci, port, slot, cmd->xbytes);
|
ahci_port_check_pio_sanity(ahci, port, slot, cmd->xbytes);
|
||||||
|
|
|
@ -512,8 +512,7 @@ void ahci_port_check_nonbusy(AHCIQState *ahci, uint8_t port, uint8_t slot);
|
||||||
void ahci_port_check_d2h_sanity(AHCIQState *ahci, uint8_t port, uint8_t slot);
|
void ahci_port_check_d2h_sanity(AHCIQState *ahci, uint8_t port, uint8_t slot);
|
||||||
void ahci_port_check_pio_sanity(AHCIQState *ahci, uint8_t port,
|
void ahci_port_check_pio_sanity(AHCIQState *ahci, uint8_t port,
|
||||||
uint8_t slot, size_t buffsize);
|
uint8_t slot, size_t buffsize);
|
||||||
void ahci_port_check_cmd_sanity(AHCIQState *ahci, uint8_t port,
|
void ahci_port_check_cmd_sanity(AHCIQState *ahci, AHCICommand *cmd);
|
||||||
uint8_t slot, size_t buffsize);
|
|
||||||
void ahci_get_command_header(AHCIQState *ahci, uint8_t port,
|
void ahci_get_command_header(AHCIQState *ahci, uint8_t port,
|
||||||
uint8_t slot, AHCICommandHeader *cmd);
|
uint8_t slot, AHCICommandHeader *cmd);
|
||||||
void ahci_set_command_header(AHCIQState *ahci, uint8_t port,
|
void ahci_set_command_header(AHCIQState *ahci, uint8_t port,
|
||||||
|
|
Loading…
Reference in New Issue