Author: adrian
Date: Wed Jan  2 03:59:02 2013
New Revision: 244951
URL: http://svnweb.freebsd.org/changeset/base/244951

Log:
  Add a new (skeleton) spectral mode manager module.

Added:
  head/sys/dev/ath/if_ath_spectral.c   (contents, props changed)
  head/sys/dev/ath/if_ath_spectral.h   (contents, props changed)
Modified:
  head/sys/dev/ath/if_ath.c
  head/sys/dev/ath/if_athioctl.h
  head/sys/dev/ath/if_athvar.h

Modified: head/sys/dev/ath/if_ath.c
==============================================================================
--- head/sys/dev/ath/if_ath.c   Wed Jan  2 03:56:20 2013        (r244950)
+++ head/sys/dev/ath/if_ath.c   Wed Jan  2 03:59:02 2013        (r244951)
@@ -111,6 +111,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ath/if_ath_rx_edma.h>
 #include <dev/ath/if_ath_tx_edma.h>
 #include <dev/ath/if_ath_beacon.h>
+#include <dev/ath/if_ath_spectral.h>
 #include <dev/ath/if_athdfs.h>
 
 #ifdef ATH_TX99_DIAG
@@ -510,6 +511,14 @@ ath_attach(u_int16_t devid, struct ath_s
                goto bad2;
        }
 
+       /* Attach spectral module */
+       if (ath_spectral_attach(sc) < 0) {
+               device_printf(sc->sc_dev,
+                   "%s: unable to attach spectral\n", __func__);
+               error = EIO;
+               goto bad2;
+       }
+
        /* Start DFS processing tasklet */
        TASK_INIT(&sc->sc_dfstask, 0, ath_dfs_tasklet, sc);
 
@@ -967,6 +976,7 @@ ath_detach(struct ath_softc *sc)
        if_ath_alq_tidyup(&sc->sc_alq);
 #endif
 
+       ath_spectral_detach(sc);
        ath_dfs_detach(sc);
        ath_desc_free(sc);
        ath_txdma_teardown(sc);
@@ -1489,6 +1499,9 @@ ath_resume(struct ath_softc *sc)
        /* Let DFS at it in case it's a DFS channel */
        ath_dfs_radar_enable(sc, ic->ic_curchan);
 
+       /* Let spectral at in case spectral is enabled */
+       ath_spectral_enable(sc, ic->ic_curchan);
+
        /* Restore the LED configuration */
        ath_led_config(sc);
        ath_hal_setledstate(ah, HAL_LED_INIT);
@@ -1918,6 +1931,9 @@ ath_init(void *arg)
        /* Let DFS at it in case it's a DFS channel */
        ath_dfs_radar_enable(sc, ic->ic_curchan);
 
+       /* Let spectral at in case spectral is enabled */
+       ath_spectral_enable(sc, ic->ic_curchan);
+
        /*
         * Likewise this is set during reset so update
         * state cached in the driver.
@@ -2226,6 +2242,9 @@ ath_reset(struct ifnet *ifp, ATH_RESET_T
        /* Let DFS at it in case it's a DFS channel */
        ath_dfs_radar_enable(sc, ic->ic_curchan);
 
+       /* Let spectral at in case spectral is enabled */
+       ath_spectral_enable(sc, ic->ic_curchan);
+
        if (ath_startrecv(sc) != 0)     /* restart recv */
                if_printf(ifp, "%s: unable to start recv logic\n", __func__);
        /*
@@ -4402,6 +4421,9 @@ ath_chan_set(struct ath_softc *sc, struc
                /* Let DFS at it in case it's a DFS channel */
                ath_dfs_radar_enable(sc, chan);
 
+               /* Let spectral at in case spectral is enabled */
+               ath_spectral_enable(sc, chan);
+
                /*
                 * Re-enable rx framework.
                 */
