sfxge(4): support per-command MCDI timeout

Submitted by:   Andy Moreton <amoreton at solarflare.com>
Sponsored by:   Solarflare Communications, Inc.
MFC after:      1 week
This commit is contained in:
Andrew Rybchenko 2016-12-30 12:10:15 +00:00
parent 7367e67956
commit 44c206993c

View file

@ -55,7 +55,6 @@ __FBSDID("$FreeBSD$");
#define SFXGE_MCDI_POLL_INTERVAL_MIN 10 /* 10us in 1us units */
#define SFXGE_MCDI_POLL_INTERVAL_MAX 100000 /* 100ms in 1us units */
#define SFXGE_MCDI_WATCHDOG_INTERVAL 10000000 /* 10s in 1us units */
static void
sfxge_mcdi_timeout(struct sfxge_softc *sc)
@ -70,7 +69,7 @@ sfxge_mcdi_timeout(struct sfxge_softc *sc)
}
static void
sfxge_mcdi_poll(struct sfxge_softc *sc)
sfxge_mcdi_poll(struct sfxge_softc *sc, uint32_t timeout_us)
{
efx_nic_t *enp;
clock_t delay_total;
@ -87,7 +86,7 @@ sfxge_mcdi_poll(struct sfxge_softc *sc)
return;
}
if (delay_total > SFXGE_MCDI_WATCHDOG_INTERVAL) {
if (delay_total > timeout_us) {
aborted = efx_mcdi_request_abort(enp);
KASSERT(aborted, ("abort failed"));
sfxge_mcdi_timeout(sc);
@ -115,6 +114,7 @@ sfxge_mcdi_execute(void *arg, efx_mcdi_req_t *emrp)
{
struct sfxge_softc *sc;
struct sfxge_mcdi *mcdi;
uint32_t timeout_us = 0;
sc = (struct sfxge_softc *)arg;
mcdi = &sc->mcdi;
@ -125,8 +125,11 @@ sfxge_mcdi_execute(void *arg, efx_mcdi_req_t *emrp)
("MCDI not initialized"));
/* Issue request and poll for completion. */
efx_mcdi_get_timeout(sc->enp, emrp, &timeout_us);
KASSERT(timeout_us > 0, ("MCDI timeout not initialized"));
efx_mcdi_request_start(sc->enp, emrp, B_FALSE);
sfxge_mcdi_poll(sc);
sfxge_mcdi_poll(sc, timeout_us);
SFXGE_MCDI_UNLOCK(mcdi);
}