svn commit: r262857 - stable/9/sys/dev/mps
Alexander Motin
mav at FreeBSD.org
Thu Mar 6 14:32:56 UTC 2014
Author: mav
Date: Thu Mar 6 14:32:55 2014
New Revision: 262857
URL: http://svnweb.freebsd.org/changeset/base/262857
Log:
MFC r262575:
Restore SIM freeze/release match, broken at r253549.
This fixes problem with SIM left in frozen state after reinit, for example,
after firmware update.
Modified:
stable/9/sys/dev/mps/mps_sas.c
Directory Properties:
stable/9/ (props changed)
stable/9/sys/ (props changed)
stable/9/sys/dev/ (props changed)
Modified: stable/9/sys/dev/mps/mps_sas.c
==============================================================================
--- stable/9/sys/dev/mps/mps_sas.c Thu Mar 6 14:28:03 2014 (r262856)
+++ stable/9/sys/dev/mps/mps_sas.c Thu Mar 6 14:32:55 2014 (r262857)
@@ -180,6 +180,10 @@ mpssas_startup_increment(struct mpssas_s
/* just starting, freeze the simq */
mps_dprint(sassc->sc, MPS_INIT,
"%s freezing simq\n", __func__);
+#if (__FreeBSD_version >= 1000039) || \
+ ((__FreeBSD_version < 1000000) && (__FreeBSD_version >= 902502))
+ xpt_hold_boot();
+#endif
xpt_freeze_simq(sassc->sim, 1);
}
mps_dprint(sassc->sc, MPS_INIT, "%s refcount %u\n", __func__,
@@ -200,11 +204,11 @@ mpssas_startup_decrement(struct mpssas_s
mps_dprint(sassc->sc, MPS_INIT,
"%s releasing simq\n", __func__);
sassc->flags &= ~MPSSAS_IN_STARTUP;
+ xpt_release_simq(sassc->sim, 1);
#if (__FreeBSD_version >= 1000039) || \
((__FreeBSD_version < 1000000) && (__FreeBSD_version >= 902502))
xpt_release_boot();
#else
- xpt_release_simq(sassc->sim, 1);
mpssas_rescan_target(sassc->sc, NULL);
#endif
}
@@ -764,13 +768,8 @@ mps_attach_sas(struct mps_softc *sc)
* Hold off boot until discovery is complete.
*/
sassc->flags |= MPSSAS_IN_STARTUP | MPSSAS_IN_DISCOVERY;
-#if (__FreeBSD_version >= 1000039) || \
- ((__FreeBSD_version < 1000000) && (__FreeBSD_version >= 902502))
- xpt_hold_boot();
-#else
- xpt_freeze_simq(sassc->sim, 1);
-#endif
sc->sassc->startup_refcount = 0;
+ mpssas_startup_increment(sassc);
callout_init(&sassc->discovery_callout, 1 /*mpsafe*/);
sassc->discovery_timeouts = 0;
@@ -1142,7 +1141,7 @@ mpssas_handle_reinit(struct mps_softc *s
mps_dprint(sc, MPS_INIT, "%s startup\n", __func__);
sc->sassc->flags |= MPSSAS_IN_STARTUP;
sc->sassc->flags |= MPSSAS_IN_DISCOVERY;
- xpt_freeze_simq(sc->sassc->sim, 1);
+ mpssas_startup_increment(sc->sassc);
/* notify CAM of a bus reset */
mpssas_announce_reset(sc, AC_BUS_RESET, CAM_TARGET_WILDCARD,
@@ -1155,12 +1154,6 @@ mpssas_handle_reinit(struct mps_softc *s
"%s startup %u tm %u after command completion\n",
__func__, sc->sassc->startup_refcount, sc->sassc->tm_count);
- /*
- * The simq was explicitly frozen above, so set the refcount to 0.
- * The simq will be explicitly released after port enable completes.
- */
- sc->sassc->startup_refcount = 0;
-
/* zero all the target handles, since they may change after the
* reset, and we have to rediscover all the targets and use the new
* handles.
@@ -3464,15 +3457,12 @@ mpssas_read_cap_done(struct cam_periph *
int
mpssas_startup(struct mps_softc *sc)
{
- struct mpssas_softc *sassc;
/*
* Send the port enable message and set the wait_for_port_enable flag.
* This flag helps to keep the simq frozen until all discovery events
* are processed.
*/
- sassc = sc->sassc;
- mpssas_startup_increment(sassc);
sc->wait_for_port_enable = 1;
mpssas_send_portenable(sc);
return (0);
@@ -3557,6 +3547,5 @@ mpssas_portenable_complete(struct mps_so
sc->port_enable_complete = 1;
wakeup(&sc->port_enable_complete);
mpssas_startup_decrement(sassc);
- xpt_release_simq(sassc->sim, 1);
}
More information about the svn-src-stable-9
mailing list