d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Use is subject to license terms.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Copyright (c) 2007-2009 Sam Leffler, Errno Consulting
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Copyright (c) 2007-2008 Marvell Semiconductor, Inc.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * All rights reserved.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Redistribution and use in source and binary forms, with or without
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * modification, are permitted provided that the following conditions
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * are met:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * 1. Redistributions of source code must retain the above copyright
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * notice, this list of conditions and the following disclaimer,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * without modification.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * 2. Redistributions in binary form must reproduce at minimum a disclaimer
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * redistribution must be conditioned upon including a substantially
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * similar Disclaimer requirement for further binary redistribution.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NO WARRANTY
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * THE POSSIBILITY OF SUCH DAMAGES.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Driver for the Marvell 88W8363 Wireless LAN controller.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/stat.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/dlpi.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <inet/common.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <inet/mi.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/stream.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/errno.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/stropts.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/stat.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/sunddi.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/strsubr.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/strsun.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/pci.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/mac_provider.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/mac_wifi.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <sys/net80211.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include <inet/wifi_ioctl.h>
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#include "mwl_var.h"
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_quiesce(dev_info_t *devinfo);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinaDDI_DEFINE_STREAM_OPS(mwl_dev_ops, nulldev, nulldev, mwl_attach, mwl_detach,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China nodev, NULL, D_MP, NULL, mwl_quiesce);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic struct modldrv mwl_modldrv = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mod_driverops, /* Type of module. This one is a driver */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Marvell 88W8363 WiFi driver v1.1", /* short description */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mwl_dev_ops /* driver specific ops */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic struct modlinkage modlinkage = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MODREV_1, (void *)&mwl_modldrv, NULL
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void *mwl_soft_state_p = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_stat(void *, uint_t, uint64_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_start(void *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_m_stop(void *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_promisc(void *, boolean_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_multicst(void *, boolean_t, const uint8_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_unicst(void *, const uint8_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic mblk_t *mwl_m_tx(void *, mblk_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_m_ioctl(void *, queue_t *, mblk_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_setprop(void *arg, const char *pr_name,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_prop_id_t wldp_pr_num,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint_t wldp_length, const void *wldp_buf);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_m_getprop(void *arg, const char *pr_name,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_id_t wldp_pr_num, uint_t wldp_length,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer void *wldp_buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void mwl_m_propinfo(void *, const char *, mac_prop_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic mac_callbacks_t mwl_m_callbacks = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_stat,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_start,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_stop,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_promisc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_multicst,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_unicst,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_tx,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_ioctl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China NULL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China NULL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China NULL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_m_setprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mwl_m_getprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mwl_m_propinfo
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_ATTACH (1 << 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_DMA (1 << 1)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_FW (1 << 2)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_HW (1 << 3)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_INTR (1 << 4)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_RX (1 << 5)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_TX (1 << 6)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_CMD (1 << 7)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_CRYPTO (1 << 8)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_SR (1 << 9)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG_MSG (1 << 10)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinauint32_t mwl_dbg_flags = 0x0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef DEBUG
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG \
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_debug
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MWL_DBG
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * PIO access attributes for registers
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic ddi_device_acc_attr_t mwl_reg_accattr = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_STRUCTURE_LE_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEFAULT_ACC
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic ddi_device_acc_attr_t mwl_cmdbuf_accattr = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_NEVERSWAP_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEFAULT_ACC
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * DMA access attributes for descriptors and bufs: NOT to be byte swapped.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic ddi_device_acc_attr_t mwl_desc_accattr = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_NEVERSWAP_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEFAULT_ACC
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic ddi_device_acc_attr_t mwl_buf_accattr = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_NEVERSWAP_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DEFAULT_ACC
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Describes the chip's DMA engine
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic ddi_dma_attr_t mwl_dma_attr = {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DMA_ATTR_V0, /* dma_attr version */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x0000000000000000ull, /* dma_attr_addr_lo */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0xFFFFFFFF, /* dma_attr_addr_hi */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x00000000FFFFFFFFull, /* dma_attr_count_max */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x0000000000000001ull, /* dma_attr_align */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x00000FFF, /* dma_attr_burstsizes */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x00000001, /* dma_attr_minxfer */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x000000000000FFFFull, /* dma_attr_maxxfer */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0xFFFFFFFFFFFFFFFFull, /* dma_attr_seg */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 1, /* dma_attr_sgllen */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0x00000001, /* dma_attr_granular */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0 /* dma_attr_flags */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China};
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const struct ieee80211_rateset mwl_rateset_11b =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China { 4, { 2, 4, 11, 22 } };
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const struct ieee80211_rateset mwl_rateset_11g =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_alloc_dma_mem(dev_info_t *, ddi_dma_attr_t *, size_t,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_device_acc_attr_t *, uint_t, uint_t,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct dma_area *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_free_dma_mem(struct dma_area *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_alloc_cmdbuf(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_free_cmdbuf(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_alloc_rx_ring(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_free_rx_ring(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_alloc_tx_ring(struct mwl_softc *, struct mwl_tx_ring *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_free_tx_ring(struct mwl_softc *, struct mwl_tx_ring *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_setupdma(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_txq_init(struct mwl_softc *, struct mwl_tx_ring *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_tx_setup(struct mwl_softc *, int, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_setup_txq(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_fwload(struct mwl_softc *, void *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_loadsym(ddi_modhandle_t, char *, char **, size_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwlFwReset(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwlPokeSdramController(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwlTriggerPciCmd(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlWaitFor(struct mwl_softc *, uint32_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlSendBlock(struct mwl_softc *, int, const void *, size_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlSendBlock2(struct mwl_softc *, const void *, size_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwlSendCmd(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlExecuteCmd(struct mwl_softc *, unsigned short);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlWaitForCmdComplete(struct mwl_softc *, uint16_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void dumpresult(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlResetHalState(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlGetPwrCalTable(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlGetCalTable(struct mwl_softc *, uint8_t, uint8_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwlGetPwrCalTable(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void dumpcaldata(const char *, const uint8_t *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void get2Ghz(MWL_HAL_CHANNELINFO *, const uint8_t *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void get5Ghz(MWL_HAL_CHANNELINFO *, const uint8_t *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void setmaxtxpow(struct mwl_hal_channel *, int, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint16_t ieee2mhz(int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const char *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlcmdname(int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_gethwspecs(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_getchannels(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void getchannels(struct mwl_softc *, int, int *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_channel *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void addchannels(struct mwl_channel *, int, int *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void addht40channels(struct mwl_channel *, int, int *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const struct mwl_channel *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China findchannel(const struct mwl_channel *, int,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void addchan(struct mwl_channel *, int, int, int, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_chan_set(struct mwl_softc *, struct mwl_channel *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_mapchan(MWL_HAL_CHANNEL *, const struct mwl_channel *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_setcurchanrates(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaconst struct ieee80211_rateset *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_get_suprates(struct ieee80211com *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_channel *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint32_t cvtChannelFlags(const MWL_HAL_CHANNEL *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const struct mwl_hal_channel *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China findhalchannel(const struct mwl_softc *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNEL *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaenum ieee80211_phymode
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_chan2mode(const struct mwl_channel *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_map2regioncode(const struct mwl_regdomain *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_startrecv(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_mode_init(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_hal_intrset(struct mwl_softc *, uint32_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_hal_getisr(struct mwl_softc *, uint32_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_sethwdma(struct mwl_softc *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_hal_txrxdma *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_getchannelinfo(struct mwl_softc *, int, int,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO **);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setmac_locked(struct mwl_softc *, const uint8_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_keyreset(struct mwl_softc *, const MWL_HAL_KEYVAL *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_keyset(struct mwl_softc *, const MWL_HAL_KEYVAL *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_newstation(struct mwl_softc *, const uint8_t *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint16_t, uint16_t, const MWL_HAL_PEERINFO *, int, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setantenna(struct mwl_softc *, MWL_HAL_ANTENNA, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setradio(struct mwl_softc *, int, MWL_HAL_PREAMBLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setwmm(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setchannel(struct mwl_softc *, const MWL_HAL_CHANNEL *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_settxpower(struct mwl_softc *, const MWL_HAL_CHANNEL *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint8_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_settxrate(struct mwl_softc *, MWL_HAL_TXRATE_HANDLING,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_TXRATE *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_settxrate_auto(struct mwl_softc *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_TXRATE *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setrateadaptmode(struct mwl_softc *, uint16_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setoptimizationlevel(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setregioncode(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setassocid(struct mwl_softc *, const uint8_t *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint16_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_setrates(struct ieee80211com *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setrtsthreshold(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setcsmode(struct mwl_softc *, MWL_HAL_CSMODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setpromisc(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_start(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_setinframode(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_hal_stop(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic struct ieee80211_node *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_node_alloc(struct ieee80211com *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_node_free(struct ieee80211_node *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_key_alloc(struct ieee80211com *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct ieee80211_key *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_keyix *, ieee80211_keyix *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_key_delete(struct ieee80211com *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct ieee80211_key *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_key_set(struct ieee80211com *, const struct ieee80211_key *,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_setanywepkey(struct ieee80211com *, const uint8_t *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_setglobalkeys(struct ieee80211com *c);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int addgroupflags(MWL_HAL_KEYVAL *, const struct ieee80211_key *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_hal_txstart(struct mwl_softc *, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_send(ieee80211com_t *, mblk_t *, uint8_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_next_scan(void *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic MWL_HAL_PEERINFO *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mkpeerinfo(MWL_HAL_PEERINFO *, const struct ieee80211_node *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint32_t get_rate_bitmap(const struct ieee80211_rateset *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_newstate(struct ieee80211com *, enum ieee80211_state, int);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int cvtrssi(uint8_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint_t mwl_intr(caddr_t, caddr_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint_t mwl_softintr(caddr_t, caddr_t);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_tx_intr(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_rx_intr(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_init(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void mwl_stop(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int mwl_resume(struct mwl_softc *);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef DEBUG
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_debug(uint32_t dbg_flags, const int8_t *fmt, ...)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China va_list args;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (dbg_flags & mwl_dbg_flags) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China va_start(args, fmt);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China vcmn_err(CE_CONT, fmt, args);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China va_end(args);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Allocate an DMA memory and a DMA handle for accessing it
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_alloc_dma_mem(dev_info_t *devinfo, ddi_dma_attr_t *dma_attr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China size_t memsize, ddi_device_acc_attr_t *attr_p, uint_t alloc_flags,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint_t bind_flags, struct dma_area *dma_p)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Allocate handle
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_dma_alloc_handle(devinfo, dma_attr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_dma_mem(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to alloc handle\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Allocate memory
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, attr_p,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China alloc_flags, DDI_DMA_SLEEP, NULL, &dma_p->mem_va,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &dma_p->alength, &dma_p->acc_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_dma_mem(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to alloc mem\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Bind the two together
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->mem_va, dma_p->alength, bind_flags,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &dma_p->cookie, &dma_p->ncookies);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_DMA_MAPPED) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_dma_mem(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to bind handle\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail3;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (dma_p->ncookies != 1) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_dma_mem(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to alloc cookies\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail4;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->nslots = ~0U;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->size = ~0U;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->token = ~0U;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->offset = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail4:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(dma_p->dma_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail3:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_dma_mem_free(&dma_p->acc_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail2:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_dma_free_handle(&dma_p->dma_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail1:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_free_dma_mem(struct dma_area *dma_p)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (dma_p->dma_hdl != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(dma_p->dma_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (dma_p->acc_hdl != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_dma_mem_free(&dma_p->acc_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->acc_hdl = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_dma_free_handle(&dma_p->dma_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->ncookies = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dma_p->dma_hdl = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_alloc_cmdbuf(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China size_t size;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China size = MWL_CMDBUF_SIZE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_dma_mem(sc->sc_dev, &mwl_dma_attr, size,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mwl_cmdbuf_accattr, DDI_DMA_CONSISTENT,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_cmd_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_cmdbuf(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to alloc dma mem\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_mem = (uint16_t *)sc->sc_cmd_dma.mem_va;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_dmaaddr = sc->sc_cmd_dma.cookie.dmac_address;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_free_cmdbuf(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_cmd_mem != NULL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_dma_mem(&sc->sc_cmd_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_alloc_rx_ring(struct mwl_softc *sc, int count)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rx_ring *ring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, err, datadlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring = &sc->sc_rxring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->count = count;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur = ring->next = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_dma_mem(sc->sc_dev, &mwl_dma_attr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China count * sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mwl_desc_accattr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_CONSISTENT, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &ring->rxdesc_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_rxring(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "alloc tx ring failed, size %d\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint32_t)(count * sizeof (struct mwl_rxdesc)));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_rx_ring(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "dma len = %d\n", (uint32_t)(ring->rxdesc_dma.alength));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->desc = (struct mwl_rxdesc *)ring->rxdesc_dma.mem_va;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->physaddr = ring->rxdesc_dma.cookie.dmac_address;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bzero(ring->desc, count * sizeof (struct mwl_rxdesc));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China datadlen = count * sizeof (struct mwl_rxbuf);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->buf = (struct mwl_rxbuf *)kmem_zalloc(datadlen, KM_SLEEP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->buf == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_rxring(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc rx ring data buffer\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bzero(ring->buf, count * sizeof (struct mwl_rxbuf));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Pre-allocate Rx buffers and populate Rx ring.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < count; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = &ring->desc[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = &ring->buf[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* alloc DMA memory */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_alloc_dma_mem(sc->sc_dev, &mwl_dma_attr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_dmabuf_size,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mwl_buf_accattr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_STREAMING,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_READ | DDI_DMA_STREAMING,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &bf->rxbuf_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_mem = (uint8_t *)(bf->rxbuf_dma.mem_va);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_baddr = bf->rxbuf_dma.cookie.dmac_address;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_desc = ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_daddr = ring->physaddr + _PTRDIFF(ds, ring->desc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->rxdesc_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_free_rx_ring(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rx_ring *ring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring = &sc->sc_rxring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->desc != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_dma_mem(&ring->rxdesc_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->buf != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < ring->count; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = &ring->buf[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_dma_mem(&bf->rxbuf_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(ring->buf,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (ring->count * sizeof (struct mwl_rxbuf)));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_alloc_tx_ring(struct mwl_softc *sc, struct mwl_tx_ring *ring,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int count)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, err, datadlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->count = count;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->queued = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur = ring->next = ring->stat = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_dma_mem(sc->sc_dev, &mwl_dma_attr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China count * sizeof (struct mwl_txdesc), &mwl_desc_accattr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_CONSISTENT, DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &ring->txdesc_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_tx_ring(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "alloc tx ring failed, size %d\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint32_t)(count * sizeof (struct mwl_txdesc)));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_tx_ring(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "dma len = %d\n", (uint32_t)(ring->txdesc_dma.alength));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->desc = (struct mwl_txdesc *)ring->txdesc_dma.mem_va;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->physaddr = ring->txdesc_dma.cookie.dmac_address;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bzero(ring->desc, count * sizeof (struct mwl_txdesc));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China datadlen = count * sizeof (struct mwl_txbuf);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->buf = kmem_zalloc(datadlen, KM_SLEEP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->buf == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_alloc_tx_ring(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc tx ring data buffer\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bzero(ring->buf, count * sizeof (struct mwl_txbuf));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < count; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = &ring->desc[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = &ring->buf[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* alloc DMA memory */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_alloc_dma_mem(sc->sc_dev, &mwl_dma_attr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_dmabuf_size,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mwl_buf_accattr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_STREAMING,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_WRITE | DDI_DMA_STREAMING,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &bf->txbuf_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_baddr = bf->txbuf_dma.cookie.dmac_address;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_mem = (uint8_t *)(bf->txbuf_dma.mem_va);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_daddr = ring->physaddr + _PTRDIFF(ds, ring->desc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_desc = ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->txdesc_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* ARGSUSED */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_free_tx_ring(struct mwl_softc *sc, struct mwl_tx_ring *ring)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->desc != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_dma_mem(&ring->txdesc_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->buf != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < ring->count; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = &ring->buf[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_dma_mem(&bf->txbuf_dma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(ring->buf,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (ring->count * sizeof (struct mwl_txbuf)));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Inform the f/w about location of the tx/rx dma data structures
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * and related state. This cmd must be done immediately after a
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * mwl_hal_gethwspecs call or the f/w will lockup.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_sethwdma(struct mwl_softc *sc, const struct mwl_hal_txrxdma *dma)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_SET_HW_SPEC *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_SET_HW_SPEC, HostCmd_CMD_SET_HW_SPEC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->WcbBase[0] = LE_32(dma->wcbBase[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->WcbBase[1] = LE_32(dma->wcbBase[1]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->WcbBase[2] = LE_32(dma->wcbBase[2]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->WcbBase[3] = LE_32(dma->wcbBase[3]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->TxWcbNumPerQueue = LE_32(dma->maxNumTxWcb);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->NumTxQueues = LE_32(dma->maxNumWCB);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->TotalRxWcb = LE_32(1); /* XXX */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->RxPdWrPtr = LE_32(dma->rxDescRead);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * pCmd->Flags = LE_32(SET_HW_SPEC_HOSTFORM_BEACON
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * #ifdef MWL_HOST_PS_SUPPORT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * | SET_HW_SPEC_HOST_POWERSAVE
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * #endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * | SET_HW_SPEC_HOSTFORM_PROBERESP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Flags = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* disable multi-bss operation for A1-A4 parts */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_revs.mh_macRev < 5)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Flags |= LE_32(SET_HW_SPEC_DISABLEMBSS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_HW_SPEC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (retval == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (pCmd->Flags & LE_32(SET_HW_SPEC_DISABLEMBSS))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hw_flags &= ~MHF_MBSS;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hw_flags |= MHF_MBSS;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Inform firmware of our tx/rx dma setup. The BAR 0
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * writes below are for compatibility with older firmware.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * For current firmware we send this information with a
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * cmd block via mwl_hal_sethwdma.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_setupdma(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hwdma.rxDescRead = sc->sc_rxring.physaddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_mem_write4(sc, sc->sc_hwspecs.rxDescRead, sc->sc_hwdma.rxDescRead);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_mem_write4(sc, sc->sc_hwspecs.rxDescWrite, sc->sc_hwdma.rxDescRead);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < MWL_NUM_TX_QUEUES - MWL_NUM_ACK_QUEUES; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_tx_ring *txring = &sc->sc_txring[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hwdma.wcbBase[i] = txring->physaddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_mem_write4(sc, sc->sc_hwspecs.wcbBase[i],
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hwdma.wcbBase[i]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hwdma.maxNumTxWcb = MWL_TX_RING_COUNT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hwdma.maxNumWCB = MWL_NUM_TX_QUEUES - MWL_NUM_ACK_QUEUES;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_sethwdma(sc, &sc->sc_hwdma);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_setupdma(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "unable to setup tx/rx dma; hal status %u\n", err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* ARGSUSED */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_txq_init(struct mwl_softc *sc, struct mwl_tx_ring *txring, int qnum)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China txring->qnum = qnum;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China txring->txpri = 0; /* XXX */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = txring->buf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = txring->desc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < MWL_TX_RING_COUNT - 1; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pPhysNext = bf->bf_daddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = txring->buf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pPhysNext = LE_32(bf->bf_daddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Setup a hardware data transmit queue for the specified
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * access control. We record the mapping from ac's
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * to h/w queues for use by mwl_tx_start.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_tx_setup(struct mwl_softc *sc, int ac, int mvtype)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define N(a) (sizeof (a)/sizeof (a[0]))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_tx_ring *txring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ac >= N(sc->sc_ac2q)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_tx_setup(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "AC %u out of range, max %u!\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ac, (uint_t)N(sc->sc_ac2q));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mvtype >= MWL_NUM_TX_QUEUES) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_tx_setup(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mvtype %u out of range, max %u!\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mvtype, MWL_NUM_TX_QUEUES);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China txring = &sc->sc_txring[mvtype];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_txq_init(sc, txring, mvtype);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_ac2q[ac] = txring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef N
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_setup_txq(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: insure BK queue is the lowest priority h/w queue */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!mwl_tx_setup(sc, WME_AC_BK, MWL_WME_AC_BK)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_DMA, "mwl: mwl_setup_txq(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "unable to setup xmit queue for %s traffic!\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_wme_acnames[WME_AC_BK]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = EIO;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!mwl_tx_setup(sc, WME_AC_BE, MWL_WME_AC_BE) ||
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China !mwl_tx_setup(sc, WME_AC_VI, MWL_WME_AC_VI) ||
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China !mwl_tx_setup(sc, WME_AC_VO, MWL_WME_AC_VO)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Not enough hardware tx queues to properly do WME;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * just punt and assign them all to the same h/w queue.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * We could do a better job of this if, for example,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * we allocate queues when we switch from station to
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * AP mode.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_ac2q[WME_AC_BE] = sc->sc_ac2q[WME_AC_BK];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_ac2q[WME_AC_VI] = sc->sc_ac2q[WME_AC_BK];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_ac2q[WME_AC_VO] = sc->sc_ac2q[WME_AC_BK];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * find mwl firmware module's "_start" "_end" symbols
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * and get its size.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_loadsym(ddi_modhandle_t modp, char *sym, char **start, size_t *len)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char start_sym[64];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char end_sym[64];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char *p, *end;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int rv;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China size_t n;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) snprintf(start_sym, sizeof (start_sym), "%s_start", sym);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) snprintf(end_sym, sizeof (end_sym), "%s_end", sym);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China p = (char *)ddi_modsym(modp, start_sym, &rv);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (p == NULL || rv != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_loadsym(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mod %s: symbol %s not found\n", sym, start_sym);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (-1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China end = (char *)ddi_modsym(modp, end_sym, &rv);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (end == NULL || rv != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_loadsym(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mod %s: symbol %s not found\n", sym, end_sym);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (-1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China n = _PTRDIFF(end, p);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *start = p;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *len = n;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlFwReset(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_ctl_read4(sc, MACREG_REG_INT_CODE) == 0xffffffff) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwlFWReset(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "device not present!\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_H2A_INTERRUPT_EVENTS, ISR_RESET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hw_flags &= ~MHF_FWHANG;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlPokeSdramController(struct mwl_softc *sc, int SDRAMSIZE_Addr)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* Set up sdram controller for superflyv2 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, 0x00006014, 0x33);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, 0x00006018, 0xa3a2632);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, 0x00006010, SDRAMSIZE_Addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlTriggerPciCmd(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(sc->sc_cmd_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_GEN_PTR, sc->sc_cmd_dmaaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_INT_CODE, 0x00);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_H2A_INTERRUPT_EVENTS,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MACREG_H2ARIC_BIT_DOOR_BELL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlWaitFor(struct mwl_softc *sc, uint32_t val)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < FW_MAX_NUM_CHECKS; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DELAY(FW_CHECK_USECS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_ctl_read4(sc, MACREG_REG_INT_CODE) == val)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Firmware block xmit when talking to the boot-rom.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlSendBlock(struct mwl_softc *sc, int bsize, const void *data, size_t dsize)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_mem[0] = LE_16(HostCmd_CMD_CODE_DNLD);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_mem[1] = LE_16(bsize);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(&sc->sc_cmd_mem[4], data, dsize);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlTriggerPciCmd(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX 2000 vs 200 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwlWaitFor(sc, MACREG_INT_CODE_CMD_FINISHED)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_INT_CODE, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwlSendBlock(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "timeout waiting for CMD_FINISHED, INT_CODE 0x%x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_read4(sc, MACREG_REG_INT_CODE));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Firmware block xmit when talking to the 1st-stage loader.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlSendBlock2(struct mwl_softc *sc, const void *data, size_t dsize)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(&sc->sc_cmd_mem[0], data, dsize);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlTriggerPciCmd(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwlWaitFor(sc, MACREG_INT_CODE_CMD_FINISHED)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_INT_CODE, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwlSendBlock2(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "timeout waiting for CMD_FINISHED, INT_CODE 0x%x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_read4(sc, MACREG_REG_INT_CODE));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* ARGSUSED */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_fwload(struct mwl_softc *sc, void *fwargs)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char *fwname = "mwlfw";
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char *fwbootname = "mwlboot";
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char *fwbinname = "mw88W8363fw";
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char *fwboot_index, *fw_index;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint8_t *fw, *fwboot;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_modhandle_t modfw;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX get from firmware header */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t FwReadySignature = HostCmd_SOFTAP_FWRDY_SIGNATURE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t OpMode = HostCmd_SOFTAP_MODE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t *fp, *ep;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China size_t fw_size, fwboot_size;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t blocksize, nbytes;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, rv, err, ntries;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rv = err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fw = fwboot = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fw_index = fwboot_index = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China modfw = ddi_modopen(fwname, KRTLD_MODE_FIRST, &rv);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (modfw == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "module %s not found\n", fwname);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = -1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_loadsym(modfw, fwbootname, &fwboot_index, &fwboot_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not get boot firmware\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = -1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_loadsym(modfw, fwbinname, &fw_index, &fw_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not get firmware\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = -1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwboot = (uint8_t *)kmem_alloc(fwboot_size, KM_SLEEP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fwboot == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_loadfirmware(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to alloc boot firmware memory\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = -1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(fwboot, fwboot_index, fwboot_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fw = (uint8_t *)kmem_alloc(fw_size, KM_SLEEP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fw == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_loadfirmware(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to alloc firmware memory\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = -1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(fw, fw_index, fw_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (modfw != NULL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_modclose(modfw);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fw_size < 4) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not load firmware image %s\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwname);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ENXIO;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fw[0] == 0x01 && fw[1] == 0x00 &&
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fw[2] == 0x00 && fw[3] == 0x00) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * 2-stage load, get the boot firmware.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fwboot == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not load firmware image %s\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwbootname);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ENXIO;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwboot = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlFwReset(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_CLEAR_SEL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MACREG_A2HRIC_BIT_MASK);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_CAUSE, 0x00);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_MASK, 0x00);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_STATUS_MASK,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MACREG_A2HRIC_BIT_MASK);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_SDRAMSIZE_Addr != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* Set up sdram controller for superflyv2 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlPokeSdramController(sc, sc->sc_SDRAMSIZE_Addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "load %s firmware image (%u bytes)\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwname, (unsigned int)fw_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fwboot != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Do 2-stage load. The 1st stage loader is setup
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * with the bootrom loader then we load the real
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * image using a different handshake. With this
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * mechanism the firmware is segmented into chunks
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * that have a CRC. If a chunk is incorrect we'll
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * be told to retransmit.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX assumes hlpimage fits in a block */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: zero size block indicates download is finished */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!mwlSendBlock(sc, fwboot_size, fwboot, fwboot_size) ||
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China !mwlSendBlock(sc, 0, NULL, 0)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ETIMEDOUT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DELAY(200 * FW_CHECK_USECS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_SDRAMSIZE_Addr != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* Set up sdram controller for superflyv2 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlPokeSdramController(sc, sc->sc_SDRAMSIZE_Addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China nbytes = ntries = 0; /* NB: silence compiler */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (fp = fw, ep = fp + fw_size; fp < ep; ) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_INT_CODE, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China blocksize = mwl_ctl_read4(sc, MACREG_REG_SCRATCH);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (blocksize == 0) /* download complete */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (blocksize > 0x00000c00) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = EINVAL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((blocksize & 0x1) == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* block successfully downloaded, advance */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp += nbytes;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ntries = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (++ntries > 2) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Guard against f/w telling us to
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * retry infinitely.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ELOOP;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* clear NAK bit/flag */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China blocksize &= ~0x1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (blocksize > _PTRDIFF(ep, fp)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX this should not happen, what to do? */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China blocksize = _PTRDIFF(ep, fp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China nbytes = blocksize;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!mwlSendBlock2(sc, fp, nbytes)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ETIMEDOUT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (fp = fw, ep = fp + fw_size; fp < ep; ) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China nbytes = _PTRDIFF(ep, fp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (nbytes > FW_DOWNLOAD_BLOCK_SIZE)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China nbytes = FW_DOWNLOAD_BLOCK_SIZE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!mwlSendBlock(sc, FW_DOWNLOAD_BLOCK_SIZE, fp,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China nbytes)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = EIO;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto bad;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp += nbytes;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Wait for firmware to startup; we monitor the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * INT_CODE register waiting for a signature to
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * written back indicating it's ready to go.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_mem[1] = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX WAR for mfg fw download
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (OpMode != HostCmd_STA_MODE)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlTriggerPciCmd(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < FW_MAX_NUM_CHECKS; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_GEN_PTR, OpMode);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DELAY(FW_CHECK_USECS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_ctl_read4(sc, MACREG_REG_INT_CODE) ==
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China FwReadySignature) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_INT_CODE, 0x00);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mwlResetHalState(sc));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_FW, "mwl: mwl_fwload(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "firmware download timeout\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (ETIMEDOUT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinabad:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlFwReset(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinabad2:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fw != NULL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(fw, fw_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (fwboot != NULL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(fwboot, fwboot_size);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwboot = fw = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fwboot_index = fw_index = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (modfw != NULL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_modclose(modfw);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Low level firmware cmd block handshake support.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlSendCmd(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(sc->sc_cmd_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_GEN_PTR, sc->sc_cmd_dmaaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_H2A_INTERRUPT_EVENTS,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MACREG_H2ARIC_BIT_DOOR_BELL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlExecuteCmd(struct mwl_softc *sc, unsigned short cmd)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_ctl_read4(sc, MACREG_REG_INT_CODE) == 0xffffffff) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: mwlExecuteCmd(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "device not present!\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (EIO);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlSendCmd(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!mwlWaitForCmdComplete(sc, 0x8000 | cmd)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: mwlExecuteCmd(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "timeout waiting for f/w cmd %s\n", mwlcmdname(cmd));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (ETIMEDOUT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(sc->sc_cmd_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cmd_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: mwlExecuteCmd(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "send cmd %s\n", mwlcmdname(cmd));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_dbg_flags & MWL_DBG_CMD)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dumpresult(sc, 1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlWaitForCmdComplete(struct mwl_softc *sc, uint16_t cmdCode)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define MAX_WAIT_FW_COMPLETE_ITERATIONS 10000
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < MAX_WAIT_FW_COMPLETE_ITERATIONS; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_cmd_mem[0] == LE_16(cmdCode))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DELAY(1 * 1000);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef MAX_WAIT_FW_COMPLETE_ITERATIONS
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const char *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwlcmdname(int cmd)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China static char buf[12];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define CMD(x) case HostCmd_CMD_##x: return #x
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (cmd) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(CODE_DNLD);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(GET_HW_SPEC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_HW_SPEC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(MAC_MULTICAST_ADR);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11_GET_STAT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(MAC_REG_ACCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(BBP_REG_ACCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(RF_REG_ACCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11_RADIO_CONTROL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11_RF_TX_POWER);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11_RF_ANTENNA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_BEACON);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_RF_CHANNEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_AID);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_INFRA_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_G_PROTECT_FLAG);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11_RTS_THSD);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11_SET_SLOT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_EDCA_PARAMS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(802_11H_DETECT_RADAR);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_WMM_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(HT_GUARD_INTERVAL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_LINKADAPT_CS_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_MAC_ADDR);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_RATE_ADAPT_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(BSS_START);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_NEW_STN);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_KEEP_ALIVE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_APMODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_SWITCH_CHANNEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(UPDATE_ENCRYPTION);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(BASTREAM);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_RIFS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_N_PROTECT_FLAG);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_N_PROTECT_OPMODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_OPTIMIZATION_LEVEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(GET_CALTABLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_MIMOPSHT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(GET_BEACON);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_REGION_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_POWERSAVESTATION);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(SET_TIM);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(GET_TIM);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(GET_SEQNO);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(DWDS_ENABLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(AMPDU_RETRY_RATEDROP_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China CMD(CFEND_ENABLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) snprintf(buf, sizeof (buf), "0x%x", cmd);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (buf);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef CMD
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinadumpresult(struct mwl_softc *sc, int showresult)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const FWCmdHdr *h = (const FWCmdHdr *)sc->sc_cmd_mem;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int len;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = LE_16(h->Length);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef MWL_MBSS_SUPPORT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: mwl_dumpresult(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Cmd %s Length %d SeqNum %d MacId %d",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlcmdname(LE_16(h->Cmd) & ~0x8000), len, h->SeqNum, h->MacId);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: mwl_dumpresult(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Cmd %s Length %d SeqNum %d",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwlcmdname(LE_16(h->Cmd) & ~0x8000), len, LE_16(h->SeqNum));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (showresult) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const char *results[] =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China { "OK", "ERROR", "NOT_SUPPORT", "PENDING", "BUSY",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "PARTIAL_DATA" };
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int result = LE_16(h->Result);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (result <= HostCmd_RESULT_PARTIAL_DATA)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: dumpresult(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Result %s", results[result]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CMD, "mwl: dumpresult(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Result %d", result);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlGetCalTable(struct mwl_softc *sc, uint8_t annex, uint8_t index)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_GET_CALTABLE *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_FW_GET_CALTABLE, HostCmd_CMD_GET_CALTABLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->annex = annex;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->index = index;
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(pCmd->calTbl, 0, sizeof (pCmd->calTbl));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_GET_CALTABLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (retval == 0 &&
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->calTbl[0] != annex && annex != 0 && annex != 255)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = EIO;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Construct channel info for 2.4GHz channels from cal data.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaget2Ghz(MWL_HAL_CHANNELINFO *ci, const uint8_t table[], int len)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, j;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China j = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < len; i += 4) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_hal_channel *hc = &ci->channels[j];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->ieee = 1+j;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->freq = ieee2mhz(1+j);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(hc->targetPowers, &table[i], 4);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China setmaxtxpow(hc, 0, 4);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China j++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci->nchannels = j;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci->freqLow = ieee2mhz(1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci->freqHigh = ieee2mhz(j);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Construct channel info for 5GHz channels from cal data.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaget5Ghz(MWL_HAL_CHANNELINFO *ci, const uint8_t table[], int len)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, j, f, l, h;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China l = 32000;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China h = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China j = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < len; i += 4) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_hal_channel *hc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (table[i] == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China continue;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China f = 5000 + 5*table[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (f < l)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China l = f;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (f > h)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China h = f;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = &ci->channels[j];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->freq = (uint16_t)f;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->ieee = table[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(hc->targetPowers, &table[i], 4);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China setmaxtxpow(hc, 1, 4); /* NB: col 1 is the freq, skip */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China j++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci->nchannels = j;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci->freqLow = (uint16_t)((l == 32000) ? 0 : l);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci->freqHigh = (uint16_t)h;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Calculate the max tx power from the channel's cal data.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinasetmaxtxpow(struct mwl_hal_channel *hc, int i, int maxix)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->maxTxPow = hc->targetPowers[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i++; i < maxix; i++)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (hc->targetPowers[i] > hc->maxTxPow)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->maxTxPow = hc->targetPowers[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint16_t
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaieee2mhz(int chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (chan == 14)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (2484);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (chan < 14)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (2407 + chan * 5);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (2512 + (chan - 15) * 20);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinadumpcaldata(const char *name, const uint8_t *table, int n)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "\n%s:\n", name);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < n; i += 4)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "[%2d] %3d %3d %3d %3d\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China i/4, table[i+0], table[i+1], table[i+2], table[i+3]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlGetPwrCalTable(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t *data;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_CHANNELINFO *ci;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int len;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: we hold the lock so it's ok to use cmdbuf */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China data = ((const HostCmd_FW_GET_CALTABLE *) sc->sc_cmd_mem)->calTbl;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwlGetCalTable(sc, 33, 0) == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = (data[2] | (data[3] << 8)) - 12;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (len > PWTAGETRATETABLE20M)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = PWTAGETRATETABLE20M;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dumpcaldata("2.4G 20M", &data[12], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China get2Ghz(&sc->sc_20M, &data[12], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwlGetCalTable(sc, 34, 0) == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = (data[2] | (data[3] << 8)) - 12;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (len > PWTAGETRATETABLE40M)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = PWTAGETRATETABLE40M;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dumpcaldata("2.4G 40M", &data[12], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci = &sc->sc_40M;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China get2Ghz(ci, &data[12], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwlGetCalTable(sc, 35, 0) == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = (data[2] | (data[3] << 8)) - 20;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (len > PWTAGETRATETABLE20M_5G)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = PWTAGETRATETABLE20M_5G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dumpcaldata("5G 20M", &data[20], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China get5Ghz(&sc->sc_20M_5G, &data[20], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwlGetCalTable(sc, 36, 0) == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = (data[2] | (data[3] << 8)) - 20;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (len > PWTAGETRATETABLE40M_5G)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = PWTAGETRATETABLE40M_5G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China dumpcaldata("5G 40M", &data[20], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci = &sc->sc_40M_5G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China get5Ghz(ci, &data[20], len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hw_flags |= MHF_CALDATA;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Reset internal state after a firmware download.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinamwlResetHalState(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Fetch cal data for later use.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX may want to fetch other stuff too.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX check return */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((sc->sc_hw_flags & MHF_CALDATA) == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwlGetPwrCalTable(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define IEEE80211_CHAN_HTG (IEEE80211_CHAN_HT|IEEE80211_CHAN_G)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define IEEE80211_CHAN_HTA (IEEE80211_CHAN_HT|IEEE80211_CHAN_A)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaaddchan(struct mwl_channel *c, int freq, int flags, int ieee, int txpow)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_freq = (uint16_t)freq;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_flags = flags;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_ieee = (uint8_t)ieee;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_minpower = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_maxpower = 2*txpow;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_maxregpower = (uint8_t)txpow;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const struct mwl_channel *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafindchannel(const struct mwl_channel chans[], int nchans,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int freq, int flags)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_channel *c;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < nchans; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c = &chans[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->ic_freq == freq && c->ic_flags == flags)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (c);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaaddht40channels(struct mwl_channel chans[], int maxchans, int *nchans,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO *ci, int flags)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_channel *c;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_channel *extc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_hal_channel *hc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c = &chans[*nchans];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China flags &= ~IEEE80211_CHAN_HT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < ci->nchannels; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Each entry defines an HT40 channel pair; find the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * extension channel above and the insert the pair.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = &ci->channels[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China extc = findchannel(chans, *nchans, hc->freq+20,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China flags | IEEE80211_CHAN_HT20);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (extc != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (*nchans >= maxchans)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addchan(c, hc->freq, flags | IEEE80211_CHAN_HT40U,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->ieee, hc->maxTxPow);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_extieee = extc->ic_ieee;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c++, (*nchans)++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (*nchans >= maxchans)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addchan(c, extc->ic_freq, flags | IEEE80211_CHAN_HT40D,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China extc->ic_ieee, hc->maxTxPow);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->ic_extieee = hc->ieee;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c++, (*nchans)++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaaddchannels(struct mwl_channel chans[], int maxchans, int *nchans,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO *ci, int flags)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_channel *c;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c = &chans[*nchans];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < ci->nchannels; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_hal_channel *hc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = &ci->channels[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (*nchans >= maxchans)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addchan(c, hc->freq, flags, hc->ieee, hc->maxTxPow);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c++, (*nchans)++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (flags == IEEE80211_CHAN_G || flags == IEEE80211_CHAN_HTG) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* g channel have a separate b-only entry */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (*nchans >= maxchans)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0] = c[-1];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[-1].ic_flags = IEEE80211_CHAN_B;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c++, (*nchans)++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (flags == IEEE80211_CHAN_HTG) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* HT g channel have a separate g-only entry */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (*nchans >= maxchans)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[-1].ic_flags = IEEE80211_CHAN_G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0] = c[-1];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0].ic_flags &= ~IEEE80211_CHAN_HT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0].ic_flags |= IEEE80211_CHAN_HT20; /* HT20 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c++, (*nchans)++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (flags == IEEE80211_CHAN_HTA) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* HT a channel have a separate a-only entry */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (*nchans >= maxchans)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[-1].ic_flags = IEEE80211_CHAN_A;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0] = c[-1];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0].ic_flags &= ~IEEE80211_CHAN_HT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c[0].ic_flags |= IEEE80211_CHAN_HT20; /* HT20 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c++, (*nchans)++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_getchannelinfo(struct mwl_softc *sc, int band, int chw,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO **ci)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (band) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_FREQ_BAND_2DOT4GHZ:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *ci = (chw == MWL_CH_20_MHz_WIDTH) ? &sc->sc_20M : &sc->sc_40M;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_FREQ_BAND_5GHZ:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *ci = (chw == MWL_CH_20_MHz_WIDTH) ?
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_20M_5G : &sc->sc_40M_5G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (EINVAL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (((*ci)->freqLow == (*ci)->freqHigh) ? EINVAL : 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinagetchannels(struct mwl_softc *sc, int maxchans, int *nchans,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_channel chans[])
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO *ci;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Use the channel info from the hal to craft the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * channel list. Note that we pass back an unsorted
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * list; the caller is required to sort it for us
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * (if desired).
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *nchans = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_hal_getchannelinfo(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_FREQ_BAND_2DOT4GHZ, MWL_CH_20_MHz_WIDTH, &ci) == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addchannels(chans, maxchans, nchans, ci, IEEE80211_CHAN_HTG);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_hal_getchannelinfo(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_FREQ_BAND_5GHZ, MWL_CH_20_MHz_WIDTH, &ci) == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addchannels(chans, maxchans, nchans, ci, IEEE80211_CHAN_HTA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_hal_getchannelinfo(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_FREQ_BAND_2DOT4GHZ, MWL_CH_40_MHz_WIDTH, &ci) == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addht40channels(chans, maxchans, nchans, ci,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_CHAN_HTG);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_hal_getchannelinfo(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_FREQ_BAND_5GHZ, MWL_CH_40_MHz_WIDTH, &ci) == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addht40channels(chans, maxchans, nchans, ci,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_CHAN_HTA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_getchannels(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Use the channel info from the hal to craft the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * channel list for net80211. Note that we pass up
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * an unsorted list; net80211 will sort it for us.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(sc->sc_channels, 0, sizeof (sc->sc_channels));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_nchans = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China getchannels(sc, IEEE80211_CHAN_MAX, &sc->sc_nchans, sc->sc_channels);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_regdomain.regdomain = SKU_DEBUG;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_regdomain.country = CTRY_DEFAULT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_regdomain.location = 'I';
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_regdomain.isocc[0] = ' '; /* XXX? */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_regdomain.isocc[1] = ' ';
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (sc->sc_nchans == 0 ? EIO : 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef IEEE80211_CHAN_HTA
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef IEEE80211_CHAN_HTG
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Return "hw specs". Note this must be the first
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * cmd MUST be done after a firmware download or the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * f/w will lockup.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX move into the hal so driver doesn't need to be responsible
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_gethwspecs(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_hal_hwspec *hw;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_GET_HW_SPEC *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw = &sc->sc_hwspecs;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_GET_HW_SPEC, HostCmd_CMD_GET_HW_SPEC);
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(&pCmd->PermanentAddr[0], 0xff, IEEE80211_ADDR_LEN);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ulFwAwakeCookie = LE_32((unsigned int)sc->sc_cmd_dmaaddr + 2048);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_GET_HW_SPEC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (retval == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(hw->macAddr, pCmd->PermanentAddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->wcbBase[0] = LE_32(pCmd->WcbBase0) & 0x0000ffff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->wcbBase[1] = LE_32(pCmd->WcbBase1[0]) & 0x0000ffff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->wcbBase[2] = LE_32(pCmd->WcbBase1[1]) & 0x0000ffff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->wcbBase[3] = LE_32(pCmd->WcbBase1[2]) & 0x0000ffff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->rxDescRead = LE_32(pCmd->RxPdRdPtr)& 0x0000ffff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->rxDescWrite = LE_32(pCmd->RxPdWrPtr)& 0x0000ffff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->regionCode = LE_16(pCmd->RegionCode) & 0x00ff;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->fwReleaseNumber = LE_32(pCmd->FWReleaseNumber);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->maxNumWCB = LE_16(pCmd->NumOfWCB);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->maxNumMCAddr = LE_16(pCmd->NumOfMCastAddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->numAntennas = LE_16(pCmd->NumberOfAntenna);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->hwVersion = pCmd->Version;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hw->hostInterface = pCmd->HostIf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_revs.mh_macRev = hw->hwVersion; /* XXX */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_revs.mh_phyRev = hw->hostInterface; /* XXX */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setmac_locked(struct mwl_softc *sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t addr[IEEE80211_ADDR_LEN])
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_SET_MAC *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_DS_SET_MAC, HostCmd_CMD_SET_MAC_ADDR);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(&pCmd->MacAddr[0], addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef MWL_MBSS_SUPPORT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: already byte swapped */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->MacType = WL_MAC_TYPE_PRIMARY_CLIENT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mwlExecuteCmd(sc, HostCmd_CMD_SET_MAC_ADDR));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinacvtPeerInfo(PeerInfo_t *to, const MWL_HAL_PEERINFO *from)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->LegacyRateBitMap = LE_32(from->LegacyRateBitMap);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->HTRateBitMap = LE_32(from->HTRateBitMap);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->CapInfo = LE_16(from->CapInfo);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->HTCapabilitiesInfo = LE_16(from->HTCapabilitiesInfo);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->MacHTParamInfo = from->MacHTParamInfo;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->AddHtInfo.ControlChan = from->AddHtInfo.ControlChan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->AddHtInfo.AddChan = from->AddHtInfo.AddChan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->AddHtInfo.OpMode = LE_16(from->AddHtInfo.OpMode);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China to->AddHtInfo.stbc = LE_16(from->AddHtInfo.stbc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* XXX station id must be in [0..63] */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_newstation(struct mwl_softc *sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t addr[IEEE80211_ADDR_LEN], uint16_t aid, uint16_t sid,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_PEERINFO *peer, int isQosSta, int wmeInfo)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_SET_NEW_STN *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_FW_SET_NEW_STN, HostCmd_CMD_SET_NEW_STN);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->AID = LE_16(aid);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->StnId = LE_16(sid);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(0); /* SET */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (peer != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: must fix up byte order */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China cvtPeerInfo(&pCmd->PeerInfo, peer);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(&pCmd->MacAddr[0], addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Qosinfo = (uint8_t)wmeInfo;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->isQosSta = (isQosSta != 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_hal_newstation(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "LegacyRateBitMap %x, CapInfo %x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->PeerInfo.LegacyRateBitMap, pCmd->PeerInfo.CapInfo);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_NEW_STN);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Configure antenna use.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Takes effect immediately.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX tx antenna setting ignored
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX rx antenna setting should always be 3 (for now)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setantenna(struct mwl_softc *sc, MWL_HAL_ANTENNA dirSet, int ant)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_802_11_RF_ANTENNA *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!(dirSet == WL_ANTENNATYPE_RX || dirSet == WL_ANTENNATYPE_TX))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (EINVAL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_802_11_RF_ANTENNA,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_802_11_RF_ANTENNA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(dirSet);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ant == 0) /* default to all/both antennae */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ant = 3;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->AntennaMode = LE_16(ant);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_802_11_RF_ANTENNA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Configure radio.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Takes effect immediately.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX preamble installed after set fixed rate cmd
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setradio(struct mwl_softc *sc, int onoff, MWL_HAL_PREAMBLE preamble)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_802_11_RADIO_CONTROL *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_802_11_RADIO_CONTROL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_802_11_RADIO_CONTROL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (onoff == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Control = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Control = LE_16(preamble);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->RadioOn = LE_16(onoff);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_802_11_RADIO_CONTROL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setwmm(struct mwl_softc *sc, int onoff)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_SetWMMMode *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_FW_SetWMMMode,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_WMM_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(onoff);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_WMM_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Convert public channel flags definition to a
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * value suitable for feeding to the firmware.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Note this includes byte swapping.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint32_t
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing ChinacvtChannelFlags(const MWL_HAL_CHANNEL *chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t w;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: f/w only understands FREQ_BAND_5GHZ, supplying the more
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * precise band info causes it to lockup (sometimes).
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w = (chan->channelFlags.FreqBand == MWL_FREQ_BAND_2DOT4GHZ) ?
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China FREQ_BAND_2DOT4GHZ : FREQ_BAND_5GHZ;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (chan->channelFlags.ChnlWidth) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_CH_10_MHz_WIDTH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w |= CH_10_MHz_WIDTH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_CH_20_MHz_WIDTH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w |= CH_20_MHz_WIDTH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_CH_40_MHz_WIDTH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w |= CH_40_MHz_WIDTH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (chan->channelFlags.ExtChnlOffset) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_EXT_CH_NONE:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w |= EXT_CH_NONE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_EXT_CH_ABOVE_CTRL_CH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w |= EXT_CH_ABOVE_CTRL_CH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MWL_EXT_CH_BELOW_CTRL_CH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China w |= EXT_CH_BELOW_CTRL_CH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (LE_32(w));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setchannel(struct mwl_softc *sc, const MWL_HAL_CHANNEL *chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_SET_RF_CHANNEL *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_FW_SET_RF_CHANNEL, HostCmd_CMD_SET_RF_CHANNEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->CurrentChannel = chan->channel;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ChannelFlags = cvtChannelFlags(chan); /* NB: byte-swapped */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_RF_CHANNEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_settxpower(struct mwl_softc *sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNEL *c, uint8_t maxtxpow)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_802_11_RF_TX_POWER *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_hal_channel *hc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i = 0, retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = findhalchannel(sc, c);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (hc == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX temp while testing */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_hal_settxpower(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "no cal data for channel %u band %u width %u ext %u\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->channel, c->channelFlags.FreqBand,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China c->channelFlags.ChnlWidth, c->channelFlags.ExtChnlOffset);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (EINVAL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_802_11_RF_TX_POWER,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_802_11_RF_TX_POWER);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(HostCmd_ACT_GEN_SET_LIST);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: 5Ghz cal data have the channel # in [0]; don't truncate */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->channelFlags.FreqBand == MWL_FREQ_BAND_5GHZ)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->PowerLevelList[i++] = LE_16(hc->targetPowers[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (; i < 4; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint16_t pow = hc->targetPowers[i];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (pow > maxtxpow)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pow = maxtxpow;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->PowerLevelList[i] = LE_16(pow);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_802_11_RF_TX_POWER);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define RATEVAL(r) ((r) &~ RATE_MCS)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define RATETYPE(r) (((r) & RATE_MCS) ? HT_RATE_TYPE : LEGACY_RATE_TYPE)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_settxrate(struct mwl_softc *sc, MWL_HAL_TXRATE_HANDLING handling,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_TXRATE *rate)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_USE_FIXED_RATE *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China FIXED_RATE_ENTRY *fp;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval, i, n;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_FW_USE_FIXED_RATE,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->MulticastRate = RATEVAL(rate->McastRate);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->MultiRateTxType = RATETYPE(rate->McastRate);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: no rate type field */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ManagementRate = RATEVAL(rate->MgtRate);
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(pCmd->FixedRateTable, 0, sizeof (pCmd->FixedRateTable));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (handling == RATE_FIXED) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_32(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->AllowRateDrop = LE_32(FIXED_RATE_WITHOUT_AUTORATE_DROP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp = pCmd->FixedRateTable;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp->FixedRate =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(RATEVAL(rate->RateSeries[0].Rate));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp->FixRateTypeFlags.FixRateType =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(RATETYPE(rate->RateSeries[0].Rate));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->EntryCount = LE_32(1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else if (handling == RATE_FIXED_DROP) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_32(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->AllowRateDrop = LE_32(FIXED_RATE_WITH_AUTO_RATE_DROP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China n = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp = pCmd->FixedRateTable;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < 4; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (rate->RateSeries[0].TryCount == 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp->FixRateTypeFlags.FixRateType =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(RATETYPE(rate->RateSeries[i].Rate));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp->FixedRate =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(RATEVAL(rate->RateSeries[i].Rate));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp->FixRateTypeFlags.RetryCountValid =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(RETRY_COUNT_VALID);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China fp->RetryCount =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(rate->RateSeries[i].TryCount-1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China n++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->EntryCount = LE_32(n);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_32(HostCmd_ACT_NOT_USE_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_settxrate_auto(struct mwl_softc *sc, const MWL_HAL_TXRATE *rate)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_USE_FIXED_RATE *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_FW_USE_FIXED_RATE,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->MulticastRate = RATEVAL(rate->McastRate);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->MultiRateTxType = RATETYPE(rate->McastRate);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: no rate type field */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ManagementRate = RATEVAL(rate->MgtRate);
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(pCmd->FixedRateTable, 0, sizeof (pCmd->FixedRateTable));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_32(HostCmd_ACT_NOT_USE_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_FIXED_RATE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef RATEVAL
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef RATETYPE
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* XXX 0 = indoor, 1 = outdoor */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setrateadaptmode(struct mwl_softc *sc, uint16_t mode)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_SET_RATE_ADAPT_MODE *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_SET_RATE_ADAPT_MODE,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_RATE_ADAPT_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->RateAdaptMode = LE_16(mode);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_RATE_ADAPT_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setoptimizationlevel(struct mwl_softc *sc, int level)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_SET_OPTIMIZATION_LEVEL *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_FW_SET_OPTIMIZATION_LEVEL,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_OPTIMIZATION_LEVEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->OptLevel = (uint8_t)level;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_OPTIMIZATION_LEVEL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Set the region code that selects the radar bin'ing agorithm.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setregioncode(struct mwl_softc *sc, int regionCode)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_SET_REGIONCODE_INFO *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_SET_REGIONCODE_INFO,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_REGION_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX map pseudo-codes to fw codes */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (regionCode) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case DOMAIN_CODE_ETSI_131:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->regionCode = LE_16(DOMAIN_CODE_ETSI);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->regionCode = LE_16(regionCode);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_REGION_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setassocid(struct mwl_softc *sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t bssId[IEEE80211_ADDR_LEN], uint16_t assocId)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_SET_AID *pCmd = (HostCmd_FW_SET_AID *) &sc->sc_cmd_mem[0];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_FW_SET_AID, HostCmd_CMD_SET_AID);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->AssocID = LE_16(assocId);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(&pCmd->MacAddr[0], bssId);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_AID);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Inform firmware of tx rate parameters. Called whenever
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * user-settable params change and after a channel change.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_setrates(struct ieee80211com *ic)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_TXRATE rates;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct ieee80211_rateset *rs;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rs = &ic->ic_bss->in_rates;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Update the h/w rate map.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: 0x80 for MCS is passed through unchanged
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(&rates, 0, sizeof (rates));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* rate used to send management frames */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rates.MgtRate = rs->ir_rates[0] & IEEE80211_RATE_VAL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* rate used to send multicast frames */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rates.McastRate = rates.MgtRate;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mwl_hal_settxrate(sc, RATE_AUTO, &rates));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Set packet size threshold for implicit use of RTS.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Takes effect immediately.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX packet length > threshold =>'s RTS
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setrtsthreshold(struct mwl_softc *sc, int threshold)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_802_11_RTS_THSD *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_DS_802_11_RTS_THSD,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_802_11_RTS_THSD);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Threshold = LE_16(threshold);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_802_11_RTS_THSD);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setcsmode(struct mwl_softc *sc, MWL_HAL_CSMODE csmode)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_SET_LINKADAPT_CS_MODE *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _CMD_SETUP(pCmd, HostCmd_DS_SET_LINKADAPT_CS_MODE,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_LINKADAPT_CS_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Action = LE_16(HostCmd_ACT_GEN_SET);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->CSMode = LE_16(csmode);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_LINKADAPT_CS_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setpromisc(struct mwl_softc *sc, int ena)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t v;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China v = mwl_ctl_read4(sc, MACREG_REG_PROMISCUOUS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_PROMISCUOUS, ena ? v | 1 : v & ~1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_start(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_BSS_START *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_DS_BSS_START, HostCmd_CMD_BSS_START);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Enable = LE_32(HostCmd_ACT_GEN_ON);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_BSS_START);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Enable sta-mode operation (disables beacon frame xmit).
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_setinframode(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_SET_INFRA_MODE *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_FW_SET_INFRA_MODE,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_SET_INFRA_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_SET_INFRA_MODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_stop(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_DS_BSS_START *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_DS_BSS_START,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_BSS_START);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->Enable = LE_32(HostCmd_ACT_GEN_OFF);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_BSS_START);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_keyset(struct mwl_softc *sc, const MWL_HAL_KEYVAL *kv,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN])
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_UPDATE_ENCRYPTION);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (kv->keyFlags & (KEY_FLAG_TXGROUPKEY|KEY_FLAG_RXGROUPKEY))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ActionType = LE_32(EncrActionTypeSetGroupKey);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ActionType = LE_32(EncrActionTypeSetKey);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.Length = LE_16(sizeof (pCmd->KeyParam));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyTypeId = LE_16(kv->keyTypeId);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyInfo = LE_32(kv->keyFlags);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyIndex = LE_32(kv->keyIndex);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: includes TKIP MIC keys */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(&pCmd->KeyParam.Key, &kv->key, kv->keyLen);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (kv->keyTypeId) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case KEY_TYPE_ID_WEP:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyLen = LE_16(kv->keyLen);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case KEY_TYPE_ID_TKIP:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyLen = LE_16(sizeof (TKIP_TYPE_KEY));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.Key.TkipKey.TkipRsc.low =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_16(kv->key.tkip.rsc.low);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.Key.TkipKey.TkipRsc.high =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(kv->key.tkip.rsc.high);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.Key.TkipKey.TkipTsc.low =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_16(kv->key.tkip.tsc.low);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.Key.TkipKey.TkipTsc.high =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China LE_32(kv->key.tkip.tsc.high);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case KEY_TYPE_ID_AES:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyLen = LE_16(sizeof (AES_TYPE_KEY));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef MWL_MBSS_SUPPORT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(pCmd->KeyParam.Macaddr, mac);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(pCmd->Macaddr, mac);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_UPDATE_ENCRYPTION);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_keyreset(struct mwl_softc *sc, const MWL_HAL_KEYVAL *kv,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN])
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY *pCmd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int retval;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China _VCMD_SETUP(pCmd, HostCmd_FW_UPDATE_ENCRYPTION_SET_KEY,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China HostCmd_CMD_UPDATE_ENCRYPTION);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->ActionType = LE_16(EncrActionTypeRemoveKey);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.Length = LE_16(sizeof (pCmd->KeyParam));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyTypeId = LE_16(kv->keyTypeId);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyInfo = LE_32(kv->keyFlags);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pCmd->KeyParam.KeyIndex = LE_32(kv->keyIndex);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef MWL_MBSS_SUPPORT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(pCmd->KeyParam.Macaddr, mac);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(pCmd->Macaddr, mac);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China retval = mwlExecuteCmd(sc, HostCmd_CMD_UPDATE_ENCRYPTION);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (retval);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* ARGSUSED */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic struct ieee80211_node *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_node_alloc(struct ieee80211com *ic)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_node *mn;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mn = kmem_zalloc(sizeof (struct mwl_node), KM_SLEEP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mn == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX stat+msg */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_MSG, "mwl: mwl_node_alloc(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "alloc node failed\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (&mn->mn_node);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_node_free(struct ieee80211_node *ni)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = ni->in_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_node *mn = MWL_NODE(ni);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mn->mn_staid != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China // mwl_hal_delstation(mn->mn_hvap, vap->iv_myaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China // delstaid(sc, mn->mn_staid);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mn->mn_staid = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_node_cleanup(ni);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(ni, sizeof (struct mwl_node));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Allocate a key cache slot for a unicast key. The
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * firmware handles key allocation and every station is
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * guaranteed key space so we are always successful.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_key_alloc(struct ieee80211com *ic, const struct ieee80211_key *k,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k->wk_keyix != IEEE80211_KEYIX_NONE ||
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (k->wk_flags & IEEE80211_KEY_GROUP)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!(&ic->ic_nw_keys[0] <= k &&
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China k < &ic->ic_nw_keys[IEEE80211_WEP_NKID])) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* should not happen */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CRYPTO, "mwl: mwl_key_alloc(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "bogus group key\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* give the caller what they requested */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *keyix = *rxkeyix = k - ic->ic_nw_keys;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CRYPTO, "mwl: mwl_key_alloc(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "alloc GROUP key keyix %x, rxkeyix %x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *keyix, *rxkeyix);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Firmware handles key allocation.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *keyix = *rxkeyix = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CRYPTO, "mwl: mwl_key_alloc(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "reset key index in key allocation\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Delete a key entry allocated by mwl_key_alloc.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_key_delete(struct ieee80211com *ic, const struct ieee80211_key *k)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_KEYVAL hk;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t bcastaddr[IEEE80211_ADDR_LEN] =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(&hk, 0, sizeof (hk));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyIndex = k->wk_keyix;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (k->wk_cipher->ic_cipher) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_CIPHER_WEP:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyTypeId = KEY_TYPE_ID_WEP;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_CIPHER_TKIP:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyTypeId = KEY_TYPE_ID_TKIP;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_CIPHER_AES_CCM:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyTypeId = KEY_TYPE_ID_AES;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX should not happen */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CRYPTO, "mwl: mwl_key_delete(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "unknown cipher %d\n", k->wk_cipher->ic_cipher);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mwl_hal_keyreset(sc, &hk, bcastaddr) == 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Set the key cache contents for the specified key. Key cache
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * slot(s) must already have been allocated by mwl_key_alloc.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* ARGSUSED */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_key_set(struct ieee80211com *ic, const struct ieee80211_key *k,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN])
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define GRPXMIT (IEEE80211_KEY_XMIT | IEEE80211_KEY_GROUP)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* NB: static wep keys are marked GROUP+tx/rx; GTK will be tx or rx */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#define IEEE80211_IS_STATICKEY(k) \
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (((k)->wk_flags & (GRPXMIT|IEEE80211_KEY_RECV)) == \
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (GRPXMIT|IEEE80211_KEY_RECV))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct ieee80211_cipher *cip = k->wk_cipher;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const uint8_t *macaddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_KEYVAL hk;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(&hk, 0, sizeof (hk));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyIndex = k->wk_keyix;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (cip->ic_cipher) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_CIPHER_WEP:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyTypeId = KEY_TYPE_ID_WEP;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyLen = k->wk_keylen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k->wk_keyix == ic->ic_def_txkey)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyFlags = KEY_FLAG_WEP_TXKEY;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!IEEE80211_IS_STATICKEY(k)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: WEP is never used for the PTK */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) addgroupflags(&hk, k);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_CIPHER_TKIP:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyTypeId = KEY_TYPE_ID_TKIP;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.key.tkip.tsc.high = (uint32_t)(k->wk_keytsc >> 16);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.key.tkip.tsc.low = (uint16_t)k->wk_keytsc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyFlags = KEY_FLAG_TSC_VALID | KEY_FLAG_MICKEY_VALID;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyLen = k->wk_keylen + IEEE80211_MICBUF_SIZE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!addgroupflags(&hk, k))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyFlags |= KEY_FLAG_PAIRWISE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_CIPHER_AES_CCM:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyTypeId = KEY_TYPE_ID_AES;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyLen = k->wk_keylen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!addgroupflags(&hk, k))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk.keyFlags |= KEY_FLAG_PAIRWISE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX should not happen */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CRYPTO, "mwl: mwl_key_set(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "unknown cipher %d\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China k->wk_cipher->ic_cipher);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: tkip mic keys get copied here too; the layout
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * just happens to match that in ieee80211_key.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memcpy(hk.key.aes, k->wk_key, hk.keyLen);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Locate address of sta db entry for writing key;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * the convention unfortunately is somewhat different
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * than how net80211, hostapd, and wpa_supplicant think.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: keys plumbed before the sta reaches AUTH state
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * will be discarded or written to the wrong sta db
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * entry because iv_bss is meaningless. This is ok
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * (right now) because we handle deferred plumbing of
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * WEP keys when the sta reaches AUTH state.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macaddr = ic->ic_bss->in_bssid;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k->wk_flags & IEEE80211_KEY_XMIT) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX plumb to local sta db too for static key wep */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_keyset(sc, &hk, ic->ic_macaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mwl_hal_keyset(sc, &hk, macaddr) == 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef IEEE80211_IS_STATICKEY
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#undef GRPXMIT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Plumb any static WEP key for the station. This is
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * necessary as we must propagate the key from the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * global key table of the vap to each sta db entry.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_setanywepkey(struct ieee80211com *ic, const uint8_t mac[IEEE80211_ADDR_LEN])
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((ic->ic_flags & (IEEE80211_F_PRIVACY|IEEE80211_F_WPA)) ==
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_F_PRIVACY &&
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_def_txkey != IEEE80211_KEYIX_NONE &&
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_nw_keys[ic->ic_def_txkey].wk_keyix != IEEE80211_KEYIX_NONE)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_key_set(ic, &ic->ic_nw_keys[ic->ic_def_txkey], mac);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_setglobalkeys(struct ieee80211com *ic)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_key *wk;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wk = &ic->ic_nw_keys[0];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (; wk < &ic->ic_nw_keys[IEEE80211_WEP_NKID]; wk++)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (wk->wk_keyix != IEEE80211_KEYIX_NONE)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_key_set(ic, wk, ic->ic_macaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaaddgroupflags(MWL_HAL_KEYVAL *hk, const struct ieee80211_key *k)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k->wk_flags & IEEE80211_KEY_GROUP) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k->wk_flags & IEEE80211_KEY_XMIT)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk->keyFlags |= KEY_FLAG_TXGROUPKEY;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k->wk_flags & IEEE80211_KEY_RECV)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hk->keyFlags |= KEY_FLAG_RXGROUPKEY;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Set/change channels.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_chan_set(struct mwl_softc *sc, struct mwl_channel *chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_CHANNEL hchan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int maxtxpow;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_chan_set(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "chan %u MHz/flags 0x%x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan->ic_freq, chan->ic_flags);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Convert to a HAL channel description with
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * the flags constrained to reflect the current
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * operating mode.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_mapchan(&hchan, chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_hal_intrset(sc, 0); /* disable interrupts */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_setchannel(sc, &hchan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Tx power is cap'd by the regulatory setting and
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * possibly a user-set limit. We pass the min of
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * these to the hal to apply them to the cal data
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * for this channel.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * XXX min bound?
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China maxtxpow = 2 * chan->ic_maxregpower;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (maxtxpow > 100)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China maxtxpow = 100;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_settxpower(sc, &hchan, maxtxpow / 2);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: potentially change mcast/mgt rates */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_setcurchanrates(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_curchan = hchan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_hal_intrset(sc, sc->sc_imask);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Convert net80211 channel to a HAL channel.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_mapchan(MWL_HAL_CHANNEL *hc, const struct mwl_channel *chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channel = chan->ic_ieee;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *(uint32_t *)&hc->channelFlags = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (((chan)->ic_flags & IEEE80211_CHAN_2GHZ) != 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channelFlags.FreqBand = MWL_FREQ_BAND_2DOT4GHZ;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (((chan)->ic_flags & IEEE80211_CHAN_5GHZ) != 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channelFlags.FreqBand = MWL_FREQ_BAND_5GHZ;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (((chan)->ic_flags & IEEE80211_CHAN_HT40) != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channelFlags.ChnlWidth = MWL_CH_40_MHz_WIDTH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (((chan)->ic_flags & IEEE80211_CHAN_HT40U) != 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channelFlags.ExtChnlOffset =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_EXT_CH_ABOVE_CTRL_CH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channelFlags.ExtChnlOffset =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_EXT_CH_BELOW_CTRL_CH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc->channelFlags.ChnlWidth = MWL_CH_20_MHz_WIDTH;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX 10MHz channels */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Return the phy mode for with the specified channel.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaenum ieee80211_phymode
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_chan2mode(const struct mwl_channel *chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (IEEE80211_IS_CHAN_HTA(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_11NA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_HTG(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_11NG);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_108G(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_TURBO_G);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_ST(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_STURBO_A);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_TURBO(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_TURBO_A);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_HALF(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_HALF);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_QUARTER(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_QUARTER);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_A(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_11A);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_ANYG(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_11G);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_B(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_11B);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China else if (IEEE80211_IS_CHAN_FHSS(chan))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_FH);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: should not get here */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_chan2mode(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "cannot map channel to mode; freq %u flags 0x%x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan->ic_freq, chan->ic_flags);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (IEEE80211_MODE_11B);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* XXX inline or eliminate? */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaconst struct ieee80211_rateset *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_get_suprates(struct ieee80211com *ic, const struct mwl_channel *c)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX does this work for 11ng basic rates? */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (&ic->ic_sup_rates[mwl_chan2mode(c)]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Inform firmware of tx rate parameters.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Called after a channel change.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_setcurchanrates(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct ieee80211_rateset *rs;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_TXRATE rates;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(&rates, 0, sizeof (rates));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rs = mwl_get_suprates(ic, sc->sc_cur_chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* rate used to send management frames */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rates.MgtRate = rs->ir_rates[0] & IEEE80211_RATE_VAL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* rate used to send multicast frames */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rates.McastRate = rates.MgtRate;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mwl_hal_settxrate_auto(sc, &rates));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic const struct mwl_hal_channel *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafindhalchannel(const struct mwl_softc *sc, const MWL_HAL_CHANNEL *c)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct mwl_hal_channel *hc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const MWL_HAL_CHANNELINFO *ci;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int chan = c->channel, i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->channelFlags.FreqBand == MWL_FREQ_BAND_2DOT4GHZ) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China i = chan - 1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->channelFlags.ChnlWidth == MWL_CH_40_MHz_WIDTH) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci = &sc->sc_40M;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->channelFlags.ExtChnlOffset ==
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_EXT_CH_BELOW_CTRL_CH)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China i -= 4;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci = &sc->sc_20M;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* 2.4G channel table is directly indexed */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = ((unsigned)i < ci->nchannels) ? &ci->channels[i] : NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else if (c->channelFlags.FreqBand == MWL_FREQ_BAND_5GHZ) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->channelFlags.ChnlWidth == MWL_CH_40_MHz_WIDTH) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci = &sc->sc_40M_5G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (c->channelFlags.ExtChnlOffset ==
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_EXT_CH_BELOW_CTRL_CH)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan -= 4;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ci = &sc->sc_20M_5G;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* 5GHz channel table is sparse and must be searched */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < ci->nchannels; i++)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ci->channels[i].ieee == chan)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = (i < ci->nchannels) ? &ci->channels[i] : NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hc = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (hc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Map SKU+country code to region code for radar bin'ing.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_map2regioncode(const struct mwl_regdomain *rd)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (rd->regdomain) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_FCC:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_FCC3:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_FCC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_CA:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_IC);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_ETSI:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_ETSI2:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_ETSI3:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (rd->country == CTRY_SPAIN)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_SPAIN);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (rd->country == CTRY_FRANCE || rd->country == CTRY_FRANCE2)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_FRANCE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX force 1.3.1 radar type */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_ETSI_131);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_JAPAN:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_MKK);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_ROW:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_DGT); /* Taiwan */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_APAC:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_APAC2:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case SKU_APAC3:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_AUS); /* Australia */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX KOREA? */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DOMAIN_CODE_FCC); /* XXX? */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Setup the rx data structures. This should only be
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * done once or we may get out of sync with the firmware.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_startrecv(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rx_ring *ring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxbuf *bf, *prev;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring = &sc->sc_rxring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = ring->buf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China prev = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < MWL_RX_RING_COUNT; i++, bf++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = bf->bf_desc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: DMA buffer contents is known to be unmodified
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * so there's no need to flush the data cache.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Setup descriptor.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->QosCtrl = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->RSSI = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Status = EAGLE_RXD_STATUS_IDLE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Channel = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->PktLen = LE_16(MWL_AGGR_SIZE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->SQ2 = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pPhysBuffData = LE_32(bf->bf_baddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: don't touch pPhysNext, set once */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->RxControl = EAGLE_RXD_CTRL_DRIVER_OWN;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China i * sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (prev != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = prev->bf_desc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pPhysNext = LE_32(bf->bf_daddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China prev = bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (prev != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = prev->bf_desc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pPhysNext = ring->physaddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* set filters, etc. */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_mode_init(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_mode_init(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: Ignore promisc in hostap mode; it's set by the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * bridge. This is wrong but we have no way to
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * identify internal requests (from the bridge)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * versus external requests such as for tcpdump.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* mwl_setmcastfilter - not support now */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_setpromisc(sc, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Kick the firmware to tell it there are new tx descriptors
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * for processing. The driver says what h/w q has work in
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * case the f/w ever gets smarter.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/* ARGSUSED */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_txstart(struct mwl_softc *sc, int qnum)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_H2A_INTERRUPT_EVENTS,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MACREG_H2ARIC_BIT_PPA_READY);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_send(ieee80211com_t *ic, mblk_t *mp, uint8_t type)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_tx_ring *ring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_frame *wh, *wh1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_node *ni = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err, off;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int mblen, pktlen, hdrlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mblk_t *m, *m0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint8_t *addr_4, *txbuf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint16_t *pfwlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_TXLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = DDI_SUCCESS;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!MWL_IS_RUNNING(sc) || MWL_IS_SUSPEND(sc)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ENXIO;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring = &sc->sc_txring[1];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ring->queued > 15) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_send(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "no txbuf, %d\n", ring->queued);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_need_sched = 1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_tx_nobuf++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ENOMEM;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China m = allocb(msgdsize(mp) + 32, BPRI_MED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (m == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_send():"
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "can't alloc mblk.\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = DDI_FAILURE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (off = 0, m0 = mp; m0 != NULL; m0 = m0->b_cont) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mblen = MBLKL(m0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) bcopy(m0->b_rptr, m->b_rptr + off, mblen);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China off += mblen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China m->b_wptr += off;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)m->b_rptr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ni = ieee80211_find_txnode(ic, wh->i_addr1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ni == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = DDI_FAILURE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_tx_err++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China hdrlen = sizeof (*wh);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pktlen = msgdsize(m);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ieee80211_encap(ic, m, ni);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China const struct ieee80211_cipher *cip;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_key *k;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China k = ieee80211_crypto_encap(ic, m);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (k == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_tx_err++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = DDI_FAILURE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail3;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Adjust the packet length for the crypto additions
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * done during encap and any other bits that the f/w
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * will add later on.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China cip = k->wk_cipher;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pktlen += cip->ic_header + cip->ic_miclen + cip->ic_trailer;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* packet header may have moved, reset our local pointer */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)m->b_rptr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = &ring->desc[ring->cur];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = &ring->buf[ring->cur];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->bf_node = ieee80211_ref_node(ni);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China txbuf = (uint8_t *)bf->bf_mem;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * inject FW specific fields into the 802.11 frame
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * 2 bytes FW len (inject)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * 24 bytes 802.11 frame header
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * 6 bytes addr4 (inject)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * n bytes 802.11 frame body
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pfwlen = (uint16_t *)txbuf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *pfwlen = pktlen - hdrlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wh1 = (struct ieee80211_frame *)(txbuf + 2);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bcopy(wh, wh1, sizeof (struct ieee80211_frame));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China addr_4 = txbuf + (sizeof (struct ieee80211_frame) + sizeof (uint16_t));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) memset(addr_4, 0, 6);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bcopy(m->b_rptr + sizeof (struct ieee80211_frame), txbuf + 32, *pfwlen);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pktlen += 8;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(bf->txbuf_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pktlen,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->QosCtrl = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->PktLen = (uint16_t)pktlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->PktPtr = bf->bf_baddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Status = LE_32(EAGLE_TXD_STATUS_FW_OWNED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Format = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pad = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->ack_wcb_addr = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->TxPriority = 1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_send(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "tx desc Status %x, DataRate %x, TxPriority %x, QosCtrl %x, "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "PktLen %x, SapPktInfo %x, Format %x, Pad %x, ack_wcb_addr %x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Status, ds->DataRate, ds->TxPriority, ds->QosCtrl, ds->PktLen,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->SapPktInfo, ds->Format, ds->pad, ds->ack_wcb_addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur * sizeof (struct mwl_txdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sizeof (struct mwl_txdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_send(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "pktlen = %u, slot = %u, queued = %x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mblen, ring->cur, ring->queued);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->queued++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur = (ring->cur + 1) % MWL_TX_RING_COUNT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: We don't need to lock against tx done because
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * this just prods the firmware to check the transmit
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * descriptors. The firmware will also start fetching
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * descriptors by itself if it notices new ones are
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * present when it goes to deliver a tx done interrupt
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * to the host. So if we race with tx done processing
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * it's ok. Delivering the kick here rather than in
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * mwl_tx_start is an optimization to avoid poking the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * firmware for each packet.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: the queue id isn't used so 0 is ok.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_hal_txstart(sc, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_stats.is_tx_frags++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_stats.is_tx_bytes += pktlen;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail3:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_free_node(ni);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail2:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China freemsg(m);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail1:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((type & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_DATA ||
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err == DDI_SUCCESS)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China freemsg(mp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_TXUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * This function is called periodically (every 200ms) during scanning to
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * switch from one channel to another.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_next_scan(void *arg)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ic->ic_state == IEEE80211_S_SCAN)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ieee80211_next_scan(ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_scan_id = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Convert a legacy rate set to a firmware bitmask.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint32_t
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaget_rate_bitmap(const struct ieee80211_rateset *rs)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t rates;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rates = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 0; i < rs->ir_nrates; i++)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (rs->ir_rates[i] & IEEE80211_RATE_VAL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 2: rates |= 0x001; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 4: rates |= 0x002; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 11: rates |= 0x004; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 22: rates |= 0x008; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 44: rates |= 0x010; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 12: rates |= 0x020; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 18: rates |= 0x040; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 24: rates |= 0x080; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 36: rates |= 0x100; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 48: rates |= 0x200; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 72: rates |= 0x400; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 96: rates |= 0x800; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 108: rates |= 0x1000; break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (rates);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Craft station database entry for station.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * NB: use host byte order here, the hal handles byte swapping.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic MWL_HAL_PEERINFO *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamkpeerinfo(MWL_HAL_PEERINFO *pi, const struct ieee80211_node *ni)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
cb2cd10c80b04aaf5cbff6a515927ff42d216c7dfei feng - Sun Microsystems - Beijing China (void) memset(pi, 0, sizeof (*pi));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pi->LegacyRateBitMap = get_rate_bitmap(&ni->in_rates);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China pi->CapInfo = ni->in_capinfo;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (pi);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China enum ieee80211_state ostate;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_channel *ic_chan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_node *ni = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_HAL_PEERINFO pi;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t chan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_scan_id != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_id);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_scan_id = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ostate = ic->ic_state;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_MSG, "mwl: mwl_newstate(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ostate %x -> nstate %x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ostate, nstate);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (nstate) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_S_INIT:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_S_SCAN:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ostate != IEEE80211_S_INIT) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic_chan = ic->ic_curchan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan = ieee80211_chan2ieee(ic, ic_chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (chan != 0 && chan != IEEE80211_CHAN_ANY) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cur_chan =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_channels[3 * chan - 2];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_MSG, "mwl: mwl_newstate(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "chan num is %u, sc chan is %u\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan, sc->sc_cur_chan->ic_ieee);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_chan_set(sc, sc->sc_cur_chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_scan_id = timeout(mwl_next_scan, (void *)sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China drv_usectohz(250000));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_S_AUTH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic_chan = ic->ic_curchan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan = ieee80211_chan2ieee(ic, ic_chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cur_chan = &sc->sc_channels[3 * chan - 2];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_MSG, "mwl: mwl_newstate(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "chan num is %u, sc chan is %u\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China chan, sc->sc_cur_chan->ic_ieee);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_chan_set(sc, sc->sc_cur_chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ni = ic->ic_bss;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_newstation(sc, ic->ic_macaddr, 0, 0, NULL, 0, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_setanywepkey(ic, ni->in_macaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_S_ASSOC:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case IEEE80211_S_RUN:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ni = ic->ic_bss;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_newstation(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr, 0, 0, mkpeerinfo(&pi, ni), 0, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_setglobalkeys(ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_setassocid(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_bss->in_bssid, ic->ic_bss->in_associd);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_setrates(ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_setrtsthreshold(sc, ic->ic_rtsthreshold);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_hal_setcsmode(sc, CSMODE_AUTO_ENA);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (sc->sc_newstate(ic, nstate, arg));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Set the interrupt mask.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_intrset(struct mwl_softc *sc, uint32_t mask)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_MASK, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hal_imask = mask;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_MASK, mask);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Return the current ISR setting and clear the cause.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_hal_getisr(struct mwl_softc *sc, uint32_t *status)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t cause;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China cause = mwl_ctl_read4(sc, MACREG_REG_A2H_INTERRUPT_CAUSE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (cause == 0xffffffff) { /* card removed */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China cause = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China } else if (cause != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* clear cause bits */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_ctl_write4(sc, MACREG_REG_A2H_INTERRUPT_CAUSE,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China cause & ~sc->sc_hal_imask);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_ctl_read4(sc, MACREG_REG_INT_CODE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China cause &= sc->sc_hal_imask;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *status = cause;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_tx_intr(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_tx_ring *ring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_txdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t status;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_TXLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring = &sc->sc_txring[1];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!(ring->queued)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_TXUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->txdesc_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (;;) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = &ring->desc[ring->next];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China status = LE_32(ds->Status);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & LE_32(EAGLE_TXD_STATUS_FW_OWNED)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status == LE_32(EAGLE_TXD_STATUS_IDLE)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_tx_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "recv tx desc status %x, datarate %x, txpriority %x, "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "QosCtrl %x, pktLen %x, SapPktInfo %x, Format %x, "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "pad %x, ack_wcb_addr %x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Status, ds->DataRate, ds->TxPriority,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->QosCtrl, ds->PktLen, ds->SapPktInfo,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Format, ds->pad, ds->ack_wcb_addr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* descriptor is no longer valid */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Status = LE_32(EAGLE_TXD_STATUS_IDLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->txdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->next * sizeof (struct mwl_txdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sizeof (struct mwl_txdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->queued--;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->next = (ring->next + 1) % MWL_TX_RING_COUNT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_tx_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China " tx done idx=%u, queued= %d\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->next, ring->queued);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_need_sched &&
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (ring->queued < MWL_TX_RING_COUNT)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_need_sched = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_tx_update(ic->ic_mach);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_TXUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Convert hardware signal strength to rssi. The value
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * provided by the device has the noise floor added in;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * we need to compensate for this but we don't have that
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * so we use a fixed value.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * The offset of 8 is good for both 2.4 and 5GHz. The LNA
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * offset is already set as part of the initial gain. This
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * will give at least +/- 3dB for 2.4GHz and +/- 5dB for 5GHz.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinacvtrssi(uint8_t ssi)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int rssi = (int)ssi + 8;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* XXX hack guess until we have a real noise floor */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rssi = 2 * (87 - rssi); /* NB: .5 dBm units */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (rssi < 0 ? 0 : rssi > 127 ? 127 : rssi);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_rx_intr(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rx_ring *ring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_node *ni;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_frame *wh;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxbuf *bf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_rxdesc *ds;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mblk_t *mp0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int ntodo, len, rssi;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint8_t *data, status;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_RXLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring = &sc->sc_rxring;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (ntodo = MWL_RX_RING_COUNT; ntodo > 0; ntodo--) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf = &ring->buf[ring->cur];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds = bf->bf_desc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China data = bf->bf_mem;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur * sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ds->RxControl != EAGLE_RXD_CTRL_DMA_OWN)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China status = ds->Status;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & EAGLE_RXD_STATUS_DECRYPT_ERR_MASK) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_CRYPTO, "mwl: mwl_rx_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "rx decrypt error\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_rx_err++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Sync the data buffer.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China len = LE_16(ds->PktLen);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(bf->rxbuf_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bf->rxbuf_dma.alength,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (len < 32 || len > sc->sc_dmabuf_size) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_RX, "mwl: mwl_rx_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "packet len error %d\n", len);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_rx_err++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto rxnext;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mp0 = allocb(sc->sc_dmabuf_size, BPRI_MED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mp0 == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_RX, "mwl: mwl_rx_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "alloc mblk error\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_rx_nobuf++;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto rxnext;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bcopy(data+ 2, mp0->b_wptr, 24);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mp0->b_wptr += 24;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China bcopy(data + 32, mp0->b_wptr, len - 32);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mp0->b_wptr += (len - 32);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)mp0->b_rptr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_FC0_TYPE_CTL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China freemsg(mp0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto rxnext;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * The f/w strips WEP header but doesn't clear
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * the WEP bit; mark the packet with M_WEP so
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * net80211 will treat the data as decrypted.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * While here also clear the PWR_MGT bit since
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * power save is handled by the firmware and
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * passing this up will potentially cause the
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * upper layer to put a station in power save
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * (except when configured with MWL_HOST_PS_SUPPORT).
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef MWL_HOST_PS_SUPPORT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#else
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wh->i_fc[1] &= ~(IEEE80211_FC1_WEP | IEEE80211_FC1_PWR_MGT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* calculate rssi early so we can re-use for each aggregate */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rssi = cvtrssi(ds->RSSI);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ni = ieee80211_find_rxnode(ic, wh);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* send the frame to the 802.11 layer */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ieee80211_input(ic, mp0, ni, rssi, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_free_node(ni);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinarxnext:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Setup descriptor.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->QosCtrl = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->RSSI = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Status = EAGLE_RXD_STATUS_IDLE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->Channel = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->PktLen = LE_16(MWL_AGGR_SIZE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->SQ2 = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->pPhysBuffData = bf->bf_baddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: don't touch pPhysNext, set once */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ds->RxControl = EAGLE_RXD_CTRL_DRIVER_OWN;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_dma_sync(ring->rxdesc_dma.dma_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur * sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sizeof (struct mwl_rxdesc),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* NB: ignore ENOMEM so we process more descriptors */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ring->cur = (ring->cur + 1) % MWL_RX_RING_COUNT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_RXUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*ARGSUSED*/
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint_t
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_softintr(caddr_t data, caddr_t unused)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)data;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Check if the soft interrupt is triggered by another
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * driver at the same level.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc->sc_rx_pend) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_rx_pend = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_rx_intr(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_INTR_UNCLAIMED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*ARGSUSED*/
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic uint_t
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_intr(caddr_t arg, caddr_t unused)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint32_t status;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!MWL_IS_RUNNING(sc) || MWL_IS_SUSPEND(sc)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_INTR_UNCLAIMED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Figure out the reason(s) for the interrupt.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_hal_getisr(sc, &status); /* NB: clears ISR too */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_INTR_UNCLAIMED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_RX_RDY) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_rx_pend = 1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_trigger_softint(sc->sc_softintr_hdl, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_TX_DONE) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_tx_intr(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_BA_WATCHDOG) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ba watchdog\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_OPC_DONE) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "opc done\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_MAC_EVENT) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mac event\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_ICV_ERROR) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ICV error\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_QUEUE_EMPTY) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "queue empty\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_QUEUE_FULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "queue full\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_RADAR_DETECT) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "radar detect\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status & MACREG_A2HRIC_BIT_CHAN_SWITCH) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_INTR, "mwl: mwl_intr(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "chan switch\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_init(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_hal_intrset(sc, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_txantenna = 0; /* h/w default */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_rxantenna = 0; /* h/w default */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setantenna(sc, WL_ANTENNATYPE_RX, sc->sc_rxantenna);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set rx antenna\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setantenna(sc, WL_ANTENNATYPE_TX, sc->sc_txantenna);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set tx antenna\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setradio(sc, 1, WL_AUTO_PREAMBLE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set radio\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setwmm(sc, (ic->ic_flags & IEEE80211_F_WME) != 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set wme\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* select default channel */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_ibss_chan = &ic->ic_sup_channels[0];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_curchan = ic->ic_ibss_chan;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cur_chan = &sc->sc_channels[1];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_chan_set(sc, sc->sc_cur_chan);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set wme\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setrateadaptmode(sc, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set rate adapt mode\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setoptimizationlevel(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (ic->ic_flags & IEEE80211_F_BURST) != 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set optimization level\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setregioncode(sc, mwl_map2regioncode(&sc->sc_regdomain));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set regioncode\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_startrecv(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set start recv logic\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Enable interrupts.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_imask = MACREG_A2HRIC_BIT_RX_RDY
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREG_A2HRIC_BIT_TX_DONE
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREG_A2HRIC_BIT_OPC_DONE
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREG_A2HRIC_BIT_ICV_ERROR
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREG_A2HRIC_BIT_RADAR_DETECT
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREG_A2HRIC_BIT_CHAN_SWITCH
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREG_A2HRIC_BIT_BA_WATCHDOG
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China | MACREQ_A2HRIC_BIT_TX_ACK;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_hal_intrset(sc, sc->sc_imask);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_start(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not get hal start\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setinframode(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: init(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set infra mode\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_resume(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int qid, err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_fwload(sc, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_resume(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to load fw\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_gethwspecs(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_resume(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to get hw spec\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_rx_ring(sc, MWL_RX_RING_COUNT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_resume(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc cmd dma buffer\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (qid = 0; qid < MWL_NUM_TX_QUEUES; qid++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_tx_ring(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_txring[qid], MWL_TX_RING_COUNT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_resume(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc tx ring %d\n", qid);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_setupdma(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_resume(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not setup dma\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_setup_txq(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_resume(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not setup txq\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_stop(struct mwl_softc *sc)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* by pass if it's quiesced */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!MWL_IS_QUIESCE(sc))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_stop(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_stop(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not stop hw\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* by pass if it's quiesced */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!MWL_IS_QUIESCE(sc))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_stat(void *arg, uint_t stat, uint64_t *val)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_node *ni = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211_rateset *rs = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (stat) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_IFSPEED:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ni = ic->ic_bss;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China rs = &ni->in_rates;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = ((ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) ?
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (rs->ir_rates[ni->in_txrate] & IEEE80211_RATE_VAL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China : ic->ic_fixed_rate) / 2 * 1000000;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_NOXMTBUF:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = sc->sc_tx_nobuf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_NORCVBUF:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = sc->sc_rx_nobuf;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_IERRORS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = sc->sc_rx_err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_RBYTES:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_bytes;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_IPACKETS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_frags;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_OBYTES:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_bytes;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_OPACKETS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_frags;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case MAC_STAT_OERRORS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_TX_FAILED:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = sc->sc_tx_err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_TX_RETRANS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *val = sc->sc_tx_retries;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_FCS_ERRORS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_WEP_ERRORS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_TX_FRAGS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_TX:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_RTS_SUCCESS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_RTS_FAILURE:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_ACK_FAILURE:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_RX_FRAGS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_RX:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case WIFI_STAT_RX_DUPS:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (ieee80211_stat(ic, stat, val));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (ENOTSUP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_start(void *arg)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_init(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_HW, "mwl: mwl_m_start():"
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Hardware initialization failed\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto fail1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_flags |= MWL_F_RUNNING;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinafail1:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_stop(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_stop(void *arg)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_stop(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_flags &= ~MWL_F_RUNNING;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*ARGSUSED*/
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_promisc(void *arg, boolean_t on)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setpromisc(sc, on);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*ARGSUSED*/
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (ENOTSUP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*ARGSUSED*/
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_unicst(void *arg, const uint8_t *macaddr)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (ENOTSUP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic mblk_t *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_tx(void *arg, mblk_t *mp)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mblk_t *next;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (MWL_IS_SUSPEND(sc)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China freemsgchain(mp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * No data frames go out unless we're associated; this
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * should not happen as the 802.11 layer does not enable
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * the xmit queue until we enter the RUN state.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ic->ic_state != IEEE80211_S_RUN) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_TX, "mwl: mwl_m_tx(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "discard, state %u\n", ic->ic_state);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China freemsgchain(mp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China while (mp != NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China next = mp->b_next;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mp->b_next = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_send(ic, mp, IEEE80211_FC0_TYPE_DATA) !=
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mp->b_next = next;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mp = next;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic void
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_ioctl(void* arg, queue_t *wq, mblk_t *mp)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ieee80211_ioctl(ic, wq, mp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err == ENETRESET) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ic->ic_des_esslen) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (MWL_IS_RUNNING(sc)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_init(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ieee80211_new_state(ic,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_S_SCAN, -1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Call back function for get/set proporty
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_getprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t wldp_length, void *wldp_buf)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ieee80211_getprop(&sc->sc_ic, pr_name, wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer wldp_length, wldp_buf);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyermwl_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t prh)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct mwl_softc *sc = (struct mwl_softc *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ieee80211_propinfo(&sc->sc_ic, pr_name, wldp_pr_num, prh);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_m_setprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint_t wldp_length, const void *wldp_buf)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc = (struct mwl_softc *)arg;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211com_t *ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int err;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ieee80211_setprop(ic, pr_name, wldp_pr_num, wldp_length,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wldp_buf);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err == ENETRESET) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ic->ic_des_esslen) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (MWL_IS_RUNNING(sc)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_init(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ieee80211_new_state(ic,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_S_SCAN, -1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct ieee80211com *ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int i, err, qid, instance;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int intr_type, intr_count, intr_actual;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China char strbuf[32];
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint8_t csz;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China uint16_t vendor_id, device_id, command;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wifi_data_t wd = { 0 };
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_register_t *macp;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (cmd) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case DDI_ATTACH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case DDI_RESUME:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc = ddi_get_soft_state(mwl_soft_state_p,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_get_instance(devinfo));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ASSERT(sc != NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_flags &= ~MWL_F_SUSPEND;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mwl_resume(sc) != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to resume\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (MWL_IS_RUNNING(sc)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mwl_init(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "resume now\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China instance = ddi_get_instance(devinfo);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (ddi_soft_state_zalloc(mwl_soft_state_p,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_get_instance(devinfo)) != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "Unable to alloc soft state\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc = ddi_get_soft_state(mwl_soft_state_p, ddi_get_instance(devinfo));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic = &sc->sc_ic;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_dev = devinfo;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* PCI configuration space */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_regs_map_setup(devinfo, 0, (caddr_t *)&sc->sc_cfg_base, 0, 0,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &mwl_reg_accattr, &sc->sc_cfg_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ddi_regs_map_setup() failed");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China csz = ddi_get8(sc->sc_cfg_handle,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint8_t *)(sc->sc_cfg_base + PCI_CONF_CACHE_LINESZ));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (!csz)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China csz = 16;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_cachelsz = csz << 2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_dmabuf_size = roundup(IEEE80211_MAX_LEN, sc->sc_cachelsz);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China vendor_id = ddi_get16(sc->sc_cfg_handle,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint16_t *)(sc->sc_cfg_base + PCI_CONF_VENID));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China device_id = ddi_get16(sc->sc_cfg_handle,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint16_t *)(sc->sc_cfg_base + PCI_CONF_DEVID));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "vendor 0x%x, device id 0x%x, cache size %d\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China vendor_id, device_id, csz);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Enable response to memory space accesses,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * and enabe bus master.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China command = PCI_COMM_MAE | PCI_COMM_ME;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_put16(sc->sc_cfg_handle,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint16_t *)((uintptr_t)(sc->sc_cfg_base) + PCI_CONF_COMM),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China command);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_put8(sc->sc_cfg_handle,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint8_t *)(sc->sc_cfg_base + PCI_CONF_LATENCY_TIMER), 0xa8);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_put8(sc->sc_cfg_handle,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (uint8_t *)(sc->sc_cfg_base + PCI_CONF_ILINE), 0x10);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* BAR0 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_regs_map_setup(devinfo, 1,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_mem_base, 0, 0, &mwl_reg_accattr, &sc->sc_mem_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "i/o space failed");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail1;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* BAR1 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_regs_map_setup(devinfo, 2,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_io_base, 0, 0, &mwl_reg_accattr, &sc->sc_io_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "memory space failed");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail2;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "PCI configuration is done successfully\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Alloc cmd DMA buffer for firmware download
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_cmdbuf(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc cmd dma buffer\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail3;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_imask = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_hw_flags = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_flags = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Some cards have SDRAM. When loading firmware we need
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * to reset the SDRAM controller prior to doing this.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * When the SDRAMSIZE is non-zero we do that work in
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * mwl_hal_fwload.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (device_id) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 0x2a02: /* CB82 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 0x2a03: /* CB85 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 0x2a08: /* MC85_B1 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 0x2a0b: /* CB85AP */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 0x2a24:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_SDRAMSIZE_Addr = 0x40fe70b7; /* 8M SDRAM */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case 0x2a04: /* MC85 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_SDRAMSIZE_Addr = 0x40fc70b7; /* 16M SDRAM */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_fwload(sc, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "firmware download failed\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail4;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "firmware download successfully\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_gethwspecs(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to get hw spec\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail4;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_getchannels(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "failed to get channels\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail4;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Alloc rx DMA buffer
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_rx_ring(sc, MWL_RX_RING_COUNT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc cmd dma buffer\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail5;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Alloc rx DMA buffer
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (qid = 0; qid < MWL_NUM_TX_QUEUES; qid++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_alloc_tx_ring(sc,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China &sc->sc_txring[qid], MWL_TX_RING_COUNT);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not alloc tx ring %d\n", qid);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail6;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_setupdma(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not setup dma\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail6;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_setup_txq(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not setup txq\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail6;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(ic->ic_macaddr, sc->sc_hwspecs.macAddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mwl MAC:%2x:%2x:%2x:%2x:%2x:%2x\n",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr[0],
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr[1],
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr[2],
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr[3],
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr[4],
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_macaddr[5]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_setmac_locked(sc, ic->ic_macaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) { /* NB: mwl_setupdma prints msg */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not set mac\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail6;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_init(&sc->sc_glock, NULL, MUTEX_DRIVER, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_init(&sc->sc_rxlock, NULL, MUTEX_DRIVER, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_init(&sc->sc_txlock, NULL, MUTEX_DRIVER, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* set supported rates */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_sup_rates[IEEE80211_MODE_11B] = mwl_rateset_11b;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_sup_rates[IEEE80211_MODE_11G] = mwl_rateset_11g;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* set supported .11b and .11g channels (1 through 14) */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (i = 1; i <= 14; i++) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_sup_channels[i].ich_freq =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_sup_channels[i].ich_flags =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_state = IEEE80211_S_INIT;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* set device capabilities */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_caps =
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_C_TXPMGT | /* tx power management */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_C_SHPREAMBLE | /* short preamble supported */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_C_SHSLOT; /* short slot time supported */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* WPA/WPA2 support */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_WPA; /* Support WPA/WPA2 */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* Enable hardware encryption */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_WEP | IEEE80211_C_TKIP | IEEE80211_C_AES_CCM;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_xmit = mwl_send;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_attach(ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* register WPA door */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_register_door(ic, ddi_driver_name(devinfo),
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_get_instance(devinfo));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /* override state transition machine */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_newstate = ic->ic_newstate;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_newstate = mwl_newstate;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_node_alloc = mwl_node_alloc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_node_free = mwl_node_free;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_crypto.cs_max_keyix = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_crypto.cs_key_alloc = mwl_key_alloc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_crypto.cs_key_delete = mwl_key_delete;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_crypto.cs_key_set = mwl_key_set;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_media_init(ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ic->ic_def_txkey = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mwl_hal_newstation(sc, ic->ic_macaddr, 0, 0, NULL, 0, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "could not create new station\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail7;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(ic->ic_bss->in_bssid, ic->ic_macaddr);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China // mwl_setglobalkeys(ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_get_supported_types(devinfo, &intr_type);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((err != DDI_SUCCESS) || (!(intr_type & DDI_INTR_TYPE_FIXED))) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "fixed type interrupt is not supported\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail7;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_get_nintrs(devinfo, DDI_INTR_TYPE_FIXED, &intr_count);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((err != DDI_SUCCESS) || (intr_count != 1)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "no fixed interrupts\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail7;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_intr_htable = kmem_zalloc(sizeof (ddi_intr_handle_t), KM_SLEEP);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_alloc(devinfo, sc->sc_intr_htable,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_INTR_TYPE_FIXED, 0, intr_count, &intr_actual, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((err != DDI_SUCCESS) || (intr_actual != 1)) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ddi_intr_alloc() failed 0x%x\n", err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail8;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_get_pri(sc->sc_intr_htable[0], &sc->sc_intr_pri);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ddi_intr_get_pri() failed 0x%x\n", err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail9;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_add_softint(devinfo, &sc->sc_softintr_hdl,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China DDI_INTR_SOFTPRI_MAX, mwl_softintr, (caddr_t)sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ddi_add_softintr() failed");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail9;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_add_handler(sc->sc_intr_htable[0], mwl_intr,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (caddr_t)sc, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ddi_intr_addr_handle() failed\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail10;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_intr_enable(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "ddi_intr_enable() failed\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail11;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Provide initial settings for the WiFi plugin; whenever this
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * information changes, we need to call mac_plugindata_update()
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wd.wd_opmode = ic->ic_opmode;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China wd.wd_secalloc = WIFI_SEC_NONE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if ((macp = mac_alloc(MAC_VERSION)) == NULL) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "MAC version mismatch\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail12;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_driver = sc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_dip = devinfo;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_src_addr = ic->ic_macaddr;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_callbacks = &mwl_m_callbacks;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_min_sdu = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_max_sdu = IEEE80211_MTU;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_pdata = &wd;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China macp->m_pdata_size = sizeof (wd);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = mac_register(macp, &ic->ic_mach);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_free(macp);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mac_register err %x\n", err);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail12;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Create minor node of type DDI_NT_NET_WIFI
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) snprintf(strbuf, sizeof (strbuf), "%s%d",
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "mwl", instance);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China err = ddi_create_minor_node(devinfo, strbuf, S_IFCHR,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China instance + 1, DDI_NT_NET_WIFI, 0);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (err != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "create minor node error\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China goto attach_fail13;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Notify link is down now
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_link_update(ic->ic_mach, LINK_STATE_DOWN);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_attach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "driver attach successfully\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail13:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mac_disable(ic->ic_mach);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mac_unregister(ic->ic_mach);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail12:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_disable(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail11:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_remove_handler(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail10:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_remove_softint(sc->sc_softintr_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_softintr_hdl = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail9:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_free(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail8:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail7:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_txlock);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_rxlock);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_glock);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail6:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China while (--qid >= 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_tx_ring(sc, &sc->sc_txring[qid]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail5:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_rx_ring(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail4:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_cmdbuf(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail3:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_mem_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail2:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_io_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail1:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_cfg_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaattach_fail0:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_soft_state_free(mwl_soft_state_p, ddi_get_instance(devinfo));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinastatic int32_t
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int qid;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc = ddi_get_soft_state(mwl_soft_state_p, ddi_get_instance(devinfo));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ASSERT(sc != NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China switch (cmd) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case DDI_DETACH:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China break;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China case DDI_SUSPEND:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (MWL_IS_RUNNING(sc))
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_stop(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (qid = 0; qid < MWL_NUM_TX_QUEUES; qid++)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_tx_ring(sc, &sc->sc_txring[qid]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_rx_ring(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_flags |= MWL_F_SUSPEND;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_GUNLOCK(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_SR, "mwl: mwl_detach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "suspend now\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China default:
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (mac_disable(sc->sc_ic.ic_mach) != 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Unregister from the MAC layer subsystem
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) mac_unregister(sc->sc_ic.ic_mach);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_remove_softint(sc->sc_softintr_hdl);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_softintr_hdl = NULL;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_disable(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_remove_handler(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China (void) ddi_intr_free(sc->sc_intr_htable[0]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China kmem_free(sc->sc_intr_htable, sizeof (ddi_intr_handle_t));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * detach ieee80211 layer
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ieee80211_detach(&sc->sc_ic);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China for (qid = 0; qid < MWL_NUM_TX_QUEUES; qid++)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_tx_ring(sc, &sc->sc_txring[qid]);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_rx_ring(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_free_cmdbuf(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_txlock);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_rxlock);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_glock);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_mem_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_io_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_cfg_handle);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_remove_minor_node(devinfo, NULL);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_soft_state_free(mwl_soft_state_p, ddi_get_instance(devinfo));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China MWL_DBG(MWL_DBG_ATTACH, "mwl: mwl_detach(): "
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China "detach successfully\n");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China/*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * quiesce(9E) entry point.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * This function is called when the system is single-threaded at high
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * PIL with preemption disabled. Therefore, this function must not be
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * blocked.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China *
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * DDI_FAILURE indicates an error condition and should almost never happen.
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaint
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinamwl_quiesce(dev_info_t *dip)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China struct mwl_softc *sc;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc = ddi_get_soft_state(mwl_soft_state_p, ddi_get_instance(dip));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (sc == NULL)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_FAILURE);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#ifdef DEBUG
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_dbg_flags = 0;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China#endif
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * No more blocking is allowed while we are in quiesce(9E) entry point
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sc->sc_flags |= MWL_F_QUIESCE;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China /*
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China * Disable all interrupts
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China */
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mwl_stop(sc);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (DDI_SUCCESS);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaint
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China_init(void)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int status;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China status = ddi_soft_state_init(&mwl_soft_state_p,
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China sizeof (struct mwl_softc), 1);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status != 0)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (status);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_init_ops(&mwl_dev_ops, "mwl");
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China status = mod_install(&modlinkage);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status != 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_fini_ops(&mwl_dev_ops);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_soft_state_fini(&mwl_soft_state_p);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (status);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaint
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China_info(struct modinfo *modinfop)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (mod_info(&modlinkage, modinfop));
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing Chinaint
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China_fini(void)
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China{
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China int status;
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China status = mod_remove(&modlinkage);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China if (status == 0) {
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China mac_fini_ops(&mwl_dev_ops);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China ddi_soft_state_fini(&mwl_soft_state_p);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China }
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China return (status);
d8d810637042c2a73a269f125dee75e8ed1421d1fei feng - Sun Microsystems - Beijing China}