mirror of https://github.com/xqemu/xqemu.git
megasas: Ignore duplicate init_firmware commands
The windows driver is sending several init_firmware commands when in MSI-X mode. It is, however, using only the first queue. So disregard any additional init_firmware commands until the HBA is reset. Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
8d72db68fe
commit
96f8f23a1e
|
@ -610,16 +610,19 @@ static int megasas_init_firmware(MegasasState *s, MegasasCmd *cmd)
|
||||||
{
|
{
|
||||||
PCIDevice *pcid = PCI_DEVICE(s);
|
PCIDevice *pcid = PCI_DEVICE(s);
|
||||||
uint32_t pa_hi, pa_lo;
|
uint32_t pa_hi, pa_lo;
|
||||||
hwaddr iq_pa, initq_size;
|
hwaddr iq_pa, initq_size = sizeof(struct mfi_init_qinfo);
|
||||||
struct mfi_init_qinfo *initq;
|
struct mfi_init_qinfo *initq = NULL;
|
||||||
uint32_t flags;
|
uint32_t flags;
|
||||||
int ret = MFI_STAT_OK;
|
int ret = MFI_STAT_OK;
|
||||||
|
|
||||||
|
if (s->reply_queue_pa) {
|
||||||
|
trace_megasas_initq_mapped(s->reply_queue_pa);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
pa_lo = le32_to_cpu(cmd->frame->init.qinfo_new_addr_lo);
|
pa_lo = le32_to_cpu(cmd->frame->init.qinfo_new_addr_lo);
|
||||||
pa_hi = le32_to_cpu(cmd->frame->init.qinfo_new_addr_hi);
|
pa_hi = le32_to_cpu(cmd->frame->init.qinfo_new_addr_hi);
|
||||||
iq_pa = (((uint64_t) pa_hi << 32) | pa_lo);
|
iq_pa = (((uint64_t) pa_hi << 32) | pa_lo);
|
||||||
trace_megasas_init_firmware((uint64_t)iq_pa);
|
trace_megasas_init_firmware((uint64_t)iq_pa);
|
||||||
initq_size = sizeof(*initq);
|
|
||||||
initq = pci_dma_map(pcid, iq_pa, &initq_size, 0);
|
initq = pci_dma_map(pcid, iq_pa, &initq_size, 0);
|
||||||
if (!initq || initq_size != sizeof(*initq)) {
|
if (!initq || initq_size != sizeof(*initq)) {
|
||||||
trace_megasas_initq_map_failed(cmd->index);
|
trace_megasas_initq_map_failed(cmd->index);
|
||||||
|
|
|
@ -697,6 +697,7 @@ lm32_uart_irq_state(int level) "irq state %d"
|
||||||
megasas_init_firmware(uint64_t pa) "pa %" PRIx64 " "
|
megasas_init_firmware(uint64_t pa) "pa %" PRIx64 " "
|
||||||
megasas_init_queue(uint64_t queue_pa, int queue_len, uint64_t head, uint64_t tail, uint32_t flags) "queue at %" PRIx64 " len %d head %" PRIx64 " tail %" PRIx64 " flags %x"
|
megasas_init_queue(uint64_t queue_pa, int queue_len, uint64_t head, uint64_t tail, uint32_t flags) "queue at %" PRIx64 " len %d head %" PRIx64 " tail %" PRIx64 " flags %x"
|
||||||
megasas_initq_map_failed(int frame) "scmd %d: failed to map queue"
|
megasas_initq_map_failed(int frame) "scmd %d: failed to map queue"
|
||||||
|
megasas_initq_mapped(uint64_t pa) "queue already mapped at %" PRIx64 ""
|
||||||
megasas_initq_mismatch(int queue_len, int fw_cmds) "queue size %d max fw cmds %d"
|
megasas_initq_mismatch(int queue_len, int fw_cmds) "queue size %d max fw cmds %d"
|
||||||
megasas_qf_found(unsigned int index, uint64_t pa) "mapped frame %x pa %" PRIx64 ""
|
megasas_qf_found(unsigned int index, uint64_t pa) "mapped frame %x pa %" PRIx64 ""
|
||||||
megasas_qf_new(unsigned int index, void *cmd) "return new frame %x cmd %p"
|
megasas_qf_new(unsigned int index, void *cmd) "return new frame %x cmd %p"
|
||||||
|
|
Loading…
Reference in New Issue