dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Use is subject to license terms.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Copyright (c) 2008 Atheros Communications Inc.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Permission to use, copy, modify, and/or distribute this software for any
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * purpose with or without fee is hereby granted, provided that the above
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * copyright notice and this permission notice appear in all copies.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
de710d24d2fae4468e64da999e1d952a247f142cJosef 'Jeff' Sipek#include <sys/sysmacros.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/param.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/types.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/signal.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/stream.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/termio.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/errno.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/file.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/cmn_err.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/stropts.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/strsubr.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/strtty.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/kbio.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/cred.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/stat.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/consdev.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/kmem.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/modctl.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/ddi.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/sunddi.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/pci.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/errno.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/mac_provider.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/dlpi.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/ethernet.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/list.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/byteorder.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/strsun.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/policy.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <inet/common.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <inet/nd.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <inet/mi.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <inet/wifi_ioctl.h>
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include <sys/mac_wifi.h>
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#include <sys/net80211.h>
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#include <sys/net80211_proto.h>
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#include <sys/net80211_ht.h>
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include "arn_ath9k.h"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include "arn_core.h"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include "arn_reg.h"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#include "arn_hw.h"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China#define ARN_MAX_RSSI 45 /* max rssi */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * Default 11n reates supported by this station.
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaextern struct ieee80211_htrateset ieee80211_rateset_11n;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * PIO access attributes for registers
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic ddi_device_acc_attr_t arn_reg_accattr = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_STRUCTURE_LE_ACC,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China DDI_DEFAULT_ACC
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * DMA access attributes for descriptors: NOT to be byte swapped.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic ddi_device_acc_attr_t arn_desc_accattr = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_DEVICE_ATTR_V0,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_STRUCTURE_LE_ACC,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China DDI_STRICTORDER_ACC,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China DDI_DEFAULT_ACC
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Describes the chip's DMA engine
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic ddi_dma_attr_t arn_dma_attr = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* version number */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0, /* low address */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xffffffffU, /* high address */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0x3ffffU, /* counter register max */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* alignment */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xFFF, /* burst sizes */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* minimum transfer size */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0x3ffffU, /* max transfer size */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xffffffffU, /* address register max */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* no scatter-gather */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* granularity of device */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0, /* DMA flags */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic ddi_dma_attr_t arn_desc_dma_attr = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DMA_ATTR_V0, /* version number */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0, /* low address */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xffffffffU, /* high address */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xffffffffU, /* counter register max */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0x1000, /* alignment */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xFFF, /* burst sizes */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* minimum transfer size */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xffffffffU, /* max transfer size */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0xffffffffU, /* address register max */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* no scatter-gather */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, /* granularity of device */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0, /* DMA flags */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#define ATH_DEF_CACHE_BYTES 32 /* default cache line size */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic kmutex_t arn_loglock;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void *arn_soft_state_p = NULL;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinastatic int arn_dwelltime = 200; /* scan interval */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_stat(void *, uint_t, uint64_t *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_start(void *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void arn_m_stop(void *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_promisc(void *, boolean_t);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_multicst(void *, boolean_t, const uint8_t *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_unicst(void *, const uint8_t *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic mblk_t *arn_m_tx(void *, mblk_t *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void arn_m_ioctl(void *, queue_t *, mblk_t *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_setprop(void *, const char *, mac_prop_id_t,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint_t, const void *);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int arn_m_getprop(void *, const char *, mac_prop_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t, void *);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void arn_m_propinfo(void *, const char *, mac_prop_id_t,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/* MAC Callcack Functions */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic mac_callbacks_t arn_m_callbacks = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_stat,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_start,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_stop,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_promisc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_multicst,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_unicst,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_tx,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_ioctl,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_m_setprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer arn_m_getprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer arn_m_propinfo
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_HW
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_REG_IO
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_QUEUE
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_EEPROM
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_XMIT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_RECV
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_CALIBRATE
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_CHANNEL
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_INTERRUPT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_REGULATORY
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_ANI
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_POWER_MGMT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_KEYCACHE
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_BEACON
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_RATE
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_INIT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_ATTACH
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_DEATCH
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_AGGR
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_RESET
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_FATAL
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_ANY
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * ARN_DBG_ALL
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinauint32_t arn_dbg_mask = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Exception/warning cases not leading to panic.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_problem(const int8_t *fmt, ...)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_list args;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_enter(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_start(args, fmt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China vcmn_err(CE_WARN, fmt, args);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_end(args);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_exit(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Normal log information independent of debug.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_log(const int8_t *fmt, ...)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_list args;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_enter(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_start(args, fmt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China vcmn_err(CE_CONT, fmt, args);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_end(args);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_exit(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_dbg(uint32_t dbg_flags, const int8_t *fmt, ...)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_list args;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (dbg_flags & arn_dbg_mask) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_enter(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_start(args, fmt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China vcmn_err(CE_CONT, fmt, args);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China va_end(args);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_exit(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Read and write, they both share the same lock. We do this to serialize
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * reads and writes on Atheros 802.11n PCI devices only. This is required
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * as the FIFO on these devices can only accept sanely 2 requests. After
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * that the device goes bananas. Serializing the reads/writes prevents this
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * from happening.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_iowrite32(struct ath_hal *ah, uint32_t reg_offset, uint32_t val)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = ah->ah_sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_enter(&sc->sc_serial_rw);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_put32(sc->sc_io_handle,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)), val);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_exit(&sc->sc_serial_rw);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_put32(sc->sc_io_handle,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)), val);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaunsigned int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_ioread32(struct ath_hal *ah, uint32_t reg_offset)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t val;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = ah->ah_sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_enter(&sc->sc_serial_rw);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China val = ddi_get32(sc->sc_io_handle,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_exit(&sc->sc_serial_rw);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China val = ddi_get32(sc->sc_io_handle,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (uint32_t *)((uintptr_t)(sc->mem) + (reg_offset)));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (val);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate an area of memory and a DMA handle for accessing it
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_alloc_dma_mem(dev_info_t *devinfo, ddi_dma_attr_t *dma_attr, size_t memsize,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_device_acc_attr_t *attr_p, uint_t alloc_flags,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint_t bind_flags, dma_area_t *dma_p)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate handle
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ddi_dma_alloc_handle(devinfo, dma_attr,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &dma_p->dma_hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate memory
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ddi_dma_mem_alloc(dma_p->dma_hdl, memsize, attr_p,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China alloc_flags, DDI_DMA_SLEEP, NULL, &dma_p->mem_va,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &dma_p->alength, &dma_p->acc_hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Bind the two together
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ddi_dma_addr_bind_handle(dma_p->dma_hdl, NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->mem_va, dma_p->alength, bind_flags,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_DMA_SLEEP, NULL, &dma_p->cookie, &dma_p->ncookies);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_DMA_MAPPED)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->nslots = ~0U;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->size = ~0U;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->token = ~0U;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->offset = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Free one allocated area of DMAable memory
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_free_dma_mem(dma_area_t *dma_p)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (dma_p->dma_hdl != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ddi_dma_unbind_handle(dma_p->dma_hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (dma_p->acc_hdl != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_dma_mem_free(&dma_p->acc_hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->acc_hdl = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_dma_free_handle(&dma_p->dma_hdl);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->ncookies = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dma_p->dma_hdl = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Initialize tx, rx. or beacon buffer list. Allocate DMA memory for
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * each buffer.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaarn_buflist_setup(dev_info_t *devinfo,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct arn_softc *sc,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China list_t *bflist,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct ath_buf **pbf,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct ath_desc **pds,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China int nbuf,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China uint_t dmabflags,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China uint32_t buflen)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i, err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_buf *bf = *pbf;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_desc *ds = *pds;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China list_create(bflist, sizeof (struct ath_buf),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China offsetof(struct ath_buf, bf_node));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < nbuf; i++, bf++, ds++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf->bf_desc = ds;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf->bf_daddr = sc->sc_desc_dma.cookie.dmac_address +
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ((uintptr_t)ds - (uintptr_t)sc->sc_desc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China list_insert_tail(bflist, bf);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* alloc DMA memory */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_alloc_dma_mem(devinfo, &arn_dma_attr,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China buflen, &arn_desc_accattr, DDI_DMA_STREAMING,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China dmabflags, &bf->bf_dma);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *pbf = bf;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *pds = ds;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Destroy tx, rx or beacon buffer list. Free DMA memory.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_buflist_cleanup(list_t *buflist)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_buf *bf;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!buflist)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf = list_head(buflist);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while (bf != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (bf->bf_m != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China freemsg(bf->bf_m);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf->bf_m = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Free DMA buffer */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_free_dma_mem(&bf->bf_dma);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (bf->bf_in != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_free_node(bf->bf_in);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf->bf_in = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China list_remove(buflist, bf);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf = list_head(buflist);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China list_destroy(buflist);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_desc_free(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_buflist_cleanup(&sc->sc_txbuf_list);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_buflist_cleanup(&sc->sc_rxbuf_list);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_buflist_cleanup(&sc->sc_bcbuf_list);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Free descriptor DMA buffer */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_free_dma_mem(&sc->sc_desc_dma);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China kmem_free((void *)sc->sc_vbufptr, sc->sc_vbuflen);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_vbufptr = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_desc_alloc(dev_info_t *devinfo, struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China size_t size;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_desc *ds;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_buf *bf;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF + ATH_BCBUF);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China size = sizeof (struct ath_desc) * (ATH_TXBUF + ATH_RXBUF);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_alloc_dma_mem(devinfo, &arn_desc_dma_attr, size,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &arn_desc_accattr, DDI_DMA_CONSISTENT,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_DMA_RDWR | DDI_DMA_CONSISTENT, &sc->sc_desc_dma);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* virtual address of the first descriptor */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_desc = (struct ath_desc *)sc->sc_desc_dma.mem_va;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ds = sc->sc_desc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "arn: arn_desc_alloc(): DMA map: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%p (%d) -> %p\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_desc, sc->sc_desc_dma.alength,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_desc_dma.cookie.dmac_address));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* allocate data structures to describe TX/RX DMA buffers */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF +
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_BCBUF);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_vbuflen = sizeof (struct ath_buf) * (ATH_TXBUF + ATH_RXBUF);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf = (struct ath_buf *)kmem_zalloc(sc->sc_vbuflen, KM_SLEEP);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_vbufptr = bf;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* DMA buffer size for each TX/RX packet */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_TX_AGGREGRATION
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->tx_dmabuf_size =
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China roundup((IEEE80211_MAX_MPDU_LEN + 3840 * 2),
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China min(sc->sc_cachelsz, (uint16_t)64));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#else
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->tx_dmabuf_size =
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China roundup(IEEE80211_MAX_MPDU_LEN, min(sc->sc_cachelsz, (uint16_t)64));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->rx_dmabuf_size =
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China roundup(IEEE80211_MAX_MPDU_LEN, min(sc->sc_cachelsz, (uint16_t)64));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* create RX buffer list */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_buflist_setup(devinfo, sc, &sc->sc_rxbuf_list, &bf, &ds,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ATH_RXBUF, DDI_DMA_READ | DDI_DMA_STREAMING, sc->rx_dmabuf_size);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_desc_free(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* create TX buffer list */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_buflist_setup(devinfo, sc, &sc->sc_txbuf_list, &bf, &ds,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ATH_TXBUF, DDI_DMA_STREAMING, sc->tx_dmabuf_size);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_desc_free(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* create beacon buffer list */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_buflist_setup(devinfo, sc, &sc->sc_bcbuf_list, &bf, &ds,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_BCBUF, DDI_DMA_STREAMING);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_desc_free(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_setcurmode(struct arn_softc *sc, enum wireless_mode mode)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_rate_table *rt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < sizeof (sc->asc_rixmap); i++)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->asc_rixmap[i] = 0xff;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rt = sc->hw_rate_table[mode];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(rt != NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < rt->rate_cnt; i++)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->asc_rixmap[rt->info[i].dot11rate &
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_RATE_VAL] = (uint8_t)i; /* LINT */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_currates = rt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_curmode = mode;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * All protection frames are transmited at 2Mb/s for
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * 11g, otherwise at 1Mb/s.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * XXX select protection rate index from rate table.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_protrix = (mode == ATH9K_MODE_11G ? 1 : 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic enum wireless_mode
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_chan2mode(struct ath9k_channel *chan)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (chan->chanmode == CHANNEL_A)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11A);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_G)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11G);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_B)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11B);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_A_HT20)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11NA_HT20);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_G_HT20)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11NG_HT20);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_A_HT40PLUS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11NA_HT40PLUS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_A_HT40MINUS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11NA_HT40MINUS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_G_HT40PLUS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11NG_HT40PLUS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else if (chan->chanmode == CHANNEL_G_HT40MINUS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11NG_HT40MINUS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ATH9K_MODE_11B);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_update_txpow(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t txpow;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_curtxpow != sc->sc_config.txpowlimit) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_txpowerlimit(ah, sc->sc_config.txpowlimit);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* read back in case value is clamped */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_getcapability(ah, ATH9K_CAP_TXPOW, 1, &txpow);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_curtxpow = (uint32_t)txpow;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinauint8_t
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaparse_mpdudensity(uint8_t mpdudensity)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 0 for no restriction
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 1 for 1/4 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 2 for 1/2 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 3 for 1 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 4 for 2 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 5 for 4 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 6 for 8 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * 7 for 16 us
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China switch (mpdudensity) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 0:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (0);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 1:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 2:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 3:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * Our lower layer calculations limit our
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * precision to 1 microsecond
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (1);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 4:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (2);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 5:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (4);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 6:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (8);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case 7:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (16);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China default:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (0);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China}
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_setup_rates(struct arn_softc *sc, uint32_t mode)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i, maxrates;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_rate_table *rate_table = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211_rateset *rateset;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* rate_table = arn_get_ratetable(sc, mode); */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (mode) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11A:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11A];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11B:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11B];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11G:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11G];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_11N
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NA_HT20:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT20];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NG_HT20:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT20];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NA_HT40PLUS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT40PLUS];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NA_HT40MINUS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11NA_HT40MINUS];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NG_HT40PLUS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT40PLUS];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NG_HT40MINUS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table = sc->hw_rate_table[ATH9K_MODE_11NG_HT40MINUS];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RATE, "arn: arn_get_ratetable(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "invalid mode %u\n", mode));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (rate_table == NULL)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (rate_table->rate_cnt > ATH_RATE_MAX) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "rate table too small (%u > %u)\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rate_table->rate_cnt, IEEE80211_RATE_MAXSIZE));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China maxrates = ATH_RATE_MAX;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China maxrates = rate_table->rate_cnt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "maxrates is %d\n", maxrates));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rateset = &ic->ic_sup_rates[mode];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < maxrates; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rateset->ir_rates[i] = rate_table->info[i].dot11rate;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RATE, "arn: arn_rate_setup(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%d\n", rate_table->info[i].dot11rate));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rateset->ir_nrates = (uint8_t)maxrates; /* ??? */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_setup_channels(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int nchan, i, index;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t regclassids[ATH_REGCLASSIDS_MAX];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t nregclass = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath9k_channel *c;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Fill in ah->ah_channels */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!ath9k_regd_init_channels(ah, ATH_CHAN_MAX, (uint32_t *)&nchan,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China regclassids, ATH_REGCLASSIDS_MAX, &nregclass, CTRY_DEFAULT,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China B_FALSE, 1)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t rd = ah->ah_currentRD;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_setup_channels(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to collect channel list; "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "regdomain likely %u country code %u\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rd, CTRY_DEFAULT));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (EINVAL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_setup_channels(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "number of channel is %d\n", nchan));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < nchan; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China c = &ah->ah_channels[i];
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China uint32_t flags;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China index = ath9k_hw_mhz2ieee(ah, c->channel, c->channelFlags);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (index > IEEE80211_CHAN_MAX) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CHANNEL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "arn: arn_setup_channels(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "bad hal channel %d (%u/%x) ignored\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China index, c->channel, c->channelFlags));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* NB: flags are known to be compatible */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (index < 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * can't handle frequency <2400MHz (negative
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * channels) right now
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CHANNEL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "arn: arn_setup_channels(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "hal channel %d (%u/%x) "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "cannot be handled, ignored\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China index, c->channel, c->channelFlags));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Calculate net80211 flags; most are compatible
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * but some need massaging. Note the static turbo
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * conversion can be removed once net80211 is updated
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * to understand static vs. dynamic turbo.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China flags = c->channelFlags & (CHANNEL_ALL | CHANNEL_PASSIVE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_sup_channels[index].ich_freq == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_sup_channels[index].ich_freq = c->channel;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_sup_channels[index].ich_flags = flags;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* channels overlap; e.g. 11g and 11b */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_sup_channels[index].ich_flags |= flags;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((c->channelFlags & CHANNEL_G) == CHANNEL_G) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_have11g = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_SHPREAMBLE |
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_C_SHSLOT; /* short slot time */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinauint32_t
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_chan2flags(ieee80211com_t *isc, struct ieee80211_channel *chan)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China uint32_t channel_mode;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China switch (ieee80211_chan2mode(isc, chan)) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NA:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (chan->ich_flags & IEEE80211_CHAN_HT40U)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_A_HT40PLUS;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China else if (chan->ich_flags & IEEE80211_CHAN_HT40D)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_A_HT40MINUS;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China else
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_A_HT20;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11NG:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (chan->ich_flags & IEEE80211_CHAN_HT40U)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_G_HT40PLUS;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China else if (chan->ich_flags & IEEE80211_CHAN_HT40D)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_G_HT40MINUS;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China else
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_G_HT20;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_TURBO_G:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_STURBO_A:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_TURBO_A:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = 0;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11A:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_A;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11G:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_B;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11B:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = CHANNEL_G;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_FH:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China channel_mode = 0;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China default:
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (channel_mode);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Update internal state after a channel change.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_chan_change(struct arn_softc *sc, struct ieee80211_channel *chan)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_isc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China enum ieee80211_phymode mode;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China enum wireless_mode wlmode;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Change channels and update the h/w rate map
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * if we're switching; e.g. 11a to 11b/g.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mode = ieee80211_chan2mode(ic, chan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (mode) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11A:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wlmode = ATH9K_MODE_11A;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11B:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wlmode = ATH9K_MODE_11B;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_MODE_11G:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wlmode = ATH9K_MODE_11B;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (wlmode != sc->sc_curmode)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setcurmode(sc, wlmode);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Set/change channels. If the channel is really being changed, it's done
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * by reseting the chip. To accomplish this we must first cleanup any pending
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * DMA, then restart stuff.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_set_channel(struct arn_softc *sc, struct ath9k_channel *hchan)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = &sc->sc_isc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t fastcc = B_TRUE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t stopped;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211_channel chan;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China enum wireless_mode curmode;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_INVALID)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (EIO);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (hchan->channel != sc->sc_ah->ah_curchan->channel ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hchan->channelFlags != sc->sc_ah->ah_curchan->channelFlags ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (sc->sc_flags & SC_OP_CHAINMASK_UPDATE) ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (sc->sc_flags & SC_OP_FULL_RESET)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * This is only performed if the channel settings have
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * actually changed.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * To switch channels clear any pending DMA operations;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * wait long enough for the RX fifo to drain, reset the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * hardware at the new frequency, and then re-enable
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the relevant bits of the h/w.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, 0); /* disable interrupts */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_draintxq(sc, B_FALSE); /* clear pending tx frames */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China stopped = arn_stoprecv(sc); /* turn off frame recv */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * XXX: do not flush receive queue here. We don't want
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * to flush data frames already in queue because of
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * changing channel.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China fastcc = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CHANNEL, "arn: arn_set_channel(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "(%u MHz) -> (%u MHz), cflags:%x, chanwidth: %d\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ah->ah_curchan->channel,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hchan->channel, hchan->channelFlags, sc->tx_chan_width));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!ath9k_hw_reset(ah, hchan, sc->tx_chan_width,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask, sc->sc_rx_chainmask,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ht_extprotspacing, fastcc, &status)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: arn_set_channel(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to reset channel %u (%uMhz) "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "flags 0x%x hal status %u\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_mhz2ieee(ah, hchan->channel,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hchan->channelFlags),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hchan->channel, hchan->channelFlags, status));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (EIO);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_curchan = *hchan;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags &= ~SC_OP_CHAINMASK_UPDATE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags &= ~SC_OP_FULL_RESET;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (arn_startrecv(sc) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_problem("arn: arn_set_channel(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to restart recv logic\n");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (EIO);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China chan.ich_freq = hchan->channel;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China chan.ich_flags = hchan->channelFlags;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_ibss_chan = &chan;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Change channels and update the h/w rate map
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * if we're switching; e.g. 11a to 11b/g.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China curmode = arn_chan2mode(hchan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (curmode != sc->sc_curmode)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setcurmode(sc, arn_chan2mode(hchan));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_update_txpow(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * This routine performs the periodic noise floor calibration function
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * that is used to adjust and optimize the chip performance. This
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * takes environmental changes (location, temperature) into account.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * When the task is complete, it reschedules itself depending on the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * appropriate interval that was calculated.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_ani_calibrate(void *arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t longcal = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t shortcal = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t aniflag = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China unsigned int timestamp = drv_hztousec(ddi_get_lbolt())/1000;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t cal_interval;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * don't calibrate when we're scanning.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * we are most likely not on our home channel.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_state != IEEE80211_S_RUN)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto settimer;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Long calibration runs independently of short calibration. */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((timestamp - sc->sc_ani.sc_longcal_timer) >= ATH_LONG_CALINTERVAL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China longcal = B_TRUE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: longcal @%lu\n", __func__, drv_hztousec));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_longcal_timer = timestamp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Short calibration applies only while sc_caldone is FALSE */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!sc->sc_ani.sc_caldone) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((timestamp - sc->sc_ani.sc_shortcal_timer) >=
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_SHORT_CALINTERVAL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China shortcal = B_TRUE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: shortcal @%lu\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China __func__, drv_hztousec));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_shortcal_timer = timestamp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_resetcal_timer = timestamp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((timestamp - sc->sc_ani.sc_resetcal_timer) >=
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_RESTART_CALINTERVAL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_reset_calvalid(ah, ah->ah_curchan,
fd7c59804fad02c3863ef57c544fa7af0fd35068Richard Lowe &sc->sc_ani.sc_caldone);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_ani.sc_caldone)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_resetcal_timer = timestamp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Verify whether we must check ANI */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((timestamp - sc->sc_ani.sc_checkani_timer) >=
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_ANI_POLLINTERVAL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China aniflag = B_TRUE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_checkani_timer = timestamp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Skip all processing if there's nothing to do. */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (longcal || shortcal || aniflag) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Call ANI routine if necessary */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (aniflag)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_ani_monitor(ah, &sc->sc_halstats,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_curchan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Perform calibration if necessary */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (longcal || shortcal) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China boolean_t iscaldone = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_calibrate(ah, ah->ah_curchan,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rx_chainmask, longcal, &iscaldone)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (longcal)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_noise_floor =
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_getchan_noise(ah,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_curchan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: calibrate chan %u/%x nf: %d\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China __func__,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_curchan->channel,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_curchan->channelFlags,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_noise_floor));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_CALIBRATE, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: calibrate chan %u/%x failed\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China __func__,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_curchan->channel,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_curchan->channelFlags));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_caldone = iscaldone;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinasettimer:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Set timer interval based on previous results.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The interval must be the shortest necessary to satisfy ANI,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * short calibration and long calibration.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China cal_interval = ATH_LONG_CALINTERVAL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_ah->ah_config.enable_ani)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China cal_interval =
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China min(cal_interval, (uint32_t)ATH_ANI_POLLINTERVAL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!sc->sc_ani.sc_caldone)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China cal_interval = min(cal_interval,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (uint32_t)ATH_SHORT_CALINTERVAL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = timeout(arn_ani_calibrate, (void *)sc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China drv_usectohz(cal_interval * 1000));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_stop_caltimer(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China timeout_id_t tmp_id = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while ((sc->sc_cal_timer != 0) && (tmp_id != sc->sc_cal_timer)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China tmp_id = sc->sc_cal_timer;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) untimeout(tmp_id);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_cal_timer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic uint_t
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_isr(caddr_t arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* LINTED E_BAD_PTR_CAST_ALIGN */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China enum ath9k_int status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_INVALID) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The hardware is not ready/present, don't
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * touch anything. Note this can happen early
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * on if the IRQ is shared.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_UNCLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!ath9k_hw_intrpend(ah)) { /* shared irq, not for us */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_UNCLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Figure out the reason(s) for the interrupt. Note
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * that the hal returns a pseudo-ISR that may include
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * bits we haven't explicitly enabled so we mask the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * value to insure we only process bits we requested.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China status &= sc->sc_imask; /* discard unasked-for bits */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * If there are no status bits set, then this interrupt was not
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * for me (should have been caught above).
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!status) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_UNCLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_intrstatus = status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_FATAL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* need a chip reset */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_FATAL\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto reset;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else if (status & ATH9K_INT_RXORN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* need a chip reset */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_RXORN\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto reset;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_RXEOL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * NB: the hardware should re-read the link when
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * RXE bit is written, but it doesn't work
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * at least on older hardware revs.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_RXEOL\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rxlink = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_TXURN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* bump tx trigger level */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_TXURN\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_updatetxtriglevel(ah, B_TRUE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* XXX: optimize this */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_RX) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_RX\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rx_pend = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_trigger_softintr(sc->sc_softint_id);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_TX) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_TX\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ddi_taskq_dispatch(sc->sc_tq,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_tx_int_proc, sc, DDI_NOSLEEP) !=
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_problem("arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "No memory for tx taskq\n");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_INT_MIB
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_MIB) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Disable interrupts until we service the MIB
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * interrupt; otherwise it will continue to
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * fire.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Let the hal handle the event. We assume
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * it will clear whatever condition caused
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the interrupt.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_procmibevent(ah, &sc->sc_halstats);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_MIB\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_INT_TIM_TIMER
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_TIM_TIMER) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_TIM_TIMER\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(ah->ah_caps.hw_caps &
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_HW_CAP_AUTOSLEEP)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Clear RxAbort bit so that we can
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * receive frames
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_setrxabort(ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto reset;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_BMISS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_BMISS\n"));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_HW_BEACON_MISS_HANDLE
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China "handle beacon mmiss by H/W mechanism\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ddi_taskq_dispatch(sc->sc_tq, arn_bmiss_proc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc, DDI_NOSLEEP) != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_problem("arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "No memory available for bmiss taskq\n");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China#else
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China "handle beacon mmiss by S/W mechanism\n"));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif /* ARN_HW_BEACON_MISS_HANDLE */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_INT_CST
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* carrier sense timeout */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_CST) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_CST\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status & ATH9K_INT_SWBA) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: arn_isr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ATH9K_INT_SWBA\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* This will occur only in Host-AP or Ad-Hoc mode */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinareset:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "Rset for fatal err\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) arn_reset(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_get_channel(struct arn_softc *sc, struct ieee80211_channel *chan)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < sc->sc_ah->ah_nchan; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_ah->ah_channels[i].channel == chan->ich_freq)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (i);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (-1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_reset(ieee80211com_t *ic)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int error = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_draintxq(sc, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) arn_stoprecv(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!ath9k_hw_reset(ah, sc->sc_ah->ah_curchan, sc->tx_chan_width,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask, sc->sc_rx_chainmask,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ht_extprotspacing, B_FALSE, &status)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RESET, "arn: arn_reset(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to reset hardware; hal status %u\n", status));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = EIO;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (arn_startrecv(sc) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RESET, "arn: arn_reset(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to start recv logic\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * We may be doing a reset in response to a request
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * that changes the channel so update any state that
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * might change as a result.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setcurmode(sc, arn_chan2mode(sc->sc_ah->ah_curchan));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_update_txpow(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_BEACONS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_beacon_config(sc); /* restart beacons */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (error);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_get_hal_qnum(uint16_t queue, struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int qnum;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (queue) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WME_AC_VO:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China qnum = sc->sc_haltype2q[ATH9K_WME_AC_VO];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WME_AC_VI:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China qnum = sc->sc_haltype2q[ATH9K_WME_AC_VI];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WME_AC_BE:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WME_AC_BK:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China qnum = sc->sc_haltype2q[ATH9K_WME_AC_BK];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China qnum = sc->sc_haltype2q[ATH9K_WME_AC_BE];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (qnum);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic struct {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t version;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const char *name;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China} ath_mac_bb_names[] = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_SREV_VERSION_5416_PCI, "5416" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_SREV_VERSION_5416_PCIE, "5418" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_SREV_VERSION_9100, "9100" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_SREV_VERSION_9160, "9160" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_SREV_VERSION_9280, "9280" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_SREV_VERSION_9285, "9285" }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic struct {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t version;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const char *name;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China} ath_rf_names[] = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { 0, "5133" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_RAD5133_SREV_MAJOR, "5133" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_RAD5122_SREV_MAJOR, "5122" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_RAD2133_SREV_MAJOR, "2133" },
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China { AR_RAD2122_SREV_MAJOR, "2122" }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic const char *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_mac_bb_name(uint32_t mac_bb_version)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(ath_mac_bb_names); i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath_mac_bb_names[i].version == mac_bb_version) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ath_mac_bb_names[i].name);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return ("????");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Return the RF name. "????" is returned if the RF is unknown.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic const char *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_rf_name(uint16_t rf_version)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(ath_rf_names); i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath_rf_names[i].version == rf_version) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ath_rf_names[i].name);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return ("????");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_next_scan(void *arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_state == IEEE80211_S_SCAN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = timeout(arn_next_scan, (void *)sc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China drv_usectohz(arn_dwelltime * 1000));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_next_scan(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_stop_scantimer(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China timeout_id_t tmp_id = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while ((sc->sc_scan_timer != 0) && (tmp_id != sc->sc_scan_timer)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China tmp_id = sc->sc_scan_timer;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) untimeout(tmp_id);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int32_t
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_newstate(ieee80211com_t *ic, enum ieee80211_state nstate, int arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211_node *in;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int32_t i, error;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t *bssid;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t rfilt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China enum ieee80211_state ostate;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath9k_channel *channel;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int pos;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Should set up & init LED here */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_INVALID)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ostate = ic->ic_state;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "arn: arn_newstate(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%x -> %x!\n", ostate, nstate));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate != IEEE80211_S_SCAN)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_stop_scantimer(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate != IEEE80211_S_RUN)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_stop_caltimer(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Should set LED here */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate == IEEE80211_S_INIT) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Disable interrupts.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (ah, sc->sc_imask &~ ATH9K_INT_GLOBAL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_opmode == IEEE80211_M_IBSS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_stoptxdma(ah, sc->sc_beaconq);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_beacon_return(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_stop_watchdog(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto done;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China in = ic->ic_bss;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pos = arn_get_channel(sc, ic->ic_curchan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (pos == -1) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: Invalid channel\n", __func__));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = EINVAL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto bad;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (in->in_htcap & IEEE80211_HTCAP_CHWIDTH40) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_update_chainmask(sc);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->tx_chan_width = ATH9K_HT_MACMODE_2040;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China } else
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->tx_chan_width = ATH9K_HT_MACMODE_20;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ah->ah_channels[pos].chanmode =
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_chan2flags(ic, ic->ic_curchan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China channel = &sc->sc_ah->ah_channels[pos];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (channel == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_problem("arn_newstate(): channel == NULL");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto bad;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = arn_set_channel(sc, channel);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (error != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate != IEEE80211_S_SCAN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_reset_chan(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto bad;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Get the receive filter according to the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * operating mode and state
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rfilt = arn_calcrxfilter(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate == IEEE80211_S_SCAN)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bssid = ic->ic_macaddr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bssid = in->in_bssid;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_setrxfilter(ah, rfilt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate == IEEE80211_S_RUN && ic->ic_opmode != IEEE80211_M_IBSS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_write_associd(ah, bssid, in->in_associd);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_write_associd(ah, bssid, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Check for WLAN_CAPABILITY_PRIVACY ? */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_flags & IEEE80211_F_PRIVACY) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < IEEE80211_WEP_NKID; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_keyisvalid(ah, (uint16_t)i))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_keysetmac(ah, (uint16_t)i,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bssid);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate == IEEE80211_S_RUN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (ic->ic_opmode) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_M_IBSS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate and setup the beacon frame.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Stop any previous beacon DMA.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_stoptxdma(ah, sc->sc_beaconq);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_beacon_return(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = arn_beacon_alloc(sc, in);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (error != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto bad;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * If joining an adhoc network defer beacon timer
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * configuration to the next beacon frame so we
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * have a current TSF to use. Otherwise we're
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * starting an ibss/bss so there's no need to delay.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_opmode == IEEE80211_M_IBSS &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_bss->in_tstamp.tsf != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_bsync = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_beacon_config(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif /* ARN_IBSS */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case IEEE80211_M_STA:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ostate != IEEE80211_S_RUN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Defer beacon timer configuration to the next
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * beacon frame so we have a current TSF to use.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Any TSF collected when scanning is likely old
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_bsync = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Configure the beacon and sleep timers. */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_beacon_config(sc);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Reset rssi stats */
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China sc->sc_halstats.ns_avgbrssi =
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ATH_RSSI_DUMMY_MARKER;
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China sc->sc_halstats.ns_avgrssi =
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ATH_RSSI_DUMMY_MARKER;
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China sc->sc_halstats.ns_avgtxrssi =
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ATH_RSSI_DUMMY_MARKER;
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China sc->sc_halstats.ns_avgtxrate =
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ATH_RATE_DUMMY_MARKER;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/* end */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif /* ARN_IBSS */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, sc->sc_imask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Reset the rate control state.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_rate_ctl_reset(sc, nstate);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinadone:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Invoke the parent method to complete the work.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = sc->sc_newstate(ic, nstate, arg);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Finally, start any timers.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (nstate == IEEE80211_S_RUN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_start_watchdog(ic, 1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(sc->sc_cal_timer == 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_cal_timer = timeout(arn_ani_calibrate, (void *)sc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China drv_usectohz(100 * 1000));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else if ((nstate == IEEE80211_S_SCAN) && (ostate != nstate)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* start ap/neighbor scan timer */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* ASSERT(sc->sc_scan_timer == 0); */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_scan_timer = timeout(arn_next_scan, (void *)sc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China drv_usectohz(arn_dwelltime * 1000));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinabad:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (error);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_watchdog(void *arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = &sc->sc_isc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int ntimer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_watchdog_timer = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_INVALID) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_state == IEEE80211_S_RUN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Start the background rate control thread if we
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * are not configured to use a fixed xmit rate.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_LEGACY_RC
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_stats.ast_rate_calls ++;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_opmode == IEEE80211_M_STA)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_rate_ctl(ic, ic->ic_bss);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_iterate_nodes(&ic->ic_sta,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_rate_ctl, sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif /* ARN_LEGACY_RC */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_HW_BEACON_MISS_HANDLE
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* nothing to do here */
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China#else
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* currently set 10 seconds as beacon miss threshold */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (ic->ic_beaconmiss++ > 100) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_BEACON, "arn_watchdog():"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "Beacon missed for 10 seconds, run"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "ieee80211_new_state(ic, IEEE80211_S_INIT, -1)\n"));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China (void) ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif /* ARN_HW_BEACON_MISS_HANDLE */
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ntimer = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_watchdog(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ntimer != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_start_watchdog(ic, ntimer);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/* ARGSUSED */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic struct ieee80211_node *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_node_alloc(ieee80211com_t *ic)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_node *an;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_TX_AGGREGATION
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China an = kmem_zalloc(sizeof (struct ath_node), KM_SLEEP);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* legacy rate control */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_LEGACY_RC
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_rate_update(sc, &an->an_node, 0);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_TX_AGGREGATION
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_TXAGGR) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_tx_node_init(sc, an);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif /* ARN_TX_AGGREGATION */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China an->last_rssi = ATH_RSSI_DUMMY_MARKER;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return ((an != NULL) ? &an->an_node : NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_node_free(struct ieee80211_node *in)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = in->in_ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_buf *bf;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_txq *txq;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int32_t i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_TX_AGGREGATION
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (sc->sc_flags & SC_OP_TXAGGR)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_tx_node_cleanup(sc, in);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif /* TX_AGGREGATION */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ARN_TXQ_SETUP(sc, i)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China txq = &sc->sc_txq[i];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_enter(&txq->axq_lock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf = list_head(&txq->axq_list);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while (bf != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (bf->bf_in == in) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf->bf_in = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bf = list_next(&txq->axq_list, bf);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_exit(&txq->axq_lock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_node_cleanup(in);
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (in->in_wpa_ie != NULL)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_free(in->in_wpa_ie);
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China if (in->in_wme_ie != NULL)
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ieee80211_free(in->in_wme_ie);
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China if (in->in_htcap_ie != NULL)
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China ieee80211_free(in->in_htcap_ie);
3ae945c326c1fc078149f2c8b11fac0cc8f6d1d6lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China kmem_free(in, sizeof (struct ath_node));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate tx/rx key slots for TKIP. We allocate one slot for
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * each key. MIC is right after the decrypt/encrypt key.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic uint16_t
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_key_alloc_pair(struct arn_softc *sc, ieee80211_keyix *txkeyix,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_keyix *rxkeyix)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t i, keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(!sc->sc_splitmic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(sc->sc_keymap)/4; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t b = sc->sc_keymap[i];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (b == 0xff)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (keyix = i * NBBY; keyix < (i + 1) * NBBY;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix++, b >>= 1) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((b & 1) || is_set(keyix+64, sc->sc_keymap)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* full pair unavailable */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix+64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "arn_key_alloc_pair(): key pair %u,%u\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix, keyix+64));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *txkeyix = *rxkeyix = keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_pair():"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China " out of pair space\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate tx/rx key slots for TKIP. We allocate two slots for
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * each key, one for decrypt/encrypt and the other for the MIC.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_key_alloc_2pair(struct arn_softc *sc, ieee80211_keyix *txkeyix,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_keyix *rxkeyix)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t i, keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(sc->sc_splitmic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(sc->sc_keymap)/4; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t b = sc->sc_keymap[i];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (b != 0xff) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * One or more slots in this byte are free.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix = i*NBBY;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while (b & 1) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China again:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix++;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China b >>= 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* XXX IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (is_set(keyix+32, sc->sc_keymap) ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China is_set(keyix+64, sc->sc_keymap) ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China is_set(keyix+32+64, sc->sc_keymap)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* full pair unavailable */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (keyix == (i+1)*NBBY) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* no slots were appropriate, advance */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China continue;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto again;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix+64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix+32, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix+32+64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "arn_key_alloc_2pair(): key pair %u,%u %u,%u\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix, keyix+64,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix+32, keyix+32+64));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *txkeyix = *rxkeyix = keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_2pair(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China " out of pair space\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate a single key cache slot.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_key_alloc_single(struct arn_softc *sc, ieee80211_keyix *txkeyix,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_keyix *rxkeyix)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t i, keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* try i,i+32,i+64,i+32+64 to minimize key pair conflicts */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(sc->sc_keymap); i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t b = sc->sc_keymap[i];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (b != 0xff) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * One or more slots are free.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix = i*NBBY;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while (b & 1)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China keyix++, b >>= 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(keyix, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_alloc_single(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "key %u\n", keyix));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *txkeyix = *rxkeyix = keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate one or more key cache slots for a unicast key. The
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * key itself is needed only to identify the cipher. For hardware
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * TKIP with split cipher+MIC keys we allocate two key cache slot
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * pairs so that we can setup separate TX and RX MIC keys. Note
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * that the MIC key for a TKIP key at slot i is assumed by the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * hardware to be at slot i+64. This limits TKIP keys to the first
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * 64 entries.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/* ARGSUSED */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_key_alloc(ieee80211com_t *ic, const struct ieee80211_key *k,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * We allocate two pair for TKIP when using the h/w to do
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the MIC. For everything else, including software crypto,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * we allocate a single entry. Note that s/w crypto requires
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * a pass-through slot on the 5211 and 5212. The 5210 does
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * not support pass-through cache entries and we map all
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * those requests to slot 0.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (k->wk_flags & IEEE80211_KEY_SWCRYPT) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_key_alloc_single(sc, keyix, rxkeyix));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_splitmic)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_key_alloc_2pair(sc, keyix, rxkeyix));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_key_alloc_pair(sc, keyix, rxkeyix));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_key_alloc_single(sc, keyix, rxkeyix));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Delete an entry in the key cache allocated by ath_key_alloc.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_key_delete(ieee80211com_t *ic, const struct ieee80211_key *k)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const struct ieee80211_cipher *cip = k->wk_cipher;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_keyix keyix = k->wk_keyix;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE, "arn_key_delete():"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China " delete key %u ic_cipher=0x%x\n", keyix, cip->ic_cipher));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_keyreset(ah, keyix);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Handle split tx/rx keying required for TKIP with h/w MIC.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (cip->ic_cipher == IEEE80211_CIPHER_TKIP &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (k->wk_flags & IEEE80211_KEY_SWMIC) == 0 && sc->sc_splitmic)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_keyreset(ah, keyix+32); /* RX key */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (keyix >= IEEE80211_WEP_NKID) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Don't touch keymap entries for global keys so
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * they are never considered for dynamic allocation.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China clr_bit(keyix, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (cip->ic_cipher == IEEE80211_CIPHER_TKIP &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * If splitmic is true +64 is TX key MIC,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * else +64 is RX key + RX key MIC.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China clr_bit(keyix+64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_splitmic) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Rx key */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China clr_bit(keyix+32, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* RX key MIC */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China clr_bit(keyix+32+64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Set a TKIP key into the hardware. This handles the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * potential distribution of key state to multiple key
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * cache slots for TKIP.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_keyset_tkip(struct arn_softc *sc, const struct ieee80211_key *k,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath9k_keyval *hk, const uint8_t mac[IEEE80211_ADDR_LEN])
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t *key_rxmic = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t *key_txmic = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t *key = (uint8_t *)&(k->wk_key[0]);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China key_txmic = key + 16;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China key_rxmic = key + 24;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (mac == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Group key installation */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac, B_FALSE));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!sc->sc_splitmic) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * data key goes at first index,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the hal handles the MIC keys at index+64.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) memcpy(hk->kv_txmic, key_txmic, sizeof (hk->kv_txmic));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac, B_FALSE));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * TX key goes at first index, RX key at +32.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The hal handles the MIC keys at index+64.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) memcpy(hk->kv_mic, key_txmic, sizeof (hk->kv_mic));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, NULL,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China B_FALSE))) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Txmic entry failed. No need to proceed further */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_KEYCACHE,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s Setting TX MIC Key Failed\n", __func__));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) memcpy(hk->kv_mic, key_rxmic, sizeof (hk->kv_mic));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* XXX delete tx key on failure? */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ath9k_hw_set_keycache_entry(ah, k->wk_keyix, hk, mac, B_FALSE));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_key_set(ieee80211com_t *ic, const struct ieee80211_key *k,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const uint8_t mac[IEEE80211_ADDR_LEN])
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China const struct ieee80211_cipher *cip = k->wk_cipher;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath9k_keyval hk;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* cipher table */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China static const uint8_t ciphermap[] = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_WEP, /* IEEE80211_CIPHER_WEP */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_TKIP, /* IEEE80211_CIPHER_TKIP */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_AES_OCB, /* IEEE80211_CIPHER_AES_OCB */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_AES_CCM, /* IEEE80211_CIPHER_AES_CCM */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_CKIP, /* IEEE80211_CIPHER_CKIP */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_CLR, /* IEEE80211_CIPHER_NONE */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China };
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bzero(&hk, sizeof (hk));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Software crypto uses a "clear key" so non-crypto
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * state kept in the key cache are maintainedd so that
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * rx frames have an entry to match.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((k->wk_flags & IEEE80211_KEY_SWCRYPT) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(cip->ic_cipher < 6);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hk.kv_type = ciphermap[cip->ic_cipher];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hk.kv_len = k->wk_keylen;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bcopy(k->wk_key, hk.kv_val, k->wk_keylen);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China hk.kv_type = ATH9K_CIPHER_CLR;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (hk.kv_type == ATH9K_CIPHER_TKIP &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (k->wk_flags & IEEE80211_KEY_SWMIC) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_keyset_tkip(sc, k, &hk, mac));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ath9k_hw_set_keycache_entry(sc->sc_ah,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China k->wk_keyix, &hk, mac, B_FALSE));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Enable/Disable short slot timing
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinavoid
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_set_shortslot(ieee80211com_t *ic, int onoff)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = ((struct arn_softc *)ic)->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (onoff)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_9);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_20);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_open(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211_channel *curchan = ic->ic_curchan;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath9k_channel *init_channel;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int error = 0, pos, status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK_ASSERT(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pos = arn_get_channel(sc, curchan);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (pos == -1) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: Invalid channel\n", __func__));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = EINVAL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto error;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->tx_chan_width = ATH9K_HT_MACMODE_20;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_curmode == ATH9K_MODE_11A) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ah->ah_channels[pos].chanmode = CHANNEL_A;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ah->ah_channels[pos].chanmode = CHANNEL_G;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China init_channel = &sc->sc_ah->ah_channels[pos];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Reset SERDES registers */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_configpcipowersave(sc->sc_ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The basic interface to setting the hardware in a good
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * state is ``reset''. On return the hardware is known to
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * be powered up and with interrupts disabled. This must
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * be followed by initialization of the appropriate bits
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * and then setup of the interrupt mask.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!ath9k_hw_reset(sc->sc_ah, init_channel,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->tx_chan_width, sc->sc_tx_chainmask,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rx_chainmask, sc->sc_ht_extprotspacing,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China B_FALSE, &status)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: unable to reset hardware; hal status %u "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "(freq %u flags 0x%x)\n", __func__, status,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China init_channel->channel, init_channel->channelFlags));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = EIO;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto error;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * This is needed only to setup initial state
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * but it's best done after a reset.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_update_txpow(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Setup the hardware after reset:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * The receive engine is set going.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Frame transmit is handled entirely
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * in the frame output path; there's nothing to do
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * here except setup the interrupt mask.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (arn_startrecv(sc) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: unable to start recv logic\n", __func__));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = EIO;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto error;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Setup our intr mask. */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask = ATH9K_INT_RX | ATH9K_INT_TX |
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_INT_RXEOL | ATH9K_INT_RXORN |
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_INT_FATAL | ATH9K_INT_GLOBAL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_HW_CAP_GTT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_GTT)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask |= ATH9K_INT_GTT;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_HW_CAP_GTT
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask |= ATH9K_INT_CST;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Enable MIB interrupts when there are hardware phy counters.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Note we only do this (at the moment) for station mode.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_INT_MIB
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_phycounters(sc->sc_ah) &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ((sc->sc_ah->ah_opmode == ATH9K_M_STA) ||
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (sc->sc_ah->ah_opmode == ATH9K_M_IBSS)))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask |= ATH9K_INT_MIB;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Some hardware processes the TIM IE and fires an
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * interrupt when the TIM bit is set. For hardware
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * that does, if not overridden by configuration,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * enable the TIM interrupt when operating as station.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_ATH9K_INT_TIM
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((sc->sc_ah->ah_caps.hw_caps & ATH9K_HW_CAP_ENHANCEDPM) &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (sc->sc_ah->ah_opmode == ATH9K_M_STA) &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China !sc->sc_config.swBeaconProcess)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask |= ATH9K_INT_TIM;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (arn_chan2mode(init_channel) != sc->sc_curmode)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setcurmode(sc, arn_chan2mode(init_channel));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: current mode after arn_setcurmode is %d\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China __func__, sc->sc_curmode));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_isrunning = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Disable BMISS interrupt when we're not associated */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(sc->sc_ah, sc->sc_imask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaerror:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (error);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_close(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK_ASSERT(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!sc->sc_isrunning)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Shutdown the hardware and driver
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Note that some of this work is not possible if the
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * hardware is gone (invalid).
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_stop_watchdog(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * make sure h/w will not generate any interrupt
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * before setting the invalid flag.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(sc->sc_flags & SC_OP_INVALID)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_draintxq(sc, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) arn_stoprecv(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_phy_disable(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rxlink = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_isrunning = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * MAC callback functions
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_stat(void *arg, uint_t stat, uint64_t *val)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211_node *in;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ieee80211_rateset *rs;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (stat) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_IFSPEED:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China in = ic->ic_bss;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rs = &in->in_rates;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = (rs->ir_rates[in->in_txrate] & IEEE80211_RATE_VAL) / 2 *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1000000ull;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_NOXMTBUF:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = sc->sc_stats.ast_tx_nobuf +
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_stats.ast_tx_nobufmgt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_IERRORS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = sc->sc_stats.ast_rx_tooshort;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_RBYTES:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_bytes;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_IPACKETS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_frags;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_OBYTES:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_bytes;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_OPACKETS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_frags;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case MAC_STAT_OERRORS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_TX_FAILED:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = sc->sc_stats.ast_tx_fifoerr +
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_stats.ast_tx_xretries +
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_stats.ast_tx_discard;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_TX_RETRANS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = sc->sc_stats.ast_tx_xretries;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_FCS_ERRORS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = sc->sc_stats.ast_rx_crcerr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_WEP_ERRORS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *val = sc->sc_stats.ast_rx_badcrypt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_TX_FRAGS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_TX:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_RTS_SUCCESS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_RTS_FAILURE:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_ACK_FAILURE:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_RX_FRAGS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_RX:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case WIFI_STAT_RX_DUPS:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ieee80211_stat(ic, stat, val));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ENOTSUP);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_start(void *arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Stop anything previously setup. This is safe
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * whether this is the first time through or not.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_close(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((err = arn_open(sc)) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* H/W is reday now */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags &= ~SC_OP_INVALID;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_stop(void *arg)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_close(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* disable HAL and put h/w to sleep */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_disable(sc->sc_ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_configpcipowersave(sc->sc_ah, 1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* XXX: hardware will not be ready in suspend state */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_INVALID;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_promisc(void *arg, boolean_t on)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t rfilt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rfilt = ath9k_hw_getrxfilter(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (on)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rfilt |= ATH9K_RX_FILTER_PROM;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China else
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China rfilt &= ~ATH9K_RX_FILTER_PROM;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_promisc = on;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_setrxfilter(ah, rfilt);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t val, index, bit;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t pos;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t *mfilt = sc->sc_mcast_hash;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* calculate XOR of eight 6bit values */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China val = ARN_LE_READ_32(mca + 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pos = (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China val = ARN_LE_READ_32(mca + 3);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pos ^= (val >> 18) ^ (val >> 12) ^ (val >> 6) ^ val;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pos &= 0x3f;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China index = pos / 32;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bit = 1 << (pos % 32);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (add) { /* enable multicast */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_mcast_refs[pos]++;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mfilt[index] |= bit;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else { /* disable multicast */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (--sc->sc_mcast_refs[pos] == 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mfilt[index] &= ~bit;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_unicst(void *arg, const uint8_t *macaddr)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_XMIT, "ath: ath_gld_saddr(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macaddr[0], macaddr[1], macaddr[2],
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macaddr[3], macaddr[4], macaddr[5]));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(sc->sc_isc.ic_macaddr, macaddr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setmac(ah, sc->sc_isc.ic_macaddr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) arn_reset(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic mblk_t *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_tx(void *arg, mblk_t *mp)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int error = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mblk_t *next;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * No data frames go out unless we're associated; this
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * should not happen as the 802.11 layer does not enable
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the xmit queue until we enter the RUN state.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ic->ic_state != IEEE80211_S_RUN) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_XMIT, "arn: arn_m_tx(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "discard, state %u\n", ic->ic_state));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_stats.ast_tx_discard++;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China freemsgchain(mp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China while (mp != NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China next = mp->b_next;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mp->b_next = NULL;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China error = arn_tx(ic, mp, IEEE80211_FC0_TYPE_DATA);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (error != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mp->b_next = next;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (error == ENOMEM) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China } else {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China freemsgchain(mp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mp = next;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (mp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int32_t err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ieee80211_ioctl(&sc->sc_isc, wq, mp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err == ENETRESET) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(sc->sc_flags & SC_OP_INVALID)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) arn_m_start(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ieee80211_new_state(&sc->sc_isc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_S_SCAN, -1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_setprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint_t wldp_length, const void *wldp_buf)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ieee80211_setprop(&sc->sc_isc, pr_name, wldp_pr_num,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wldp_length, wldp_buf);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err == ENETRESET) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(sc->sc_flags & SC_OP_INVALID)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) arn_m_start(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ieee80211_new_state(&sc->sc_isc,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_S_SCAN, -1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/* ARGSUSED */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_m_getprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t wldp_length, void *wldp_buf)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = arg;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int err = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ieee80211_getprop(&sc->sc_isc, pr_name, wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer wldp_length, wldp_buf);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (err);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerarn_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 arn_softc *sc = arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ieee80211_propinfo(&sc->sc_isc, pr_name, wldp_pr_num, prh);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/* return bus cachesize in 4B word units */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_pci_config_cachesize(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint8_t csz;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Cache line size is used to size and align various
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * structures used to communicate with the hardware.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China csz = pci_config_get8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (csz == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * We must have this setup properly for rx buffer
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * DMA to work so force a reasonable value here if it
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * comes up zero.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China csz = ATH_DEF_CACHE_BYTES / sizeof (uint32_t);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_put8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China csz);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_cachelsz = csz << 2;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_pci_setup(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t command;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Enable memory mapping and bus mastering
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(sc != NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China command = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_COMM);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China command |= PCI_COMM_MAE | PCI_COMM_ME;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_put16(sc->sc_cfg_handle, PCI_CONF_COMM, command);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China command = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_COMM);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((command & PCI_COMM_MAE) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_problem("arn: arn_pci_setup(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "failed to enable memory mapping\n");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (EIO);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((command & PCI_COMM_ME) == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_problem("arn: arn_pci_setup(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "failed to enable bus mastering\n");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (EIO);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "arn: arn_pci_setup(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "set command reg to 0x%x \n", command));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic void
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_get_hw_encap(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah = sc->sc_ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_AES_CCM, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_AES_CCM;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_AES_OCB, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_AES;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_TKIP, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_TKIP;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_WEP, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_WEP;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_MIC, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_TKIPMIC;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinastatic void
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaarn_setup_ht_cap(struct arn_softc *sc)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#define ATH9K_HT_CAP_MAXRXAMPDU_65536 0x3 /* 2 ^ 16 */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#define ATH9K_HT_CAP_MPDUDENSITY_8 0x6 /* 8 usec */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China uint8_t rx_streams;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_ht_conf *ht_info = &sc->sc_ht_conf;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ht_info->ht_supported = B_TRUE;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Todo: IEEE80211_HTCAP_SMPS */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ht_info->cap = IEEE80211_HTCAP_CHWIDTH40|
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_SHORTGI40 |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_DSSSCCK40;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ht_info->ampdu_factor = ATH9K_HT_CAP_MAXRXAMPDU_65536;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ht_info->ampdu_density = ATH9K_HT_CAP_MPDUDENSITY_8;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* set up supported mcs set */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China (void) memset(&ht_info->rx_mcs_mask, 0, sizeof (ht_info->rx_mcs_mask));
de710d24d2fae4468e64da999e1d952a247f142cJosef 'Jeff' Sipek rx_streams = ISP2(sc->sc_ah->ah_caps.rx_chainmask) ? 1 : 2;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ht_info->rx_mcs_mask[0] = 0xff;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (rx_streams >= 2)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ht_info->rx_mcs_mask[1] = 0xff;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China}
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/* xxx should be used for ht rate set negotiating ? */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinastatic void
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaarn_overwrite_11n_rateset(struct arn_softc *sc)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China uint8_t *ht_rs = sc->sc_ht_conf.rx_mcs_mask;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China int mcs_idx, mcs_count = 0;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China int i, j;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China (void) memset(&ieee80211_rateset_11n, 0,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sizeof (ieee80211_rateset_11n));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China for (i = 0; i < 10; i++) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China for (j = 0; j < 8; j++) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (ht_rs[i] & (1 << j)) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China mcs_idx = i * 8 + j;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (mcs_idx >= IEEE80211_HTRATE_MAXSIZE) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China break;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ieee80211_rateset_11n.rs_rates[mcs_idx] =
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China (uint8_t)mcs_idx;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China mcs_count++;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ieee80211_rateset_11n.rs_nrates = (uint8_t)mcs_count;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RATE, "arn_overwrite_11n_rateset(): "
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "MCS rate set supported by this station is as follows:\n"));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China for (i = 0; i < ieee80211_rateset_11n.rs_nrates; i++) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_RATE, "MCS rate %d is %d\n",
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China i, ieee80211_rateset_11n.rs_rates[i]));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China}
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * Update WME parameters for a transmit queue.
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinastatic int
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaarn_tx_queue_update(struct arn_softc *sc, int ac)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#define ATH_EXPONENT_TO_VALUE(v) ((1<<v)-1)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#define ATH_TXOP_TO_US(v) (v<<5)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic = (ieee80211com_t *)sc;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct ath_txq *txq;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct wmeParams *wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct ath_hal *ah = sc->sc_ah;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info qi;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China txq = &sc->sc_txq[arn_get_hal_qnum(ac, sc)];
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_get_txq_props(ah, txq->axq_qnum, &qi);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_TXOKINT_ENABLE = 0x0001
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_TXERRINT_ENABLE = 0x0001
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_TXDESCINT_ENABLE = 0x0002
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_TXEOLINT_ENABLE = 0x0004
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_TXURNINT_ENABLE = 0x0008
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_BACKOFF_DISABLE = 0x0010
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_COMPRESSION_ENABLE = 0x0020
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* xxx should update these flags here? */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#if 0
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China TXQ_FLAG_TXERRINT_ENABLE |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China TXQ_FLAG_TXDESCINT_ENABLE |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China TXQ_FLAG_TXURNINT_ENABLE;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_aifs = wmep->wmep_aifsn;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_cwmin = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmin);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_cwmax = ATH_EXPONENT_TO_VALUE(wmep->wmep_logcwmax);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_readyTime = 0;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_burstTime = ATH_TXOP_TO_US(wmep->wmep_txopLimit);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "%s:"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "Q%u"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "qflags 0x%x"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "aifs %u"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "cwmin %u"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "cwmax %u"
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "burstTime %u\n",
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China __func__,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China txq->axq_qnum,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_qflags,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_aifs,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_cwmin,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_cwmax,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China qi.tqi_burstTime));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (!ath9k_hw_set_txq_props(ah, txq->axq_qnum, &qi)) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_problem("unable to update hardware queue "
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "parameters for %s traffic!\n",
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ieee80211_wme_acnames[ac]);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (0);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China } else {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* push to H/W */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_resettxqueue(ah, txq->axq_qnum);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (1);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#undef ATH_TXOP_TO_US
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#undef ATH_EXPONENT_TO_VALUE
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China}
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/* Update WME parameters */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinastatic int
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaarn_wme_update(ieee80211com_t *ic)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China struct arn_softc *sc = (struct arn_softc *)ic;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* updateing */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China return (!arn_tx_queue_update(sc, WME_AC_BE) ||
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China !arn_tx_queue_update(sc, WME_AC_BK) ||
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China !arn_tx_queue_update(sc, WME_AC_VI) ||
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China !arn_tx_queue_update(sc, WME_AC_VO) ? EIO : 0);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China}
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China/*
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * Update tx/rx chainmask. For legacy association,
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * hard code chainmask to 1x1, for 11n association, use
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China * the chainmask configuration.
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinavoid
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing Chinaarn_update_chainmask(struct arn_softc *sc)
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China{
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China boolean_t is_ht = B_FALSE;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_CHAINMASK_UPDATE;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China is_ht = sc->sc_ht_conf.ht_supported;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (is_ht) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask = sc->sc_ah->ah_caps.tx_chainmask;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_rx_chainmask = sc->sc_ah->ah_caps.rx_chainmask;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China } else {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask = 1;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_rx_chainmask = 1;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China "tx_chainmask = %d, rx_chainmask = %d\n",
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask, sc->sc_rx_chainmask));
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China}
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_resume(dev_info_t *devinfo)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int ret = DDI_SUCCESS;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "ath: ath_resume(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "failed to get soft state\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Set up config space command register(s). Refuse
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * to resume on failure.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (arn_pci_setup(sc) != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INIT, "ath: ath_resume(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ath_pci_setup() failed\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(sc->sc_flags & SC_OP_INVALID))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ret = arn_open(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (ret);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int instance;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int32_t err;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t vendor_id;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint16_t device_id;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China uint32_t val;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China char strbuf[32];
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211com_t *ic;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wifi_data_t wd = { 0 };
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac_register_t *macp;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (cmd) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case DDI_ATTACH:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case DDI_RESUME:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_resume(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China instance = ddi_get_instance(devinfo);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ddi_soft_state_zalloc(arn_soft_state_p, instance) != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%s: Unable to alloc softstate\n", __func__));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic = (ieee80211com_t *)sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_dev = devinfo;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&sc->sc_genlock, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&sc->sc_serial_rw, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&sc->sc_txbuflock, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&sc->sc_rxbuflock, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&sc->sc_resched_lock, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&sc->sc_bcbuflock, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_INVALID;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = pci_config_setup(devinfo, &sc->sc_cfg_handle);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "pci_config_setup() failed"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (arn_pci_setup(sc) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Cache line size set up */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_pci_config_cachesize(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China vendor_id = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_VENID);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China device_id = pci_config_get16(sc->sc_cfg_handle, PCI_CONF_DEVID);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): vendor 0x%x, "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "device id 0x%x, cache size %d\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China vendor_id, device_id,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_get8(sc->sc_cfg_handle, PCI_CONF_CACHE_LINESZ)));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_put8(sc->sc_cfg_handle, PCI_CONF_LATENCY_TIMER, 0xa8);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China val = pci_config_get32(sc->sc_cfg_handle, 0x40);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((val & 0x0000ff00) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_put32(sc->sc_cfg_handle, 0x40, val & 0xffff00ff);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ddi_regs_map_setup(devinfo, 1,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &sc->mem, 0, 0, &arn_reg_accattr, &sc->sc_io_handle);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "regs map1 = %x err=%d\n", sc->mem, err));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ddi_regs_map_setup() failed"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah = ath9k_hw_attach(device_id, sc, sc->mem, &status);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ah == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to attach hw: H/W status %u\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China status));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail2;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ah = ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_getmac(ah, ic->ic_macaddr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Get the hardware key cache size. */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_keymax = ah->ah_caps.keycache_size;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_keymax > ATH_KEYMAX) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "Warning, using only %u entries in %u key cache\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_KEYMAX, sc->sc_keymax));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_keymax = ATH_KEYMAX;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Reset the key cache since some parts do not
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * reset the contents on initial power up.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < sc->sc_keymax; i++)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_keyreset(ah, (uint16_t)i);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Mark key cache slots associated with global keys
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * as in use. If we knew TKIP was not to be used we
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * could leave the +32, +64, and +32+64 slots free.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * XXX only for splitmic.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < IEEE80211_WEP_NKID; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(i, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(i + 32, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(i + 64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China set_bit(i + 32 + 64, sc->sc_keymap);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Collect the channel list using the default country code */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_setup_channels(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err == EINVAL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ERR:arn_setup_channels\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail3;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* default to STA mode */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ah->ah_opmode = ATH9K_M_STA;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Setup rate tables */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_rate_attach(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setup_rates(sc, IEEE80211_MODE_11A);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setup_rates(sc, IEEE80211_MODE_11B);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setup_rates(sc, IEEE80211_MODE_11G);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Setup current mode here */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_setcurmode(sc, ATH9K_MODE_11G);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* 802.11g features */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_have11g)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_SHPREAMBLE |
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_C_SHSLOT; /* short slot time */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Temp workaround */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_mrretry = 1;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_config.ath_aggr_prot = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Setup tx/rx descriptors */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = arn_desc_alloc(devinfo, sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "failed to allocate descriptors: %d\n", err));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail3;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((sc->sc_tq = ddi_taskq_create(devinfo, "ath_taskq", 1,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China TASKQ_DEFAULTPRI, 0)) == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ERR:ddi_taskq_create\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Allocate hardware transmit queues: one queue for
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * beacon frames and one data queue for each QoS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * priority. Note that the hal handles reseting
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * these queues at the needed time.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_beaconq = arn_beaconq_setup(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_beaconq == (-1)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to setup a beacon xmit queue\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_HOSTAP
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_cabq = arn_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_cabq == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to setup CAB xmit queue\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_config.cabqReadytime = ATH_CABQ_READY_TIME;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath_cabq_update(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(sc->sc_haltype2q); i++)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_haltype2q[i] = -1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Setup data queues */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* NB: ensure BK queue is the lowest priority h/w queue */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!arn_tx_setup(sc, ATH9K_WME_AC_BK)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to setup xmit queue for BK traffic\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!arn_tx_setup(sc, ATH9K_WME_AC_BE)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to setup xmit queue for BE traffic\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!arn_tx_setup(sc, ATH9K_WME_AC_VI)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to setup xmit queue for VI traffic\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!arn_tx_setup(sc, ATH9K_WME_AC_VO)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "unable to setup xmit queue for VO traffic\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail4;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Initializes the noise floor to a reasonable default value.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Later on this will be updated during ANI processing.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_ani.sc_noise_floor = ATH_DEFAULT_NOISE_FLOOR;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_TKIP, NULL)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Whether we should enable h/w TKIP MIC.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * XXX: if we don't support WME TKIP MIC, then we wouldn't
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * report WMM capable, so it's always safe to turn on
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * TKIP MIC in this case.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_TKIP_MIC,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0, 1, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Get cipher releated capability information */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_get_hw_encap(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Check whether the separate key cache entries
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * are required to handle both tx+rx MIC keys.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * With split mic keys the number of stations is limited
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * to 27 otherwise 59.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_TKIP, NULL) &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH9K_CIPHER_MIC, NULL) &&
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_getcapability(ah, ATH9K_CAP_TKIP_SPLIT,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 0, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_splitmic = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* turn on mcast key search if possible */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!ath9k_hw_getcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 0, NULL))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 1,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China 1, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_config.txpowlimit = ATH_TXPOWER_MAX;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_config.txpowlimit_override = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* 11n Capabilities */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_HT) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_TXAGGR;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_RXAGGR;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_setup_ht_cap(sc);
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China arn_overwrite_11n_rateset(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rx_chainmask = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "tx_chainmask = %d, rx_chainmask = %d\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_tx_chainmask, sc->sc_rx_chainmask));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* arn_update_chainmask(sc); */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, B_TRUE, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_defant = ath9k_hw_getdefantenna(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_getmac(ah, sc->sc_myaddr);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ah->ah_caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_getbssidmask(ah, sc->sc_bssidmask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ATH_SET_VAP_BSSID_MASK(sc->sc_bssidmask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setbssidmask(ah, sc->sc_bssidmask);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* set default value to short slot time */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_slottime = ATH9K_SLOT_TIME_9;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setslottime(ah, ATH9K_SLOT_TIME_9);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* initialize beacon slots */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ARRAY_SIZE(sc->sc_bslot); i++)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_bslot[i] = ATH_IF_ID_ANY;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Save MISC configurations */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_config.swBeaconProcess = 1;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Support QoS/WME */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_WME;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_wme.wme_update = arn_wme_update;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Support 802.11n/HT */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (sc->sc_ht_conf.ht_supported) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_htcaps =
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_CHWIDTH40 |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_SHORTGI40 |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_DSSSCCK40 |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_MAXAMSDU_7935 |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTC_HT |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTC_AMSDU |
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China IEEE80211_HTCAP_RXSTBC_2STREAM;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#ifdef ARN_TX_AGGREGATION
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_htcaps |= IEEE80211_HTC_AMPDU;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Header padding requested by driver */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_flags |= IEEE80211_F_DATAPAD;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Support WPA/WPA2 */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_WPA;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#if 0
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_TXFRAG; /* handle tx frags */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_caps |= IEEE80211_C_BGSCAN; /* capable of bg scanning */
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China#endif
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_phytype = IEEE80211_T_HT;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_opmode = IEEE80211_M_STA;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_state = IEEE80211_S_INIT;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_maxrssi = ARN_MAX_RSSI;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_set_shortslot = arn_set_shortslot;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_xmit = arn_tx;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_attach(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ic->ic_curchan->ich_freq: %d\n", ic->ic_curchan->ich_freq));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* different instance has different WPA door */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) snprintf(ic->ic_wpadoor, MAX_IEEE80211STR, "%s_%s%d", WPA_DOOR,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_driver_name(devinfo),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_get_instance(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China if (sc->sc_ht_conf.ht_supported) {
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China sc->sc_recv_action = ic->ic_recv_action;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_recv_action = arn_ampdu_recv_action;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China // sc->sc_send_action = ic->ic_send_action;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China // ic->ic_send_action = arn_ampdu_send_action;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_ampdu_rxmax = sc->sc_ht_conf.ampdu_factor;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_ampdu_density = sc->sc_ht_conf.ampdu_density;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China ic->ic_ampdu_limit = ic->ic_ampdu_rxmax;
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China }
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Override 80211 default routines */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_newstate = ic->ic_newstate;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_newstate = arn_newstate;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_recv_mgmt = ic->ic_recv_mgmt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_recv_mgmt = arn_recv_mgmt;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_watchdog = arn_watchdog;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_node_alloc = arn_node_alloc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_node_free = arn_node_free;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_crypto.cs_key_alloc = arn_key_alloc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_crypto.cs_key_delete = arn_key_delete;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_crypto.cs_key_set = arn_key_set;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_media_init(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * initialize default tx key
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ic->ic_def_txkey = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_rx_pend = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(sc->sc_ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ddi_add_softintr(devinfo, DDI_SOFTINT_LOW,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &sc->sc_softint_id, NULL, 0, arn_softint_handler, (caddr_t)sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "ddi_add_softintr() failed....\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail5;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ddi_get_iblock_cookie(devinfo, 0, &sc->sc_iblock)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "Can not get iblock cookie for INT\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail6;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ddi_add_intr(devinfo, 0, NULL, NULL, arn_isr,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (caddr_t)sc) != DDI_SUCCESS) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "Can not set intr for ARN driver\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail6;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Provide initial settings for the WiFi plugin; whenever this
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * information changes, we need to call mac_plugindata_update()
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wd.wd_opmode = ic->ic_opmode;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wd.wd_secalloc = WIFI_SEC_NONE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid)"
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wd.wd_bssid[0], wd.wd_bssid[1], wd.wd_bssid[2],
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China wd.wd_bssid[3], wd.wd_bssid[4], wd.wd_bssid[5]));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if ((macp = mac_alloc(MAC_VERSION)) == NULL) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "MAC version mismatch\n"));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail7;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_driver = sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_dip = devinfo;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_src_addr = ic->ic_macaddr;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_callbacks = &arn_m_callbacks;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_min_sdu = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_max_sdu = IEEE80211_MTU;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_pdata = &wd;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China macp->m_pdata_size = sizeof (wd);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = mac_register(macp, &ic->ic_mach);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac_free(macp);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "mac_register err %x\n", err));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China goto attach_fail7;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* Create minor node of type DDI_NT_NET_WIFI */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) snprintf(strbuf, sizeof (strbuf), "%s%d",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_NODENAME, instance);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China err = ddi_create_minor_node(devinfo, strbuf, S_IFCHR,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China instance + 1, DDI_NT_NET_WIFI, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "WARN: arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "Create minor node failed - %d\n", err));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
c0c934808d1b7d058148814255f32064a0e09555lin wang - Sun Microsystems - Beijing China /* Notify link is down now */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac_link_update(ic->ic_mach, LINK_STATE_DOWN);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_promisc = B_FALSE;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bzero(sc->sc_mcast_refs, sizeof (sc->sc_mcast_refs));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China bzero(sc->sc_mcast_hash, sizeof (sc->sc_mcast_hash));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_ATTACH, "arn: arn_attach(): "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "Atheros AR%s MAC/BB Rev:%x "
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China "AR%s RF Rev:%x: mem=0x%lx\n",
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_mac_bb_name(ah->ah_macVersion),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_macRev,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_rf_name((ah->ah_analog5GhzRev & AR_RADIO_SREV_MAJOR)),
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ah->ah_phyRev,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (unsigned long)sc->mem));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* XXX: hardware will not be ready until arn_open() being called */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_INVALID;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_isrunning = 0;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail7:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_remove_intr(devinfo, 0, sc->sc_iblock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail6:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_remove_softintr(sc->sc_softint_id);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail5:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ieee80211_detach(ic);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail4:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_desc_free(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc->sc_tq)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_taskq_destroy(sc->sc_tq);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail3:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_detach(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail2:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_io_handle);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail1:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_teardown(&sc->sc_cfg_handle);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaattach_fail0:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc->sc_flags |= SC_OP_INVALID;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* cleanup tx queues */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_txbuflock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ARN_TXQ_SETUP(sc, i)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* arn_tx_cleanupq(asc, &asc->sc_txq[i]); */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&((&sc->sc_txq[i])->axq_lock));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_rxbuflock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_serial_rw);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_genlock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_resched_lock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_bcbuflock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_soft_state_free(arn_soft_state_p, instance);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Suspend transmit/receive for powerdown
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_suspend(struct arn_softc *sc)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_LOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_close(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ARN_UNLOCK(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int32_t
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ASSERT(sc != NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China switch (cmd) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case DDI_DETACH:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China break;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China case DDI_SUSPEND:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (arn_suspend(sc));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China default:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (mac_disable(sc->sc_isc.ic_mach) != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_stop_scantimer(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_stop_caltimer(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* disable interrupts */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(sc->sc_ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Unregister from the MAC layer subsystem
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) mac_unregister(sc->sc_isc.ic_mach);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* free intterrupt resources */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_remove_intr(devinfo, 0, sc->sc_iblock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_remove_softintr(sc->sc_softint_id);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * NB: the order of these is important:
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * o call the 802.11 layer before detaching the hal to
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * insure callbacks into the driver to delete global
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * key cache entries can be handled
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * o reclaim the tx queue data structures after calling
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * the 802.11 layer as we'll get called back to reclaim
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * node state and potentially want to use them
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * o to cleanup the tx queues the hal is called, so detach
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * it last
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ieee80211_detach(&sc->sc_isc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_desc_free(sc);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_taskq_destroy(sc->sc_tq);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (!(sc->sc_flags & SC_OP_INVALID))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* cleanup tx queues */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_txbuflock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ARN_TXQ_SETUP(sc, i)) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China arn_tx_cleanupq(sc, &sc->sc_txq[i]);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&((&sc->sc_txq[i])->axq_lock));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_detach(sc->sc_ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* free io handle */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_regs_map_free(&sc->sc_io_handle);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China pci_config_teardown(&sc->sc_cfg_handle);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /* destroy locks */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_genlock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_serial_rw);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_rxbuflock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_resched_lock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#ifdef ARN_IBSS
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_bcbuflock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China#endif
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_remove_minor_node(devinfo, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_soft_state_free(arn_soft_state_p, ddi_get_instance(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China/*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * quiesce(9E) entry point.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * This function is called when the system is single-threaded at high
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * PIL with preemption disabled. Therefore, this function must not be
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * blocked.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China *
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * DDI_FAILURE indicates an error condition and should almost never happen.
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic int32_t
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaarn_quiesce(dev_info_t *devinfo)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct arn_softc *sc;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int i;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China struct ath_hal *ah;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China sc = ddi_get_soft_state(arn_soft_state_p, ddi_get_instance(devinfo));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (sc == NULL || (ah = sc->sc_ah) == NULL)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_FAILURE);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Disable interrupts
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Disable TX HW
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (ARN_TXQ_SETUP(sc, i))
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_stoptxdma(ah, sc->sc_txq[i].axq_qnum);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Disable RX HW
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_stoppcurecv(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ath9k_hw_setrxfilter(ah, 0);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_stopdmarecv(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China drv_usecwait(3000);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China /*
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China * Power down HW
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (void) ath9k_hw_phy_disable(ah);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (DDI_SUCCESS);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing ChinaDDI_DEFINE_STREAM_OPS(arn_dev_ops, nulldev, nulldev, arn_attach, arn_detach,
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China nodev, NULL, D_MP, NULL, arn_quiesce);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic struct modldrv arn_modldrv = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &mod_driverops, /* Type of module. This one is a driver */
fd7c59804fad02c3863ef57c544fa7af0fd35068Richard Lowe "Atheros 9000 series driver", /* short description */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China &arn_dev_ops /* driver specific ops */
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinastatic struct modlinkage modlinkage = {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China MODREV_1, (void *)&arn_modldrv, NULL
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China};
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China_info(struct modinfo *modinfop)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (mod_info(&modlinkage, modinfop));
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China_init(void)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China status = ddi_soft_state_init
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China (&arn_soft_state_p, sizeof (struct arn_softc), 1);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status != 0)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (status);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_init(&arn_loglock, NULL, MUTEX_DRIVER, NULL);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac_init_ops(&arn_dev_ops, "arn");
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China status = mod_install(&modlinkage);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status != 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac_fini_ops(&arn_dev_ops);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_soft_state_fini(&arn_soft_state_p);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (status);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing Chinaint
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China_fini(void)
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China{
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China int status;
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China status = mod_remove(&modlinkage);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China if (status == 0) {
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mac_fini_ops(&arn_dev_ops);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China mutex_destroy(&arn_loglock);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China ddi_soft_state_fini(&arn_soft_state_p);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China }
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China return (status);
dd1de3740722a4b99a74005255effebbd20a6d70lin wang - Sun Microsystems - Beijing China}