Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Jul 2026 04:09:30 +0000
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Cc:        Abdelkader Boudih <freebsd@seuros.com>
Subject:   git: 2b9ed8da552c - main - fwdv: match unit directories instead of IDENTIFY
Message-ID:  <6a59aafa.25df7.2ce67f9d@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by adrian:

URL: https://cgit.FreeBSD.org/src/commit/?id=2b9ed8da552c5825bf261214665a48f81999db0d

commit 2b9ed8da552c5825bf261214665a48f81999db0d
Author:     Abdelkader Boudih <freebsd@seuros.com>
AuthorDate: 2026-07-17 04:08:19 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2026-07-17 04:08:20 +0000

    fwdv: match unit directories instead of IDENTIFY
    
    Migrated fwdv to use per-unit-directory child device
    
    Reviewed by:    adrian
    Differential Revision:  https://reviews.freebsd.org/D58204
---
 share/man/man4/fwdv.4   |  14 +++---
 sys/dev/firewire/fwdv.c | 113 +++++++++++-------------------------------------
 2 files changed, 35 insertions(+), 92 deletions(-)

diff --git a/share/man/man4/fwdv.4 b/share/man/man4/fwdv.4
index c21a95019c70..2d90349db698 100644
--- a/share/man/man4/fwdv.4
+++ b/share/man/man4/fwdv.4
@@ -3,7 +3,7 @@
 .\"
 .\" SPDX-License-Identifier: BSD-2-Clause
 .\"
-.Dd June 19, 2026
+.Dd July 12, 2026
 .Dt FWDV 4
 .Os
 .Sh NAME
@@ -18,12 +18,16 @@ The
 driver provides DV frame capture from AV/C tape devices attached via
 IEEE 1394 (FireWire), including DV camcorders, VCRs, and DV converters.
 .Pp
-The driver attaches to the
+The driver attaches to unit directories in the device CSR configuration ROM
+with
+.Va unit_spec_id
+0x00a02d (1394 Trade Association) and
+.Va unit_sw_version
+0x010001 (AV/C).
+When a matching device is present on the
 .Xr firewire 4
-bus and creates
+bus, the driver creates
 .Pa /dev/fwdvX
-at load time.
-When an AV/C device is connected, the driver automatically discovers it
 and begins receiving IEC 61883 isochronous packets on first open,
 assembling complete DV frames.
 Applications read raw DV frames from the character device
diff --git a/sys/dev/firewire/fwdv.c b/sys/dev/firewire/fwdv.c
index b1bb6bb997cc..6fdfb9680c5d 100644
--- a/sys/dev/firewire/fwdv.c
+++ b/sys/dev/firewire/fwdv.c
@@ -54,12 +54,9 @@ SYSCTL_INT(_hw_firewire_fwdv, OID_AUTO, iso_channel, CTLFLAG_RWTUN,
 			printf("fwdv: " fmt, ## __VA_ARGS__);		\
 	} while (0)
 
-static void	fwdv_identify(driver_t *, device_t);
 static int	fwdv_probe(device_t);
 static int	fwdv_attach(device_t);
 static int	fwdv_detach(device_t);
-static void	fwdv_post_busreset(void *);
-static void	fwdv_post_explore(void *);
 static void	fwdv_probe_task(void *, int);
 
 static int	fwdv_avc_command(struct fwdv_softc *, const uint8_t *, int,
@@ -865,70 +862,6 @@ fwdv_parse_identity(struct fwdv_softc *sc)
 
 }
 
-static void
-fwdv_post_explore(void *arg)
-{
-	struct fwdv_softc *sc = (struct fwdv_softc *)arg;
-	struct fw_device *fwdev;
-	int was_streaming;
-
-	FWDV_LOCK(sc);
-
-	if (sc->state == FWDV_STATE_DETACHING) {
-		FWDV_UNLOCK(sc);
-		return;
-	}
-
-	if (sc->fwdev != NULL) {
-		STAILQ_FOREACH(fwdev, &sc->fd.fc->devices, link) {
-			if (fwdev == sc->fwdev &&
-			    fwdev->status == FWDEVATTACHED)
-				break;
-		}
-		if (fwdev == NULL) {
-			was_streaming = (sc->state == FWDV_STATE_STREAMING);
-			device_printf(sc->fd.dev, "AV/C device disconnected%s\n",
-			    was_streaming ? " (was streaming)" : "");
-			sc->fwdev = NULL;
-			sc->state = FWDV_STATE_IDLE;
-			wakeup(sc);
-			selwakeup(&sc->rsel);
-			FWDV_UNLOCK(sc);
-			if (was_streaming)
-				fwdv_iso_stop(sc);
-			FWDV_LOCK(sc);
-		}
-	}
-
-	if (sc->fwdev == NULL) {
-		STAILQ_FOREACH(fwdev, &sc->fd.fc->devices, link) {
-			if (fwdev->status != FWDEVATTACHED)
-				continue;
-
-			if (!crom_has_specver(fwdev->csrrom,
-			    CSRVAL_1394TA, CSR_PROTAVC))
-				continue;
-
-			sc->fwdev = fwdev;
-			sc->eui_hi = fwdev->eui.hi;
-			sc->eui_lo = fwdev->eui.lo;
-
-			FWDV_UNLOCK(sc);
-
-			if (taskqueue_enqueue(taskqueue_thread,
-			    &sc->probe_task) != 0) {
-				device_printf(sc->fd.dev,
-				    "probe task enqueue failed\n");
-				FWDV_LOCK(sc);
-				sc->fwdev = NULL;
-				FWDV_UNLOCK(sc);
-			}
-			return;
-		}
-	}
-
-	FWDV_UNLOCK(sc);
-}
 
 static void
 fwdv_probe_task(void *arg, int pending __unused)
@@ -963,26 +896,24 @@ fwdv_probe_task(void *arg, int pending __unused)
 		fwdv_iso_start(sc);
 }
 
