Skip to content

Commit 345ed94

Browse files
committed
pci: fix: restore enum state on program bridge error
1 parent 4739af9 commit 345ed94

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

src/pci.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,8 +591,17 @@ static int pci_program_bridge(uint8_t bus, uint8_t dev, uint8_t fun,
591591
uint32_t mem_start;
592592
uint32_t io_start;
593593
uint32_t orig_cmd;
594+
uint8_t saved_bus;
595+
uint32_t saved_mem;
596+
uint32_t saved_pf;
597+
uint32_t saved_io;
594598
int ret;
595599

600+
saved_bus = info->curr_bus_number;
601+
saved_mem = info->mem;
602+
saved_pf = info->mem_pf;
603+
saved_io = info->io;
604+
596605
orig_cmd = pci_config_read16(bus, dev, fun, PCI_COMMAND_OFFSET);
597606
pci_config_write16(bus, dev, fun, PCI_COMMAND_OFFSET, 0);
598607

@@ -701,6 +710,13 @@ static int pci_program_bridge(uint8_t bus, uint8_t dev, uint8_t fun,
701710
return 0;
702711

703712
err:
713+
info->curr_bus_number = saved_bus;
714+
info->mem = saved_mem;
715+
info->mem_pf = saved_pf;
716+
info->io = saved_io;
717+
pci_config_write8(bus, dev, fun, PCI_PRIMARY_BUS, 0);
718+
pci_config_write8(bus, dev, fun, PCI_SECONDARY_BUS, 0);
719+
pci_config_write8(bus, dev, fun, PCI_SUB_SEC_BUS, 0);
704720
pci_config_write16(bus, dev, fun, PCI_COMMAND_OFFSET, orig_cmd);
705721
return -1;
706722
}

0 commit comments

Comments
 (0)