NetBSD-Bugs archive

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

Re: port-sparc64/42545: pcictl(8) can cause sb2500 to reset



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

From: Takeshi Nakayama <tn%catvmics.ne.jp@localhost>
To: gnats-bugs%NetBSD.org@localhost, mrg%eterna.com.au@localhost
Cc: port-sparc64-maintainer%netbsd.org@localhost, 
gnats-admin%netbsd.org@localhost,
 netbsd-bugs%netbsd.org@localhost
Subject: Re: port-sparc64/42545: pcictl(8) can cause sb2500 to reset
Date: Thu, 31 Dec 2009 01:41:43 +0900 (JST)

 Hello,
 
 Could the attached patch fix the problem?
 
 It seems that accessing to a PCI configration space where devices
 are unavailable causes data_access_error trap.  We need to check a
 validity of OF node embeded in pcitag to avoid the trap (see
 pci_make_tag() in pci_machdep.c, psycho_pci_conf_read() and
 psycho_pci_conf_write() in psycho.c).
 
 -- Takeshi Nakayama
 
 Index: schizo.c
 ===================================================================
 RCS file: /cvsroot/src/sys/arch/sparc64/dev/schizo.c,v
 retrieving revision 1.10
 diff -u -d -r1.10 schizo.c
 --- schizo.c   30 Nov 2009 05:00:58 -0000      1.10
 +++ schizo.c   30 Dec 2009 16:16:16 -0000
 @@ -448,11 +448,12 @@
  schizo_conf_read(pci_chipset_tag_t pc, pcitag_t tag, int reg)
  {
        struct schizo_pbm *sp = pc->cookie;
 -      pcireg_t val;
 +      pcireg_t val = (pcireg_t)~0;
  
        DPRINTF(SDB_CONF, ("%s: tag %lx reg %x ", __func__, (long)tag, reg));
 -      val = bus_space_read_4(sp->sp_cfgt, sp->sp_cfgh,
 -          PCITAG_OFFSET(tag) + reg);
 +      if (PCITAG_NODE(tag) != -1)
 +              val = bus_space_read_4(sp->sp_cfgt, sp->sp_cfgh,
 +                  PCITAG_OFFSET(tag) + reg);
        DPRINTF(SDB_CONF, (" returning %08x\n", (u_int)val));
        return (val);
  }
 @@ -464,6 +465,13 @@
  
        DPRINTF(SDB_CONF, ("%s: tag %lx; reg %x; data %x", __func__,
                (long)tag, reg, (int)data));
 +
 +      /* If we don't know it, just punt it.  */
 +      if (PCITAG_NODE(tag) == -1) {
 +              DPRINTF(SDB_CONF, (" .. bad addr\n"));
 +              return;
 +      }
 +
          bus_space_write_4(sp->sp_cfgt, sp->sp_cfgh,
            PCITAG_OFFSET(tag) + reg, data);
        DPRINTF(SDB_CONF, (" .. done\n"));
 


Home | Main Index | Thread Index | Old Index