-static void
-fwdv_post_busreset(void *arg __unused)
-{
 
-}
-
-static void
-fwdv_identify(driver_t *driver, device_t parent)
-{
-
-	if (device_find_child(parent, "fwdv", DEVICE_UNIT_ANY) == NULL)
-		BUS_ADD_CHILD(parent, 0, "fwdv", DEVICE_UNIT_ANY);
-}
 
 static int
 fwdv_probe(device_t dev)
 {
+	struct fw_unit *unit;
+
+	unit = fw_get_unit(dev);
+	if (unit == NULL)
+		return (ENXIO);
+
+	if (unit->spec_id != CSRVAL_1394TA)
+		return (ENXIO);
+	if (unit->sw_version != CSR_PROTAVC)
+		return (ENXIO);
 
 	device_set_desc(dev, "AV/C DV Capture over FireWire");
-	return (0);
+	return (BUS_PROBE_DEFAULT);
 }
 
 static int
@@ -990,15 +921,26 @@ fwdv_attach(device_t dev)
 {
 	struct fwdv_softc *sc;
 	struct firewire_comm *fc;
+	struct fw_unit *unit;
+	struct fw_device *fwdev;
 	int err;
 
+	unit = fw_get_unit(dev);
+	if (unit == NULL)
+		return (ENXIO);
+	fwdev = unit->fwdev;
+	if (fwdev == NULL)
+		return (ENXIO);
+
 	sc = device_get_softc(dev);
 	sc->fd.dev = dev;
-	sc->fd.fc = device_get_ivars(dev);
+	sc->fd.fc = fw_get_comm(dev);
 	fc = sc->fd.fc;
 	mtx_init(&sc->mtx, "fwdv", NULL, MTX_DEF);
 
-	sc->fwdev = NULL;
+	sc->fwdev = fwdev;
+	sc->eui_hi = fwdev->eui.hi;
+	sc->eui_lo = fwdev->eui.lo;
 	sc->state = FWDV_STATE_IDLE;
 	sc->dma_ch = -1;
 	sc->open_count = 0;
@@ -1044,10 +986,8 @@ fwdv_attach(device_t dev)
 		return (err);
 	}
 
-	sc->fd.post_busreset = fwdv_post_busreset;
-	sc->fd.post_explore = fwdv_post_explore;
-
-	fwdv_post_explore(sc);
+	if (taskqueue_enqueue(taskqueue_thread, &sc->probe_task) != 0)
+		device_printf(dev, "probe task enqueue failed\n");
 
 	return (0);
 }
@@ -1083,7 +1023,6 @@ fwdv_detach(device_t dev)
 }
 
 static device_method_t fwdv_methods[] = {
-	DEVMETHOD(device_identify,	fwdv_identify),
 	DEVMETHOD(device_probe,		fwdv_probe),
 	DEVMETHOD(device_attach,	fwdv_attach),
 	DEVMETHOD(device_detach,	fwdv_detach),


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a59aafa.25df7.2ce67f9d>