summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/ath/ath_wificonfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/ath/ath_wificonfig.c')
-rw-r--r--usr/src/uts/common/io/ath/ath_wificonfig.c818
1 files changed, 0 insertions, 818 deletions
diff --git a/usr/src/uts/common/io/ath/ath_wificonfig.c b/usr/src/uts/common/io/ath/ath_wificonfig.c
deleted file mode 100644
index cc6c7d1a67..0000000000
--- a/usr/src/uts/common/io/ath/ath_wificonfig.c
+++ /dev/null
@@ -1,818 +0,0 @@
-/*
- * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
- */
-
-/*
- * 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.
- * 3. Neither the names of the above-listed copyright holders nor the names
- * of any contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * 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.
- *
- */
-
-#pragma ident "%Z%%M% %I% %E% SMI"
-
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/signal.h>
-#include <sys/stream.h>
-#include <sys/termio.h>
-#include <sys/errno.h>
-#include <sys/file.h>
-#include <sys/cmn_err.h>
-#include <sys/stropts.h>
-#include <sys/strsubr.h>
-#include <sys/strtty.h>
-#include <sys/kbio.h>
-#include <sys/cred.h>
-#include <sys/stat.h>
-#include <sys/consdev.h>
-#include <sys/kmem.h>
-#include <sys/modctl.h>
-#include <sys/ddi.h>
-#include <sys/sunddi.h>
-#include <sys/pci.h>
-#include <sys/errno.h>
-#include <sys/gld.h>
-#include <sys/dlpi.h>
-#include <sys/ethernet.h>
-#include <sys/note.h>
-#include <sys/strsun.h>
-#include <sys/list.h>
-#include <inet/common.h>
-#include <inet/nd.h>
-#include <inet/mi.h>
-#include <inet/wifi_ioctl.h>
-#include "ath_impl.h"
-#include "ath_hal.h"
-#include "ath_ieee80211.h"
-
-extern int
-ath_gld_start(gld_mac_info_t *gld_p);
-
-static int
-ath_wificfg_essid(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- char *value, *buf;
- int len;
- wldp_t *infp, *outfp;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
-
- outfp = (wldp_t *)buf;
- infp = (wldp_t *)mp->b_rptr;
-
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- if (cmd == WLAN_GET_PARAM) {
- if (mi_strlen((const char *)isc->isc_des_essid) == 0) {
- outfp->wldp_length = offsetof(wldp_t, wldp_buf) +
- offsetof(wl_essid_t, wl_essid_essid) +
- mi_strlen((const char *)
- isc->isc_bss->in_essid);
- ((wl_essid_t *)(outfp->wldp_buf))->wl_essid_length =
- mi_strlen((const char *)
- isc->isc_bss->in_essid);
- bcopy(isc->isc_bss->in_essid,
- buf + offsetof(wldp_t, wldp_buf) +
- offsetof(wl_essid_t, wl_essid_essid),
- mi_strlen((const char *)
- isc->isc_bss->in_essid));
- } else {
- outfp->wldp_length = offsetof(wldp_t, wldp_buf) +
- offsetof(wl_essid_t, wl_essid_essid) +
- mi_strlen((const char *)isc->isc_des_essid);
- ((wl_essid_t *)(outfp->wldp_buf))->wl_essid_length =
- mi_strlen((const char *)isc->isc_des_essid);
- bcopy(isc->isc_des_essid,
- buf + offsetof(wldp_t, wldp_buf) +
- offsetof(wl_essid_t, wl_essid_essid),
- mi_strlen((const char *)
- isc->isc_des_essid));
- }
- } else if (cmd == WLAN_SET_PARAM) {
- value = ((wl_essid_t *)(infp->wldp_buf))->wl_essid_essid;
- bzero(isc->isc_des_essid, IEEE80211_NWID_LEN);
- if (mi_strlen(value) == 0)
- isc->isc_des_esslen = 0;
- else {
- len = mi_strlen((const char *)value);
- if (len > IEEE80211_NWID_LEN)
- len = IEEE80211_NWID_LEN;
- bcopy(value, isc->isc_des_essid, len);
- isc->isc_des_esslen = len;
- ATH_DEBUG((ATH_DBG_WIFICFG,
- "ath: ath_wificfg_essid(): "
- "set essid=%s len=%d\n", value, len));
- }
- if (asc->asc_invalid == 0) {
- (void) ath_gld_start(isc->isc_dev);
- (void) _ieee80211_new_state(isc, IEEE80211_S_SCAN, -1);
- }
- }
-
- outfp->wldp_result = WL_SUCCESS;
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- kmem_free(buf, MAX_BUF_LEN);
- return (WL_SUCCESS);
-}
-
-static int
-ath_wificfg_bssid(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- char *buf;
- wldp_t *outfp;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- outfp->wldp_length = WIFI_BUF_OFFSET + sizeof (wl_bssid_t);
- if (cmd == WLAN_GET_PARAM) {
- if (isc->isc_flags & IEEE80211_F_DESBSSID)
- bcopy(isc->isc_des_bssid,
- buf + WIFI_BUF_OFFSET, sizeof (wl_bssid_t));
- else
- bcopy(isc->isc_bss->in_bssid,
- buf + WIFI_BUF_OFFSET, sizeof (wl_bssid_t));
- outfp->wldp_result = WL_SUCCESS;
-
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: ath_wificfg_bssid(): "
- "get bssid=%x %x %x %x %x %x\n",
- buf[WIFI_BUF_OFFSET+0], buf[WIFI_BUF_OFFSET+1],
- buf[WIFI_BUF_OFFSET+2], buf[WIFI_BUF_OFFSET+3],
- buf[WIFI_BUF_OFFSET+4], buf[WIFI_BUF_OFFSET+5]));
- } else if (cmd == WLAN_SET_PARAM) {
- outfp->wldp_result = WL_READONLY;
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- kmem_free(buf, MAX_BUF_LEN);
- return (WL_SUCCESS);
-}
-
-static int
-ath_wificfg_nodename(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- char *value, *buf;
- int iret, nickname_len;
- uint32_t i;
- wldp_t *infp, *outfp;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: ath_wificfg_nodename(): "
- "nodename entry\n"));
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- infp = (wldp_t *)mp->b_rptr;
-
- nickname_len = MIN(isc->isc_nicknamelen, IEEE80211_NWID_LEN);
-
- if (cmd == WLAN_GET_PARAM) {
- outfp->wldp_length = WIFI_BUF_OFFSET +
- offsetof(wl_nodename_t, wl_nodename_name) + nickname_len;
- ((wl_nodename_t *)(buf + WIFI_BUF_OFFSET))->wl_nodename_length =
- nickname_len;
- bcopy(isc->isc_nickname, buf + WIFI_BUF_OFFSET +
- offsetof(wl_nodename_t, wl_nodename_name), nickname_len);
- outfp->wldp_result = WL_SUCCESS;
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: ath_wificfg_nodename(): "
- "get nodename=%s\n", isc->isc_nickname));
- } else if (cmd == WLAN_SET_PARAM) {
- value = ((wl_nodename_t *)(infp->wldp_buf))->wl_nodename_name;
- (void) strncpy((char *)isc->isc_nickname, value,
- MIN(32, strlen(value)));
- isc->isc_nickname[strlen(value)] = '\0';
- isc->isc_nicknamelen =
- ((wl_nodename_t *)(infp->wldp_buf))->wl_nodename_length;
- outfp->wldp_length = WIFI_BUF_OFFSET;
- outfp->wldp_result = WL_SUCCESS;
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: ath_wificfg_nodename(): "
- "set nodename=%s\n", value));
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: ath_wificfg_nodename(): "
- "set nodename_len=%d\n", isc->isc_nicknamelen));
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_encryption(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- char *buf;
- int iret;
- wldp_t *infp, *outfp;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- infp = (wldp_t *)mp->b_rptr;
- outfp->wldp_length = offsetof(wldp_t, wldp_buf) +
- sizeof (wl_encryption_t);
- if (cmd == WLAN_GET_PARAM) {
- *(wl_encryption_t *)(outfp->wldp_buf) =
- (isc->isc_flags & IEEE80211_F_WEPON) ? 1 : 0;
- outfp->wldp_result = WL_SUCCESS;
- } else if (cmd == WLAN_SET_PARAM) {
- if (*(wl_encryption_t *)(infp->wldp_buf) ==
- WL_NOENCRYPTION) {
- isc->isc_flags &= ~IEEE80211_F_WEPON;
- } else if (*(wl_encryption_t *)(infp->wldp_buf) ==
- WL_ENC_WEP) {
- isc->isc_flags |= IEEE80211_F_WEPON;
- }
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: "
- "ath_wificfg_encryption(): set encryption=%d\n",
- (isc->isc_flags & IEEE80211_F_WEPON) ? 1 : 0));
- if (asc->asc_invalid == 0) {
- (void) ath_gld_start(isc->isc_dev);
- (void) _ieee80211_new_state(isc, IEEE80211_S_SCAN, -1);
- }
- outfp->wldp_result = WL_SUCCESS;
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_wepkey(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- wldp_t *infp, *outfp;
- char *buf;
- int iret;
- wl_wep_key_t *p_wepkey_tab;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- infp = (wldp_t *)mp->b_rptr;
-
- outfp->wldp_length = offsetof(wldp_t, wldp_buf) +
- sizeof (wl_wep_key_tab_t);
-
- if (cmd == WLAN_GET_PARAM) {
- outfp->wldp_result = WL_WRITEONLY;
- } else if (cmd == WLAN_SET_PARAM) {
- p_wepkey_tab = (wl_wep_key_t *)(infp->wldp_buf);
- for (i = 0; i < MAX_NWEPKEYS; i++) {
- if (p_wepkey_tab[i].wl_wep_operation == WL_ADD) {
- isc->isc_nw_keys[i].iwk_len =
- p_wepkey_tab[i].wl_wep_length;
- bcopy(p_wepkey_tab[i].wl_wep_key,
- isc->isc_nw_keys[i].iwk_key,
- p_wepkey_tab[i].wl_wep_length);
- }
- }
- if (asc->asc_invalid == 0) {
- (void) ath_gld_start(isc->isc_dev);
- (void) _ieee80211_new_state(isc, IEEE80211_S_SCAN, -1);
- }
- outfp->wldp_result = WL_SUCCESS;
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-
-}
-
-static int
-ath_wificfg_keyid(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- char *buf;
- int iret;
- wldp_t *infp, *outfp;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
- wl_wep_key_id_t keyid;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- infp = (wldp_t *)mp->b_rptr;
-
- outfp->wldp_length = offsetof(wldp_t, wldp_buf) +
- sizeof (wl_wep_key_id_t);
-
- if (cmd == WLAN_GET_PARAM) {
- *(wl_wep_key_id_t *)(outfp->wldp_buf) =
- isc->isc_wep_txkey;
- outfp->wldp_result = WL_SUCCESS;
- } else if (cmd == WLAN_SET_PARAM) {
- keyid = *(wl_wep_key_id_t *)(infp->wldp_buf);
- if (keyid >= MAX_NWEPKEYS) {
- outfp->wldp_result = WL_NOTSUPPORTED;
- } else {
- isc->isc_wep_txkey = keyid;
- ATH_DEBUG((ATH_DBG_WIFICFG,
- "ath: ath_wificfg_keyid(): set wepkeyid=%d\n",
- isc->isc_wep_txkey));
- if (asc->asc_invalid == 0) {
- (void) ath_gld_start(isc->isc_dev);
- (void) _ieee80211_new_state(isc,
- IEEE80211_S_SCAN, -1);
- }
- outfp->wldp_result = WL_SUCCESS;
- }
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-/*
- * Units are in db above the noise floor. That means the
- * rssi values reported in the tx/rx descriptors in the
- * driver are the SNR expressed in db.
- */
-static void
-ath_getrssi(struct ieee80211_node *in, wl_rssi_t *rssi)
-{
- wl_rssi_t val, max_val;
-
- max_val = 63; /* Max rssi */
- val = (wl_rssi_t)in->in_recv_hist[in->in_hist_cur].irh_rssi;
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: ath_getrssi(): "
- "rssi: %d\n", val));
- if (val > max_val)
- val = max_val; /* Max rssi */
- if (max_val > MAX_RSSI)
- *rssi = (wl_rssi_t)((val + (double)max_val / MAX_RSSI - 1) /
- max_val * MAX_RSSI);
- else
- *rssi = (wl_rssi_t)((double)val / max_val * MAX_RSSI);
-}
-
-static void
-ath_wait_scan(ath_t *asc)
-{
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- while (isc->isc_flags & IEEE80211_F_ASCAN) {
- if (cv_timedwait(&isc->isc_scan_cv, &isc->isc_genlock,
- ddi_get_lbolt() + drv_usectohz(6000000)) != 0)
- break;
- }
-}
-
-static int
-ath_wificfg_esslist(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- _NOTE(ARGUNUSED(cmd))
-
- char *buf;
- int iret;
- uint32_t i, essid_num;
- struct ieee80211_node *in;
- wldp_t *outfp;
- wl_ess_conf_t *p_ess_conf;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- /* Wait scan finish */
- ath_wait_scan(asc);
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- essid_num = 0;
- in = list_head(&isc->isc_in_list);
- while (in != NULL) {
- p_ess_conf = (wl_ess_conf_t *)
- (buf + offsetof(wldp_t, wldp_buf) +
- offsetof(wl_ess_list_t, wl_ess_list_ess) +
- essid_num * sizeof (wl_ess_conf_t));
-
- if (p_ess_conf > (wl_ess_conf_t *)
- (buf + MAX_BUF_LEN - sizeof (wl_ess_conf_t)))
- break;
-
- bcopy(in->in_essid,
- p_ess_conf->wl_ess_conf_essid.wl_essid_essid,
- in->in_esslen);
- bcopy(in->in_bssid, p_ess_conf->wl_ess_conf_bssid, 6);
- (p_ess_conf->wl_phy_conf).wl_phy_dsss_conf.wl_dsss_subtype =
- WL_DSSS;
- p_ess_conf->wl_ess_conf_wepenabled =
- (in->in_capinfo & IEEE80211_CAPINFO_PRIVACY ?
- WL_ENC_WEP : WL_NOENCRYPTION);
- p_ess_conf->wl_ess_conf_bsstype =
- (in->in_capinfo & IEEE80211_CAPINFO_ESS ?
- WL_BSS_BSS : WL_BSS_IBSS);
- ath_getrssi(in, &(p_ess_conf->wl_ess_conf_sl));
-
- essid_num++;
- in = list_next(&isc->isc_in_list, in);
- }
-
- ((wl_ess_list_t *)(outfp->wldp_buf))->wl_ess_list_num = essid_num;
- outfp->wldp_length = offsetof(wldp_t, wldp_buf) +
- offsetof(wl_ess_list_t, wl_ess_list_ess) +
- essid_num * sizeof (wl_ess_conf_t);
- outfp->wldp_result = WL_SUCCESS;
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_supportrates(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- _NOTE(ARGUNUSED(asc))
-
- uint16_t i;
- wldp_t *outfp;
- char *buf;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
- struct ieee80211_node *in = isc->isc_bss;
- const struct ieee80211_rateset *rs;
- wl_rates_t *rates;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- rs = &isc->isc_sup_rates[ieee80211_chan2mode(isc, in->in_chan)];
- rates = (wl_rates_t *)(outfp->wldp_buf);
- if (cmd == WLAN_GET_PARAM) {
- rates->wl_rates_num = rs->ir_nrates;
- for (i = 0; i < rs->ir_nrates; i++) {
- rates->wl_rates_rates[i] = rs->ir_rates[i] &
- IEEE80211_RATE_VAL;
- }
- outfp->wldp_length = WIFI_BUF_OFFSET +
- offsetof(wl_rates_t, wl_rates_rates) +
- rs->ir_nrates * sizeof (char);
- outfp->wldp_result = WL_SUCCESS;
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- }
-
- kmem_free(buf, MAX_BUF_LEN);
- return (WL_SUCCESS);
-}
-
-static int
-ath_wificfg_desiredrates(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- int rate, iret;
- char *buf;
- wldp_t *outfp;
-
- ieee80211com_t *isc = (ieee80211com_t *)asc;
- struct ieee80211_node *in = isc->isc_bss;
- struct ieee80211_rateset *rs = &in->in_rates;
-
- /*
- * Here rate is a full duplex speed, wificonfig will divide it
- * by 2 when display to user. From the wificonfig point of view,
- * 'rate' is just a transmiting rate.
- */
- rate = (rs->ir_rates[in->in_txrate] & IEEE80211_RATE_VAL);
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- if (cmd == WLAN_GET_PARAM) {
- ((wl_rates_t *)(outfp->wldp_buf))->wl_rates_num = 1;
- (((wl_rates_t *)(outfp->wldp_buf))->wl_rates_rates)[0] = rate;
- outfp->wldp_length = WIFI_BUF_OFFSET +
- offsetof(wl_rates_t, wl_rates_rates) + sizeof (char);
- ATH_DEBUG((ATH_DBG_WIFICFG, "ath: "
- "ath_wificfg_desiredrates(): current rate=%dM\n", rate));
- outfp->wldp_result = WL_SUCCESS;
- } else if (cmd == WLAN_SET_PARAM) {
- outfp->wldp_length = WIFI_BUF_OFFSET;
- outfp->wldp_result = WL_SUCCESS;
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_authmode(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- _NOTE(ARGUNUSED(asc))
-
- uint32_t i, authmode;
- char *buf;
- int iret;
- wldp_t *infp, *outfp;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- infp = (wldp_t *)mp->b_rptr;
-
- outfp->wldp_length = WIFI_BUF_OFFSET + sizeof (wl_authmode_t);
- outfp->wldp_result = WL_SUCCESS;
- if (cmd == WLAN_GET_PARAM) {
- *(wl_authmode_t *)(outfp->wldp_buf) = WL_OPENSYSTEM;
- } else if (cmd == WLAN_SET_PARAM) {
- authmode = *(wl_authmode_t *)(infp->wldp_buf);
- if (authmode != WL_OPENSYSTEM) {
- outfp->wldp_length = WIFI_BUF_OFFSET;
- outfp->wldp_result = WL_LACK_FEATURE;
- }
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_bsstype(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- _NOTE(ARGUNUSED(asc))
-
- uint32_t i, bss_type;
- char *buf;
- int iret;
- wldp_t *infp, *outfp;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- infp = (wldp_t *)mp->b_rptr;
- outfp->wldp_length = WIFI_BUF_OFFSET + sizeof (wl_bss_type_t);
- outfp->wldp_result = WL_SUCCESS;
- if (cmd == WLAN_GET_PARAM) {
- *(wl_bss_type_t *)(outfp->wldp_buf) = WL_BSS_BSS;
- } else if (cmd == WLAN_SET_PARAM) {
- bss_type = (uint16_t)(*(wl_bss_type_t *)(infp->wldp_buf));
- if (bss_type != WL_BSS_BSS) {
- outfp->wldp_length = WIFI_BUF_OFFSET;
- outfp->wldp_result = WL_LACK_FEATURE;
- }
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_linkstatus(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- char *buf;
- int iret;
- wldp_t *outfp;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- outfp->wldp_length = WIFI_BUF_OFFSET + sizeof (wl_linkstatus_t);
- outfp->wldp_result = WL_SUCCESS;
-
- if (cmd == WLAN_GET_PARAM) {
- *(wl_linkstatus_t *)(outfp->wldp_buf) =
- (IEEE80211_S_RUN == isc->isc_state) ?
- WL_CONNECTED : WL_NOTCONNECTED;
- } else if (cmd == WLAN_SET_PARAM) {
- outfp->wldp_length = WIFI_BUF_OFFSET;
- outfp->wldp_result = WL_NOTSUPPORTED;
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_rssi(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i;
- char *buf;
- int iret;
- wldp_t *outfp;
-
- ieee80211com_t *isc = (ieee80211com_t *)asc;
- struct ieee80211_node *in = isc->isc_bss;
-
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
-
- outfp->wldp_length = WIFI_BUF_OFFSET + sizeof (wl_rssi_t);
- outfp->wldp_result = WL_SUCCESS;
-
- if (cmd == WLAN_GET_PARAM) {
- ath_getrssi(in, (wl_rssi_t *)(outfp->wldp_buf));
- } else if (cmd == WLAN_SET_PARAM) {
- outfp->wldp_length = WIFI_BUF_OFFSET;
- outfp->wldp_result = WL_NOTSUPPORTED;
- }
-
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- iret = (int)(outfp->wldp_result);
- kmem_free(buf, MAX_BUF_LEN);
- return (iret);
-}
-
-static int
-ath_wificfg_scan(ath_t *asc)
-{
- int iret = WL_SUCCESS;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- if (asc->asc_invalid == 0 && isc->isc_state == IEEE80211_S_INIT) {
- (void) _ieee80211_new_state(isc, IEEE80211_S_SCAN, -1);
- ath_wait_scan(asc);
- (void) _ieee80211_new_state(isc, IEEE80211_S_INIT, -1);
- }
- return (iret);
-}
-
-static void
-ath_loaddefdata(ath_t *asc)
-{
- int i;
- ieee80211com_t *isc = (ieee80211com_t *)asc;
- struct ieee80211_node *in = isc->isc_bss;
- struct ieee80211_rateset *rs = &in->in_rates;
-
- if (isc->isc_flags & IEEE80211_F_DESBSSID)
- bzero(isc->isc_des_bssid, IEEE80211_ADDR_LEN);
- else
- bzero(isc->isc_bss->in_bssid, IEEE80211_ADDR_LEN);
- isc->isc_des_esslen = 0;
- isc->isc_des_essid[0] = 0;
- isc->isc_bss->in_essid[0] = 0;
- rs->ir_rates[in->in_txrate] = 0; /* rate */
- isc->isc_flags &= ~IEEE80211_F_WEPON; /* encryption */
- isc->isc_wep_txkey = 0; /* wepkey id */
- for (i = 0; i < MAX_NWEPKEYS; i++) /* wepkey */
- isc->isc_nw_keys[i].iwk_len = 0;
- for (i = 0; i < IEEE80211_RECV_HIST_LEN; ++i)
- in->in_recv_hist[i].irh_rssi = 0;
- in->in_hist_cur = IEEE80211_RECV_HIST_LEN - 1;
-}
-
-static int
-ath_wificfg_loaddefaults(ath_t *asc)
-{
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- ath_loaddefdata(asc);
-
- if (asc->asc_invalid == 0) {
- (void) ath_gld_start(isc->isc_dev);
- (void) _ieee80211_new_state(isc, IEEE80211_S_SCAN, -1);
- }
-
- return (WL_SUCCESS);
-}
-
-static int
-ath_wificfg_disassoc(ath_t *asc)
-{
- ieee80211com_t *isc = (ieee80211com_t *)asc;
-
- if (! asc->asc_invalid) {
- (void) _ieee80211_new_state(isc, IEEE80211_S_INIT, -1);
- ath_loaddefdata(asc);
- }
- return (WL_SUCCESS);
-}
-
-int32_t
-ath_getset(ath_t *asc, mblk_t *mp, uint32_t cmd)
-{
- uint32_t i, id;
- char *buf;
- int ret;
- wldp_t *infp, *outfp;
-
- ret = WL_SUCCESS;
- infp = (wldp_t *)mp->b_rptr;
- id = infp->wldp_id;
-
- switch (id) {
- case WL_ESSID:
- ret = ath_wificfg_essid(asc, mp, cmd);
- break;
- case WL_BSSID:
- ret = ath_wificfg_bssid(asc, mp, cmd);
- break;
- case WL_NODE_NAME:
- ret = ath_wificfg_nodename(asc, mp, cmd);
- break;
- case WL_ENCRYPTION:
- ret = ath_wificfg_encryption(asc, mp, cmd);
- break;
- case WL_WEP_KEY_TAB:
- ret = ath_wificfg_wepkey(asc, mp, cmd);
- break;
- case WL_WEP_KEY_ID:
- ret = ath_wificfg_keyid(asc, mp, cmd);
- break;
- case WL_ESS_LIST:
- ret = ath_wificfg_esslist(asc, mp, cmd);
- break;
- case WL_SUPPORTED_RATES:
- ret = ath_wificfg_supportrates(asc, mp, cmd);
- break;
- case WL_DESIRED_RATES:
- ret = ath_wificfg_desiredrates(asc, mp, cmd);
- break;
- case WL_AUTH_MODE:
- ret = ath_wificfg_authmode(asc, mp, cmd);
- break;
- case WL_BSS_TYPE:
- ret = ath_wificfg_bsstype(asc, mp, cmd);
- break;
- case WL_LINKSTATUS:
- ret = ath_wificfg_linkstatus(asc, mp, cmd);
- break;
- case WL_RSSI:
- ret = ath_wificfg_rssi(asc, mp, cmd);
- break;
- case WL_SCAN:
- ret = ath_wificfg_scan(asc);
- break;
- case WL_LOAD_DEFAULTS:
- ret = ath_wificfg_loaddefaults(asc);
- break;
- case WL_DISASSOCIATE:
- ret = ath_wificfg_disassoc(asc);
- break;
- default:
- buf = kmem_zalloc(MAX_BUF_LEN, KM_SLEEP);
- outfp = (wldp_t *)buf;
- bcopy(mp->b_rptr, buf, sizeof (wldp_t));
- outfp->wldp_length = offsetof(wldp_t, wldp_buf);
- outfp->wldp_result = WL_LACK_FEATURE;
- for (i = 0; i < (outfp->wldp_length); i++)
- (void) mi_mpprintf_putc((char *)mp, buf[i]);
- kmem_free(buf, MAX_BUF_LEN);
- break;
- }
- return (ret);
-}