From owner-p4-projects@FreeBSD.ORG Tue Jan 22 18:45:51 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4F3D316A41B; Tue, 22 Jan 2008 18:45:51 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1500916A418 for ; Tue, 22 Jan 2008 18:45:51 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 091D013C4D1 for ; Tue, 22 Jan 2008 18:45:51 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0MIjoo8075138 for ; Tue, 22 Jan 2008 18:45:50 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0MIjo43075135 for perforce@freebsd.org; Tue, 22 Jan 2008 18:45:50 GMT (envelope-from sam@freebsd.org) Date: Tue, 22 Jan 2008 18:45:50 GMT Message-Id: <200801221845.m0MIjo43075135@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 133885 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 22 Jan 2008 18:45:51 -0000 http://perforce.freebsd.org/chv.cgi?CH=133885 Change 133885 by sam@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 + +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; +}