NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: port-i386/44581: MacBook1,1 won't resume after suspend



The following reply was made to PR port-i386/44581; it has been noted by GNATS.

From: Taylor R Campbell <campbell+netbsd%mumble.net@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: port-i386/44581: MacBook1,1 won't resume after suspend
Date: Wed, 16 Feb 2011 20:19:10 +0000

 fwohci(4) is not happy to attach if its PCI command status register
 does not have bus mastering or memory mapping enabled.  I think this
 is the case for many drivers.  If I have fwohci0 detached, I observe
 that when pci3 is resumed, device 3 function 0 (where fwohci0
 attaches) has its command status register zeroed.  That makes
 fwohci_pci_attach fail, because pci_mapreg_map thinks the flags are
 inappropriate.
 
 I tried the following patch, and, lo and behold, the machine resumes!
 (I have lots of changes in this tree which may be necessary too.)
 
 But here's the weird part.  The output I see is
 
    fwohci0: on resume, csr = 42992150
    fwohci0: setting csr to 42992150
 
 I'm glad my machine is resuming now, but this leaves me unsatisfied
 inside...
 
 Also, if I detach fwohci0 before suspending and rescan pci3 after
 resuming, then the csr has bus mastering and memory mapping disabled,
 so fwohci0 fails to attach.  I know this doesn't matter much, but it
 would be nice if suspending while fwohci0 is detached didn't render
 fwohci0 unusable until the next reboot.
 
 Index: fwohci_pci.c
 ===================================================================
 RCS file: /cvsroot/src/sys/dev/pci/fwohci_pci.c,v
 retrieving revision 1.39
 diff -p -u -r1.39 fwohci_pci.c
 --- fwohci_pci.c       29 Apr 2010 06:41:27 -0000      1.39
 +++ fwohci_pci.c       16 Feb 2011 20:08:21 -0000
 @@ -214,10 +213,18 @@ fwohci_pci_resume(device_t dv, const pmf
  {
        struct fwohci_pci_softc *psc = device_private(dv);
        int s;
 +      uint32_t csr;
  
        s = splbio();
 +      csr = pci_conf_read(psc->psc_pc, psc->psc_tag, PCI_COMMAND_STATUS_REG);
 +      aprint_normal_dev(dv, "on resume, csr = %d\n", csr);
 +      csr |= PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_MEM_ENABLE;
 +      aprint_normal_dev(dv, "setting csr to %d\n", csr);
 +      pci_conf_write(psc->psc_pc, psc->psc_tag, PCI_COMMAND_STATUS_REG, csr);
        fwohci_resume(&psc->psc_sc);
 +      aprint_normal_dev(dv, "fwohci_resume returned, about to splx %d\n", s);
        splx(s);
 +      aprint_normal_dev(dv, "fwohci_resume splx %d\n", s);
  
        return true;
  }
 


Home | Main Index | Thread Index | Old Index