On Fri, Dec 16, 2011 at 5:54 PM, Mark Kettenis <[email protected]> wrote: >> Date: Fri, 16 Dec 2011 17:46:30 -0500 >> From: Brian Callahan <[email protected]> >> >> sdhc0 at pci3 dev 0 function 0 "Ricoh 5U823 SD/MMC" rev 0x04panic: >> kernel diagnostic assertion "(reg & 0x3) == 0" failed: file >> "../../../../arch/amd64/pci/pci_machdep.c", line 298 > > Ugh, I made a typo there. B This one should work better. > > Index: sdhc_pci.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/sdhc_pci.c,v > retrieving revision 1.11 > diff -u -p -r1.11 sdhc_pci.c > --- sdhc_pci.c B 31 Jul 2011 16:55:01 -0000 B B B 1.11 > +++ sdhc_pci.c B 16 Dec 2011 22:52:15 -0000 > @@ -98,11 +98,42 @@ sdhc_pci_attach(struct device *parent, s > > B B B B /* Some RICOH controllers lack a capability register. */ > B B B B if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_RICOH && > - B B B B B PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_RICOH_R5U823) > + B B B B B PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_RICOH_R5U823) { > + B B B B B B B reg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0xf8); > + B B B B B B B reg &= ~0x0000ff00; > + B B B B B B B reg |= 0x0000fc00; > + B B B B B B B pci_conf_write(pa->pa_pc, pa->pa_tag, 0xf8, reg); > + > + B B B B B B B reg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0x150); > + B B B B B B B reg &= ~0x000000ff; > + B B B B B B B reg |= 0x00000010; > + B B B B B B B pci_conf_write(pa->pa_pc, pa->pa_tag, 0x150, reg); > + > + B B B B B B B reg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0xf8); > + B B B B B B B reg &= ~0x0000ff00; > + B B B B B B B reg |= 0x00000000; > + B B B B B B B pci_conf_write(pa->pa_pc, pa->pa_tag, 0xf8, reg); > + > + B B B B B B B reg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0xfc); > + B B B B B B B reg &= ~0x000000ff; > + B B B B B B B reg |= 0x00000001; > + B B B B B B B pci_conf_write(pa->pa_pc, pa->pa_tag, 0xfc, reg); > + > + B B B B B B B reg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0xe0); > + B B B B B B B reg &= ~0x0000ff00; > + B B B B B B B reg |= 0x00003200; > + B B B B B B B pci_conf_write(pa->pa_pc, pa->pa_tag, 0xe0, reg); > + > + B B B B B B B reg = pci_conf_read(pa->pa_pc, pa->pa_tag, 0xfc); > + B B B B B B B reg &= ~0x000000ff; > + B B B B B B B reg |= 0x00000000; > + B B B B B B B pci_conf_write(pa->pa_pc, pa->pa_tag, 0xfc, reg); > + > B B B B B B B B caps = (0x21 << SDHC_BASE_FREQ_SHIFT) | > B B B B B B B B B B B B (0x21 << SDHC_TIMEOUT_FREQ_SHIFT) | > B B B B B B B B B B B B SDHC_TIMEOUT_FREQ_UNIT | > SDHC_VOLTAGE_SUPP_3_3V | > B B B B B B B B B B B B SDHC_DMA_SUPPORT; > + B B B } > > B B B B if (pci_intr_map(pa, &ih)) { > B B B B B B B B printf(": can't map interrupt\n");
The second patch works perfectly. Thanks!
