rtw.c revision 42516a0c6ebf6e259c2abcd1ca315fec43268f39
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Use is subject to license terms.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2004 David Young. All rights reserved.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * This code was written by David Young.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Redistribution and use in source and binary forms, with or without
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * modification, are permitted provided that the following conditions
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 1. Redistributions of source code must retain the above copyright
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * notice, this list of conditions and the following disclaimer.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 2. Redistributions in binary form must reproduce the above copyright
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * notice, this list of conditions and the following disclaimer in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * documentation and/or other materials provided with the distribution.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 3. Neither the name of the author nor the names of any co-contributors
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * may be used to endorse or promote products derived from this software
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * without specific prior written permission.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
f948ca04a28ccfeed9633bf4b0fb0d2c59c37478David Luna * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL David
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * OF SUCH DAMAGE.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * PIO access attributes for registers
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic ddi_device_acc_attr_t rtw_reg_accattr = {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DMA access attributes for descriptors and bufs: NOT to be byte swapped.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic ddi_device_acc_attr_t rtw_desc_accattr = {
static int rtw_m_start(void *);
static void rtw_m_stop(void *);
NULL,
_init(void)
int status;
if (status != 0)
return (status);
if (status != 0) {
return (status);
_fini(void)
int status;
if (status == 0) {
return (status);
#ifdef DEBUG
switch (access) {
case RTW_ACCESS_NONE:
case RTW_ACCESS_CONFIG:
case RTW_ACCESS_ANAPARM:
if (enable)
if (enable)
if (enable)
switch (naccess) {
case RTW_ACCESS_NONE:
case RTW_ACCESS_ANAPARM:
case RTW_ACCESS_CONFIG:
case RTW_ACCESS_NONE:
case RTW_ACCESS_CONFIG:
case RTW_ACCESS_NONE:
case RTW_ACCESS_CONFIG:
case RTW_ACCESS_ANAPARM:
case RTW_ACCESS_ANAPARM:
case RTW_ACCESS_NONE:
case RTW_ACCESS_CONFIG:
case RTW_ACCESS_ANAPARM:
if (enable)
return (ETIMEDOUT);
return (ETIMEDOUT);
int rc;
if (rc != 0)
return (rc);
switch (priority) {
const char *dvname)
for (i = 0; i < IEEE80211_ADDR_LEN; i++)
switch (*rfchipid) {
case RTW_RFCHIPID_MAXIM:
case RTW_RFCHIPID_INTERSIL:
case RTW_RFCHIPID_RFMD:
case RTW_RFCHIPID_RESERVED:
case RTW_CONFIG0_GL_USA:
case RTW_CONFIG0_GL_EUROPE:
case RTW_CONFIG0_GL_JAPAN:
const char *dvname)
int rc;
dvname);
return (ENOMEM);
return (rc);
#ifdef SROM_DEBUG
const char *dvname)
const char *method;
switch (rfchipid) {
case RTW_RFCHIPID_INTERSIL:
case RTW_RFCHIPID_PHILIPS:
case RTW_RFCHIPID_RFMD:
const char *dvname)
switch (locale) {
nrate = 0;
const char *dvname)
case RTW_CONFIG0_GL_USA:
case RTW_CONFIG0_GL_JAPAN:
case RTW_CONFIG0_GL_EUROPE:
const char *dvname)
static uint8_t
if (is_last)
sizeof (struct rtw_rxdesc),
int active;
sizeof (struct rtw_rxdesc),
if (enable)
int err;
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_SUCCESS);
for (i = 0; i < RTW_NTXPRI; i++) {
for (j = 0; j < RTW_RXQLEN; j++) {
rxbf++;
int i, j, err;
goto error;
for (i = 0; i < RTW_NTXPRI; i++) {
i, vtx[i]);
sizeof (struct rtw_txbuf),
sizeof (struct rtw_txbuf),
goto error;
goto error;
return (DDI_SUCCESS);
return (DDI_FAILURE);
int is_last;
for (i = 0; i < RTW_NTXPRI; i++) {
for (j = 0; j < rtw_qlen[i]; j++) {
is_last = 0;
if (is_last) {
txbf++;
if (!flag)
for (j = 0; j < RTW_RXQLEN; j++) {
is_last = 0;
rxbf++;
switch (power) {
case RTW_ON:
case RTW_SLEEP:
case RTW_OFF:
switch (power) {
case RTW_OFF:
if (before_rf)
case RTW_SLEEP:
if (!before_rf)
case RTW_ON:
if (!before_rf)
switch (power) {
case RTW_OFF:
if (before_rf)
case RTW_SLEEP:
if (!before_rf)
case RTW_ON:
if (!before_rf)
switch (power) {
case RTW_OFF:
if (before_rf)
case RTW_SLEEP:
if (!before_rf)
case RTW_ON:
if (!before_rf)
if (digphy) {
int digphy)
int rc;
switch (power) {
case RTW_ON:
case RTW_SLEEP:
case RTW_OFF:
if (rc == 0)
return (rc);
int rc;
return (EIO);
switch (opmode) {
case IEEE80211_M_AHDEMO:
case IEEE80211_M_IBSS:
case IEEE80211_M_HOSTAP:
case IEEE80211_M_STA:
case IEEE80211_M_AHDEMO:
case IEEE80211_M_IBSS:
int rc = 0;
if (rc != 0)
int rc;
return (rc);
int rc = 0;
goto out;
if (rc != 0)
return (rc);
out:
return (rc);
static struct rtw_rf *
int rtw_host_rfio;
switch (rfchipid) {
case RTW_RFCHIPID_INTERSIL:
case RTW_RFCHIPID_PHILIPS:
case RTW_RFCHIPID_RFMD:
switch (rfchipid) {
case RTW_RFCHIPID_MAXIM:
case RTW_RFCHIPID_PHILIPS:
case RTW_RFCHIPID_RFMD:
return (NULL);
return (rf);
static uint8_t
return (phydelay);
int rate;
rate = 0;
struct rtw_ieee80211_duration *d)
d->d_residue = 0;
if (remainder != 0) {
data_dur++;
switch (rate) {
d->d_rts_dur =
ack;
npkt++;
return (rc);
if (iswep) {
struct ieee80211_key *k;
if (k == NULL) {
__func__);
switch (rate) {
sizeof (struct rtw_txdesc),
__func__);
if (ret != 0) {
static mblk_t *
return (NULL);
return (mp);
for (i = 0; i < IEEE80211_ADDR_LEN; i++)
srate--)
srate--)
static int startctl = 0;
if (enough &&
switch (mod) {
if (nrate > 0) {
nrate--;
nrate++;
} else if (enough)
if (!startctl) {
static int32_t
int error;
return (error);
switch (nstate) {
case IEEE80211_S_INIT:
startctl = 0;
case IEEE80211_S_SCAN:
case IEEE80211_S_RUN:
case IEEE80211_M_HOSTAP:
case IEEE80211_M_IBSS:
case IEEE80211_M_AHDEMO:
case IEEE80211_M_STA:
case IEEE80211_M_MONITOR:
case IEEE80211_S_ASSOC:
case IEEE80211_S_AUTH:
return (error);
for (i = 0; i < RTW_RXQLEN; i++) {
sizeof (struct rtw_rxdesc),
sizeof (struct rtw_rxdesc),
goto next;
goto next;
goto next;
goto next;
goto next;
next:
is_last = 0;
cnt++;
sizeof (struct rtw_txdesc),
bf);
sizeof (struct rtw_txdesc),
static uint_t
if (isr == 0) {
return (DDI_INTR_UNCLAIMED);
#ifdef DEBUG
return (DDI_INTR_CLAIMED);
#ifdef DMA_DEBUG
for (i = 0; i < RTW_NTXPRI; i++) {
if (j >= DMA_WAIT)
if (j == DMA_WAIT)
for (i = 0; i < RTW_RXQLEN; i++) {
if (j == DMA_WAIT)
int ret;
#ifdef DEBUG
if (ret) {
uint32_t t;
if (on)
uint32_t t;
if (add) {
switch (stat) {
case MAC_STAT_IFSPEED:
case MAC_STAT_NOXMTBUF:
case MAC_STAT_NORCVBUF:
case MAC_STAT_RBYTES:
case MAC_STAT_IPACKETS:
case MAC_STAT_OBYTES:
case MAC_STAT_OPACKETS:
case WIFI_STAT_TX_RETRANS:
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:
*val = 0;
for (i = 0; i < RTW_NTXPRI; i++) {
uint32_t i;
switch (cmd) {
case DDI_ATTACH:
return (DDI_FAILURE);
return (DDI_FAILURE);
goto attach_fail0;
if (!csz)
goto attach_fail0;
goto attach_fail1;
goto attach_fail2;
goto attach_fail2;
goto attach_fail3;
goto attach_fail3;
goto attach_fail4;
!= DDI_SUCCESS) {
goto attach_fail5;
for (i = 0; i < RTW_NTXPRI; i++) {
goto attach_fail7;
goto attach_fail8;
if (err != 0) {
goto attach_fail8;
goto attach_fail9;
return (DDI_SUCCESS);
return (DDI_FAILURE);
static int32_t
switch (cmd) {
case DDI_DETACH:
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_FAILURE);
return (DDI_SUCCESS);