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