Deleted Added
full compact
if_ath.c (218925) if_ath.c (219180)
1/*-
2 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGES.
28 */
29
30#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 14 unchanged lines hidden (view full) ---

23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27 * THE POSSIBILITY OF SUCH DAMAGES.
28 */
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/dev/ath/if_ath.c 218925 2011-02-21 19:22:45Z adrian $");
31__FBSDID("$FreeBSD: head/sys/dev/ath/if_ath.c 219180 2011-03-02 16:03:19Z adrian $");
32
33/*
34 * Driver for the Atheros Wireless LAN controller.
35 *
36 * This software is derived from work of Atsushi Onoe; his contribution
37 * is greatly appreciated.
38 */
39

--- 47 unchanged lines hidden (view full) ---

87
88#include <dev/ath/if_athvar.h>
89#include <dev/ath/ath_hal/ah_devid.h> /* XXX for softled */
90#include <dev/ath/ath_hal/ah_diagcodes.h>
91
92#include <dev/ath/if_ath_debug.h>
93#include <dev/ath/if_ath_misc.h>
94#include <dev/ath/if_ath_tx.h>
32
33/*
34 * Driver for the Atheros Wireless LAN controller.
35 *
36 * This software is derived from work of Atsushi Onoe; his contribution
37 * is greatly appreciated.
38 */
39

--- 47 unchanged lines hidden (view full) ---

