Re: kern/59876 (igc0: unable to initialize)
"Shinichi Doyashiki via gnats" <[email protected]> Wed, 22 Jul 2026 21:55:01 +0000 (UTC)
| Newsgroups | gmane.os.netbsd.bugs |
|---|---|
| Message-ID | <[email protected]> |
The following reply was made to PR kern/59876; it has been noted by GNATS. From: Shinichi Doyashiki <[email protected]> To: [email protected] Cc: Subject: Re: kern/59876 (igc0: unable to initialize) Date: Thu, 23 Jul 2026 06:42:29 +0900 I attempted some diagnostics, but the initialization of the igc driver fails with the error below. A failure in the BIOS initialization of the PCI BAR0 or similar components is a possibility, though I have not been able to diagnose the issue to that extent. [ 1.0417554] igc0 at pci1 dev 0 function 0: Intel(R) Ethernet Controller I226-V (rev. 0x04) [ 1.0417554] igc_set_mac_type [ 1.0417554] igc0: PCI BAR confliction error; try PCI_ADDR_FIXUP [ 1.0417554] igc_set_mac_type [ 1.0417554] igc_init_mac_ops_generic [ 1.0417554] igc_init_phy_ops_generic [ 1.0417554] igc_init_nvm_ops_generic [ 1.0417554] igc_init_mac_ops_generic [ 1.0417554] igc_init_phy_ops_generic [ 1.0417554] igc_init_nvm_ops_generic [ 1.0417554] igc_init_mac_params_i225 [ 1.0417554] igc_init_mac_ops_generic [ 1.0417554] igc_init_nvm_params_i225 [ 1.0417554] igc_get_flash_presence_i225 [ 1.0417554] igc_init_phy_params_i225 [ 1.0417554] igc_phy_hw_reset_generic [ 1.0417554] igc_check_reset_block [ 1.0417554] igc_get_phy_id [ 1.0417554] igc_read_phy_reg_gpy [ 1.0417554] igc_acquire_phy_base [ 1.0417554] igc_acquire_swfw_sync_i225 [ 1.0417554] igc_get_hw_semaphore_i225 [ 1.0417554] igc_put_hw_semaphore_generic [ 1.0417554] Driver can't access device - [ 1.0417554] SMBI bit is set. [ 1.0417554] PHY Initialization Error [ 1.0417554] igc0: unable to initialize [ 1.0417554] igc0: WARNING: power management not supported Index: if_igc.c =================================================================== RCS file: /cvsroot/src/sys/dev/pci/igc/if_igc.c,v retrieving revision 1.25 diff -u -1 -0 -r1.25 if_igc.c --- if_igc.c 10 Jun 2026 21:02:49 -0000 1.25 +++ if_igc.c 22 Jul 2026 21:26:09 -0000 @@ -343,20 +343,25 @@ * and initializes the hardware. * * return 0 on success, positive on failure *********************************************************************/ static void igc_attach(device_t parent, device_t self, void *aux) { struct pci_attach_args *pa = aux; struct igc_softc *sc = device_private(self); struct igc_hw *hw = &sc->hw; +#if 1 + pcireg_t rombar; + pcireg_t bar0; + pcireg_t bar3; +#endif const struct igc_product *igcp = igc_lookup(pa); KASSERT(igcp != NULL); sc->sc_dev = self; callout_init(&sc->sc_tick_ch, CALLOUT_MPSAFE); callout_setfunc(&sc->sc_tick_ch, igc_tick, sc); sc->sc_core_stopping = false; sc->osdep.os_sc = sc; @@ -375,20 +380,45 @@ { aprint_verbose(", 32-bit DMA"); sc->osdep.os_dmat = pa->pa_dmat; } pci_aprint_devinfo_fancy(pa, "Ethernet controller", igcp->igcp_name, 1); /* Determine hardware and mac info */ igc_identify_hardware(sc); +#if 1 + /* read Expansion ROM BAR, BAR0, BAR3 */ + rombar = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_MAPREG_ROM); + /* check ROM is disabled; then check address */ + if (!(rombar & PCI_MAPREG_ROM_ENABLE)) { + bar0 = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BAR0); + bar3 = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_BAR3); + if (PCI_MAPREG_MEM_ADDR(rombar) == PCI_MAPREG_MEM_ADDR(bar0) || + PCI_MAPREG_MEM_ADDR(rombar) == PCI_MAPREG_MEM_ADDR(bar3)) { + aprint_error_dev(sc->sc_dev, "PCI BAR confliction error; try PCI_ADDR_FIXUP\n"); +#if 0 + /* trying move BAR here is no effective solution */ + aprint_normal_dev(sc->sc_dev, "write 0 to BAR\n"); + pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_MAPREG_ROM, 0); + rombar = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_MAPREG_ROM); + aprint_normal_dev(sc->sc_dev, "read 0x%08x\n", rombar); + aprint_normal_dev(sc->sc_dev, "write ~1 to BAR\n"); + pci_conf_write(pa->pa_pc, pa->pa_tag, PCI_MAPREG_ROM, (pcireg_t)~1); + rombar = pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_MAPREG_ROM); + aprint_normal_dev(sc->sc_dev, "read 0x%08x\n", rombar); +#endif + } + } +#endif + sc->num_tx_desc = IGC_DEFAULT_TXD; sc->num_rx_desc = IGC_DEFAULT_RXD; /* Setup PCI resources */ if (igc_allocate_pci_resources(sc)) { aprint_error_dev(sc->sc_dev, "unable to allocate PCI resources\n"); goto err; }