Re: PR 60404: Beaglebone Black: nonfunctional usb wifi

Brook Milligan <[email protected]> Thu, 16 Jul 2026 08:12:49 -0600
Newsgroups gmane.os.netbsd.ports.arm
Message-ID <[email protected]>
Thanks for the input so far.  Here is an (I hope) improved version (see =
below).  (There are still some aprints that will be removed, but are =
informative for now.)

This patch is based upon a new driver for the control module registers, =
which better follows the binding specs and does not introduce too much =
extra stuff.  Again, I would greatly appreciate a review.

There are some questions I would appreciate answers to.

First, the location of additions to GENERIC and files.ti are pretty =
arbitrary.  Where would you expect to find these bits?

Second, should this be added to any other kernels beyond GENERIC?

Thanks for your input and help.

Cheers,
Brook


Index: sys/arch/arm/ti/files.ti
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/src/sys/arch/arm/ti/files.ti,v
retrieving revision 1.30
diff -u -r1.30 files.ti
--- sys/arch/arm/ti/files.ti	30 Mar 2026 08:17:29 -0000	1.30
+++ sys/arch/arm/ti/files.ti	15 Jul 2026 16:58:02 -0000
@@ -145,6 +145,10 @@
 attach	motg at fdt with omapmusb
 file	arch/arm/ti/ti_omapmusb.c	omapmusb
=20
+device	tiusbctrl
+attach	tiusbctrl at fdt with ti_usbctrl
+file	arch/arm/ti/ti_usbctrl.c		ti_usbctrl
+
 # RNG
 device	tirng
 attach	tirng at fdt with ti_rng
Index: sys/arch/arm/ti/ti_otgreg.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/src/sys/arch/arm/ti/ti_otgreg.h,v
retrieving revision 1.1
diff -u -r1.1 ti_otgreg.h
--- sys/arch/arm/ti/ti_otgreg.h	27 Oct 2019 16:31:26 -0000	1.1
+++ sys/arch/arm/ti/ti_otgreg.h	15 Jul 2026 16:58:02 -0000
@@ -72,3 +72,10 @@
=20
 #define USB_CORE_OFFSET		0x400
 #define USB_CORE_SIZE		0x400
+
+/* USB control module register */
+#define CM_USBCTRL(n)			(2 * sizeof(uint32_t))
+#define CM_USBCTRL_CM_PWRDN		__BIT(0)
+#define CM_USBCTRL_OTG_PWRDN		__BIT(1)
+#define CM_USBCTRL_OTGVDET_EN		__BIT(19)
+#define CM_USBCTRL_OTGSESSENDEN		__BIT(20)
Index: sys/arch/evbarm/conf/GENERIC
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/src/sys/arch/evbarm/conf/GENERIC,v
retrieving revision 1.131
diff -u -r1.131 GENERIC
--- sys/arch/evbarm/conf/GENERIC	26 Apr 2026 12:57:03 -0000	=
1.131
+++ sys/arch/evbarm/conf/GENERIC	15 Jul 2026 16:58:04 -0000
@@ -609,6 +609,8 @@
 usb* 		at usbus?
 usbnode*	at fdt?
=20
+tiusbctrl*	at fdt?
+
 # Virtio devices
 virtio* 	at fdt?				# Virtio MMIO device
 virtio* 	at pci? dev ? function ?	# Virtio PCI device