87
88#include <dev/ath/if_athvar.h>
89#include <dev/ath/ath_hal/ah_devid.h> /* XXX for softled */
90#include <dev/ath/ath_hal/ah_diagcodes.h>
91
92#include <dev/ath/if_ath_debug.h>
93#include <dev/ath/if_ath_misc.h>
94#include <dev/ath/if_ath_tx.h>
95#include <dev/ath/if_ath_sysctl.h>
95
96#ifdef ATH_TX99_DIAG
97#include <dev/ath/ath_tx99/ath_tx99.h>
98#endif
99
100/*
101 * ATH_BCBUF determines the number of vap's that can transmit
102 * beacons and also (currently) the number of vap's that can

--- 14 unchanged lines hidden (view full) ---

117 const char name[IFNAMSIZ], int unit, int opmode,
118 int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
119 const uint8_t mac[IEEE80211_ADDR_LEN]);
120static void ath_vap_delete(struct ieee80211vap *);
121static void ath_init(void *);
122static void ath_stop_locked(struct ifnet *);
123static void ath_stop(struct ifnet *);
124static void ath_start(struct ifnet *);
96
97#ifdef ATH_TX99_DIAG
98#include <dev/ath/ath_tx99/ath_tx99.h>
99#endif
100
101/*
102 * ATH_BCBUF determines the number of vap's that can transmit
103 * beacons and also (currently) the number of vap's that can

--- 14 unchanged lines hidden (view full) ---

118 const char name[IFNAMSIZ], int unit, int opmode,
119 int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
120 const uint8_t mac[IEEE80211_ADDR_LEN]);
121static void ath_vap_delete(struct ieee80211vap *);
122static void ath_init(void *);
123static void ath_stop_locked(struct ifnet *);
124static void ath_stop(struct ifnet *);
125static void ath_start(struct ifnet *);
125static int ath_reset(struct ifnet *);
126static int ath_reset_vap(struct ieee80211vap *, u_long);
127static int ath_media_change(struct ifnet *);
128static void ath_watchdog(void *);
129static int ath_ioctl(struct ifnet *, u_long, caddr_t);
130static void ath_fatal_proc(void *, int);
131static void ath_bmiss_vap(struct ieee80211vap *);
132static void ath_bmiss_proc(void *, int);
133static int ath_keyset(struct ath_softc *, const struct ieee80211_key *,

--- 65 unchanged lines hidden (view full) ---

199static void ath_getradiocaps(struct ieee80211com *, int, int *,
200 struct ieee80211_channel []);
201static int ath_getchannels(struct ath_softc *);
202static void ath_led_event(struct ath_softc *, int);
203
204static int ath_rate_setup(struct ath_softc *, u_int mode);
205static void ath_setcurmode(struct ath_softc *, enum ieee80211_phymode);
206
126static int ath_reset_vap(struct ieee80211vap *, u_long);
127static int ath_media_change(struct ifnet *);
128static void ath_watchdog(void *);
129static int ath_ioctl(struct ifnet *, u_long, caddr_t);
130static void ath_fatal_proc(void *, int);
131static void ath_bmiss_vap(struct ieee80211vap *);
132static void ath_bmiss_proc(void *, int);
133static int ath_keyset(struct ath_softc *, const struct ieee80211_key *,

--- 65 unchanged lines hidden (view full) ---

199static void ath_getradiocaps(struct ieee80211com *, int, int *,
200 struct ieee80211_channel []);
201static int ath_getchannels(struct ath_softc *);
202static void ath_led_event(struct ath_softc *, int);
203
204static int ath_rate_setup(struct ath_softc *, u_int mode);
205static void ath_setcurmode(struct ath_softc *, enum ieee80211_phymode);
206
207static void ath_sysctlattach(struct ath_softc *);
208static void ath_announce(struct ath_softc *);
207static void ath_announce(struct ath_softc *);
209static void ath_sysctl_stats_attach(struct ath_softc *sc);
210
211#ifdef IEEE80211_SUPPORT_TDMA
212static void ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt,
213 u_int32_t bintval);
214static void ath_tdma_bintvalsetup(struct ath_softc *sc,
215 const struct ieee80211_tdma_state *tdma);
216static void ath_tdma_config(struct ath_softc *sc, struct ieee80211vap *vap);
217static void ath_tdma_update(struct ieee80211_node *ni,

--- 1427 unchanged lines hidden (view full) ---

1645
1646/*
1647 * Reset the hardware w/o losing operational state. This is
1648 * basically a more efficient way of doing ath_stop, ath_init,
1649 * followed by state transitions to the current 802.11
1650 * operational state. Used to recover from various errors and
1651 * to reset or reload hardware state.
1652 */
208
209#ifdef IEEE80211_SUPPORT_TDMA
210static void ath_tdma_settimers(struct ath_softc *sc, u_int32_t nexttbtt,
211 u_int32_t bintval);
212static void ath_tdma_bintvalsetup(struct ath_softc *sc,
213 const struct ieee80211_tdma_state *tdma);
214static void ath_tdma_config(struct ath_softc *sc, struct ieee80211vap *vap);
215static void ath_tdma_update(struct ieee80211_node *ni,

--- 1427 unchanged lines hidden (view full) ---

1643
1644/*
1645 * Reset the hardware w/o losing operational state. This is
1646 * basically a more efficient way of doing ath_stop, ath_init,
1647 * followed by state transitions to the current 802.11
1648 * operational state. Used to recover from various errors and
1649 * to reset or reload hardware state.
1650 */
1653static int
1651int
1654ath_reset(struct ifnet *ifp)
1655{
1656 struct ath_softc *sc = ifp->if_softc;
1657 struct ieee80211com *ic = ifp->if_l2com;
1658 struct ath_hal *ah = sc->sc_ah;
1659 HAL_STATUS status;
1660
1661 ath_hal_intrset(ah, 0); /* disable interrupts */

--- 3947 unchanged lines hidden (view full) ---

5609 default:
5610 error = EINVAL;
5611 break;
5612 }
5613 return error;
5614#undef IS_RUNNING
5615}
5616
1652ath_reset(struct ifnet *ifp)
1653{
1654 struct ath_softc *sc = ifp->if_softc;
1655 struct ieee80211com *ic = ifp->if_l2com;
1656 struct ath_hal *ah = sc->sc_ah;
1657 HAL_STATUS status;
1658
1659 ath_hal_intrset(ah, 0); /* disable interrupts */

--- 3947 unchanged lines hidden (view full) ---

5607 default:
5608 error = EINVAL;
5609 break;
5610 }
5611 return error;
5612#undef IS_RUNNING
5613}
5614
5617static int
5618ath_sysctl_slottime(SYSCTL_HANDLER_ARGS)
5619{
5620 struct ath_softc *sc = arg1;
5621 u_int slottime = ath_hal_getslottime(sc->sc_ah);
5622 int error;
5623
5624 error = sysctl_handle_int(oidp, &slottime, 0, req);
5625 if (error || !req->newptr)
5626 return error;
5627 return !ath_hal_setslottime(sc->sc_ah, slottime) ? EINVAL : 0;
5628}
5629
5630static int
5631ath_sysctl_acktimeout(SYSCTL_HANDLER_ARGS)
5632{
5633 struct ath_softc *sc = arg1;
5634 u_int acktimeout = ath_hal_getacktimeout(sc->sc_ah);
5635 int error;
5636
5637 error = sysctl_handle_int(oidp, &acktimeout, 0, req);
5638 if (error || !req->newptr)
5639 return error;
5640 return !ath_hal_setacktimeout(sc->sc_ah, acktimeout) ? EINVAL : 0;
5641}
5642
5643static int
5644ath_sysctl_ctstimeout(SYSCTL_HANDLER_ARGS)
5645{
5646 struct ath_softc *sc = arg1;
5647 u_int ctstimeout = ath_hal_getctstimeout(sc->sc_ah);
5648 int error;
5649
5650 error = sysctl_handle_int(oidp, &ctstimeout, 0, req);
5651 if (error || !req->newptr)
5652 return error;
5653 return !ath_hal_setctstimeout(sc->sc_ah, ctstimeout) ? EINVAL : 0;
5654}
5655
5656static int
5657ath_sysctl_softled(SYSCTL_HANDLER_ARGS)
5658{
5659 struct ath_softc *sc = arg1;
5660 int softled = sc->sc_softled;
5661 int error;
5662
5663 error = sysctl_handle_int(oidp, &softled, 0, req);
5664 if (error || !req->newptr)
5665 return error;
5666 softled = (softled != 0);
5667 if (softled != sc->sc_softled) {
5668 if (softled) {
5669 /* NB: handle any sc_ledpin change */
5670 ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin,
5671 HAL_GPIO_MUX_MAC_NETWORK_LED);
5672 ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin,
5673 !sc->sc_ledon);
5674 }
5675 sc->sc_softled = softled;
5676 }
5677 return 0;
5678}
5679
5680static int
5681ath_sysctl_ledpin(SYSCTL_HANDLER_ARGS)
5682{
5683 struct ath_softc *sc = arg1;
5684 int ledpin = sc->sc_ledpin;
5685 int error;
5686
5687 error = sysctl_handle_int(oidp, &ledpin, 0, req);
5688 if (error || !req->newptr)
5689 return error;
5690 if (ledpin != sc->sc_ledpin) {
5691 sc->sc_ledpin = ledpin;
5692 if (sc->sc_softled) {
5693 ath_hal_gpioCfgOutput(sc->sc_ah, sc->sc_ledpin,
5694 HAL_GPIO_MUX_MAC_NETWORK_LED);
5695 ath_hal_gpioset(sc->sc_ah, sc->sc_ledpin,
5696 !sc->sc_ledon);
5697 }
5698 }
5699 return 0;
5700}
5701
5702static int
5703ath_sysctl_txantenna(SYSCTL_HANDLER_ARGS)
5704{
5705 struct ath_softc *sc = arg1;
5706 u_int txantenna = ath_hal_getantennaswitch(sc->sc_ah);
5707 int error;
5708
5709 error = sysctl_handle_int(oidp, &txantenna, 0, req);
5710 if (!error && req->newptr) {
5711 /* XXX assumes 2 antenna ports */
5712 if (txantenna < HAL_ANT_VARIABLE || txantenna > HAL_ANT_FIXED_B)
5713 return EINVAL;
5714 ath_hal_setantennaswitch(sc->sc_ah, txantenna);
5715 /*
5716 * NB: with the switch locked this isn't meaningful,
5717 * but set it anyway so things like radiotap get
5718 * consistent info in their data.
5719 */
5720 sc->sc_txantenna = txantenna;
5721 }
5722 return error;
5723}
5724
5725static int
5726ath_sysctl_rxantenna(SYSCTL_HANDLER_ARGS)
5727{
5728 struct ath_softc *sc = arg1;
5729 u_int defantenna = ath_hal_getdefantenna(sc->sc_ah);
5730 int error;
5731
5732 error = sysctl_handle_int(oidp, &defantenna, 0, req);
5733 if (!error && req->newptr)
5734 ath_hal_setdefantenna(sc->sc_ah, defantenna);
5735 return error;
5736}
5737
5738static int
5739ath_sysctl_diversity(SYSCTL_HANDLER_ARGS)
5740{
5741 struct ath_softc *sc = arg1;
5742 u_int diversity = ath_hal_getdiversity(sc->sc_ah);
5743 int error;
5744
5745 error = sysctl_handle_int(oidp, &diversity, 0, req);
5746 if (error || !req->newptr)
5747 return error;
5748 if (!ath_hal_setdiversity(sc->sc_ah, diversity))
5749 return EINVAL;
5750 sc->sc_diversity = diversity;
5751 return 0;
5752}
5753
5754static int
5755ath_sysctl_diag(SYSCTL_HANDLER_ARGS)
5756{
5757 struct ath_softc *sc = arg1;
5758 u_int32_t diag;
5759 int error;
5760
5761 if (!ath_hal_getdiag(sc->sc_ah, &diag))
5762 return EINVAL;
5763 error = sysctl_handle_int(oidp, &diag, 0, req);
5764 if (error || !req->newptr)
5765 return error;
5766 return !ath_hal_setdiag(sc->sc_ah, diag) ? EINVAL : 0;
5767}
5768
5769static int
5770ath_sysctl_tpscale(SYSCTL_HANDLER_ARGS)
5771{
5772 struct ath_softc *sc = arg1;
5773 struct ifnet *ifp = sc->sc_ifp;
5774 u_int32_t scale;
5775 int error;
5776
5777 (void) ath_hal_gettpscale(sc->sc_ah, &scale);
5778 error = sysctl_handle_int(oidp, &scale, 0, req);
5779 if (error || !req->newptr)
5780 return error;
5781 return !ath_hal_settpscale(sc->sc_ah, scale) ? EINVAL :
5782 (ifp->if_drv_flags & IFF_DRV_RUNNING) ? ath_reset(ifp) : 0;
5783}
5784
5785static int
5786ath_sysctl_tpc(SYSCTL_HANDLER_ARGS)
5787{
5788 struct ath_softc *sc = arg1;
5789 u_int tpc = ath_hal_gettpc(sc->sc_ah);
5790 int error;
5791
5792 error = sysctl_handle_int(oidp, &tpc, 0, req);
5793 if (error || !req->newptr)
5794 return error;
5795 return !ath_hal_settpc(sc->sc_ah, tpc) ? EINVAL : 0;
5796}
5797
5798static int
5799ath_sysctl_rfkill(SYSCTL_HANDLER_ARGS)
5800{
5801 struct ath_softc *sc = arg1;
5802 struct ifnet *ifp = sc->sc_ifp;
5803 struct ath_hal *ah = sc->sc_ah;
5804 u_int rfkill = ath_hal_getrfkill(ah);
5805 int error;
5806
5807 error = sysctl_handle_int(oidp, &rfkill, 0, req);
5808 if (error || !req->newptr)
5809 return error;
5810 if (rfkill == ath_hal_getrfkill(ah)) /* unchanged */
5811 return 0;
5812 if (!ath_hal_setrfkill(ah, rfkill))
5813 return EINVAL;
5814 return (ifp->if_drv_flags & IFF_DRV_RUNNING) ? ath_reset(ifp) : 0;
5815}
5816
5817static int
5818ath_sysctl_rfsilent(SYSCTL_HANDLER_ARGS)
5819{
5820 struct ath_softc *sc = arg1;
5821 u_int rfsilent;
5822 int error;
5823
5824 (void) ath_hal_getrfsilent(sc->sc_ah, &rfsilent);
5825 error = sysctl_handle_int(oidp, &rfsilent, 0, req);
5826 if (error || !req->newptr)
5827 return error;
5828 if (!ath_hal_setrfsilent(sc->sc_ah, rfsilent))
5829 return EINVAL;
5830 sc->sc_rfsilentpin = rfsilent & 0x1c;
5831 sc->sc_rfsilentpol = (rfsilent & 0x2) != 0;
5832 return 0;
5833}
5834
5835static int
5836ath_sysctl_tpack(SYSCTL_HANDLER_ARGS)
5837{
5838 struct ath_softc *sc = arg1;
5839 u_int32_t tpack;
5840 int error;
5841
5842 (void) ath_hal_gettpack(sc->sc_ah, &tpack);
5843 error = sysctl_handle_int(oidp, &tpack, 0, req);
5844 if (error || !req->newptr)
5845 return error;
5846 return !ath_hal_settpack(sc->sc_ah, tpack) ? EINVAL : 0;
5847}
5848
5849static int
5850ath_sysctl_tpcts(SYSCTL_HANDLER_ARGS)
5851{
5852 struct ath_softc *sc = arg1;
5853 u_int32_t tpcts;
5854 int error;
5855
5856 (void) ath_hal_gettpcts(sc->sc_ah, &tpcts);
5857 error = sysctl_handle_int(oidp, &tpcts, 0, req);
5858 if (error || !req->newptr)
5859 return error;
5860 return !ath_hal_settpcts(sc->sc_ah, tpcts) ? EINVAL : 0;
5861}
5862
5863static int
5864ath_sysctl_intmit(SYSCTL_HANDLER_ARGS)
5865{
5866 struct ath_softc *sc = arg1;
5867 int intmit, error;
5868
5869 intmit = ath_hal_getintmit(sc->sc_ah);
5870 error = sysctl_handle_int(oidp, &intmit, 0, req);
5871 if (error || !req->newptr)
5872 return error;
5873 return !ath_hal_setintmit(sc->sc_ah, intmit) ? EINVAL : 0;
5874}
5875
5876#ifdef IEEE80211_SUPPORT_TDMA
5877static int
5878ath_sysctl_setcca(SYSCTL_HANDLER_ARGS)
5879{
5880 struct ath_softc *sc = arg1;
5881 int setcca, error;
5882
5883 setcca = sc->sc_setcca;
5884 error = sysctl_handle_int(oidp, &setcca, 0, req);
5885 if (error || !req->newptr)
5886 return error;
5887 sc->sc_setcca = (setcca != 0);
5888 return 0;
5889}
5890#endif /* IEEE80211_SUPPORT_TDMA */
5891
5892static void
5893ath_sysctlattach(struct ath_softc *sc)
5894{
5895 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
5896 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
5897 struct ath_hal *ah = sc->sc_ah;
5898
5899 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5900 "countrycode", CTLFLAG_RD, &sc->sc_eecc, 0,
5901 "EEPROM country code");
5902 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5903 "regdomain", CTLFLAG_RD, &sc->sc_eerd, 0,
5904 "EEPROM regdomain code");
5905#ifdef ATH_DEBUG
5906 SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5907 "debug", CTLFLAG_RW, &sc->sc_debug, 0,
5908 "control debugging printfs");
5909#endif
5910 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5911 "slottime", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5912 ath_sysctl_slottime, "I", "802.11 slot time (us)");
5913 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5914 "acktimeout", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5915 ath_sysctl_acktimeout, "I", "802.11 ACK timeout (us)");
5916 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5917 "ctstimeout", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5918 ath_sysctl_ctstimeout, "I", "802.11 CTS timeout (us)");
5919 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5920 "softled", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5921 ath_sysctl_softled, "I", "enable/disable software LED support");
5922 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5923 "ledpin", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5924 ath_sysctl_ledpin, "I", "GPIO pin connected to LED");
5925 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5926 "ledon", CTLFLAG_RW, &sc->sc_ledon, 0,
5927 "setting to turn LED on");
5928 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5929 "ledidle", CTLFLAG_RW, &sc->sc_ledidle, 0,
5930 "idle time for inactivity LED (ticks)");
5931 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5932 "txantenna", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5933 ath_sysctl_txantenna, "I", "antenna switch");
5934 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5935 "rxantenna", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5936 ath_sysctl_rxantenna, "I", "default/rx antenna");
5937 if (ath_hal_hasdiversity(ah))
5938 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5939 "diversity", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5940 ath_sysctl_diversity, "I", "antenna diversity");
5941 sc->sc_txintrperiod = ATH_TXINTR_PERIOD;
5942 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5943 "txintrperiod", CTLFLAG_RW, &sc->sc_txintrperiod, 0,
5944 "tx descriptor batching");
5945 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5946 "diag", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5947 ath_sysctl_diag, "I", "h/w diagnostic control");
5948 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5949 "tpscale", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5950 ath_sysctl_tpscale, "I", "tx power scaling");
5951 if (ath_hal_hastpc(ah)) {
5952 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5953 "tpc", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5954 ath_sysctl_tpc, "I", "enable/disable per-packet TPC");
5955 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5956 "tpack", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5957 ath_sysctl_tpack, "I", "tx power for ack frames");
5958 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5959 "tpcts", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5960 ath_sysctl_tpcts, "I", "tx power for cts frames");
5961 }
5962 if (ath_hal_hasrfsilent(ah)) {
5963 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5964 "rfsilent", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5965 ath_sysctl_rfsilent, "I", "h/w RF silent config");
5966 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5967 "rfkill", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5968 ath_sysctl_rfkill, "I", "enable/disable RF kill switch");
5969 }
5970 if (ath_hal_hasintmit(ah)) {
5971 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5972 "intmit", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5973 ath_sysctl_intmit, "I", "interference mitigation");
5974 }
5975 sc->sc_monpass = HAL_RXERR_DECRYPT | HAL_RXERR_MIC;
5976 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5977 "monpass", CTLFLAG_RW, &sc->sc_monpass, 0,
5978 "mask of error frames to pass when monitoring");
5979#ifdef IEEE80211_SUPPORT_TDMA
5980 if (ath_hal_macversion(ah) > 0x78) {
5981 sc->sc_tdmadbaprep = 2;
5982 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5983 "dbaprep", CTLFLAG_RW, &sc->sc_tdmadbaprep, 0,
5984 "TDMA DBA preparation time");
5985 sc->sc_tdmaswbaprep = 10;
5986 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5987 "swbaprep", CTLFLAG_RW, &sc->sc_tdmaswbaprep, 0,
5988 "TDMA SWBA preparation time");
5989 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5990 "guardtime", CTLFLAG_RW, &sc->sc_tdmaguard, 0,
5991 "TDMA slot guard time");
5992 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5993 "superframe", CTLFLAG_RD, &sc->sc_tdmabintval, 0,
5994 "TDMA calculated super frame");
5995 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
5996 "setcca", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
5997 ath_sysctl_setcca, "I", "enable CCA control");
5998 }
5999#endif
6000}
6001
6002/*
6003 * Announce various information on device/driver attach.
6004 */
6005static void
6006ath_announce(struct ath_softc *sc)
6007{
6008 struct ifnet *ifp = sc->sc_ifp;
6009 struct ath_hal *ah = sc->sc_ah;

--- 377 unchanged lines hidden (view full) ---

6387 * Record local TSF for our last send for use
6388 * in arbitrating slot collisions.
6389 */
6390 vap->iv_bss->ni_tstamp.tsf = ath_hal_gettsf64(ah);
6391 }
6392}
6393#endif /* IEEE80211_SUPPORT_TDMA */
6394
5615/*
5616 * Announce various information on device/driver attach.
5617 */
5618static void
5619ath_announce(struct ath_softc *sc)
5620{
5621 struct ifnet *ifp = sc->sc_ifp;
5622 struct ath_hal *ah = sc->sc_ah;

--- 377 unchanged lines hidden (view full) ---

6000 * Record local TSF for our last send for use
6001 * in arbitrating slot collisions.
6002 */
6003 vap->iv_bss->ni_tstamp.tsf = ath_hal_gettsf64(ah);
6004 }
6005}
6006#endif /* IEEE80211_SUPPORT_TDMA */
6007
6395static int
6396ath_sysctl_clearstats(SYSCTL_HANDLER_ARGS)
6397{
6398 struct ath_softc *sc = arg1;
6399 int val = 0;
6400 int error;
6401
6402 error = sysctl_handle_int(oidp, &val, 0, req);
6403 if (error || !req->newptr)
6404 return error;
6405 if (val == 0)
6406 return 0; /* Not clearing the stats is still valid */
6407 memset(&sc->sc_stats, 0, sizeof(sc->sc_stats));
6408 val = 0;
6409 return 0;
6410}
6411
6412static void
6413ath_sysctl_stats_attach_rxphyerr(struct ath_softc *sc, struct sysctl_oid_list *parent)
6414{
6415 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
6416 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
6417 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
6418 int i;
6419 char sn[8];
6420
6421 tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "rx_phy_err", CTLFLAG_RD, NULL, "Per-code RX PHY Errors");
6422 child = SYSCTL_CHILDREN(tree);
6423 for (i = 0; i < 64; i++) {
6424 snprintf(sn, sizeof(sn), "%d", i);
6425 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, sn, CTLFLAG_RD, &sc->sc_stats.ast_rx_phy[i], 0, "");
6426 }
6427}
6428
6429static void
6430ath_sysctl_stats_attach(struct ath_softc *sc)
6431{
6432 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
6433 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
6434 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
6435
6436 /* Create "clear" node */
6437 SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
6438 "clear_stats", CTLTYPE_INT | CTLFLAG_RW, sc, 0,
6439 ath_sysctl_clearstats, "I", "clear stats");
6440
6441 /* Create stats node */
6442 tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD,
6443 NULL, "Statistics");
6444 child = SYSCTL_CHILDREN(tree);
6445
6446 /* This was generated from if_athioctl.h */
6447
6448 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_watchdog", CTLFLAG_RD,
6449 &sc->sc_stats.ast_watchdog, 0, "device reset by watchdog");
6450 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_hardware", CTLFLAG_RD,
6451 &sc->sc_stats.ast_hardware, 0, "fatal hardware error interrupts");
6452 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_bmiss", CTLFLAG_RD,
6453 &sc->sc_stats.ast_bmiss, 0, "beacon miss interrupts");
6454 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_bmiss_phantom", CTLFLAG_RD,
6455 &sc->sc_stats.ast_bmiss_phantom, 0, "beacon miss interrupts");
6456 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_bstuck", CTLFLAG_RD,
6457 &sc->sc_stats.ast_bstuck, 0, "beacon stuck interrupts");
6458 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rxorn", CTLFLAG_RD,
6459 &sc->sc_stats.ast_rxorn, 0, "rx overrun interrupts");
6460 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rxeol", CTLFLAG_RD,
6461 &sc->sc_stats.ast_rxeol, 0, "rx eol interrupts");
6462 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_txurn", CTLFLAG_RD,
6463 &sc->sc_stats.ast_txurn, 0, "tx underrun interrupts");
6464 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_mib", CTLFLAG_RD,
6465 &sc->sc_stats.ast_mib, 0, "mib interrupts");
6466 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_intrcoal", CTLFLAG_RD,
6467 &sc->sc_stats.ast_intrcoal, 0, "interrupts coalesced");
6468 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_packets", CTLFLAG_RD,
6469 &sc->sc_stats.ast_tx_packets, 0, "packet sent on the interface");
6470 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_mgmt", CTLFLAG_RD,
6471 &sc->sc_stats.ast_tx_mgmt, 0, "management frames transmitted");
6472 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_discard", CTLFLAG_RD,
6473 &sc->sc_stats.ast_tx_discard, 0, "frames discarded prior to assoc");
6474 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_qstop", CTLFLAG_RD,
6475 &sc->sc_stats.ast_tx_qstop, 0, "output stopped 'cuz no buffer");
6476 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_encap", CTLFLAG_RD,
6477 &sc->sc_stats.ast_tx_encap, 0, "tx encapsulation failed");
6478 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_nonode", CTLFLAG_RD,
6479 &sc->sc_stats.ast_tx_nonode, 0, "tx failed 'cuz no node");
6480 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_nombuf", CTLFLAG_RD,
6481 &sc->sc_stats.ast_tx_nombuf, 0, "tx failed 'cuz no mbuf");
6482 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_nomcl", CTLFLAG_RD,
6483 &sc->sc_stats.ast_tx_nomcl, 0, "tx failed 'cuz no cluster");
6484 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_linear", CTLFLAG_RD,
6485 &sc->sc_stats.ast_tx_linear, 0, "tx linearized to cluster");
6486 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_nodata", CTLFLAG_RD,
6487 &sc->sc_stats.ast_tx_nodata, 0, "tx discarded empty frame");
6488 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_busdma", CTLFLAG_RD,
6489 &sc->sc_stats.ast_tx_busdma, 0, "tx failed for dma resrcs");
6490 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_xretries", CTLFLAG_RD,
6491 &sc->sc_stats.ast_tx_xretries, 0, "tx failed 'cuz too many retries");
6492 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_fifoerr", CTLFLAG_RD,
6493 &sc->sc_stats.ast_tx_fifoerr, 0, "tx failed 'cuz FIFO underrun");
6494 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_filtered", CTLFLAG_RD,
6495 &sc->sc_stats.ast_tx_filtered, 0, "tx failed 'cuz xmit filtered");
6496 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_shortretry", CTLFLAG_RD,
6497 &sc->sc_stats.ast_tx_shortretry, 0, "tx on-chip retries (short)");
6498 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_longretry", CTLFLAG_RD,
6499 &sc->sc_stats.ast_tx_longretry, 0, "tx on-chip retries (long)");
6500 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_badrate", CTLFLAG_RD,
6501 &sc->sc_stats.ast_tx_badrate, 0, "tx failed 'cuz bogus xmit rate");
6502 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_noack", CTLFLAG_RD,
6503 &sc->sc_stats.ast_tx_noack, 0, "tx frames with no ack marked");
6504 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_rts", CTLFLAG_RD,
6505 &sc->sc_stats.ast_tx_rts, 0, "tx frames with rts enabled");
6506 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_cts", CTLFLAG_RD,
6507 &sc->sc_stats.ast_tx_cts, 0, "tx frames with cts enabled");
6508 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_shortpre", CTLFLAG_RD,
6509 &sc->sc_stats.ast_tx_shortpre, 0, "tx frames with short preamble");
6510 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_altrate", CTLFLAG_RD,
6511 &sc->sc_stats.ast_tx_altrate, 0, "tx frames with alternate rate");
6512 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_protect", CTLFLAG_RD,
6513 &sc->sc_stats.ast_tx_protect, 0, "tx frames with protection");
6514 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_ctsburst", CTLFLAG_RD,
6515 &sc->sc_stats.ast_tx_ctsburst, 0, "tx frames with cts and bursting");
6516 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_ctsext", CTLFLAG_RD,
6517 &sc->sc_stats.ast_tx_ctsext, 0, "tx frames with cts extension");
6518 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_nombuf", CTLFLAG_RD,
6519 &sc->sc_stats.ast_rx_nombuf, 0, "rx setup failed 'cuz no mbuf");
6520 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_busdma", CTLFLAG_RD,
6521 &sc->sc_stats.ast_rx_busdma, 0, "rx setup failed for dma resrcs");
6522 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_orn", CTLFLAG_RD,
6523 &sc->sc_stats.ast_rx_orn, 0, "rx failed 'cuz of desc overrun");
6524 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_crcerr", CTLFLAG_RD,
6525 &sc->sc_stats.ast_rx_crcerr, 0, "rx failed 'cuz of bad CRC");
6526 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_fifoerr", CTLFLAG_RD,
6527 &sc->sc_stats.ast_rx_fifoerr, 0, "rx failed 'cuz of FIFO overrun");
6528 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_badcrypt", CTLFLAG_RD,
6529 &sc->sc_stats.ast_rx_badcrypt, 0, "rx failed 'cuz decryption");
6530 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_badmic", CTLFLAG_RD,
6531 &sc->sc_stats.ast_rx_badmic, 0, "rx failed 'cuz MIC failure");
6532 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_phyerr", CTLFLAG_RD,
6533 &sc->sc_stats.ast_rx_phyerr, 0, "rx failed 'cuz of PHY err");
6534 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_tooshort", CTLFLAG_RD,
6535 &sc->sc_stats.ast_rx_tooshort, 0, "rx discarded 'cuz frame too short");
6536 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_toobig", CTLFLAG_RD,
6537 &sc->sc_stats.ast_rx_toobig, 0, "rx discarded 'cuz frame too large");
6538 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_packets", CTLFLAG_RD,
6539 &sc->sc_stats.ast_rx_packets, 0, "packet recv on the interface");
6540 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_mgt", CTLFLAG_RD,
6541 &sc->sc_stats.ast_rx_mgt, 0, "management frames received");
6542 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_ctl", CTLFLAG_RD,
6543 &sc->sc_stats.ast_rx_ctl, 0, "rx discarded 'cuz ctl frame");
6544 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_be_xmit", CTLFLAG_RD,
6545 &sc->sc_stats.ast_be_xmit, 0, "beacons transmitted");
6546 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_be_nombuf", CTLFLAG_RD,
6547 &sc->sc_stats.ast_be_nombuf, 0, "beacon setup failed 'cuz no mbuf");
6548 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_per_cal", CTLFLAG_RD,
6549 &sc->sc_stats.ast_per_cal, 0, "periodic calibration calls");
6550 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_per_calfail", CTLFLAG_RD,
6551 &sc->sc_stats.ast_per_calfail, 0, "periodic calibration failed");
6552 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_per_rfgain", CTLFLAG_RD,
6553 &sc->sc_stats.ast_per_rfgain, 0, "periodic calibration rfgain reset");
6554 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rate_calls", CTLFLAG_RD,
6555 &sc->sc_stats.ast_rate_calls, 0, "rate control checks");
6556 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rate_raise", CTLFLAG_RD,
6557 &sc->sc_stats.ast_rate_raise, 0, "rate control raised xmit rate");
6558 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rate_drop", CTLFLAG_RD,
6559 &sc->sc_stats.ast_rate_drop, 0, "rate control dropped xmit rate");
6560 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ant_defswitch", CTLFLAG_RD,
6561 &sc->sc_stats.ast_ant_defswitch, 0, "rx/default antenna switches");
6562 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ant_txswitch", CTLFLAG_RD,
6563 &sc->sc_stats.ast_ant_txswitch, 0, "tx antenna switches");
6564 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_cabq_xmit", CTLFLAG_RD,
6565 &sc->sc_stats.ast_cabq_xmit, 0, "cabq frames transmitted");
6566 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_cabq_busy", CTLFLAG_RD,
6567 &sc->sc_stats.ast_cabq_busy, 0, "cabq found busy");
6568 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_raw", CTLFLAG_RD,
6569 &sc->sc_stats.ast_tx_raw, 0, "tx frames through raw api");
6570 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ff_txok", CTLFLAG_RD,
6571 &sc->sc_stats.ast_ff_txok, 0, "fast frames tx'd successfully");
6572 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ff_txerr", CTLFLAG_RD,
6573 &sc->sc_stats.ast_ff_txerr, 0, "fast frames tx'd w/ error");
6574 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ff_rx", CTLFLAG_RD,
6575 &sc->sc_stats.ast_ff_rx, 0, "fast frames rx'd");
6576 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ff_flush", CTLFLAG_RD,
6577 &sc->sc_stats.ast_ff_flush, 0, "fast frames flushed from staging q");
6578 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_qfull", CTLFLAG_RD,
6579 &sc->sc_stats.ast_tx_qfull, 0, "tx dropped 'cuz of queue limit");
6580 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_nobuf", CTLFLAG_RD,
6581 &sc->sc_stats.ast_tx_nobuf, 0, "tx dropped 'cuz no ath buffer");
6582 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tdma_update", CTLFLAG_RD,
6583 &sc->sc_stats.ast_tdma_update, 0, "TDMA slot timing updates");
6584 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tdma_timers", CTLFLAG_RD,
6585 &sc->sc_stats.ast_tdma_timers, 0, "TDMA slot update set beacon timers");
6586 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tdma_tsf", CTLFLAG_RD,
6587 &sc->sc_stats.ast_tdma_tsf, 0, "TDMA slot update set TSF");
6588 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tdma_ack", CTLFLAG_RD,
6589 &sc->sc_stats.ast_tdma_ack, 0, "TDMA tx failed 'cuz ACK required");
6590 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_raw_fail", CTLFLAG_RD,
6591 &sc->sc_stats.ast_tx_raw_fail, 0, "raw tx failed 'cuz h/w down");
6592 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_nofrag", CTLFLAG_RD,
6593 &sc->sc_stats.ast_tx_nofrag, 0, "tx dropped 'cuz no ath frag buffer");
6594 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_be_missed", CTLFLAG_RD,
6595 &sc->sc_stats.ast_be_missed, 0, "number of -missed- beacons");
6596 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_ani_cal", CTLFLAG_RD,
6597 &sc->sc_stats.ast_ani_cal, 0, "number of ANI polls");
6598 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_agg", CTLFLAG_RD,
6599 &sc->sc_stats.ast_rx_agg, 0, "number of aggregate frames received");
6600
6601 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_halfgi", CTLFLAG_RD,
6602 &sc->sc_stats.ast_rx_halfgi, 0, "number of frames received with half-GI");
6603 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_2040", CTLFLAG_RD,
6604 &sc->sc_stats.ast_rx_2040, 0, "number of HT/40 frames received");
6605 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_pre_crc_err", CTLFLAG_RD,
6606 &sc->sc_stats.ast_rx_pre_crc_err, 0, "number of delimeter-CRC errors detected");
6607 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_post_crc_err", CTLFLAG_RD,
6608 &sc->sc_stats.ast_rx_post_crc_err, 0, "number of post-delimiter CRC errors detected");
6609 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_decrypt_busy_err", CTLFLAG_RD,
6610 &sc->sc_stats.ast_rx_decrypt_busy_err, 0, "number of frames received w/ busy decrypt engine");
6611 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_rx_hi_rx_chain", CTLFLAG_RD,
6612 &sc->sc_stats.ast_rx_hi_rx_chain, 0, "");
6613 SYSCTL_ADD_UINT(ctx, child, OID_AUTO, "ast_tx_htprotect", CTLFLAG_RD,
6614 &sc->sc_stats.ast_tx_htprotect, 0, "HT tx frames with protection");
6615
6616 /* Attach the RX phy error array */
6617 ath_sysctl_stats_attach_rxphyerr(sc, child);
6618}