Home | History | Annotate | Line # | Download | only in ic
ath_netbsd.c revision 1.3.2.6
      1  1.3.2.6    yamt /*	$NetBSD: ath_netbsd.c,v 1.3.2.6 2008/01/21 09:42:54 yamt Exp $ */
      2  1.3.2.1    yamt 
      3      1.1  dyoung /*-
      4      1.1  dyoung  * Copyright (c) 2003, 2004 David Young
      5      1.1  dyoung  * All rights reserved.
      6      1.1  dyoung  *
      7      1.1  dyoung  * Redistribution and use in source and binary forms, with or without
      8      1.1  dyoung  * modification, are permitted provided that the following conditions
      9      1.1  dyoung  * are met:
     10      1.1  dyoung  * 1. Redistributions of source code must retain the above copyright
     11      1.1  dyoung  *    notice, this list of conditions and the following disclaimer.
     12      1.1  dyoung  * 2. Redistributions in binary form must reproduce the above copyright
     13      1.1  dyoung  *    notice, this list of conditions and the following disclaimer in the
     14      1.1  dyoung  *    documentation and/or other materials provided with the distribution.
     15      1.1  dyoung  * 3. The name of the author may not be used to endorse or promote products
     16      1.1  dyoung  *    derived from this software without specific prior written permission.
     17      1.1  dyoung  *
     18      1.1  dyoung  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19      1.1  dyoung  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20      1.1  dyoung  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21      1.1  dyoung  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22      1.1  dyoung  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     23      1.1  dyoung  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     24      1.1  dyoung  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     25      1.1  dyoung  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26      1.1  dyoung  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27      1.1  dyoung  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28      1.1  dyoung  */
     29  1.3.2.1    yamt 
     30  1.3.2.1    yamt #include <sys/cdefs.h>
     31  1.3.2.6    yamt __KERNEL_RCSID(0, "$NetBSD: ath_netbsd.c,v 1.3.2.6 2008/01/21 09:42:54 yamt Exp $");
     32  1.3.2.1    yamt 
     33      1.1  dyoung #include <sys/param.h>
     34      1.1  dyoung #include <sys/types.h>
     35      1.1  dyoung #include <sys/errno.h>
     36  1.3.2.2    yamt #include <sys/systm.h>
     37      1.1  dyoung #include <sys/sysctl.h>
     38  1.3.2.2    yamt #include <sys/mbuf.h>
     39      1.1  dyoung #include <sys/malloc.h>
     40      1.1  dyoung #include <sys/kernel.h>
     41      1.1  dyoung #include <sys/socket.h>
     42      1.1  dyoung #include <sys/sockio.h>
     43      1.1  dyoung #include <sys/sysctl.h>
     44      1.1  dyoung #include <sys/callout.h>
     45  1.3.2.4    yamt #include <sys/bus.h>
     46      1.1  dyoung #include <machine/stdarg.h>
     47      1.1  dyoung #include <sys/endian.h>
     48      1.2  martin #include <sys/device.h>
     49      1.1  dyoung 
     50      1.1  dyoung #include <net/if.h>
     51      1.1  dyoung #include <net/if_dl.h>
     52      1.1  dyoung #include <net/if_media.h>
     53      1.1  dyoung #include <net/if_arp.h>
     54      1.1  dyoung #include <net/if_ether.h>
     55      1.1  dyoung #include <net/if_llc.h>
     56      1.1  dyoung 
     57      1.1  dyoung #include <net80211/ieee80211_netbsd.h>
     58      1.1  dyoung #include <net80211/ieee80211_var.h>
     59      1.1  dyoung #include <dev/ic/ath_netbsd.h>
     60      1.1  dyoung #include <dev/ic/athvar.h>
     61      1.3  dyoung 
     62      1.1  dyoung void
     63  1.3.2.5    yamt device_printf(device_t dev, const char *fmt, ...)
     64      1.1  dyoung {
     65  1.3.2.5    yamt 	va_list ap;
     66      1.1  dyoung 
     67  1.3.2.5    yamt 	va_start(ap, fmt);
     68  1.3.2.5    yamt 	printf("%s: ", device_xname(dev));
     69  1.3.2.5    yamt 	vprintf(fmt, ap);
     70  1.3.2.5    yamt 	va_end(ap);
     71      1.1  dyoung 	return;
     72      1.1  dyoung }
     73      1.1  dyoung 
     74      1.1  dyoung /*
     75  1.3.2.1    yamt  * Setup sysctl(3) MIB, hw.ath.*.
     76      1.1  dyoung  *
     77      1.1  dyoung  * TBD condition CTLFLAG_PERMANENT on being an LKM or not
     78      1.1  dyoung  */
     79      1.1  dyoung SYSCTL_SETUP(sysctl_ath, "sysctl ath subtree setup")
     80      1.1  dyoung {
     81      1.1  dyoung 	int rc;
     82      1.1  dyoung 	const struct sysctlnode *cnode, *rnode;
     83      1.1  dyoung 
     84      1.1  dyoung 	if ((rnode = ath_sysctl_treetop(clog)) == NULL)
     85      1.1  dyoung 		return;
     86      1.1  dyoung 
     87      1.1  dyoung 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READWRITE, "dwell",
     88      1.1  dyoung 	    "channel dwell time (ms) for AP/station scanning",
     89      1.1  dyoung 	    dwelltime)) != 0)
     90      1.1  dyoung 		goto err;
     91      1.1  dyoung 
     92      1.1  dyoung 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READWRITE, "calibrate",
     93      1.1  dyoung 	    "chip calibration interval (secs)", calinterval)) != 0)
     94      1.1  dyoung 		goto err;
     95      1.1  dyoung 
     96      1.1  dyoung 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READWRITE, "outdoor",
     97      1.1  dyoung 	    "outdoor operation", outdoor)) != 0)
     98      1.1  dyoung 		goto err;
     99      1.1  dyoung 
    100      1.1  dyoung 	/* country code */
    101      1.1  dyoung 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READWRITE,
    102      1.1  dyoung 	    "countrycode", "country code", countrycode)) != 0)
    103      1.1  dyoung 		goto err;
    104      1.1  dyoung 
    105      1.1  dyoung 	/* regulatory domain */
    106  1.3.2.1    yamt 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READWRITE, "regdomain",
    107  1.3.2.1    yamt 	    "EEPROM regdomain code", regdomain)) != 0)
    108      1.1  dyoung 		goto err;
    109      1.1  dyoung 
    110      1.1  dyoung 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READWRITE, "debug",
    111      1.1  dyoung 	    "control debugging printfs", debug)) != 0)
    112      1.1  dyoung 		goto err;
    113      1.1  dyoung 
    114  1.3.2.1    yamt 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READONLY, "rxbuf",
    115  1.3.2.1    yamt 	    "rx buffers allocated", rxbuf)) != 0)
    116  1.3.2.1    yamt 		goto err;
    117  1.3.2.1    yamt 	if ((rc = SYSCTL_GLOBAL_INT(CTLFLAG_READONLY, "txbuf",
    118  1.3.2.1    yamt 	    "tx buffers allocated", txbuf)) != 0)
    119  1.3.2.1    yamt 		goto err;
    120  1.3.2.1    yamt 
    121      1.1  dyoung 	return;
    122      1.1  dyoung err:
    123      1.1  dyoung 	printf("%s: sysctl_createv failed (rc = %d)\n", __func__, rc);
    124      1.1  dyoung }
    125      1.1  dyoung 
    126      1.1  dyoung static int
    127      1.1  dyoung ath_sysctl_slottime(SYSCTLFN_ARGS)
    128      1.1  dyoung {
    129      1.1  dyoung 	struct ath_softc *sc;
    130      1.1  dyoung 	struct sysctlnode node;
    131      1.1  dyoung 	u_int slottime;
    132      1.1  dyoung 	int error;
    133      1.1  dyoung 
    134      1.1  dyoung 	node = *rnode;
    135      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    136      1.1  dyoung 	slottime = ath_hal_getslottime(sc->sc_ah);
    137      1.1  dyoung 	node.sysctl_data = &slottime;
    138      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    139      1.1  dyoung 	if (error || newp == NULL)
    140      1.1  dyoung 		return error;
    141      1.1  dyoung 	return !ath_hal_setslottime(sc->sc_ah, slottime) ? EINVAL : 0;
    142      1.1  dyoung }
    143      1.1  dyoung 
    144      1.1  dyoung static int
    145      1.1  dyoung ath_sysctl_acktimeout(SYSCTLFN_ARGS)
    146      1.1  dyoung {
    147      1.1  dyoung 	struct ath_softc *sc;
    148      1.1  dyoung 	struct sysctlnode node;
    149      1.1  dyoung 	u_int acktimeout;
    150      1.1  dyoung 	int error;
    151      1.1  dyoung 
    152      1.1  dyoung 	node = *rnode;
    153      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    154      1.1  dyoung 	acktimeout = ath_hal_getacktimeout(sc->sc_ah);
    155      1.1  dyoung 	node.sysctl_data = &acktimeout;
    156      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    157      1.1  dyoung 	if (error || newp == NULL)
    158      1.1  dyoung 		return error;
    159      1.1  dyoung 	return !ath_hal_setacktimeout(sc->sc_ah, acktimeout) ? EINVAL : 0;
    160      1.1  dyoung }
    161      1.1  dyoung 
    162      1.1  dyoung static int
    163      1.1  dyoung ath_sysctl_ctstimeout(SYSCTLFN_ARGS)
    164      1.1  dyoung {
    165      1.1  dyoung 	struct ath_softc *sc;
    166      1.1  dyoung 	struct sysctlnode node;
    167      1.1  dyoung 	u_int ctstimeout;
    168      1.1  dyoung 	int error;
    169      1.1  dyoung 
    170      1.1  dyoung 	node = *rnode;
    171      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    172      1.1  dyoung 	ctstimeout = ath_hal_getctstimeout(sc->sc_ah);
    173      1.1  dyoung 	node.sysctl_data = &ctstimeout;
    174      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    175      1.1  dyoung 	if (error || newp == NULL)
    176      1.1  dyoung 		return error;
    177      1.1  dyoung 	return !ath_hal_setctstimeout(sc->sc_ah, ctstimeout) ? EINVAL : 0;
    178      1.1  dyoung }
    179      1.1  dyoung 
    180      1.1  dyoung static int
    181      1.1  dyoung ath_sysctl_softled(SYSCTLFN_ARGS)
    182      1.1  dyoung {
    183      1.1  dyoung 	struct ath_softc *sc;
    184      1.1  dyoung 	struct sysctlnode node;
    185      1.1  dyoung 	int softled;
    186      1.1  dyoung 	int error;
    187      1.1  dyoung 
    188      1.1  dyoung 	node = *rnode;
    189      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    190      1.1  dyoung 	softled = sc->sc_softled;
    191      1.1  dyoung 	node.sysctl_data = &softled;
    192      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    193      1.1  dyoung 	if (error || newp == NULL)
    194      1.1  dyoung 		return error;
    195      1.1  dyoung 	softled = (softled != 0);
    196      1.1  dyoung 	if (softled != sc->sc_softled) {
    197      1.1  dyoung 		if (softled) {
    198      1.1  dyoung 			/* NB: handle any sc_ledpin change */
    199      1.1  dyoung 			ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin);
    200      1.1  dyoung 			ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin,
    201      1.1  dyoung 				!sc->sc_ledon);
    202      1.1  dyoung 		}
    203      1.1  dyoung 		sc->sc_softled = softled;
    204      1.1  dyoung 	}
    205      1.1  dyoung 	return 0;
    206      1.1  dyoung }
    207      1.1  dyoung 
    208      1.1  dyoung static int
    209      1.1  dyoung ath_sysctl_rxantenna(SYSCTLFN_ARGS)
    210      1.1  dyoung {
    211      1.1  dyoung 	struct ath_softc *sc;
    212      1.1  dyoung 	struct sysctlnode node;
    213      1.1  dyoung 	u_int defantenna;
    214      1.1  dyoung 	int error;
    215      1.1  dyoung 
    216      1.1  dyoung 	node = *rnode;
    217      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    218      1.1  dyoung 	defantenna = ath_hal_getdefantenna(sc->sc_ah);
    219      1.1  dyoung 	node.sysctl_data = &defantenna;
    220      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    221      1.1  dyoung 	if (error || newp == NULL)
    222      1.1  dyoung 		return error;
    223      1.1  dyoung 	ath_hal_setdefantenna(sc->sc_ah, defantenna);
    224      1.1  dyoung 	return 0;
    225      1.1  dyoung }
    226      1.1  dyoung 
    227      1.1  dyoung static int
    228      1.1  dyoung ath_sysctl_diversity(SYSCTLFN_ARGS)
    229      1.1  dyoung {
    230      1.1  dyoung 	struct ath_softc *sc;
    231      1.1  dyoung 	struct sysctlnode node;
    232      1.1  dyoung 	u_int diversity;
    233      1.1  dyoung 	int error;
    234      1.1  dyoung 
    235      1.1  dyoung 	node = *rnode;
    236      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    237      1.1  dyoung 	diversity = sc->sc_diversity;
    238      1.1  dyoung 	node.sysctl_data = &diversity;
    239      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    240      1.1  dyoung 	if (error || newp == NULL)
    241      1.1  dyoung 		return error;
    242      1.1  dyoung 	if (!ath_hal_setdiversity(sc->sc_ah, diversity))
    243      1.1  dyoung 		return EINVAL;
    244      1.1  dyoung 	sc->sc_diversity = diversity;
    245      1.1  dyoung 	return 0;
    246      1.1  dyoung }
    247      1.1  dyoung 
    248      1.1  dyoung static int
    249      1.1  dyoung ath_sysctl_diag(SYSCTLFN_ARGS)
    250      1.1  dyoung {
    251      1.1  dyoung 	struct ath_softc *sc;
    252      1.1  dyoung 	struct sysctlnode node;
    253      1.1  dyoung 	u_int32_t diag;
    254      1.1  dyoung 	int error;
    255      1.1  dyoung 
    256      1.1  dyoung 	node = *rnode;
    257      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    258      1.1  dyoung 	if (!ath_hal_getdiag(sc->sc_ah, &diag))
    259      1.1  dyoung 		return EINVAL;
    260      1.1  dyoung 	node.sysctl_data = &diag;
    261      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    262      1.1  dyoung 	if (error || newp == NULL)
    263      1.1  dyoung 		return error;
    264      1.1  dyoung 	return !ath_hal_setdiag(sc->sc_ah, diag) ? EINVAL : 0;
    265      1.1  dyoung }
    266      1.1  dyoung 
    267      1.1  dyoung static int
    268      1.1  dyoung ath_sysctl_tpscale(SYSCTLFN_ARGS)
    269      1.1  dyoung {
    270      1.1  dyoung 	struct ath_softc *sc;
    271      1.1  dyoung 	struct sysctlnode node;
    272      1.1  dyoung 	u_int32_t scale;
    273      1.1  dyoung 	int error;
    274      1.1  dyoung 
    275      1.1  dyoung 	node = *rnode;
    276      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    277  1.3.2.1    yamt 	(void)ath_hal_gettpscale(sc->sc_ah, &scale);
    278      1.1  dyoung 	node.sysctl_data = &scale;
    279      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    280      1.1  dyoung 	if (error || newp == NULL)
    281      1.1  dyoung 		return error;
    282      1.1  dyoung 	return !ath_hal_settpscale(sc->sc_ah, scale)
    283      1.1  dyoung 	    ? EINVAL
    284      1.1  dyoung 	    : ath_reset(&sc->sc_if);
    285      1.1  dyoung }
    286      1.1  dyoung 
    287      1.1  dyoung static int
    288      1.1  dyoung ath_sysctl_tpc(SYSCTLFN_ARGS)
    289      1.1  dyoung {
    290      1.1  dyoung 	struct ath_softc *sc;
    291      1.1  dyoung 	struct sysctlnode node;
    292      1.1  dyoung 	u_int tpc;
    293      1.1  dyoung 	int error;
    294      1.1  dyoung 
    295      1.1  dyoung 	node = *rnode;
    296      1.1  dyoung 	sc = (struct ath_softc *)node.sysctl_data;
    297      1.1  dyoung 	tpc = ath_hal_gettpc(sc->sc_ah);
    298      1.1  dyoung 	node.sysctl_data = &tpc;
    299      1.1  dyoung 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    300      1.1  dyoung 	if (error || newp == NULL)
    301      1.1  dyoung 		return error;
    302      1.1  dyoung 	return !ath_hal_settpc(sc->sc_ah, tpc) ? EINVAL : 0;
    303      1.1  dyoung }
    304      1.1  dyoung 
    305  1.3.2.1    yamt static int
    306  1.3.2.1    yamt ath_sysctl_rfkill(SYSCTLFN_ARGS)
    307  1.3.2.1    yamt {
    308  1.3.2.1    yamt 	struct ath_softc *sc;
    309  1.3.2.1    yamt 	struct sysctlnode node;
    310  1.3.2.1    yamt 	u_int rfkill;
    311  1.3.2.1    yamt 	int error;
    312  1.3.2.1    yamt 
    313  1.3.2.1    yamt 	node = *rnode;
    314  1.3.2.1    yamt 	sc = (struct ath_softc *)node.sysctl_data;
    315  1.3.2.1    yamt 	rfkill = ath_hal_getrfkill(sc->sc_ah);
    316  1.3.2.1    yamt 	node.sysctl_data = &rfkill;
    317  1.3.2.1    yamt 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    318  1.3.2.1    yamt 	if (error || newp == NULL)
    319  1.3.2.1    yamt 		return error;
    320  1.3.2.1    yamt 	return !ath_hal_setrfkill(sc->sc_ah, rfkill) ? EINVAL : 0;
    321  1.3.2.1    yamt }
    322  1.3.2.1    yamt 
    323  1.3.2.1    yamt static int
    324  1.3.2.1    yamt ath_sysctl_rfsilent(SYSCTLFN_ARGS)
    325  1.3.2.1    yamt {
    326  1.3.2.1    yamt 	struct ath_softc *sc;
    327  1.3.2.1    yamt 	struct sysctlnode node;
    328  1.3.2.1    yamt 	u_int rfsilent;
    329  1.3.2.1    yamt 	int error;
    330  1.3.2.1    yamt 
    331  1.3.2.1    yamt 	node = *rnode;
    332  1.3.2.1    yamt 	sc = (struct ath_softc *)node.sysctl_data;
    333  1.3.2.1    yamt 	(void)ath_hal_getrfsilent(sc->sc_ah, &rfsilent);
    334  1.3.2.1    yamt 	node.sysctl_data = &rfsilent;
    335  1.3.2.1    yamt 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    336  1.3.2.1    yamt 	if (error || newp == NULL)
    337  1.3.2.1    yamt 		return error;
    338  1.3.2.1    yamt 	return !ath_hal_setrfsilent(sc->sc_ah, rfsilent) ? EINVAL : 0;
    339  1.3.2.1    yamt }
    340  1.3.2.1    yamt 
    341  1.3.2.1    yamt static int
    342  1.3.2.1    yamt ath_sysctl_regdomain(SYSCTLFN_ARGS)
    343  1.3.2.1    yamt {
    344  1.3.2.1    yamt 	struct ath_softc *sc;
    345  1.3.2.1    yamt 	struct sysctlnode node;
    346  1.3.2.1    yamt 	u_int32_t rd;
    347  1.3.2.1    yamt 	int error;
    348  1.3.2.1    yamt 
    349  1.3.2.1    yamt 	node = *rnode;
    350  1.3.2.1    yamt 	sc = (struct ath_softc *)node.sysctl_data;
    351  1.3.2.1    yamt 	if (!ath_hal_getregdomain(sc->sc_ah, &rd))
    352  1.3.2.1    yamt 		return EINVAL;
    353  1.3.2.1    yamt 	node.sysctl_data = &rd;
    354  1.3.2.1    yamt 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    355  1.3.2.1    yamt 	if (error || newp == NULL)
    356  1.3.2.1    yamt 		return error;
    357  1.3.2.1    yamt 	return !ath_hal_setregdomain(sc->sc_ah, rd) ? EINVAL : 0;
    358  1.3.2.1    yamt }
    359  1.3.2.1    yamt 
    360  1.3.2.1    yamt static int
    361  1.3.2.1    yamt ath_sysctl_tpack(SYSCTLFN_ARGS)
    362  1.3.2.1    yamt {
    363  1.3.2.1    yamt 	struct ath_softc *sc;
    364  1.3.2.1    yamt 	struct sysctlnode node;
    365  1.3.2.1    yamt 	u_int32_t tpack;
    366  1.3.2.1    yamt 	int error;
    367  1.3.2.1    yamt 
    368  1.3.2.1    yamt 	node = *rnode;
    369  1.3.2.1    yamt 	sc = (struct ath_softc *)node.sysctl_data;
    370  1.3.2.1    yamt 	(void)ath_hal_gettpack(sc->sc_ah, &tpack);
    371  1.3.2.1    yamt 	node.sysctl_data = &tpack;
    372  1.3.2.1    yamt 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    373  1.3.2.1    yamt 	if (error || newp == NULL)
    374  1.3.2.1    yamt 		return error;
    375  1.3.2.1    yamt 	return !ath_hal_settpack(sc->sc_ah, tpack) ? EINVAL : 0;
    376  1.3.2.1    yamt }
    377  1.3.2.1    yamt 
    378  1.3.2.1    yamt static int
    379  1.3.2.1    yamt ath_sysctl_tpcts(SYSCTLFN_ARGS)
    380  1.3.2.1    yamt {
    381  1.3.2.1    yamt 	struct ath_softc *sc;
    382  1.3.2.1    yamt 	struct sysctlnode node;
    383  1.3.2.1    yamt 	u_int32_t tpcts;
    384  1.3.2.1    yamt 	int error;
    385  1.3.2.1    yamt 
    386  1.3.2.1    yamt 	node = *rnode;
    387  1.3.2.1    yamt 	sc = (struct ath_softc *)node.sysctl_data;
    388  1.3.2.1    yamt 	(void)ath_hal_gettpcts(sc->sc_ah, &tpcts);
    389  1.3.2.1    yamt 	node.sysctl_data = &tpcts;
    390  1.3.2.1    yamt 	error = sysctl_lookup(SYSCTLFN_CALL(&node));
    391  1.3.2.1    yamt 	if (error || newp == NULL)
    392  1.3.2.1    yamt 		return error;
    393  1.3.2.1    yamt 	return !ath_hal_settpcts(sc->sc_ah, tpcts) ? EINVAL : 0;
    394  1.3.2.1    yamt }
    395  1.3.2.1    yamt 
    396  1.3.2.1    yamt const struct sysctlnode *
    397      1.3  dyoung ath_sysctl_instance(const char *dvname, struct sysctllog **log)
    398      1.3  dyoung {
    399      1.3  dyoung 	int rc;
    400      1.3  dyoung 	const struct sysctlnode *rnode;
    401      1.3  dyoung 
    402      1.3  dyoung 	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
    403      1.3  dyoung 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw", NULL,
    404      1.3  dyoung 	    NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0)
    405      1.3  dyoung 		goto err;
    406      1.3  dyoung 
    407      1.3  dyoung 	if ((rc = sysctl_createv(log, 0, &rnode, &rnode,
    408      1.3  dyoung 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, dvname,
    409      1.3  dyoung 	    SYSCTL_DESCR("ath information and options"),
    410      1.3  dyoung 	    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
    411      1.3  dyoung 		goto err;
    412      1.3  dyoung 
    413      1.3  dyoung 	return rnode;
    414      1.3  dyoung err:
    415      1.3  dyoung 	printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
    416      1.3  dyoung 	return NULL;
    417      1.3  dyoung }
    418      1.3  dyoung 
    419      1.1  dyoung const struct sysctlnode *
    420      1.1  dyoung ath_sysctl_treetop(struct sysctllog **log)
    421      1.1  dyoung {
    422      1.1  dyoung 	int rc;
    423      1.1  dyoung 	const struct sysctlnode *rnode;
    424      1.1  dyoung 
    425      1.1  dyoung 	if ((rc = sysctl_createv(log, 0, NULL, &rnode,
    426      1.1  dyoung 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "hw", NULL,
    427      1.1  dyoung 	    NULL, 0, NULL, 0, CTL_HW, CTL_EOL)) != 0)
    428      1.1  dyoung 		goto err;
    429      1.1  dyoung 
    430      1.1  dyoung 	if ((rc = sysctl_createv(log, 0, &rnode, &rnode,
    431      1.1  dyoung 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "ath",
    432      1.1  dyoung 	    SYSCTL_DESCR("ath information and options"),
    433      1.1  dyoung 	    NULL, 0, NULL, 0, CTL_CREATE, CTL_EOL)) != 0)
    434      1.1  dyoung 		goto err;
    435      1.1  dyoung 
    436      1.1  dyoung 	return rnode;
    437      1.1  dyoung err:
    438      1.1  dyoung 	printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
    439      1.1  dyoung 	return NULL;
    440      1.1  dyoung }
    441      1.1  dyoung 
    442      1.1  dyoung void
    443      1.1  dyoung ath_sysctlattach(struct ath_softc *sc)
    444      1.1  dyoung {
    445      1.1  dyoung 	int rc;
    446      1.1  dyoung 	struct sysctllog **log = &sc->sc_sysctllog;
    447      1.1  dyoung 	const struct sysctlnode *cnode, *rnode;
    448      1.1  dyoung 
    449      1.1  dyoung 	ath_hal_getcountrycode(sc->sc_ah, &sc->sc_countrycode);
    450  1.3.2.1    yamt 	(void)ath_hal_getregdomain(sc->sc_ah, &sc->sc_regdomain);
    451      1.1  dyoung 	sc->sc_debug = ath_debug;
    452      1.1  dyoung 	sc->sc_txintrperiod = ATH_TXINTR_PERIOD;
    453      1.1  dyoung 
    454      1.3  dyoung 	if ((rnode = ath_sysctl_instance(sc->sc_dev.dv_xname, log)) == NULL)
    455      1.1  dyoung 		return;
    456      1.1  dyoung 
    457      1.1  dyoung 	if ((rc = SYSCTL_INT(0, countrycode, "EEPROM country code")) != 0)
    458      1.1  dyoung 		goto err;
    459      1.1  dyoung 
    460      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, debug,
    461      1.1  dyoung 	    "control debugging printfs")) != 0)
    462      1.1  dyoung 		goto err;
    463      1.1  dyoung 
    464      1.1  dyoung #if 0
    465      1.1  dyoung 	/* channel dwell time (ms) for AP/station scanning */
    466      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, dwell,
    467      1.1  dyoung 	    "Channel dwell time (ms) for scanning")) != 0)
    468      1.1  dyoung 		goto err;
    469      1.1  dyoung #endif
    470      1.1  dyoung 
    471      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, slottime,
    472      1.1  dyoung 	    "802.11 slot time (us)")) != 0)
    473      1.1  dyoung 		goto err;
    474      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, acktimeout,
    475      1.1  dyoung 	    "802.11 ACK timeout (us)")) != 0)
    476      1.1  dyoung 		goto err;
    477      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, ctstimeout,
    478      1.1  dyoung 	    "802.11 CTS timeout (us)")) != 0)
    479      1.1  dyoung 		goto err;
    480      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, softled,
    481      1.1  dyoung 	    "enable/disable software LED support")) != 0)
    482      1.1  dyoung 		goto err;
    483      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, ledpin,
    484      1.1  dyoung 	    "GPIO pin connected to LED")) != 0)
    485      1.1  dyoung 		goto err;
    486      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, ledon,
    487      1.1  dyoung 	    "setting to turn LED on")) != 0)
    488      1.1  dyoung 		goto err;
    489      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, ledidle,
    490      1.1  dyoung 	    "idle time for inactivity LED (ticks)")) != 0)
    491      1.1  dyoung 		goto err;
    492      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, txantenna,
    493      1.1  dyoung 	    "tx antenna (0=auto)")) != 0)
    494      1.1  dyoung 		goto err;
    495      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, rxantenna,
    496      1.1  dyoung 	    "default/rx antenna")) != 0)
    497      1.1  dyoung 		goto err;
    498  1.3.2.1    yamt 	if (ath_hal_hasdiversity(sc->sc_ah)) {
    499      1.1  dyoung 		if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, diversity,
    500      1.1  dyoung 		    "antenna diversity")) != 0)
    501      1.1  dyoung 			goto err;
    502      1.1  dyoung 	}
    503      1.1  dyoung 	if ((rc = SYSCTL_INT(CTLFLAG_READWRITE, txintrperiod,
    504      1.1  dyoung 	    "tx descriptor batching")) != 0)
    505      1.1  dyoung 		goto err;
    506      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, diag,
    507      1.1  dyoung 	    "h/w diagnostic control")) != 0)
    508      1.1  dyoung 		goto err;
    509      1.1  dyoung 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, tpscale,
    510      1.1  dyoung 	    "tx power scaling")) != 0)
    511      1.1  dyoung 		goto err;
    512  1.3.2.1    yamt 	if (ath_hal_hastpc(sc->sc_ah)) {
    513      1.1  dyoung 		if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, tpc,
    514      1.1  dyoung 		    "enable/disable per-packet TPC")) != 0)
    515      1.1  dyoung 			goto err;
    516  1.3.2.1    yamt 		if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, tpack,
    517  1.3.2.1    yamt 		    "tx power for ack frames")) != 0)
    518  1.3.2.1    yamt 			goto err;
    519  1.3.2.1    yamt 		if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, tpcts,
    520  1.3.2.1    yamt 		    "tx power for cts frames")) != 0)
    521  1.3.2.1    yamt 			goto err;
    522      1.1  dyoung 	}
    523  1.3.2.1    yamt 	if (ath_hal_hasrfsilent(sc->sc_ah)) {
    524  1.3.2.1    yamt 		if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, rfsilent,
    525  1.3.2.1    yamt 		    "h/w RF silent config")) != 0)
    526  1.3.2.1    yamt 			goto err;
    527  1.3.2.1    yamt 		if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, rfkill,
    528  1.3.2.1    yamt 		    "enable/disable RF kill switch")) != 0)
    529  1.3.2.1    yamt 			goto err;
    530  1.3.2.1    yamt 	}
    531  1.3.2.1    yamt 	if ((rc = SYSCTL_INT_SUBR(CTLFLAG_READWRITE, regdomain,
    532  1.3.2.1    yamt 	    "EEPROM regdomain code")) != 0)
    533  1.3.2.1    yamt 		goto err;
    534      1.1  dyoung 	return;
    535      1.1  dyoung err:
    536      1.1  dyoung 	printf("%s: sysctl_createv failed, rc = %d\n", __func__, rc);
    537      1.1  dyoung }
    538