--- /dev/null	2026-07-15 10:51:55.222314187 -0600
+++ sys/arch/arm/ti/ti_usbctrl.c	2026-07-15 10:51:11.382655707 =
-0600
@@ -0,0 +1,113 @@
+/* $NetBSD$ */
+/*
+ * Copyright (c) 2026 Brook Milligan.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *	notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *	notice, this list of conditions and the following disclaimer in =
the
+ *	documentation and/or other materials provided with the =
distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED =
WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE =
DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, =
BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF =
USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON =
ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE =
USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/device.h>
+#include <arm/ti/ti_otgreg.h>
+
+#include <dev/usb/usbhist.h>
+#include <dev/fdt/fdtvar.h>
+
+#ifdef USB_DEBUG
+#ifndef USBCTRL_DEBUG
+#define usbctrldebug 0
+#else
+extern int usbctrldebug;
+#endif /* USBCTRL_DEBUG */
+#endif /* USB_DEBUG */
+
+#define	DPRINTF(FMT,A,B,C,D)	=
USBHIST_LOGN(usbctrldebug,1,FMT,A,B,C,D)
+#define	USBCTRLHIST_FUNC()		USBHIST_FUNC()
+#define	USBCTRLHIST_CALLED(name)	=
USBHIST_CALLED(usbctrldebug)
+
+static const struct device_compatible_entry compat_data[] =3D {
+	{ .compat =3D "ti,am335x-usb-ctrl-module" },
+	DEVICE_COMPAT_EOL
+};
+
+/*
+ * usbctrl device attachment and driver,
+ * for the USB control module registers, which
+ * must be initialized prior to the ti_motg
+ * driver attachment
+ */
+
+struct ti_usbctrl_softc {
+	bus_space_tag_t		sc_ctrliot;
+	bus_space_handle_t	sc_ctrlioh;
+};
+
+static int	ti_usbctrl_match(device_t, cfdata_t, void *);
+static void	ti_usbctrl_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(ti_usbctrl, sizeof(struct ti_usbctrl_softc),
+    ti_usbctrl_match, ti_usbctrl_attach, NULL, NULL);
+
+static int
+ti_usbctrl_match(device_t parent, cfdata_t match, void *aux)
+{
+	struct fdt_attach_args * const faa =3D aux;
+
+	return of_compatible_match(faa->faa_phandle, compat_data);
+}
+
+static void
+ti_usbctrl_attach(device_t parent, device_t self, void *aux)
+{
+	struct ti_usbctrl_softc *sc =3D device_private(self);
+	struct fdt_attach_args * const faa =3D aux;
+	const int phandle =3D faa->faa_phandle;
+	bus_addr_t addr[2];
+	bus_size_t size[2];
+
+	USBCTRLHIST_FUNC(); USBCTRLHIST_CALLED();
+
+	aprint_normal("\n=3D=3D=3D> ti_usbctrl_attach(): %s\n", =
of_compatible_lookup(phandle, compat_data)->compat);
+
+	if (fdtbus_get_reg_byname(phandle, "phy_ctrl", &addr[0], =
&size[0]) !=3D 0 ||
+	    fdtbus_get_reg_byname(phandle, "wakeup", &addr[1], =
&size[1])) {
+		aprint_error_dev(self, "couldn't get registers\n");
+		return;
+	}
+	aprint_normal("=3D=3D=3D> phy_ctrl: 0x%08lx 0x%08lx\n", addr[0], =
size[0]);
+	aprint_normal("=3D=3D=3D> wakeup:   0x%08lx 0x%08lx\n", addr[1], =
size[1]);
+
+	sc->sc_ctrliot =3D faa->faa_bst;
+	if (bus_space_map(sc->sc_ctrliot, addr[0], size[0], 0, =
&sc->sc_ctrlioh) !=3D 0) {
+		aprint_error_dev(self, "couldn't map registers\n");
+		return;
+	}
+
+	for (int i =3D 0; i < 2; ++i) {
+		uint32_t usb_ctrl =3D bus_space_read_4(sc->sc_ctrliot, =
sc->sc_ctrlioh, CM_USBCTRL(i));
+		aprint_normal("=3D=3D=3D> reading usb_ctrl%d: 0x%04x\n", =
i, usb_ctrl);
+		usb_ctrl &=3D ~(CM_USBCTRL_CM_PWRDN | =
CM_USBCTRL_OTG_PWRDN);
+		usb_ctrl |=3D (CM_USBCTRL_OTGVDET_EN | =
CM_USBCTRL_OTGSESSENDEN);
+		aprint_normal("=3D=3D=3D> writing usb_ctrl%d: 0x%04x\n", =
i, usb_ctrl);
+		bus_space_write_4(sc->sc_ctrliot, sc->sc_ctrlioh, =
CM_USBCTRL(i), usb_ctrl);
+	}
+}