Date: Mon, 6 Jan 2014 01:51:08 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r260362 - projects/altix2/sys/ia64/sgisn Message-ID: <201401060151.s061p8gj085830@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Mon Jan 6 01:51:08 2014 New Revision: 260362 URL: http://svnweb.freebsd.org/changeset/base/260362 Log: Fix precious commit. In "productizing" the code, the following went wrong: 1. The loop termination check was removed, resulting in an infinite loop. 2. The loop termination changed from a return to a break, actually causing the tail end of the shub_ptc() function to execute and causing panics there due to sc being re-used. Now that we properly wait for the PTC operation to complete, fix the loop termination condition by masking off bits we don't care for. Without it we end up in another infinite loop. Sheez... Modified: projects/altix2/sys/ia64/sgisn/sgisn_shub.c Modified: projects/altix2/sys/ia64/sgisn/sgisn_shub.c ============================================================================== --- projects/altix2/sys/ia64/sgisn/sgisn_shub.c Mon Jan 6 00:52:39 2014 (r260361) +++ projects/altix2/sys/ia64/sgisn/sgisn_shub.c Mon Jan 6 01:51:08 2014 (r260362) @@ -613,7 +613,7 @@ void shub_ptc(vm_offset_t va, u_int rid) { device_t dev; - struct sgisn_shub_softc *sc; + struct sgisn_shub_softc *sc, *scx; uint64_t cfg0, cfg1, ptc, ws, wsreg; u_int mynas, nasid, shub1; @@ -640,16 +640,18 @@ shub_ptc(vm_offset_t va, u_int rid) if (nasid == mynas) goto next; dev = devclass_get_device(sgisn_shub_devclass, nasid >> 1); - sc = (dev != NULL) ? device_get_softc(dev) : NULL; - if (sc == NULL) + if (dev == NULL) + break; + scx = device_get_softc(dev); + if (scx == NULL) goto next; if (shub1) { - bus_space_write_8(sc->sc_tag, sc->sc_hndl, + bus_space_write_8(scx->sc_tag, scx->sc_hndl, SHUB_MMR_PTC_CFG0, cfg0); - bus_space_write_8(sc->sc_tag, sc->sc_hndl, + bus_space_write_8(scx->sc_tag, scx->sc_hndl, SHUB_MMR_PTC_CFG1, cfg1); } else - bus_space_write_8(sc->sc_tag, sc->sc_hndl, + bus_space_write_8(scx->sc_tag, scx->sc_hndl, SHUB_MMR_PTC(rid), ptc); next: nasid += 2; @@ -668,7 +670,7 @@ shub_ptc(vm_offset_t va, u_int rid) while (1) { ws = bus_space_read_8(sc->sc_tag, sc->sc_hndl, wsreg); KASSERT((ws & 2) == 0, ("%s: deadlock detected", __func__)); - if ((ws >> 56) == ((shub1) ? 0x3f : 0)) + if (((ws >> 56) & 0x3f) == ((shub1) ? 0x3f : 0)) return; cpu_spinwait(); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401060151.s061p8gj085830>