
Hi,
pci_hose_read_config_{byte,word}_via_dword uses a temporary read buffer `val32', so if read_config_dword returns -1 then val32 also should be initialized.
Without this fix we'll go on scanning bus with vendor or header_ type uninitialized. This brings many unnecessary config trials.
compiled and tested with our MIPS board.
Thanks, Shinya
Index: b/drivers/pci.c =================================================================== --- a/drivers/pci.c +++ b/drivers/pci.c @@ -75,7 +75,7 @@ PCI_OP(write, word, u16, ) PCI_OP(write, dword, u32, ) #endif /* CONFIG_IXP425 */
-#define PCI_READ_VIA_DWORD_OP(size, type, off_mask) \ +#define PCI_READ_VIA_DWORD_OP(size, type, off_mask, error_code) \ int pci_hose_read_config_##size##_via_dword(struct pci_controller *hose,\ pci_dev_t dev, \ int offset, type val) \ @@ -83,7 +83,10 @@ int pci_hose_read_config_##size##_via_dw u32 val32; \ \ if (pci_hose_read_config_dword(hose, dev, offset & 0xfc, &val32) < 0)\ + { \ + error_code; \ return -1; \ + } \ \ *val = (val32 >> ((offset & (int)off_mask) * 8)); \ \ @@ -111,8 +114,8 @@ int pci_hose_write_config_##size##_via_d return 0; \ }
-PCI_READ_VIA_DWORD_OP(byte, u8 *, 0x03) -PCI_READ_VIA_DWORD_OP(word, u16 *, 0x02) +PCI_READ_VIA_DWORD_OP(byte, u8 *, 0x03, *val = 0xff) +PCI_READ_VIA_DWORD_OP(word, u16 *, 0x02, *val = 0xffff) PCI_WRITE_VIA_DWORD_OP(byte, u8, 0x03, 0x000000ff) PCI_WRITE_VIA_DWORD_OP(word, u16, 0x02, 0x0000ffff)