aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/wlags49_h2/wl_priv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/wlags49_h2/wl_priv.c')
-rw-r--r--drivers/staging/wlags49_h2/wl_priv.c1928
1 files changed, 0 insertions, 1928 deletions
diff --git a/drivers/staging/wlags49_h2/wl_priv.c b/drivers/staging/wlags49_h2/wl_priv.c
deleted file mode 100644
index aff927350222..000000000000
--- a/drivers/staging/wlags49_h2/wl_priv.c
+++ /dev/null
@@ -1,1928 +0,0 @@
-/*******************************************************************************
- * Agere Systems Inc.
- * Wireless device driver for Linux (wlags49).
- *
- * Copyright (c) 1998-2003 Agere Systems Inc.
- * All rights reserved.
- * http://www.agere.com
- *
- * Initially developed by TriplePoint, Inc.
- * http://www.triplepoint.com
- *
- *------------------------------------------------------------------------------
- *
- * This file defines handling routines for the private IOCTLs
- *
- *------------------------------------------------------------------------------
- *
- * SOFTWARE LICENSE
- *
- * This software is provided subject to the following terms and conditions,
- * which you should read carefully before using the software. Using this
- * software indicates your acceptance of these terms and conditions. If you do
- * not agree with these terms and conditions, do not use the software.
- *
- * Copyright © 2003 Agere Systems Inc.
- * All rights reserved.
- *
- * Redistribution and use in source or binary forms, with or without
- * modifications, are permitted provided that the following conditions are met:
- *
- * . Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following Disclaimer as comments in the code as
- * well as in the documentation and/or other materials provided with the
- * distribution.
- *
- * . Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following Disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * . Neither the name of Agere Systems Inc. nor the names of the contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * Disclaimer
- *
- * THIS SOFTWARE IS PROVIDED “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY
- * USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS OWN
- * RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, 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, INCLUDING, BUT NOT LIMITED TO, 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
- * DAMAGE.
- *
- ******************************************************************************/
-
-/*******************************************************************************
- * include files
- ******************************************************************************/
-#include <wl_version.h>
-
-#include <linux/if_arp.h>
-#include <linux/ioport.h>
-#include <linux/slab.h>
-#include <linux/delay.h>
-#include <linux/uaccess.h>
-
-#include <debug.h>
-#include <hcf.h>
-#include <hcfdef.h>
-
-#include <wl_if.h>
-#include <wl_internal.h>
-#include <wl_enc.h>
-#include <wl_main.h>
-#include <wl_priv.h>
-#include <wl_util.h>
-#include <wl_netdev.h>
-
-int wvlan_uil_connect(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_disconnect(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_action(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_block(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_unblock(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_send_diag_msg(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_put_info(struct uilreq *urq, struct wl_private *lp);
-int wvlan_uil_get_info(struct uilreq *urq, struct wl_private *lp);
-
-int cfg_driver_info(struct uilreq *urq, struct wl_private *lp);
-int cfg_driver_identity(struct uilreq *urq, struct wl_private *lp);
-
-
-/* If USE_UIL is not defined, then none of the UIL Interface code below will
- be included in the build */
-#ifdef USE_UIL
-
-/*******************************************************************************
- * wvlan_uil()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * The handler function for the UIL interface.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_uil(struct uilreq *urq, struct wl_private *lp)
-{
- int ioctl_ret = 0;
-
- switch (urq->command) {
- case UIL_FUN_CONNECT:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_CONNECT\n");
- ioctl_ret = wvlan_uil_connect(urq, lp);
- break;
- case UIL_FUN_DISCONNECT:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_DISCONNECT\n");
- ioctl_ret = wvlan_uil_disconnect(urq, lp);
- break;
- case UIL_FUN_ACTION:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_ACTION\n");
- ioctl_ret = wvlan_uil_action(urq, lp);
- break;
- case UIL_FUN_SEND_DIAG_MSG:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_SEND_DIAG_MSG\n");
- ioctl_ret = wvlan_uil_send_diag_msg(urq, lp);
- break;
- case UIL_FUN_GET_INFO:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_GET_INFO\n");
- ioctl_ret = wvlan_uil_get_info(urq, lp);
- break;
- case UIL_FUN_PUT_INFO:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- WVLAN2_UIL_PUT_INFO\n");
- ioctl_ret = wvlan_uil_put_info(urq, lp);
- break;
- default:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_UIL -- UNSUPPORTED UIL CODE: 0x%X", urq->command);
- ioctl_ret = -EOPNOTSUPP;
- break;
- }
- return ioctl_ret;
-} /* wvlan_uil */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_uil_connect()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Connect to the UIL in order to make a request.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_connect(struct uilreq *urq, struct wl_private *lp)
-{
- if (!(lp->flags & WVLAN2_UIL_CONNECTED)) {
- lp->flags |= WVLAN2_UIL_CONNECTED;
- urq->hcfCtx = &(lp->hcfCtx);
- urq->result = UIL_SUCCESS;
- } else {
- DBG_WARNING(DbgInfo, "UIL_ERR_IN_USE\n");
- urq->result = UIL_ERR_IN_USE;
- }
-
- return 0;
-} /* wvlan_uil_connect */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_uil_disconnect()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Disconnect from the UIL after a request has been completed.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_disconnect(struct uilreq *urq, struct wl_private *lp)
-{
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- if (lp->flags & WVLAN2_UIL_CONNECTED) {
- lp->flags &= ~WVLAN2_UIL_CONNECTED;
- /*
- if (lp->flags & WVLAN2_UIL_BUSY) {
- lp->flags &= ~WVLAN2_UIL_BUSY;
- netif_start_queue(lp->dev);
- }
- */
- }
-
- urq->hcfCtx = NULL;
- urq->result = UIL_SUCCESS;
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return 0;
-} /* wvlan_uil_disconnect */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_uil_action()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Handler for the UIL_ACT_xxx subcodes associated with UIL_FUN_ACTION
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_action(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
- ltv_t *ltv;
-
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- /* Make sure there's an LTV in the request buffer */
- ltv = (ltv_t *)urq->data;
- if (ltv != NULL) {
- /* Switch on the Type field of the LTV contained in the request
- buffer */
- switch (ltv->typ) {
- case UIL_ACT_BLOCK:
- DBG_TRACE(DbgInfo, "UIL_ACT_BLOCK\n");
- result = wvlan_uil_block(urq, lp);
- break;
- case UIL_ACT_UNBLOCK:
- DBG_TRACE(DbgInfo, "UIL_ACT_UNBLOCK\n");
- result = wvlan_uil_unblock(urq, lp);
- break;
- case UIL_ACT_SCAN:
- DBG_TRACE(DbgInfo, "UIL_ACT_SCAN\n");
- urq->result = hcf_action(&(lp->hcfCtx), MDD_ACT_SCAN);
- break;
- case UIL_ACT_APPLY:
- DBG_TRACE(DbgInfo, "UIL_ACT_APPLY\n");
- urq->result = wl_apply(lp);
- break;
- case UIL_ACT_RESET:
- DBG_TRACE(DbgInfo, "UIL_ACT_RESET\n");
- urq->result = wl_go(lp);
- break;
- default:
- DBG_WARNING(DbgInfo, "Unknown action code: 0x%x\n", ltv->typ);
- break;
- }
- } else {
- DBG_ERROR(DbgInfo, "Bad LTV for this action\n");
- urq->result = UIL_ERR_LEN;
- }
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return result;
-} /* wvlan_uil_action */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_uil_block()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Sets a block in the driver to prevent access to the card by other
- * processes.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-
-int wvlan_uil_block(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
-
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- if (capable(CAP_NET_ADMIN)) {
- lp->flags |= WVLAN2_UIL_BUSY;
- netif_stop_queue(lp->dev);
- WL_WDS_NETIF_STOP_QUEUE(lp);
- urq->result = UIL_SUCCESS;
- } else {
- DBG_ERROR(DbgInfo, "EPERM\n");
- urq->result = UIL_FAILURE;
- result = -EPERM;
- }
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return result;
-} /* wvlan_uil_block */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_uil_unblock()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Unblocks the driver to restore access to the card by other processes.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_unblock(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
-
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- if (capable(CAP_NET_ADMIN)) {
- if (lp->flags & WVLAN2_UIL_BUSY) {
- lp->flags &= ~WVLAN2_UIL_BUSY;
- netif_wake_queue(lp->dev);
- WL_WDS_NETIF_WAKE_QUEUE(lp);
- }
- } else {
- DBG_ERROR(DbgInfo, "EPERM\n");
- urq->result = UIL_FAILURE;
- result = -EPERM;
- }
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return result;
-} /* wvlan_uil_unblock */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_uil_send_diag_msg()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Sends a diagnostic message to the card.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_send_diag_msg(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
- DESC_STRCT Descp[1];
-
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- if (capable(CAP_NET_ADMIN)) {
- if ((urq->data != NULL) && (urq->len != 0)) {
- if (lp->hcfCtx.IFB_RscInd != 0) {
- u_char *data;
-
- /* Verify the user buffer */
- result = verify_area(VERIFY_READ, urq->data, urq->len);
- if (result != 0) {
- DBG_ERROR(DbgInfo, "verify_area failed, result: %d\n", result);
- urq->result = UIL_FAILURE;
- return result;
- }
-
- data = kmalloc(urq->len, GFP_KERNEL);
- if (data != NULL) {
- memset(Descp, 0, sizeof(DESC_STRCT));
- memcpy(data, urq->data, urq->len);
-
- Descp[0].buf_addr = (wci_bufp)data;
- Descp[0].BUF_CNT = urq->len;
- Descp[0].next_desc_addr = 0; /* terminate list */
-
- hcf_send_msg(&(lp->hcfCtx), &Descp[0], HCF_PORT_0);
- kfree(data);
- } else {
- DBG_ERROR(DbgInfo, "ENOMEM\n");
- urq->result = UIL_FAILURE;
- result = -ENOMEM;
- return result;
- }
-
- } else {
- urq->result = UIL_ERR_BUSY;
- }
-
- } else {
- urq->result = UIL_FAILURE;
- }
- } else {
- DBG_ERROR(DbgInfo, "EPERM\n");
- urq->result = UIL_FAILURE;
- result = -EPERM;
- }
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return result;
-} /* wvlan_uil_send_diag_msg */
-/*============================================================================*/
-
-
-/*******************************************************************************
- * wvlan_uil_put_info()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Sends a specific RID directly to the driver to set configuration info.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_put_info(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
- ltv_t *pLtv;
- bool_t ltvAllocated = FALSE;
- ENCSTRCT sEncryption;
- size_t len;
-
-#ifdef USE_WDS
- hcf_16 hcfPort = HCF_PORT_0;
-#endif /* USE_WDS */
-
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- if (capable(CAP_NET_ADMIN)) {
- if ((urq->data != NULL) && (urq->len != 0)) {
- /* Make sure that we have at least a command and length to send. */
- if (urq->len < (sizeof(hcf_16) * 2)) {
- urq->len = sizeof(lp->ltvRecord);
- urq->result = UIL_ERR_LEN;
- DBG_ERROR(DbgInfo, "No Length/Type in LTV!!!\n");
- DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n");
- return result;
- }
-
- /* Verify the user buffer */
- result = verify_area(VERIFY_READ, urq->data, urq->len);
- if (result != 0) {
- urq->result = UIL_FAILURE;
- DBG_ERROR(DbgInfo, "verify_area(), VERIFY_READ FAILED\n");
- return result;
- }
-
- /* Get only the command and length information. */
- copy_from_user(&(lp->ltvRecord), urq->data, sizeof(hcf_16) * 2);
-
- /* Make sure the incoming LTV record length is within the bounds of the
- IOCTL length */
- if (((lp->ltvRecord.len + 1) * sizeof(hcf_16)) > urq->len) {
- urq->len = sizeof(lp->ltvRecord);
- urq->result = UIL_ERR_LEN;
- DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n");
- return result;
- }
-
- /* If the requested length is greater than the size of our local
- LTV record, try to allocate it from the kernel stack.
- Otherwise, we just use our local LTV record. */
- if (urq->len > sizeof(lp->ltvRecord)) {
- pLtv = kmalloc(urq->len, GFP_KERNEL);
- if (pLtv != NULL) {
- ltvAllocated = TRUE;
- } else {
- DBG_ERROR(DbgInfo, "Alloc FAILED\n");
- urq->len = sizeof(lp->ltvRecord);
- urq->result = UIL_ERR_LEN;
- result = -ENOMEM;
- return result;
- }
- } else {
- pLtv = &(lp->ltvRecord);
- }
-
- /* Copy the data from the user's buffer into the local LTV
- record data area. */
- copy_from_user(pLtv, urq->data, urq->len);
-
-
- /* We need to snoop the commands to see if there is anything we
- need to store for the purposes of a reset or start/stop
- sequence. Perform endian translation as needed */
- switch (pLtv->typ) {
- case CFG_CNF_PORT_TYPE:
- lp->PortType = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_OWN_MAC_ADDR:
- /* TODO: determine if we are going to store anything based on this */
- break;
- case CFG_CNF_OWN_CHANNEL:
- lp->Channel = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- /* CFG_CNF_OWN_SSID currently same as CNF_DESIRED_SSID. Do we
- need separate storage for this? */
- /* case CFG_CNF_OWN_SSID: */
- case CFG_CNF_OWN_ATIM_WINDOW:
- lp->atimWindow = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_SYSTEM_SCALE:
- lp->DistanceBetweenAPs = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
-
- case CFG_CNF_MAX_DATA_LEN:
- /* TODO: determine if we are going to store anything based
- on this */
- break;
- case CFG_CNF_PM_ENABLED:
- lp->PMEnabled = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_MCAST_RX:
- lp->MulticastReceive = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_MAX_SLEEP_DURATION:
- lp->MaxSleepDuration = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_HOLDOVER_DURATION:
- lp->holdoverDuration = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_OWN_NAME:
- memset(lp->StationName, 0, sizeof(lp->StationName));
- len = min_t(size_t, pLtv->u.u16[0], sizeof(lp->StationName));
- strlcpy(lp->StationName, &pLtv->u.u8[2], len);
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_LOAD_BALANCING:
- lp->loadBalancing = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_MEDIUM_DISTRIBUTION:
- lp->mediumDistribution = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#ifdef WARP
- case CFG_CNF_TX_POW_LVL:
- lp->txPowLevel = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- /* case CFG_CNF_SHORT_RETRY_LIMIT: */ /* Short Retry Limit */
- /* case 0xFC33: */ /* Long Retry Limit */
- case CFG_SUPPORTED_RATE_SET_CNTL: /* Supported Rate Set Control */
- lp->srsc[0] = pLtv->u.u16[0];
- lp->srsc[1] = pLtv->u.u16[1];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- pLtv->u.u16[1] = CNV_INT_TO_LITTLE(pLtv->u.u16[1]);
- break;
- case CFG_BASIC_RATE_SET_CNTL: /* Basic Rate Set Control */
- lp->brsc[0] = pLtv->u.u16[0];
- lp->brsc[1] = pLtv->u.u16[1];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- pLtv->u.u16[1] = CNV_INT_TO_LITTLE(pLtv->u.u16[1]);
- break;
- case CFG_CNF_CONNECTION_CNTL:
- lp->connectionControl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- /* case CFG_PROBE_DATA_RATE: */
-#endif /* HERMES25 */
-
-#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */
- /* ;?should we restore this to allow smaller memory footprint */
-
- case CFG_CNF_OWN_DTIM_PERIOD:
- lp->DTIMPeriod = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#ifdef WARP
- case CFG_CNF_OWN_BEACON_INTERVAL: /* Own Beacon Interval */
- lp->ownBeaconInterval = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#endif /* WARP */
- case CFG_COEXISTENSE_BEHAVIOUR: /* Coexistence behavior */
- lp->coexistence = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#ifdef USE_WDS
- case CFG_CNF_WDS_ADDR1:
- memcpy(&lp->wds_port[0].wdsAddress, &pLtv->u.u8[0], ETH_ALEN);
- hcfPort = HCF_PORT_1;
- break;
- case CFG_CNF_WDS_ADDR2:
- memcpy(&lp->wds_port[1].wdsAddress, &pLtv->u.u8[0], ETH_ALEN);
- hcfPort = HCF_PORT_2;
- break;
- case CFG_CNF_WDS_ADDR3:
- memcpy(&lp->wds_port[2].wdsAddress, &pLtv->u.u8[0], ETH_ALEN);
- hcfPort = HCF_PORT_3;
- break;
- case CFG_CNF_WDS_ADDR4:
- memcpy(&lp->wds_port[3].wdsAddress, &pLtv->u.u8[0], ETH_ALEN);
- hcfPort = HCF_PORT_4;
- break;
- case CFG_CNF_WDS_ADDR5:
- memcpy(&lp->wds_port[4].wdsAddress, &pLtv->u.u8[0], ETH_ALEN);
- hcfPort = HCF_PORT_5;
- break;
- case CFG_CNF_WDS_ADDR6:
- memcpy(&lp->wds_port[5].wdsAddress, &pLtv->u.u8[0], ETH_ALEN);
- hcfPort = HCF_PORT_6;
- break;
-#endif /* USE_WDS */
-
- case CFG_CNF_MCAST_PM_BUF:
- lp->multicastPMBuffering = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_REJECT_ANY:
- lp->RejectAny = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#endif
-
- case CFG_CNF_ENCRYPTION:
- lp->EnableEncryption = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_CNF_AUTHENTICATION:
- lp->authentication = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */
- /* ;?should we restore this to allow smaller memory footprint */
-
- /* case CFG_CNF_EXCL_UNENCRYPTED:
- lp->ExcludeUnencrypted = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break; */
- case CFG_CNF_MCAST_RATE:
- /* TODO: determine if we are going to store anything based on this */
- break;
- case CFG_CNF_INTRA_BSS_RELAY:
- lp->intraBSSRelay = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#endif
-
- case CFG_CNF_MICRO_WAVE:
- /* TODO: determine if we are going to store anything based on this */
- break;
- /*case CFG_CNF_LOAD_BALANCING:*/
- /* TODO: determine if we are going to store anything based on this */
- /* break; */
- /* case CFG_CNF_MEDIUM_DISTRIBUTION: */
- /* TODO: determine if we are going to store anything based on this */
- /* break; */
- /* case CFG_CNF_RX_ALL_GROUP_ADDRESS: */
- /* TODO: determine if we are going to store anything based on this */
- /* break; */
- /* case CFG_CNF_COUNTRY_INFO: */
- /* TODO: determine if we are going to store anything based on this */
- /* break; */
- case CFG_CNF_OWN_SSID:
- /* case CNF_DESIRED_SSID: */
- case CFG_DESIRED_SSID:
- memset(lp->NetworkName, 0, sizeof(lp->NetworkName));
- memcpy((void *)lp->NetworkName, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]);
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
-
- /* take care of the special network name "ANY" case */
- if ((strlen(&pLtv->u.u8[2]) == 0) ||
- (strcmp(&pLtv->u.u8[2], "ANY") == 0) ||
- (strcmp(&pLtv->u.u8[2], "any") == 0)) {
- /* set the SSID_STRCT llen field (u16[0]) to zero, and the
- effectually null the string u8[2] */
- pLtv->u.u16[0] = 0;
- pLtv->u.u8[2] = 0;
- }
- break;
- case CFG_GROUP_ADDR:
- /* TODO: determine if we are going to store anything based on this */
- break;
- case CFG_CREATE_IBSS:
- lp->CreateIBSS = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_RTS_THRH:
- lp->RTSThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_TX_RATE_CNTL:
- lp->TxRateControl[0] = pLtv->u.u16[0];
- lp->TxRateControl[1] = pLtv->u.u16[1];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- pLtv->u.u16[1] = CNV_INT_TO_LITTLE(pLtv->u.u16[1]);
- break;
- case CFG_PROMISCUOUS_MODE:
- /* TODO: determine if we are going to store anything based on this */
- break;
- /* case CFG_WAKE_ON_LAN: */
- /* TODO: determine if we are going to store anything based on this */
- /* break; */
-#if 1 /* ;? #if (HCF_TYPE) & HCF_TYPE_AP */
- /* ;?should we restore this to allow smaller memory footprint */
- case CFG_RTS_THRH0:
- lp->RTSThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_TX_RATE_CNTL0:
-/*;?no idea what this should be, get going so comment it out lp->TxRateControl = pLtv->u.u16[0];*/
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
-#ifdef USE_WDS
- case CFG_RTS_THRH1:
- lp->wds_port[0].rtsThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_1;
- break;
- case CFG_RTS_THRH2:
- lp->wds_port[1].rtsThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_2;
- break;
- case CFG_RTS_THRH3:
- lp->wds_port[2].rtsThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_3;
- break;
- case CFG_RTS_THRH4:
- lp->wds_port[3].rtsThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_4;
- break;
- case CFG_RTS_THRH5:
- lp->wds_port[4].rtsThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_5;
- break;
- case CFG_RTS_THRH6:
- lp->wds_port[5].rtsThreshold = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_6;
- break;
- case CFG_TX_RATE_CNTL1:
- lp->wds_port[0].txRateCntl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_1;
- break;
- case CFG_TX_RATE_CNTL2:
- lp->wds_port[1].txRateCntl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_2;
- break;
- case CFG_TX_RATE_CNTL3:
- lp->wds_port[2].txRateCntl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_3;
- break;
- case CFG_TX_RATE_CNTL4:
- lp->wds_port[3].txRateCntl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_4;
- break;
- case CFG_TX_RATE_CNTL5:
- lp->wds_port[4].txRateCntl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_5;
- break;
- case CFG_TX_RATE_CNTL6:
- lp->wds_port[5].txRateCntl = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- hcfPort = HCF_PORT_6;
- break;
-#endif /* USE_WDS */
-#endif /* (HCF_TYPE) & HCF_TYPE_AP */
-
- case CFG_DEFAULT_KEYS:
- {
- CFG_DEFAULT_KEYS_STRCT *pKeys = (CFG_DEFAULT_KEYS_STRCT *)pLtv;
-
- pKeys->key[0].len = CNV_INT_TO_LITTLE(pKeys->key[0].len);
- pKeys->key[1].len = CNV_INT_TO_LITTLE(pKeys->key[1].len);
- pKeys->key[2].len = CNV_INT_TO_LITTLE(pKeys->key[2].len);
- pKeys->key[3].len = CNV_INT_TO_LITTLE(pKeys->key[3].len);
-
- memcpy((void *)&(lp->DefaultKeys), (void *)pKeys,
- sizeof(CFG_DEFAULT_KEYS_STRCT));
- }
- break;
- case CFG_TX_KEY_ID:
- lp->TransmitKeyID = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_SCAN_SSID:
- /* TODO: determine if we are going to store anything based on this */
- break;
- case CFG_TICK_TIME:
- /* TODO: determine if we are going to store anything based on this */
- break;
- /* these RIDS are Info RIDs, and should they be allowed for puts??? */
- case CFG_MAX_LOAD_TIME:
- case CFG_DL_BUF:
- /* case CFG_HSI_SUP_RANGE: */
- case CFG_NIC_SERIAL_NUMBER:
- case CFG_NIC_IDENTITY:
- case CFG_NIC_MFI_SUP_RANGE:
- case CFG_NIC_CFI_SUP_RANGE:
- case CFG_NIC_TEMP_TYPE:
- case CFG_NIC_PROFILE:
- case CFG_FW_IDENTITY:
- case CFG_FW_SUP_RANGE:
- case CFG_MFI_ACT_RANGES_STA:
- case CFG_CFI_ACT_RANGES_STA:
- case CFG_PORT_STAT:
- case CFG_CUR_SSID:
- case CFG_CUR_BSSID:
- case CFG_COMMS_QUALITY:
- case CFG_CUR_TX_RATE:
- case CFG_CUR_BEACON_INTERVAL:
- case CFG_CUR_SCALE_THRH:
- case CFG_PROTOCOL_RSP_TIME:
- case CFG_CUR_SHORT_RETRY_LIMIT:
- case CFG_CUR_LONG_RETRY_LIMIT:
- case CFG_MAX_TX_LIFETIME:
- case CFG_MAX_RX_LIFETIME:
- case CFG_CF_POLLABLE:
- case CFG_AUTHENTICATION_ALGORITHMS:
- case CFG_PRIVACY_OPT_IMPLEMENTED:
- /* case CFG_CURRENT_REMOTE_RATES: */
- /* case CFG_CURRENT_USED_RATES: */
- /* case CFG_CURRENT_SYSTEM_SCALE: */
- /* case CFG_CURRENT_TX_RATE1: */
- /* case CFG_CURRENT_TX_RATE2: */
- /* case CFG_CURRENT_TX_RATE3: */
- /* case CFG_CURRENT_TX_RATE4: */
- /* case CFG_CURRENT_TX_RATE5: */
- /* case CFG_CURRENT_TX_RATE6: */
- case CFG_NIC_MAC_ADDR:
- case CFG_PCF_INFO:
- /* case CFG_CURRENT_COUNTRY_INFO: */
- case CFG_PHY_TYPE:
- case CFG_CUR_CHANNEL:
- /* case CFG_CURRENT_POWER_STATE: */
- /* case CFG_CCAMODE: */
- case CFG_SUPPORTED_DATA_RATES:
- break;
- case CFG_AP_MODE:
-/*;? lp->DownloadFirmware = (pLtv->u.u16[0]) + 1; */
- DBG_ERROR(DbgInfo, "set CFG_AP_MODE no longer supported\n");
- break;
- case CFG_ENCRYPT_STRING:
- /* TODO: ENDIAN TRANSLATION HERE??? */
- memset(lp->szEncryption, 0, sizeof(lp->szEncryption));
- memcpy((void *)lp->szEncryption, (void *)&pLtv->u.u8[0],
- (pLtv->len * sizeof(hcf_16)));
- wl_wep_decode(CRYPT_CODE, &sEncryption,
- lp->szEncryption);
-
- /* the Linux driver likes to use 1-4 for the key IDs, and then
- convert to 0-3 when sending to the card. The Windows code
- base used 0-3 in the API DLL, which was ported to Linux. For
- the sake of the user experience, we decided to keep 0-3 as the
- numbers used in the DLL; and will perform the +1 conversion here.
- We could have converted the entire Linux driver, but this is
- less obtrusive. This may be a "todo" to convert the whole driver */
- lp->TransmitKeyID = sEncryption.wTxKeyID + 1;
- lp->EnableEncryption = sEncryption.wEnabled;
-
- memcpy(&lp->DefaultKeys, &sEncryption.EncStr,
- sizeof(CFG_DEFAULT_KEYS_STRCT));
- break;
- /*case CFG_COUNTRY_STRING:
- memset(lp->countryString, 0, sizeof(lp->countryString));
- memcpy((void *)lp->countryString, (void *)&pLtv->u.u8[2], (size_t)pLtv->u.u16[0]);
- break;
- */
-
- case CFG_DRIVER_ENABLE:
- lp->driverEnable = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_WOLAS_ENABLE:
- lp->wolasEnable = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_SET_WPA_AUTH_KEY_MGMT_SUITE:
- lp->AuthKeyMgmtSuite = pLtv->u.u16[0];
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_DISASSOCIATE_ADDR:
- pLtv->u.u16[ETH_ALEN / 2] = CNV_INT_TO_LITTLE(pLtv->u.u16[ETH_ALEN / 2]);
- break;
- case CFG_ADD_TKIP_DEFAULT_KEY:
- case CFG_REMOVE_TKIP_DEFAULT_KEY:
- /* Endian convert the Tx Key Information */
- pLtv->u.u16[0] = CNV_INT_TO_LITTLE(pLtv->u.u16[0]);
- break;
- case CFG_ADD_TKIP_MAPPED_KEY:
- break;
- case CFG_REMOVE_TKIP_MAPPED_KEY:
- break;
- /* some RIDs just can't be put */
- case CFG_MB_INFO:
- case CFG_IFB:
- default:
- break;
- }
-
- /* This code will prevent Static Configuration Entities from
- being sent to the card, as they require a call to
- UIL_ACT_APPLY to take effect. Dynamic Entities will be sent
- immediately */
- switch (pLtv->typ) {
- case CFG_CNF_PORT_TYPE:
- case CFG_CNF_OWN_MAC_ADDR:
- case CFG_CNF_OWN_CHANNEL:
- case CFG_CNF_OWN_SSID:
- case CFG_CNF_OWN_ATIM_WINDOW:
- case CFG_CNF_SYSTEM_SCALE:
- case CFG_CNF_MAX_DATA_LEN:
- case CFG_CNF_PM_ENABLED:
- case CFG_CNF_MCAST_RX:
- case CFG_CNF_MAX_SLEEP_DURATION:
- case CFG_CNF_HOLDOVER_DURATION:
- case CFG_CNF_OWN_NAME:
- case CFG_CNF_LOAD_BALANCING:
- case CFG_CNF_MEDIUM_DISTRIBUTION:
-#ifdef WARP
- case CFG_CNF_TX_POW_LVL:
- case CFG_CNF_CONNECTION_CNTL:
- /*case CFG_PROBE_DATA_RATE: */
-#endif /* HERMES25 */
-#if 1 /*;? (HCF_TYPE) & HCF_TYPE_AP */
- /*;?should we restore this to allow smaller memory footprint */
- case CFG_CNF_OWN_DTIM_PERIOD:
-#ifdef WARP
- case CFG_CNF_OWN_BEACON_INTERVAL: /* Own Beacon Interval */
-#endif /* WARP */
-#ifdef USE_WDS
- case CFG_CNF_WDS_ADDR1:
- case CFG_CNF_WDS_ADDR2:
- case CFG_CNF_WDS_ADDR3:
- case CFG_CNF_WDS_ADDR4:
- case CFG_CNF_WDS_ADDR5:
- case CFG_CNF_WDS_ADDR6:
-#endif
- case CFG_CNF_MCAST_PM_BUF:
- case CFG_CNF_REJECT_ANY:
-#endif
-
- case CFG_CNF_ENCRYPTION:
- case CFG_CNF_AUTHENTICATION:
-#if 1 /* ;? (HCF_TYPE) & HCF_TYPE_AP */
- /* ;?should we restore this to allow smaller memory footprint */
-
- case CFG_CNF_EXCL_UNENCRYPTED:
- case CFG_CNF_MCAST_RATE:
- case CFG_CNF_INTRA_BSS_RELAY:
-#endif
-
- case CFG_CNF_MICRO_WAVE:
- /* case CFG_CNF_LOAD_BALANCING: */
- /* case CFG_CNF_MEDIUM_DISTRIBUTION: */
- /* case CFG_CNF_RX_ALL_GROUP_ADDRESS: */
- /* case CFG_CNF_COUNTRY_INFO: */
- /* case CFG_COUNTRY_STRING: */
- case CFG_AP_MODE:
- case CFG_ENCRYPT_STRING:
- /* case CFG_DRIVER_ENABLE: */
- case CFG_WOLAS_ENABLE:
- case CFG_MB_INFO:
- case CFG_IFB:
- break;
- /* Deal with this dynamic MSF RID, as it's required for WPA */
- case CFG_DRIVER_ENABLE:
- if (lp->driverEnable) {
- hcf_cntl(&(lp->hcfCtx), HCF_CNTL_ENABLE | HCF_PORT_0);
- hcf_cntl(&(lp->hcfCtx), HCF_CNTL_CONNECT);
- } else {
- hcf_cntl(&(lp->hcfCtx), HCF_CNTL_DISABLE | HCF_PORT_0);
- hcf_cntl(&(lp->hcfCtx), HCF_CNTL_DISCONNECT);
- }
- break;
- default:
- wl_act_int_off(lp);
- urq->result = hcf_put_info(&(lp->hcfCtx), (LTVP) pLtv);
- wl_act_int_on(lp);
- break;
- }
-
- if (ltvAllocated)
- kfree(pLtv);
- } else {
- urq->result = UIL_FAILURE;
- }
- } else {
- DBG_ERROR(DbgInfo, "EPERM\n");
- urq->result = UIL_FAILURE;
- result = -EPERM;
- }
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return result;
-} /* wvlan_uil_put_info */
-
-/*============================================================================*/
-
-/*******************************************************************************
- * wvlan_uil_get_info()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Sends a specific RID directly to the driver to retrieve configuration
- * info.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int wvlan_uil_get_info(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
- int i;
-
- if (urq->hcfCtx == &(lp->hcfCtx)) {
- if ((urq->data != NULL) && (urq->len != 0)) {
- ltv_t *pLtv;
- bool_t ltvAllocated = FALSE;
-
- /* Make sure that we have at least a command and length */
- if (urq->len < (sizeof(hcf_16) * 2)) {
- urq->len = sizeof(lp->ltvRecord);
- DBG_ERROR(DbgInfo, "No Length/Type in LTV!!!\n");
- DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n");
- urq->result = UIL_ERR_LEN;
- return result;
- }
-
- /* Verify the user's LTV record header. */
- result = verify_area(VERIFY_READ, urq->data, sizeof(hcf_16) * 2);
- if (result != 0) {
- DBG_ERROR(DbgInfo, "verify_area(), VERIFY_READ FAILED\n");
- urq->result = UIL_FAILURE;
- return result;
- }
-
- /* Get only the command and length information. */
- result = copy_from_user(&(lp->ltvRecord), urq->data, sizeof(hcf_16) * 2);
-
- /* Make sure the incoming LTV record length is within the bounds of
- the IOCTL length. */
- if (((lp->ltvRecord.len + 1) * sizeof(hcf_16)) > urq->len) {
- DBG_ERROR(DbgInfo, "Incoming LTV too big\n");
- urq->len = sizeof(lp->ltvRecord);
- urq->result = UIL_ERR_LEN;
- return result;
- }
-
- /* Determine if hcf_get_info() is needed or not */
- switch (lp->ltvRecord.typ) {
- case CFG_NIC_IDENTITY:
- memcpy(&lp->ltvRecord.u.u8[0], &lp->NICIdentity, sizeof(lp->NICIdentity));
- break;
- case CFG_PRI_IDENTITY:
- memcpy(&lp->ltvRecord.u.u8[0], &lp->PrimaryIdentity, sizeof(lp->PrimaryIdentity));
- break;
- case CFG_AP_MODE:
- DBG_ERROR(DbgInfo, "set CFG_AP_MODE no longer supported, so is get useful ????\n");
- lp->ltvRecord.u.u16[0] =
- CNV_INT_TO_LITTLE(lp->hcfCtx.IFB_FWIdentity.comp_id) == COMP_ID_FW_AP;
- break;
- /* case CFG_DRV_INFO: */
- case CFG_ENCRYPT_STRING:
- case CFG_COUNTRY_STRING:
- case CFG_DRIVER_ENABLE:
- case CFG_WOLAS_ENABLE:
- /* TODO: determine if we're going to support these */
- urq->result = UIL_FAILURE;
- break;
- case CFG_DRV_INFO:
- DBG_TRACE(DbgInfo, "Intercept CFG_DRV_INFO\n");
- result = cfg_driver_info(urq, lp);
- break;
- case CFG_DRV_IDENTITY:
- DBG_TRACE(DbgInfo, "Intercept CFG_DRV_IDENTITY\n");
- result = cfg_driver_identity(urq, lp);
- break;
- case CFG_IFB:
- /* IFB can be a security hole */
- if (!capable(CAP_NET_ADMIN)) {
- result = -EPERM;
- break;
- }
-
- /* Else fall through to the default */
-
- case CFG_FW_IDENTITY: /* For Hermes-1, this is cached */
- default:
-
- /* Verify the user buffer */
- result = verify_area(VERIFY_WRITE, urq->data, urq->len);
- if (result != 0) {
- DBG_ERROR(DbgInfo, "verify_area(), VERIFY_WRITE FAILED\n");
- urq->result = UIL_FAILURE;
- break;
- }
-
- /* If the requested length is greater than the size of our local
- LTV record, try to allocate it from the kernel stack.
- Otherwise, we just use our local LTV record. */
- if (urq->len > sizeof(lp->ltvRecord)) {
- pLtv = kmalloc(urq->len, GFP_KERNEL);
- if (pLtv != NULL) {
- ltvAllocated = TRUE;
-
- /* Copy the command/length information into the new buffer. */
- memcpy(pLtv, &(lp->ltvRecord), sizeof(hcf_16) * 2);
- } else {
- urq->len = sizeof(lp->ltvRecord);
- urq->result = UIL_ERR_LEN;
- DBG_ERROR(DbgInfo, "kmalloc FAILED\n");
- DBG_ERROR(DbgInfo, "UIL_ERR_LEN\n");
- result = -ENOMEM;
- break;
- }
- } else {
- pLtv = &(lp->ltvRecord);
- }
-
- wl_act_int_off(lp);
- urq->result = hcf_get_info(&(lp->hcfCtx), (LTVP) pLtv);
- wl_act_int_on(lp);
-
- /* Copy the LTV into the user's buffer. */
- /*copy_to_user(urq->data, pLtv, urq->len); */
-
- /*if(ltvAllocated)
- {
- kfree(pLtv);
- }*/
-
- /* urq->result = UIL_SUCCESS; */
- break;
- }
-
- /* Handle endian conversion of special fields */
- switch (lp->ltvRecord.typ) {
- /* simple int gets just need the first hcf_16 byte flipped */
- case CFG_CNF_PORT_TYPE:
- case CFG_CNF_OWN_CHANNEL:
- case CFG_CNF_OWN_ATIM_WINDOW:
- case CFG_CNF_SYSTEM_SCALE:
- case CFG_CNF_MAX_DATA_LEN:
- case CFG_CNF_PM_ENABLED:
- case CFG_CNF_MCAST_RX:
- case CFG_CNF_MAX_SLEEP_DURATION:
- case CFG_CNF_HOLDOVER_DURATION:
- case CFG_CNF_OWN_DTIM_PERIOD:
- case CFG_CNF_MCAST_PM_BUF:
- case CFG_CNF_REJECT_ANY:
- case CFG_CNF_ENCRYPTION:
- case CFG_CNF_AUTHENTICATION:
- case CFG_CNF_EXCL_UNENCRYPTED:
- case CFG_CNF_INTRA_BSS_RELAY:
- case CFG_CNF_MICRO_WAVE:
- case CFG_CNF_LOAD_BALANCING:
- case CFG_CNF_MEDIUM_DISTRIBUTION:
-#ifdef WARP
- case CFG_CNF_TX_POW_LVL:
- case CFG_CNF_CONNECTION_CNTL:
- case CFG_CNF_OWN_BEACON_INTERVAL: /* Own Beacon Interval */
- case CFG_COEXISTENSE_BEHAVIOUR: /* Coexistence Behavior */
- /*case CFG_CNF_RX_ALL_GROUP_ADDRESS: */
-#endif /* HERMES25 */
- case CFG_CREATE_IBSS:
- case CFG_RTS_THRH:
- case CFG_PROMISCUOUS_MODE:
- /*case CFG_WAKE_ON_LAN: */
- case CFG_RTS_THRH0:
- case CFG_RTS_THRH1:
- case CFG_RTS_THRH2:
- case CFG_RTS_THRH3:
- case CFG_RTS_THRH4:
- case CFG_RTS_THRH5:
- case CFG_RTS_THRH6:
- case CFG_TX_RATE_CNTL0:
- case CFG_TX_RATE_CNTL1:
- case CFG_TX_RATE_CNTL2:
- case CFG_TX_RATE_CNTL3:
- case CFG_TX_RATE_CNTL4:
- case CFG_TX_RATE_CNTL5:
- case CFG_TX_RATE_CNTL6:
- case CFG_TX_KEY_ID:
- case CFG_TICK_TIME:
- case CFG_MAX_LOAD_TIME:
- case CFG_NIC_TEMP_TYPE:
- case CFG_PORT_STAT:
- case CFG_CUR_TX_RATE:
- case CFG_CUR_BEACON_INTERVAL:
- case CFG_PROTOCOL_RSP_TIME:
- case CFG_CUR_SHORT_RETRY_LIMIT:
- case CFG_CUR_LONG_RETRY_LIMIT:
- case CFG_MAX_TX_LIFETIME:
- case CFG_MAX_RX_LIFETIME:
- case CFG_CF_POLLABLE:
- case CFG_PRIVACY_OPT_IMPLEMENTED:
- /* case CFG_CURRENT_REMOTE_RATES: */
- /* case CFG_CURRENT_USED_RATES: */
- /* case CFG_CURRENT_SYSTEM_SCALE: */
- /* case CFG_CURRENT_TX_RATE1: */
- /* case CFG_CURRENT_TX_RATE2: */
- /* case CFG_CURRENT_TX_RATE3: */
- /* case CFG_CURRENT_TX_RATE4: */
- /* case CFG_CURRENT_TX_RATE5: */
- /* case CFG_CURRENT_TX_RATE6: */
- case CFG_PHY_TYPE:
- case CFG_CUR_CHANNEL:
- /* case CFG_CURRENT_POWER_STATE: */
- /* case CFG_CCAMODE: */
- /* lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]); */
- /* break; */
- /* name string gets just need the first hcf_16 byte flipped (length of string) */
- case CFG_CNF_OWN_SSID:
- case CFG_CNF_OWN_NAME:
- /* case CNF_DESIRED_SSID: */
- case CFG_DESIRED_SSID:
- case CFG_SCAN_SSID:
- case CFG_CUR_SSID:
- lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]);
- break;
- /* non-length counted strings need no byte flipping */
- case CFG_CNF_OWN_MAC_ADDR:
- /* this case is no longer valid: CFG_CNF_WDS_ADDR */
- case CFG_CNF_WDS_ADDR1:
- case CFG_CNF_WDS_ADDR2:
- case CFG_CNF_WDS_ADDR3:
- case CFG_CNF_WDS_ADDR4:
- case CFG_CNF_WDS_ADDR5:
- case CFG_CNF_WDS_ADDR6:
- case CFG_GROUP_ADDR:
- case CFG_NIC_SERIAL_NUMBER:
- case CFG_CUR_BSSID:
- case CFG_NIC_MAC_ADDR:
- case CFG_SUPPORTED_DATA_RATES: /* need to ensure we can treat this as a string */
- break;
- /* case CFG_CNF_COUNTRY_INFO: */ /* special case, see page 75 of 022486, Rev C. */
- /* case CFG_CURRENT_COUNTRY_INFO: */ /* special case, see page 101 of 022486, Rev C. */
- /*
- lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]);
- lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[3]);
-
- for(i = 4; i < lp->ltvRecord.len; i++) {
- lp->ltvRecord.u.u16[i] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[i]);
- }
- break;
- */
-
- case CFG_DEFAULT_KEYS:
- {
- CFG_DEFAULT_KEYS_STRCT *pKeys = (CFG_DEFAULT_KEYS_STRCT *)&lp->ltvRecord.u.u8[0];
-
- pKeys[0].len = CNV_INT_TO_LITTLE(pKeys[0].len);
- pKeys[1].len = CNV_INT_TO_LITTLE(pKeys[1].len);
- pKeys[2].len = CNV_INT_TO_LITTLE(pKeys[2].len);
- pKeys[3].len = CNV_INT_TO_LITTLE(pKeys[3].len);
- }
- break;
- case CFG_CNF_MCAST_RATE:
- case CFG_TX_RATE_CNTL:
- case CFG_SUPPORTED_RATE_SET_CNTL: /* Supported Rate Set Control */
- case CFG_BASIC_RATE_SET_CNTL: /* Basic Rate Set Control */
- lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]);
- lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]);
- break;
- case CFG_DL_BUF:
- case CFG_NIC_IDENTITY:
- case CFG_COMMS_QUALITY:
- case CFG_PCF_INFO:
- lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]);
- lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]);
- lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[2]);
- break;
- case CFG_FW_IDENTITY:
- lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]);
- lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]);
- lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[2]);
- lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[3]);
- break;
- /* case CFG_HSI_SUP_RANGE: */
- case CFG_NIC_MFI_SUP_RANGE:
- case CFG_NIC_CFI_SUP_RANGE:
- case CFG_NIC_PROFILE:
- case CFG_FW_SUP_RANGE:
- lp->ltvRecord.u.u16[0] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[0]);
- lp->ltvRecord.u.u16[1] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[1]);
- lp->ltvRecord.u.u16[2] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[2]);
- lp->ltvRecord.u.u16[3] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[3]);
- lp->ltvRecord.u.u16[4] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[4]);
- break;
- case CFG_MFI_ACT_RANGES_STA:
- case CFG_CFI_ACT_RANGES_STA:
- case CFG_CUR_SCALE_THRH:
- case CFG_AUTHENTICATION_ALGORITHMS:
- for (i = 0; i < (lp->ltvRecord.len - 1); i++)
- lp->ltvRecord.u.u16[i] = CNV_INT_TO_LITTLE(lp->ltvRecord.u.u16[i]);
- break;
- /* done at init time, and endian handled then */
- case CFG_PRI_IDENTITY:
- break;
- case CFG_MB_INFO:
- /* wvlanEndianTranslateMailbox(pLtv); */
- break;
- /* MSF and HCF RIDS */
- case CFG_IFB:
- case CFG_DRV_INFO:
- case CFG_AP_MODE:
- case CFG_ENCRYPT_STRING:
- case CFG_COUNTRY_STRING:
- case CFG_DRIVER_ENABLE:
- case CFG_WOLAS_ENABLE:
- default:
- break;
- }
-
- /* Copy the LTV into the user's buffer. */
- copy_to_user(urq->data, &(lp->ltvRecord), urq->len);
-
- if (ltvAllocated)
- kfree(&(lp->ltvRecord));
- urq->result = UIL_SUCCESS;
- } else {
- urq->result = UIL_FAILURE;
- }
- } else {
- DBG_ERROR(DbgInfo, "UIL_ERR_WRONG_IFB\n");
- urq->result = UIL_ERR_WRONG_IFB;
- }
-
- return result;
-} /* wvlan_uil_get_info */
-/*============================================================================*/
-
-
-
-
-
-/*******************************************************************************
- * cfg_driver_info()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Retrieves driver information.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int cfg_driver_info(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
-
- /* Make sure that user buffer can handle the driver information buffer */
- if (urq->len < sizeof(lp->driverInfo)) {
- urq->len = sizeof(lp->driverInfo);
- urq->result = UIL_ERR_LEN;
- return result;
- }
-
- /* Verify the user buffer. */
- result = verify_area(VERIFY_WRITE, urq->data, sizeof(lp->driverInfo));
- if (result != 0) {
- urq->result = UIL_FAILURE;
- return result;
- }
-
- lp->driverInfo.card_stat = lp->hcfCtx.IFB_CardStat;
-
- /* Copy the driver information into the user's buffer. */
- urq->result = UIL_SUCCESS;
- copy_to_user(urq->data, &(lp->driverInfo), sizeof(lp->driverInfo));
-
- return result;
-} /* cfg_driver_info */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * cfg_driver_identity()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Retrieves ID information from the card.
- *
- * PARAMETERS:
- *
- * urq - a pointer to the UIL request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * UIL_SUCCESS
- * UIL_ERR_xxx value otherwise
- *
- ******************************************************************************/
-int cfg_driver_identity(struct uilreq *urq, struct wl_private *lp)
-{
- int result = 0;
-
- /* Make sure that user buffer can handle the driver identity structure. */
- if (urq->len < sizeof(lp->driverIdentity)) {
- urq->len = sizeof(lp->driverIdentity);
- urq->result = UIL_ERR_LEN;
- return result;
- }
-
- /* Verify the user buffer. */
- result = verify_area(VERIFY_WRITE, urq->data, sizeof(lp->driverIdentity));
- if (result != 0) {
- urq->result = UIL_FAILURE;
- return result;
- }
-
- /* Copy the driver identity into the user's buffer. */
- urq->result = UIL_SUCCESS;
- copy_to_user(urq->data, &(lp->driverIdentity), sizeof(lp->driverIdentity));
-
- return result;
-} /* cfg_driver_identity */
-/*============================================================================*/
-
-
-#endif /* USE_UIL */
-
-
-/* If WIRELESS_EXT is not defined, then the functions that follow will not be
- included in the build. */
-/* NOTE: Are these still even needed? */
-#ifdef WIRELESS_EXT
-
-
-/*******************************************************************************
- * wvlan_set_netname()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Set the ESSID of the card.
- *
- * PARAMETERS:
- *
- * wrq - a pointer to the wireless request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_set_netname(struct net_device *dev,
- struct iw_request_info *info,
- union iwreq_data *wrqu,
- char *extra)
-{
- struct wl_private *lp = wl_priv(dev);
- unsigned long flags;
-
- wl_lock(lp, &flags);
-
- memset(lp->NetworkName, 0, sizeof(lp->NetworkName));
- memcpy(lp->NetworkName, extra, wrqu->data.length);
-
- /* Commit the adapter parameters */
- wl_apply(lp);
- wl_unlock(lp, &flags);
-
- return 0;
-} /* wvlan_set_netname */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_get_netname()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Get the ESSID of the card.
- *
- * PARAMETERS:
- *
- * wrq - a pointer to the wireless request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_get_netname(struct net_device *dev,
- struct iw_request_info *info,
- union iwreq_data *wrqu,
- char *extra)
-{
- struct wl_private *lp = wl_priv(dev);
- unsigned long flags;
- int ret = 0;
- int status = -1;
- wvName_t *pName;
-
- wl_lock(lp, &flags);
-
- /* Get the current network name */
- lp->ltvRecord.len = 1 + (sizeof(*pName) / sizeof(hcf_16));
- lp->ltvRecord.typ = CFG_CUR_SSID;
-
- status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord));
-
- if (status == HCF_SUCCESS) {
- pName = (wvName_t *)&(lp->ltvRecord.u.u32);
-
- memset(extra, '\0', HCF_MAX_NAME_LEN);
- wrqu->data.length = pName->length;
-
- memcpy(extra, pName->name, pName->length);
- } else {
- ret = -EFAULT;
- }
-
- wl_unlock(lp, &flags);
-
- return ret;
-} /* wvlan_get_netname */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_set_station_nickname()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Set the card's station nickname.
- *
- * PARAMETERS:
- *
- * wrq - a pointer to the wireless request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_set_station_nickname(struct net_device *dev,
- struct iw_request_info *info,
- union iwreq_data *wrqu,
- char *extra)
-{
- struct wl_private *lp = wl_priv(dev);
- unsigned long flags;
- size_t len;
-
- wl_lock(lp, &flags);
-
- memset(lp->StationName, 0, sizeof(lp->StationName));
- len = min_t(size_t, wrqu->data.length, sizeof(lp->StationName));
- strlcpy(lp->StationName, extra, len);
-
- /* Commit the adapter parameters */
- wl_apply(lp);
- wl_unlock(lp, &flags);
-
- return 0;
-} /* wvlan_set_station_nickname */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_get_station_nickname()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Get the card's station nickname.
- *
- * PARAMETERS:
- *
- * wrq - a pointer to the wireless request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_get_station_nickname(struct net_device *dev,
- struct iw_request_info *info,
- union iwreq_data *wrqu,
- char *extra)
-{
- struct wl_private *lp = wl_priv(dev);
- unsigned long flags;
- int ret = 0;
- int status = -1;
- wvName_t *pName;
-
- wl_lock(lp, &flags);
-
- /* Get the current station name */
- lp->ltvRecord.len = 1 + (sizeof(*pName) / sizeof(hcf_16));
- lp->ltvRecord.typ = CFG_CNF_OWN_NAME;
-
- status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord));
-
- if (status == HCF_SUCCESS) {
- pName = (wvName_t *)&(lp->ltvRecord.u.u32);
-
- memset(extra, '\0', HCF_MAX_NAME_LEN);
- wrqu->data.length = pName->length;
- memcpy(extra, pName->name, pName->length);
- } else {
- ret = -EFAULT;
- }
-
- wl_unlock(lp, &flags);
-
-/* out: */
- return ret;
-} /* wvlan_get_station_nickname */
-/*============================================================================*/
-
-
-
-
-/*******************************************************************************
- * wvlan_set_porttype()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Set the card's porttype
- *
- * PARAMETERS:
- *
- * wrq - a pointer to the wireless request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_set_porttype(struct net_device *dev,
- struct iw_request_info *info,
- union iwreq_data *wrqu,
- char *extra)
-{
- struct wl_private *lp = wl_priv(dev);
- unsigned long flags;
- int ret = 0;
- hcf_16 portType;
-
- wl_lock(lp, &flags);
-
- /* Validate the new value */
- portType = *((__u32 *)extra);
-
- if (!((portType == 1) || (portType == 3))) {
- ret = -EINVAL;
- goto out_unlock;
- }
-
- lp->PortType = portType;
-
- /* Commit the adapter parameters */
- wl_apply(lp);
-
-out_unlock:
- wl_unlock(lp, &flags);
-
-/* out: */
- return ret;
-}
-
-/*============================================================================*/
-
-
-/*******************************************************************************
- * wvlan_get_porttype()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * Get the card's porttype
- *
- * PARAMETERS:
- *
- * wrq - a pointer to the wireless request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_get_porttype(struct net_device *dev,
- struct iw_request_info *info,
- union iwreq_data *wrqu,
- char *extra)
-{
- struct wl_private *lp = wl_priv(dev);
- unsigned long flags;
- int ret = 0;
- int status = -1;
- hcf_16 *pPortType;
- __u32 *pData = (__u32 *)extra;
-
- wl_lock(lp, &flags);
-
- /* Get the current port type */
- lp->ltvRecord.len = 1 + (sizeof(*pPortType) / sizeof(hcf_16));
- lp->ltvRecord.typ = CFG_CNF_PORT_TYPE;
-
- status = hcf_get_info(&(lp->hcfCtx), (LTVP)&(lp->ltvRecord));
-
- if (status == HCF_SUCCESS) {
- pPortType = (hcf_16 *)&(lp->ltvRecord.u.u32);
-
- *pData = CNV_LITTLE_TO_INT(*pPortType);
- } else {
- ret = -EFAULT;
- }
-
- wl_unlock(lp, &flags);
-
-/* out: */
- return ret;
-} /* wvlan_get_porttype */
-/*============================================================================*/
-
-#endif /* WIRELESS_EXT */
-
-
-
-
-#ifdef USE_RTS
-/*******************************************************************************
- * wvlan_rts()
- *******************************************************************************
- *
- * DESCRIPTION:
- *
- * IOCTL handler for RTS commands
- *
- * PARAMETERS:
- *
- * rrq - a pointer to the rts request buffer
- * lp - a pointer to the device's private adapter structure
- *
- * RETURNS:
- *
- * 0 on success
- * errno value otherwise
- *
- ******************************************************************************/
-int wvlan_rts(struct rtsreq *rrq, __u32 io_base)
-{
- int ioctl_ret = 0;
-
- DBG_PRINT("io_base: 0x%08x\n", io_base);
-
- switch (rrq->typ) {
- case WL_IOCTL_RTS_READ:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_READ\n");
- rrq->data[0] = IN_PORT_WORD(io_base + rrq->reg);
- DBG_TRACE(DbgInfo, " reg 0x%04x ==> 0x%04x\n", rrq->reg, CNV_LITTLE_TO_SHORT(rrq->data[0]));
- break;
- case WL_IOCTL_RTS_WRITE:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_WRITE\n");
- OUT_PORT_WORD(io_base + rrq->reg, rrq->data[0]);
- DBG_TRACE(DbgInfo, " reg 0x%04x <== 0x%04x\n", rrq->reg, CNV_LITTLE_TO_SHORT(rrq->data[0]));
- break;
- case WL_IOCTL_RTS_BATCH_READ:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_BATCH_READ\n");
- IN_PORT_STRING_16(io_base + rrq->reg, rrq->data, rrq->len);
- DBG_TRACE(DbgInfo, " reg 0x%04x ==> %d bytes\n", rrq->reg, rrq->len * sizeof(__u16));
- break;
- case WL_IOCTL_RTS_BATCH_WRITE:
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- WL_IOCTL_RTS_BATCH_WRITE\n");
- OUT_PORT_STRING_16(io_base + rrq->reg, rrq->data, rrq->len);
- DBG_TRACE(DbgInfo, " reg 0x%04x <== %d bytes\n", rrq->reg, rrq->len * sizeof(__u16));
- break;
- default:
-
- DBG_TRACE(DbgInfo, "IOCTL: WVLAN2_IOCTL_RTS -- UNSUPPORTED RTS CODE: 0x%X", rrq->typ);
- ioctl_ret = -EOPNOTSUPP;
- break;
- }
-
- return ioctl_ret;
-} /* wvlan_rts */
-/*============================================================================*/
-
-#endif /* USE_RTS */