@@ -5384,6 +5406,9 @@ ath_ioctl(struct ifnet *ifp, u_long cmd,
                error = ath_ioctl_phyerr(sc,(struct ath_diag*) ifr);
                break;
 #endif
+       case SIOCGATHSPECTRAL:
+               error = ath_ioctl_spectral(sc,(struct ath_diag*) ifr);
+               break;
        case SIOCGATHNODERATESTATS:
                error = ath_ioctl_ratestats(sc, (struct ath_rateioctl *) ifr);
                break;

Added: head/sys/dev/ath/if_ath_spectral.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/ath/if_ath_spectral.c  Wed Jan  2 03:59:02 2013        
(r244951)
@@ -0,0 +1,224 @@
+/*-
+ * Copyright (c) 2013 Adrian Chadd <adr...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $FreeBSD$
+ */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+/*
+ * Implement some basic spectral scan control logic.
+ */
+#include "opt_ath.h"
+#include "opt_inet.h"
+#include "opt_wlan.h"
+
+#include <sys/param.h>
+#include <sys/systm.h> 
+#include <sys/sysctl.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/errno.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/bus.h>
+
+#include <sys/socket.h>
+ 
+#include <net/if.h>
+#include <net/if_media.h>
+#include <net/if_arp.h>
+#include <net/ethernet.h>              /* XXX for ether_sprintf */
+
+#include <net80211/ieee80211_var.h>
+
+#include <net/bpf.h>
+
+#ifdef INET
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#endif
+
+#include <dev/ath/if_athvar.h>
+#include <dev/ath/if_ath_spectral.h>
+
+#include <dev/ath/ath_hal/ah_desc.h>
+
+struct ath_spectral_state {
+       HAL_SPECTRAL_PARAM      spectral_state;
+       int     spectral_active;
+       int     spectral_enabled;
+};
+
+/*
+ * Methods which are required
+ */
+
+/*
+ * Attach DFS to the given interface
+ */
+int
+ath_spectral_attach(struct ath_softc *sc)
+{
+       struct ath_spectral_state *ss;
+
+       ss = malloc(sizeof(struct ath_spectral_state),
+           M_TEMP, M_WAITOK | M_ZERO);
+
+       if (ss == NULL) {
+               device_printf(sc->sc_dev, "%s: failed to alloc memory\n",
+                   __func__);
+               return (-ENOMEM);
+       }
+
+       sc->sc_spectral = ss;
+
+       (void) ath_hal_spectral_get_config(sc->sc_ah, &ss->spectral_state);
+
+       return (0);
+}
+
+/*
+ * Detach DFS from the given interface
+ */
+int
+ath_spectral_detach(struct ath_softc *sc)
+{
+       if (sc->sc_spectral != NULL) {
+               free(sc->sc_spectral, M_TEMP);
+       }
+       return (0);
+}
+
+/*
+ * Check whether spectral needs enabling and if so,
+ * flip it on.
+ */
+int
+ath_spectral_enable(struct ath_softc *sc, struct ieee80211_channel *ch)
+{
+
+       return (0);
+}
+
+/*
+ * Handle ioctl requests from the diagnostic interface.
+ *
+ * The initial part of this code resembles ath_ioctl_diag();
+ * it's likely a good idea to reduce duplication between
+ * these two routines.
+ */
+int
+ath_ioctl_spectral(struct ath_softc *sc, struct ath_diag *ad)
+{
+       unsigned int id = ad->ad_id & ATH_DIAG_ID;
+       void *indata = NULL;
+       void *outdata = NULL;
+       u_int32_t insize = ad->ad_in_size;
+       u_int32_t outsize = ad->ad_out_size;
+       int error = 0;
+       HAL_SPECTRAL_PARAM peout;
+       HAL_SPECTRAL_PARAM *pe;
+       struct ath_spectral_state *ss = sc->sc_spectral;
+
+       if (ad->ad_id & ATH_DIAG_IN) {
+               /*
+                * Copy in data.
+                */
+               indata = malloc(insize, M_TEMP, M_NOWAIT);
+               if (indata == NULL) {
+                       error = ENOMEM;
+                       goto bad;
+               }
+               error = copyin(ad->ad_in_data, indata, insize);
+               if (error)
+                       goto bad;
+       }
+       if (ad->ad_id & ATH_DIAG_DYN) {
+               /*
+                * Allocate a buffer for the results (otherwise the HAL
+                * returns a pointer to a buffer where we can read the
+                * results).  Note that we depend on the HAL leaving this
+                * pointer for us to use below in reclaiming the buffer;
+                * may want to be more defensive.
+                */
+               outdata = malloc(outsize, M_TEMP, M_NOWAIT);
+               if (outdata == NULL) {
+                       error = ENOMEM;
+                       goto bad;
+               }
+       }
+       switch (id) {
+               case SPECTRAL_CONTROL_GET_PARAMS:
+                       memset(&peout, 0, sizeof(peout));
+                       outsize = sizeof(HAL_SPECTRAL_PARAM);
+                       ath_hal_spectral_get_config(sc->sc_ah, &peout);
+                       pe = (HAL_SPECTRAL_PARAM *) outdata;
+                       memcpy(pe, &peout, sizeof(*pe));
+                       break;
+               case SPECTRAL_CONTROL_SET_PARAMS:
+                       if (insize < sizeof(HAL_SPECTRAL_PARAM)) {
+                               error = EINVAL;
+                               break;
+                       }
+                       pe = (HAL_SPECTRAL_PARAM *) indata;
+                       ath_hal_spectral_configure(sc->sc_ah, pe);
+                       /* Save a local copy of the updated parameters */
+                       ath_hal_spectral_get_config(sc->sc_ah,
+                           &ss->spectral_state);
+                       break;
+               case SPECTRAL_CONTROL_START:
+                       ath_hal_spectral_configure(sc->sc_ah,
+                           &ss->spectral_state);
+                       (void) ath_hal_spectral_start(sc->sc_ah);
+                       break;
+               case SPECTRAL_CONTROL_STOP:
+                       (void) ath_hal_spectral_stop(sc->sc_ah);
+                       break;
+               case SPECTRAL_CONTROL_ENABLE:
+                       /* XXX TODO */
+               case SPECTRAL_CONTROL_DISABLE:
+                       /* XXX TODO */
+               break;
+               default:
+                       error = EINVAL;
+       }
+       if (outsize < ad->ad_out_size)
+               ad->ad_out_size = outsize;
+       if (outdata && copyout(outdata, ad->ad_out_data, ad->ad_out_size))
+               error = EFAULT;
+bad:
+       if ((ad->ad_id & ATH_DIAG_IN) && indata != NULL)
+               free(indata, M_TEMP);
+       if ((ad->ad_id & ATH_DIAG_DYN) && outdata != NULL)
+               free(outdata, M_TEMP);
+       return (error);
+}
+

Added: head/sys/dev/ath/if_ath_spectral.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/dev/ath/if_ath_spectral.h  Wed Jan  2 03:59:02 2013        
(r244951)
@@ -0,0 +1,40 @@
+/*-
+ * Copyright (c) 2013 Adrian Chadd <adr...@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer,
+ *    without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ *    redistribution must be conditioned upon including a substantially
+ *    similar Disclaimer requirement for further binary redistribution.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $FreeBSD$
+ */
+#ifndef        __IF_ATH_SPECTRAL_H__
+#define        __IF_ATH_SPECTRAL_H__
+
+extern int ath_spectral_attach(struct ath_softc *sc);
+extern int ath_spectral_detach(struct ath_softc *sc);
+extern int ath_ioctl_spectral(struct ath_softc *sc, struct ath_diag *ad);
+extern int ath_spectral_enable(struct ath_softc *sc,
+           struct ieee80211_channel *ch);
+
+#endif /* __IF_ATH_SPECTRAL_H__ */

Modified: head/sys/dev/ath/if_athioctl.h
==============================================================================
--- head/sys/dev/ath/if_athioctl.h      Wed Jan  2 03:56:20 2013        
(r244950)
+++ head/sys/dev/ath/if_athioctl.h      Wed Jan  2 03:59:02 2013        
(r244951)
@@ -406,4 +406,26 @@ struct ath_tx_radiotap_header {
 #define        DFS_PARAM_ENABLE        32
 #define        DFS_PARAM_EN_EXTCH      33
 
+/*
+ * Spectral ioctl parameter types
+ */
+#define        SPECTRAL_PARAM_FFT_PERIOD       1
+#define        SPECTRAL_PARAM_SS_PERIOD        2
+#define        SPECTRAL_PARAM_SS_COUNT         3
+#define        SPECTRAL_PARAM_SS_SHORT_RPT     4
+#define        SPECTRAL_PARAM_ENABLED          5
+#define        SPECTRAL_PARAM_ACTIVE           6
+
+/*
+ * Spectral control parameters
+ */
+#define        SIOCGATHSPECTRAL        _IOWR('i', 151, struct ath_diag)
+
+#define        SPECTRAL_CONTROL_ENABLE         2
+#define        SPECTRAL_CONTROL_DISABLE        3
+#define        SPECTRAL_CONTROL_START          4
+#define        SPECTRAL_CONTROL_STOP           5
+#define        SPECTRAL_CONTROL_GET_PARAMS     6
+#define        SPECTRAL_CONTROL_SET_PARAMS     7
+
 #endif /* _DEV_ATH_ATHIOCTL_H */

Modified: head/sys/dev/ath/if_athvar.h
==============================================================================
--- head/sys/dev/ath/if_athvar.h        Wed Jan  2 03:56:20 2013        
(r244950)
+++ head/sys/dev/ath/if_athvar.h        Wed Jan  2 03:59:02 2013        
(r244951)
@@ -750,6 +750,10 @@ struct ath_softc {
        int                     sc_dodfs;       /* Whether to enable DFS rx 
filter bits */
        struct task             sc_dfstask;     /* DFS processing task */
 
+       /* Spectral related state */
+       void                    *sc_spectral;
+       int                     sc_dospectral;
+
        /* ALQ */
 #ifdef ATH_DEBUG_ALQ
        struct if_ath_alq sc_alq;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to