From nobody Wed Jul 8 05:42:03 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gw6Rj6WYxz6kkR8 for ; Wed, 08 Jul 2026 05:42:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR1" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gw6Rh61HKz3wtC for ; Wed, 08 Jul 2026 05:42:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783489328; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=vbBfkkjv52M7nTzIkkkccDn424Dehg0S5VQlKp1KzmM=; b=K2GT5vMCtZXz9FOFhN0Y8+HZ/sU+IgWBQs419X+V1DM+lTeGaY3GVmJkMLfo0//wvwlIOW Xv7CK7G/43p1Vp18eZgL2W0IDqffYyqkpizHDHO3MYRx8cP+4bfWKvQh881LP5EMNMgjIk t2C0xOH0hYlda9hKZ71+yXLBsgk7Ih8zdCF6vcXT/Gukn14ZAba4g7cxCswmiH9kmOwrYZ s0+q4O3CD8CgxF4mRUrPDp0NUmVDBTNMyb8kbfFWvavA8DKhXWHibYuQWclGh8INCWGMPo I/J7k6uZu0WG1KvSN2VRNCmZuOAuSq675VMnyHzqkSrRXStiFugCtXINCuU00Q== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1783489328; a=rsa-sha256; cv=none; b=F+8nHjr3i6hyTR914Do2F1cBApLGhmJAxSX3XxEEsJQ7ehro4PaJTpBYFqFW8BsVEtwd6K A7rS036QDUkwyQ+IKSlw33SiU0+8is+1m9vAkiidwjnrVWN2S+J+7f5FQy0cEH0WjpBJNU pvqtJ9OpoBgOGPFNoz3gmme74VVILGW0f1I7iPxrmNFQuL33DJGyAIN2+QaqYMmyspj0/F lrZNTuRnASshLqZ8AGKMARLwSmNPwrMPhQgds2I2VJSc3P28xBou1yEbVHcQ7yPKX7ie3Y 6ZSyQKNQZ15T2a0XVpxRHkbTs9raMA3ahQIobIA1kr9yVYt2uQGQ9twhAGNGjQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1783489328; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=vbBfkkjv52M7nTzIkkkccDn424Dehg0S5VQlKp1KzmM=; b=cgsYUquI9BrcN+NzZBJaUJ9dhQ7G2dzHy8su3TKz4HT6FK2unJfU9gegrxgPiXKg9VxHjB ircQ4/fav+3rL9hfyAO0qYGbG8dlCugt9UXsJpBXpYP79JkMSpWWqX6Ia+HRmFZUMEtkAs WeyhJbkHSNvr3+E+H6yAue1R8k1DAFEWtXzZpsmN5+3O1pfI0UGKr1SYJ+pftnOQjlvMzm 85k72AkFFci5tIYC2lCvLJ/ECISxmvHt6t7EEqGqCt8lp9L4w3lA7aadrtPLT8FG9ed1/W hUzTlsHdVZcLFV/BkYe1xqNok2L3pcMx8E6xTp1LIo0RNrDyZhHrYg9S1SkThg== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gw6Rh4fmQz17LR for ; Wed, 08 Jul 2026 05:42:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3b20b by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Wed, 08 Jul 2026 05:42:03 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Cc: Abdelkader Boudih From: Adrian Chadd Subject: git: 4b3d03566821 - main - fwohci: fix LPS delay, PHY_INT storm, and SID timeout recovery List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: adrian X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 4b3d035668211c19fc6fd5d4d207c2e8f96e7ad3 Auto-Submitted: auto-generated Date: Wed, 08 Jul 2026 05:42:03 +0000 Message-Id: <6a4de32b.3b20b.589193a8@gitrepo.freebsd.org> The branch main has been updated by adrian: URL: https://cgit.FreeBSD.org/src/commit/?id=4b3d035668211c19fc6fd5d4d207c2e8f96e7ad3 commit 4b3d035668211c19fc6fd5d4d207c2e8f96e7ad3 Author: Abdelkader Boudih AuthorDate: 2026-07-08 05:30:44 +0000 Commit: Adrian Chadd CommitDate: 2026-07-08 05:32:43 +0000 fwohci: fix LPS delay, PHY_INT storm, and SID timeout recovery Fixed the post-LPS delay from 500us to the IEEE 1394a-2000 s6.1 mandated 10ms ceiling. Handled PHY_INT by clearing W1C status bits in register 5 (masked ISBR to avoid spurious bus resets). Added a SID timeout callout that recovers the state machine when a remote device fails to complete self-ID. Fixed FW_PHY_SPD operator precedence and gated noisy messages behind bootverbose/firewire_debug. Reviewed by: adrian Differential Revision: https://reviews.freebsd.org/D58033 --- sys/dev/firewire/fwohci.c | 59 ++++++++++++++++++++++++++++++++++++++------ sys/dev/firewire/fwohcivar.h | 3 +++ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/sys/dev/firewire/fwohci.c b/sys/dev/firewire/fwohci.c index eeb35bb94b42..245edb1f8fe4 100644 --- a/sys/dev/firewire/fwohci.c +++ b/sys/dev/firewire/fwohci.c @@ -155,6 +155,7 @@ void fwohci_txbufdb (struct fwohci_softc *, int , struct fw_bulkxfer *); static void fwohci_task_busreset(void *, int); static void fwohci_task_sid(void *, int); static void fwohci_task_dma(void *, int); +static void fwohci_sid_timeout(void *); /* * memory allocated for DMA programs @@ -427,17 +428,20 @@ fwohci_probe_phy(struct fwohci_softc *sc, device_t dev) * It is not actually available port on your PC . */ OWRITE(sc, OHCI_HCCCTL, OHCI_HCC_LPS); - DELAY(500); + /* IEEE 1394a-2000 s6.1: PHY reset completes within 10 ms of LPS. */ + DELAY(10000); reg = fwphy_rddata(sc, FW_PHY_SPD_REG); if ((reg >> 5) != 7) { sc->fc.mode &= ~FWPHYASYST; sc->fc.nport = reg & FW_PHY_NP; - sc->fc.speed = reg & FW_PHY_SPD >> 6; + sc->fc.speed = (reg & FW_PHY_SPD) >> 6; if (sc->fc.speed > MAX_SPEED) { - device_printf(dev, "invalid speed %d (fixed to %d).\n", - sc->fc.speed, MAX_SPEED); + if (bootverbose) + device_printf(dev, + "invalid speed %d (fixed to %d).\n", + sc->fc.speed, MAX_SPEED); sc->fc.speed = MAX_SPEED; } device_printf(dev, @@ -449,8 +453,10 @@ fwohci_probe_phy(struct fwohci_softc *sc, device_t dev) sc->fc.nport = reg & FW_PHY_NP; sc->fc.speed = (reg2 & FW_PHY_ESPD) >> 5; if (sc->fc.speed > MAX_SPEED) { - device_printf(dev, "invalid speed %d (fixed to %d).\n", - sc->fc.speed, MAX_SPEED); + if (bootverbose) + device_printf(dev, + "invalid speed %d (fixed to %d).\n", + sc->fc.speed, MAX_SPEED); sc->fc.speed = MAX_SPEED; } device_printf(dev, @@ -762,6 +768,7 @@ fwohci_init(struct fwohci_softc *sc, device_t dev) TASK_INIT(&sc->fwohci_task_busreset, 2, fwohci_task_busreset, sc); TASK_INIT(&sc->fwohci_task_sid, 1, fwohci_task_sid, sc); TASK_INIT(&sc->fwohci_task_dma, 0, fwohci_task_dma, sc); + callout_init_mtx(&sc->sid_timeout_callout, FW_GMTX(&sc->fc), 0); fw_init(&sc->fc); fwohci_reset(sc, dev); @@ -804,6 +811,7 @@ fwohci_detach(struct fwohci_softc *sc, device_t dev) fwohci_db_free(&sc->it[i]); fwohci_db_free(&sc->ir[i]); } + callout_drain(&sc->sid_timeout_callout); if (sc->fc.taskqueue != NULL) { taskqueue_drain(sc->fc.taskqueue, &sc->fwohci_task_busreset); taskqueue_drain(sc->fc.taskqueue, &sc->fwohci_task_sid); @@ -1824,7 +1832,8 @@ fwohci_intr_core(struct fwohci_softc *sc, uint32_t stat, int count) /* Disable bus reset interrupt until sid recv. */ OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_PHY_BUS_R); - device_printf(fc->dev, "%s: BUS reset\n", __func__); + if (sc->sid_timeout_count == 0 || firewire_debug) + device_printf(fc->dev, "%s: BUS reset\n", __func__); OWRITE(sc, FWOHCI_INTMASKCLR, OHCI_INT_CYC_LOST); OWRITE(sc, OHCI_LNKCTLCLR, OHCI_CNTL_CYCSRC); @@ -1835,6 +1844,10 @@ fwohci_intr_core(struct fwohci_softc *sc, uint32_t stat, int count) if (!kdb_active) taskqueue_enqueue(sc->fc.taskqueue, &sc->fwohci_task_busreset); + + /* SID watchdog: recover if self-ID never completes. */ + callout_reset(&sc->sid_timeout_callout, hz / 2, + fwohci_sid_timeout, sc); } if (stat & OHCI_INT_PHY_SID) { /* Enable bus reset interrupt */ @@ -1902,6 +1915,8 @@ fwohci_intr_core(struct fwohci_softc *sc, uint32_t stat, int count) } fc->status = FWBUSINIT; + callout_stop(&sc->sid_timeout_callout); + sc->sid_timeout_count = 0; if (!kdb_active) taskqueue_enqueue(sc->fc.taskqueue, &sc->fwohci_task_sid); @@ -1982,7 +1997,13 @@ fwohci_intr_dma(struct fwohci_softc *sc, uint32_t stat, int count) device_printf(fc->dev, "unrecoverable error\n"); } if (stat & OHCI_INT_PHY_INT) { - device_printf(fc->dev, "phy int\n"); + uint32_t r5; + + /* Clear W1C interrupt bits; mask ISBR(6) to avoid bus reset. */ + r5 = fwphy_rddata(sc, 5); + if (firewire_debug) + device_printf(fc->dev, "phy int: reg5=0x%02x\n", r5); + fwphy_wrdata(sc, 5, (r5 & ~(1 << 6)) | 0x3c); } } @@ -2039,6 +2060,28 @@ fwohci_task_sid(void *arg, int pending) fw_drain_txq(fc); fw_sidrcv(fc, buf, plen); free(buf, M_FW); + +} + +/* SelfID timeout: called with FW_GLOCK held (callout_init_mtx). */ +static void +fwohci_sid_timeout(void *arg) +{ + struct fwohci_softc *sc = arg; + struct firewire_comm *fc = &sc->fc; + + FW_GLOCK_ASSERT(fc); + if (fc->status != FWBUSRESET) + return; + + sc->sid_timeout_count++; + if (sc->sid_timeout_count == 1) + device_printf(fc->dev, "SelfID timeout, retrying\n"); + + /* Reset state machine so next bus reset is recognized. */ + fc->status = FWBUSINIT; + OWRITE(sc, FWOHCI_INTSTATCLR, OHCI_INT_PHY_BUS_R); + OWRITE(sc, FWOHCI_INTMASK, OHCI_INT_PHY_BUS_R); } static void diff --git a/sys/dev/firewire/fwohcivar.h b/sys/dev/firewire/fwohcivar.h index 754d61bb3513..a9e7e06b5590 100644 --- a/sys/dev/firewire/fwohcivar.h +++ b/sys/dev/firewire/fwohcivar.h @@ -36,6 +36,7 @@ * */ +#include #include typedef struct fwohci_softc { @@ -71,6 +72,8 @@ typedef struct fwohci_softc { struct task fwohci_task_busreset; struct task fwohci_task_sid; struct task fwohci_task_dma; + struct callout sid_timeout_callout; /* fires if SID phase doesn't complete */ + int sid_timeout_count; /* consecutive SID timeouts */ int cycle_lost; } fwohci_softc_t;