atu.c revision 0dc2366f7b9f9f36e10909b1e95edbf2a261c2ac
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Use is subject to license terms.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Copyright (c) 2003, 2004
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Daan Vreeken <Danovitsch@Vitsch.net>. All rights reserved.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Redistribution and use in source and binary forms, with or without
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * modification, are permitted provided that the following conditions
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * are met:
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * 1. Redistributions of source code must retain the above copyright
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * notice, this list of conditions and the following disclaimer.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * 2. Redistributions in binary form must reproduce the above copyright
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * notice, this list of conditions and the following disclaimer in the
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * documentation and/or other materials provided with the distribution.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * 3. All advertising materials mentioning features or use of this software
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * must display the following acknowledgement:
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * This product includes software developed by Daan Vreeken.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * 4. Neither the name of the author nor the names of any co-contributors
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * may be used to endorse or promote products derived from this software
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * without specific prior written permission.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * THIS SOFTWARE IS PROVIDED BY Daan Vreeken AND CONTRIBUTORS ``AS IS'' AND
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * ARE DISCLAIMED. IN NO EVENT SHALL Daan Vreeken OR THE VOICES IN HIS HEAD
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * THE POSSIBILITY OF SUCH DAMAGE.
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Atmel AT76c503 / AT76c503a / AT76c505 / AT76c505a USB WLAN driver
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Originally written by Daan Vreeken <Danovitsch @ Vitsch . net>
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Contributed to by :
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Chris Whitehouse, Alistair Phillips, Peter Pilka, Martijn van Buul,
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Suihong Liang, Arjan van Leeuwen, Stuart Walsh
9512fe850e98fdd448c638ca63fdd92a8a510255ahl * Ported to OpenBSD by Theo de Raadt and David Gwynne.
#define USBDRV_MINOR_VER 0
#include "fw/atmel_rfmd.hex"
#include "fw/atmel_rfmd2958.hex"
#include "fw/atmel_rfmd2958-smc.hex"
#include "fw/atmel_intersil.hex"
#include "fw/atmel_at76c505_rfmd.hex"
#include "fw/atmel_at76c503_rfmd_acc.hex"
#include "fw/atmel_at76c503_i3863.hex"
#include "atu.h"
static void *atu_soft_state_p;
return (EIO);
return (ENOMEM);
if (mp)
static uint8_t
return (DFUState_DFUError);
return (state);
int err;
case RadioRFMD:
case RadioRFMD2958:
case RadioRFMD2958_SMC:
case AT76C503_RFMD_ACC:
case AT76C505_RFMD:
if (err) {
return (err);
case RadioIntersil:
case AT76C503_i3863:
if (err) {
return (err);
return (ETIME);
return (err);
int err;
switch (size) {
if (err)
return (err);
int err;
sizeof (radio));
if (err)
return (err);
if (err)
return (err);
if (on)
struct ieee80211_key *k;
int err, i;
if (err) {
return (err);
switch (k->wk_keylen) {
goto nowep;
for (i = 0; i < IEEE80211_WEP_NKID; i++) {
if (k->wk_keylen == 0)
if (err)
return (err);
if (err)
return (err);
if (err)
return (err);
(void *)ATU_POWER_ACTIVE);
if (err)
return (err);
int err;
return (EIO);
if (err) {
return (err);
if (err) {
return (err);
int err;
if (err) {
return (err);
if (err)
return (err);
return (EIO);
int err = 0;
switch (nstate) {
case IEEE80211_S_SCAN:
switch (ostate) {
case IEEE80211_S_SCAN:
case IEEE80211_S_AUTH:
case IEEE80211_S_ASSOC:
case IEEE80211_S_RUN:
return (err);
(void (*) (void*))ieee80211_next_scan,
return (err);
case IEEE80211_S_AUTH:
switch (ostate) {
case IEEE80211_S_INIT:
case IEEE80211_S_SCAN:
if (err) {
return (err);
return (err);
int uret;
goto fail;
goto fail;
fail:
return (EIO);
struct atu_rx_hdr *h;
goto fail;
goto fail;
goto fail;
done:
fail:
goto done;
int uret;
return (ENOMEM);
return (EIO);
int uret;
return (EIO);
return (EIO);
int err, i;
for (i = 0; i < ATU_RX_LIST_CNT; i++) {
if (err)
return (err);
mblk_t *m;
goto fail;
if (m == NULL) {
goto fail;
freemsg(m);
goto fail;
sizeof (struct ieee80211_frame));
if (!err) {
freemsg(m);
fail:
return (err);
int err;
if (err)
return (err);
if (err)
goto fail;
if (err) {
goto fail;
if (err) {
goto fail;
fail:
return (err);
case IEEE80211_S_AUTH:
case IEEE80211_S_ASSOC:
switch (state) {
case DFUState_DnLoadSync:
status);
if (err) {
return (err);
case DFUState_DFUIdle:
case DFUState_DnLoadIdle:
if (err) {
return (err);
if (block_size == 0)
case DFUState_DFUError:
return (EIO);
return (ETIME);
if (err) {
return (err);
return (err);
while (bytes_left) {
if (err) {
return (err);
block++;
if (err) {
return (err);
int err;
if (!err) {
if (err)
return (err);
return (EIO);
if (attach)
return (EAGAIN);
goto stage2;
int err;
return (DDI_FAILURE);
if (!err)
switch (cmd) {
case DDI_ATTACH:
case DDI_RESUME:
return (DDI_SUCCESS);
return (DDI_SUCCESS);
return (DDI_FAILURE);
return (DDI_FAILURE);
goto fail1;
goto fail2;
return (DDI_SUCCESS);
} else if (err) {
goto fail2;
if (err) {
goto fail2;
goto fail3;
if (err)
goto fail3;
goto fail4;
return (DDI_SUCCESS);
return (DDI_FAILURE);
int err;
switch (cmd) {
case DDI_DETACH:
case DDI_SUSPEND:
return (DDI_SUCCESS);
return (DDI_FAILURE);
if (err)
return (DDI_FAILURE);
return (DDI_SUCCESS);
(void *)&atu_modldrv,
_init(void)
int status;
if (status != 0)
return (status);
if (status != 0) {
return (status);
_fini(void)
int status;
if (status == 0) {
return (status);
int err;
return (err);
return (ENOTSUP);
return (ENOTSUP);
const void *buf)
int err;
return (err);
if (err)
return (err);
int err;
if (err)
static mblk_t *
return (NULL);
return (mp);
return (mp);
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_FRAGS:
case WIFI_STAT_MCAST_TX:
case WIFI_STAT_TX_FAILED:
case WIFI_STAT_TX_RETRANS:
case WIFI_STAT_TX_RERETRANS:
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_FCS_ERRORS:
case WIFI_STAT_WEP_ERRORS:
case WIFI_STAT_RX_DUPS:
return (ENOTSUP);
NULL,
NULL,
NULL,
NULL,