PERFORCE change 133885 for review

Sam Leffler sam at FreeBSD.org
Tue Jan 22 10:45:51 PST 2008


http://perforce.freebsd.org/chv.cgi?CH=133885

Change 133885 by sam at sam_ebb on 2008/01/22 18:45:44

	add diagnostic api for fetching register contents etc.

Affected files ...

.. //depot/projects/wifi/sys/dev/ral/if_ral_pci.c#8 edit
.. //depot/projects/wifi/sys/dev/ral/if_raldiag.h#1 add

Differences ...

==== //depot/projects/wifi/sys/dev/ral/if_ral_pci.c#8 (text+ko) ====

@@ -269,3 +269,85 @@
 
 	return 0;
 }
+
+#include <dev/ral/if_raldiag.h>
+
+static int
+getregdump(device_t dev,
+	const RAL_REGRANGE *regs, int nregs,
+	void *dstbuf, int space)
+{
+	struct ral_pci_softc *psc = device_get_softc(dev);
+	struct rt2560_softc *sc = &psc->u.sc_rt2560;
+	u_int32_t *dp = dstbuf;
+	int i;
+
+	for (i = 0; i < nregs&& space >= 2*sizeof(u_int32_t); i++) {
+		u_int r = regs[i].start;
+		u_int e = regs[i].end;
+		*dp++ = (r<<16) | e;
+		space -= sizeof(u_int32_t);
+		do {
+			*dp++ = bus_space_read_4(sc->sc_st, sc->sc_sh, r);
+			r += sizeof(u_int32_t);
+			space -= sizeof(u_int32_t);
+		} while (r <= e && space >= sizeof(u_int32_t));
+	}
+	return (char *) dp - (char *) dstbuf;
+}
+
+/*
+ * Diagnostic interface.  This is used by various
+ * tools to do things like retrieve register contents for
+ * debugging.  The mechanism is intentionally opaque so that
+ * it can change frequently w/o concern for compatiblity.
+ */
+int
+ral_ioctl_diag(device_t dev, struct ral_diag *ad)
+{
+	void *outdata, *indata;
+	int error, nregs, inspace;
+	RAL_REVS revs;
+
+	switch (ad->ad_id & RAL_DIAG_ID) {
+	case RAL_DIAG_REVS:		/* MAC/PHY/Radio revs */
+		if (ad->ad_out_size != sizeof(revs))
+			return EINVAL;
+		bzero(&revs, sizeof(revs));
+		revs.ah_devid = pci_get_device(dev);
+		revs.ah_macRev = 0;
+		revs.ah_phyRev = 0;
+		return copyout(&revs, ad->ad_out_data, sizeof(revs));
+	case RAL_DIAG_REGS:
+		/*
+		 * Copy in register ranges.
+		 */
+		nregs = ad->ad_in_size / sizeof(RAL_REGRANGE);
+		if (nregs <= 0)
+			return EINVAL;
+		inspace = nregs * sizeof(RAL_REGRANGE);
+		indata = malloc(inspace, M_TEMP, M_NOWAIT);
+		if (indata == NULL)
+			return ENOMEM;
+		error = copyin(ad->ad_in_data, indata, inspace);
+		if (error) {
+			free(indata, M_TEMP);
+			return error;
+		}
+		/*
+		 * Allocate a buffer for the results.
+		 */
+		outdata = malloc(ad->ad_out_size, M_TEMP, M_NOWAIT);
+		if (outdata == NULL) {
+			free(indata, M_TEMP);
+			return ENOMEM;
+		}
+		error = copyout(outdata, ad->ad_out_data, 
+				getregdump(dev, indata, nregs,
+				    outdata, ad->ad_out_size));
+		free(indata, M_TEMP);
+		free(outdata, M_TEMP);
+		return error;
+	}
+	return EINVAL;
+}


More information about the p4-projects mailing list