iwk2.c revision 216e0daa70a0058c5dc883bc667cd6925015df0a
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Use is subject to license terms.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Copyright (c) 2007, Intel Corporation
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * All rights reserved.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Copyright (c) 2006
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Copyright (c) 2007
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Damien Bergamini <damien.bergamini@free.fr>
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Permission to use, copy, modify, and distribute this software for any
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * purpose with or without fee is hereby granted, provided that the above
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * copyright notice and this permission notice appear in all copies.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * Driver for Intel PRO/Wireless 4965AGN(kedron) 802.11 network adapters.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* DMA attributes for a shared page */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* lowest usable address */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* flags (reserved) */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* DMA attributes for a keep warm DRAM descriptor */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* lowest usable address */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* flags (reserved) */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* DMA attributes for a ring descriptor */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* lowest usable address */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* flags (reserved) */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* DMA attributes for a cmd */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* lowest usable address */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* flags (reserved) */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/* DMA attributes for a rx buffer */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* lowest usable address */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 0, /* flags (reserved) */
uint32_t *, int);
iwk_rx_data_t *);
iwk_rx_data_t *);
_init(void)
int status;
return (status);
return (status);
_fini(void)
int status;
return (status);
NULL,
NULL,
NULL,
#ifdef DEBUG
int intr_type;
int intr_count;
int intr_actual;
switch (cmd) {
case DDI_ATTACH:
case DDI_RESUME:
return (DDI_SUCCESS);
goto attach_fail1;
goto attach_fail1;
goto attach_fail2;
goto attach_fail2a;
goto attach_fail_intr_a;
goto attach_fail_intr_a;
goto attach_fail_intr_b;
goto attach_fail_intr_c;
goto attach_fail3;
goto attach_fail3a;
goto attach_fail4;
if (err != 0) {
goto attach_fail4;
goto attach_fail4;
goto attach_fail4;
goto attach_fail5;
goto attach_fail7;
goto attach_fail8;
goto attach_fail_intr_d;
goto attach_fail9;
goto attach_fail9;
return (DDI_SUCCESS);
return (err);
int err;
switch (cmd) {
case DDI_DETACH:
case DDI_SUSPEND:
return (DDI_SUCCESS);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (err);
return (DDI_SUCCESS);
#ifdef DEBUG
iwk_dbg_flags = 0;
return (DDI_SUCCESS);
int err;
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_SUCCESS);
goto fail;
goto fail;
goto fail;
goto fail;
goto fail;
fail:
return (err);
goto fail;
return (err);
fail:
return (err);
goto fail;
return (err);
fail:
return (err);
goto fail;
for (i = 0; i < RX_QUEUE_SIZE; i++) {
goto fail;
return (err);
fail:
return (err);
for (i = 0; i < RX_QUEUE_SIZE; i++) {
goto fail;
goto fail;
goto fail;
for (i = 0; i < TFD_QUEUE_SIZE_MAX; i++) {
goto fail;
return (err);
fail:
return (err);
for (i = 0; i < IWK_NUM_QUEUES; i++) {
if (i == IWK_CMD_QUEUE_NUM)
goto fail;
goto fail;
goto fail;
return (err);
fail:
return (err);
int i = IWK_NUM_QUEUES;
static ieee80211_node_t *
switch (nstate) {
case IEEE80211_S_SCAN:
switch (ostate) {
case IEEE80211_S_INIT:
return (err);
return (err);
case IEEE80211_S_AUTH:
case IEEE80211_S_ASSOC:
case IEEE80211_S_RUN:
case IEEE80211_S_SCAN:
return (err);
case IEEE80211_S_AUTH:
return (err);
case IEEE80211_S_RUN:
return (err);
return (err);
if (err) {
return (err);
return (err);
case IEEE80211_S_INIT:
case IEEE80211_S_ASSOC:
if (err) {
return (err);
if (err) {
return (err);
return (err);
#ifdef DEBUG
int err;
case IEEE80211_CIPHER_WEP:
case IEEE80211_CIPHER_TKIP:
case IEEE80211_CIPHER_AES_CCM:
index1++) {
mac)) {
static uint32_t
static uint32_t
* ucode load/initialization steps:
return (err);
return (err);
int16_t t;
for (i = 0; i < RX_RES_PHY_CNT; i++)
mrssi = 0;
#ifdef DEBUG
if (mp) {
sizeof (struct iwk_init_alive_resp));
sizeof (struct iwk_alive_resp));
for (i = 0; i < IWK_NUM_QUEUES; i++) {
(i << SCD_QUEUE_STTS_REG_POS_TXF)|
static uint_t
return (DDI_INTR_UNCLAIMED);
case REPLY_4965_RX:
case REPLY_TX:
case REPLY_ALIVE:
case CARD_STATE_NOTIFICATION:
case SCAN_START_NOTIFICATION:
case STATISTICS_NOTIFICATION:
return (DDI_INTR_CLAIMED);
static uint_t
return (DDI_INTR_UNCLAIMED);
return (DDI_INTR_UNCLAIMED);
return (DDI_INTR_CLAIMED);
#ifdef DEBUG
return (DDI_INTR_CLAIMED);
if (r & BIT_INT_RF_KILL) {
if (r & BIT_INT_ALIVE) {
return (DDI_INTR_CLAIMED);
static uint8_t
switch (rate) {
ret = 0;
return (ret);
static mblk_t *
return (NULL);
return (NULL);
return (mp);
return (mp);
goto exit;
goto exit;
goto exit;
freemsg(m);
goto exit;
freemsg(m);
goto exit;
if (k == NULL) {
freemsg(m);
goto exit;
#ifdef DEBUG
freemsg(m);
exit:
return (err);
case IEEE80211_M_STA:
case IEEE80211_M_IBSS:
case IEEE80211_M_AHDEMO:
case IEEE80211_M_HOSTAP:
case IEEE80211_M_MONITOR:
for (i = 0; i < POWER_TABLE_NUM_HT_OFDM_ENTRIES; i++) {
for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
int err = 0;
return (err);
int err;
wldp_buf);
err = 0;
return (err);
switch (stat) {
case MAC_STAT_IFSPEED:
case MAC_STAT_NOXMTBUF:
case MAC_STAT_NORCVBUF:
case MAC_STAT_IERRORS:
case MAC_STAT_RBYTES:
case MAC_STAT_IPACKETS:
case MAC_STAT_OBYTES:
case MAC_STAT_OPACKETS:
case MAC_STAT_OERRORS:
case WIFI_STAT_TX_FAILED:
case WIFI_STAT_TX_RETRANS:
case WIFI_STAT_FCS_ERRORS:
case WIFI_STAT_WEP_ERRORS:
case WIFI_STAT_TX_FRAGS:
case WIFI_STAT_MCAST_TX:
case WIFI_STAT_RTS_SUCCESS:
case WIFI_STAT_RTS_FAILURE:
case WIFI_STAT_ACK_FAILURE:
case WIFI_STAT_RX_FRAGS:
case WIFI_STAT_MCAST_RX:
case WIFI_STAT_RX_DUPS:
return (ENOTSUP);
return (IWK_SUCCESS);
int err;
return (IWK_SUCCESS);
return (IWK_SUCCESS);
int err;
goto fail;
return (IWK_SUCCESS);
fail:
return (err);
return (IWK_SUCCESS);
return (IWK_SUCCESS);
if (!err)
IEEE80211_S_SCAN, 0);
timeout++;
timeout = 0;
if (async)
return (IWK_SUCCESS);
return (IWK_SUCCESS);
return (IWK_FAIL);
int i, err;
return (IWK_FAIL);
return (err);
if (err) {
return (err);
return (err);
for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
return (err);
return (IWK_SUCCESS);
essid));
return (IWK_SUCCESS);
int i, err;
sizeof (powertable), 0);
return (err);
sizeof (bt), 0);
return (err);
case IEEE80211_M_STA:
case IEEE80211_M_IBSS:
case IEEE80211_M_AHDEMO:
case IEEE80211_M_HOSTAP:
case IEEE80211_M_MONITOR:
sizeof (iwk_rxon_cmd_t), 0);
return (err);
if (err) {
return (err);
return (err);
for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
sizeof (link_quality), 0);
return (err);
return (IWK_SUCCESS);
return (IWK_SUCCESS);
return (ETIMEDOUT);
return (IWK_SUCCESS);
return (IWK_SUCCESS);
return (IWK_FAIL);
int i, rr;
return (IWK_FAIL);
if (rr != 0) {
return (IWK_FAIL);
return (IWK_FAIL);
return (IWK_SUCCESS);
goto fail1;
goto fail1;
goto fail1;
if (err) {
goto fail1;
return (IWK_SUCCESS);
return (err);
for (i = 0; i < IWK_NUM_QUEUES; i++)
int need_change = 0;
* The details is described in iwk_calibration.h file
return (DDI_FAILURE);
return (tempera);
* please refer to iwk_calibration.h file
return (CALIB_CH_GROUP_5);
return (CALIB_CH_GROUP_1);
return (CALIB_CH_GROUP_2);
return (CALIB_CH_GROUP_3);
return (CALIB_CH_GROUP_4);
return (DDI_FAILURE);
int32_t i;
if (is_hi_chan) {
return (NULL);
if ((channel >=
(channel <=
return (b_n);
if (num < 0) {
if (denom < 0) {
return (IWK_SUCCESS);
return (y1);
int32_t c, m;
return (DDI_FAILURE);
ch1_n =
ch2_n =
for (c = 0; c < EEP_TX_POWER_TX_CHAINS; c++) {
for (m = 0; m < EEP_TX_POWER_MEASUREMENTS; m++) {
m1_p =
m2_p =
return (IWK_SUCCESS);
* please refer to iwk_calibration.h file
return (vol_comp);
vol_comp = 0;
return (vol_comp);
static struct iwk_txpower_tempera_comp {
return (MIN_TX_GAIN_INDEX_52GHZ_EXT);
return (MIN_TX_GAIN_INDEX);
return (DDI_FAILURE);
channel);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
if (tx_grp < 0) {
return (tx_grp);
if (is_fat) {
if (is_high_chan) {
if (is_24G) {
if (is_24G) {
if (is_24G) {
(void) iwk_division(
for (r = 0; r < POWER_TABLE_NUM_ENTRIES; r++) {
is_mimo = 0;
if (is_mimo) {
atten_value = 0;
if (txpower_gains_idx <
if (!is_24G) {
if (POWER_TABLE_CCK_ENTRY == r) {
} else if (txpower_gains_idx < 0) {
txpower_gains_idx = 0;
if (r < POWER_TABLE_NUM_HT_OFDM_ENTRIES) {
return (IWK_SUCCESS);
int rv;
return (IWK_SUCCESS);
if (rv) {
return (rv);
if (rv) {
return (rv);
return (IWK_SUCCESS);
int is_diff;
sizeof (struct iwk_notif_statistics));
if (!is_diff) {
int i, rv;
for (i = 0; i < RX_CHAINS_NUM; i++) {
if (rv) {
return (rv);
return (IWK_SUCCESS);
int max_beacon_chain_n;
int min_noise_chain_n;
if (INTERFERENCE_DATA_AVAILABLE !=
return (IWK_SUCCESS);
return (IWK_SUCCESS);
!is_24G)) {
return (IWK_SUCCESS);
max_beacon_chain_n = 0;
for (i = 0; i < RX_CHAINS_NUM; i++) {
if (i != max_beacon_chain_n) {
beacon_aver[i];
min_noise_chain_n = 0;
for (i = 0; i < RX_CHAINS_NUM; i++) {
(noise_aver[i] <=
min_noise_chain_n = i;
for (i = 0; i < RX_CHAINS_NUM; i++) {
(noise_aver[i] <=
min_noise_chain_n = i;
for (i = 0; i < RX_CHAINS_NUM; i++) {
if (rv) {
return (rv);
return (IWK_SUCCESS);
int i, rv;
if (rv) {
return (rv);
return (IWK_SUCCESS);
* for more infomation, please refer to iwk_calibration.h file
int rv;
return (DDI_FAILURE);
if (INTERFERENCE_DATA_AVAILABLE !=
return (DDI_FAILURE);
if (!actual_rx_time) {
return (DDI_FAILURE);
if (rv) {
return (rv);
if (rv) {
return (rv);
return (IWK_SUCCESS);
if (rv) {
return (rv);
return (IWK_SUCCESS);
noise_a =
noise_b =
noise_c =
* for more infomation, please refer to iwk_calibration.h file
return (IWK_SUCCESS);
return (IWK_SUCCESS);
int err;
switch (subtype) {
index1++) {
if (!(log_event_table_ptr)) {
if (!wraps) {
for (i = 0; i < num_events; i++) {
if (wraps) {
for (i = 0; i < idx; i++) {
if (!(err_ptr)) {
if (!(valid)) {
sizeof (iwk_add_sta_t));
return (err);
return (err);
return (err);
return (err);
int err;
return (err);
return (err);
if (err) {
return (err);
if (err) {
return (err);
if (err) {
return (err);
for (int i = 0; i < IEEE80211_KEY_MAX; i++) {
if (err == 0) {
return (IWK_FAIL);
return (IWK_SUCCESS);
int rate;
sizeof (iwk_tx_beacon_cmd_t));
rate = 0;
masks = 0;
return (IWK_FAIL);
sizeof (iwk_tx_cmd_t) +
mp, 0)) {
return (err);
return (err);
int i, rate;
return (IWK_FAIL);
0, sizeof (iwk_add_sta_t));
return (err);
for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
return (err);
return (IWK_FAIL);
sizeof (iwk_add_sta_t));
sizeof (iwk_add_sta_t));
return (err);
for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) {
return (err);
return (err);