9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Use is subject to license terms.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2003, 2004
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Daan Vreeken <Danovitsch@Vitsch.net>. All rights reserved.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Redistribution and use in source and binary forms, with or without
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * modification, are permitted provided that the following conditions
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * are met:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 1. Redistributions of source code must retain the above copyright
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * notice, this list of conditions and the following disclaimer.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 2. Redistributions in binary form must reproduce the above copyright
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * notice, this list of conditions and the following disclaimer in the
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * documentation and/or other materials provided with the distribution.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 3. All advertising materials mentioning features or use of this software
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * must display the following acknowledgement:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * This product includes software developed by Daan Vreeken.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 4. Neither the name of the author nor the names of any co-contributors
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * may be used to endorse or promote products derived from this software
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * without specific prior written permission.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * THIS SOFTWARE IS PROVIDED BY Daan Vreeken AND CONTRIBUTORS ``AS IS'' AND
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * ARE DISCLAIMED. IN NO EVENT SHALL Daan Vreeken OR THE VOICES IN HIS HEAD
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * THE POSSIBILITY OF SUCH DAMAGE.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Atmel AT76c503 / AT76c503a / AT76c505 / AT76c505a USB WLAN driver
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Originally written by Daan Vreeken <Danovitsch @ Vitsch . net>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * http://vitsch.net/bsd/atuwi
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Contributed to by :
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Chris Whitehouse, Alistair Phillips, Peter Pilka, Martijn van Buul,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Suihong Liang, Arjan van Leeuwen, Stuart Walsh
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Ported to OpenBSD by Theo de Raadt and David Gwynne.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/strsubr.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/strsun.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/mac_provider.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/mac_wifi.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/net80211.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#define USBDRV_MAJOR_VER 2
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#define USBDRV_MINOR_VER 0
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/usb/usba.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include <sys/usb/usba/usba_types.h>
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_rfmd.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_rfmd2958.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_rfmd2958-smc.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_intersil.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_at76c505_rfmd.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_at76c503_rfmd_acc.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "fw/atmel_at76c503_i3863.hex"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China#include "atu.h"
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void *atu_soft_state_p;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic mac_callbacks_t atu_m_callbacks;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic const struct ieee80211_rateset atu_rateset = {4, {2, 4, 11, 22}};
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_usb_request(struct atu_softc *sc, uint8_t type,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t request, uint16_t value, uint16_t index, uint16_t length,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t *data)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_ctrl_setup_t req;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_cb_flags_t cf;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_cr_t cr;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mblk_t *mp = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int uret = USB_SUCCESS;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(&req, sizeof (req));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.bmRequestType = type;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.bRequest = request;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.wValue = value;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.wIndex = index;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.wLength = length;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.attrs = USB_ATTRS_NONE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (type & USB_DEV_REQ_DEV_TO_HOST) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req.attrs = USB_ATTRS_AUTOCLEARING;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uret = usb_pipe_ctrl_xfer_wait(sc->sc_udev->dev_default_ph,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China &req, &mp, &cr, &cf, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (mp == NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (uret == USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(mp->b_rptr, data, length);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China } else {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if ((mp = allocb(length, BPRI_HI)) == NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ENOMEM);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(data, mp->b_wptr, length);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mp->b_wptr += length;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uret = usb_pipe_ctrl_xfer_wait(sc->sc_udev->dev_default_ph,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China &req, &mp, &cr, &cf, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (mp)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (uret == USB_SUCCESS ? 0 : EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_get_mib(struct atu_softc *sc, uint8_t type, uint8_t size,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t index, uint8_t *buf)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return atu_usb_request(sc, ATU_VENDOR_IF_IN, 0x033,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China type << 8, index, size, buf);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_get_cmd_status(struct atu_softc *sc, uint8_t cmd, uint8_t *status)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * all other drivers (including Windoze) request 40 bytes of status
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * and get a short-xfer of just 6 bytes. we can save 34 bytes of
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * buffer if we just request those 6 bytes in the first place :)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return atu_usb_request(sc, ATU_VENDOR_IF_IN, 0x22, cmd,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0000, 6, status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic uint8_t
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_get_dfu_state(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t state;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (atu_usb_request(sc, DFU_GETSTATE, 0, 0, 1, &state))
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DFUState_DFUError);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (state);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_get_opmode(struct atu_softc *sc, uint8_t *mode)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return atu_usb_request(sc, ATU_VENDOR_IF_IN, 0x33, 0x0001,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0000, 1, mode);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_get_config(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_rfmd_conf rfmd_conf;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_intersil_conf intersil_conf;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (sc->sc_radio) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case RadioRFMD:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case RadioRFMD2958:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case RadioRFMD2958_SMC:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case AT76C503_RFMD_ACC:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case AT76C505_RFMD:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, ATU_VENDOR_IF_IN, 0x33, 0x0a02,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0000, sizeof (rfmd_conf), (uint8_t *)&rfmd_conf);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: get RFMD config failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(rfmd_conf.MACAddr, ic->ic_macaddr, IEEE80211_ADDR_LEN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case RadioIntersil:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case AT76C503_i3863:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, ATU_VENDOR_IF_IN, 0x33, 0x0902,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0000, sizeof (intersil_conf), (uint8_t *)&intersil_conf);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: get Intersil config failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(intersil_conf.MACAddr, ic->ic_macaddr,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China IEEE80211_ADDR_LEN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_wait_completion(struct atu_softc *sc, uint8_t cmd, uint8_t *status)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t statusreq[6];
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int idle_count = 0, err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China while ((err = atu_get_cmd_status(sc, cmd, statusreq)) == 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if ((statusreq[5] != STATUS_IN_PROGRESS) &&
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (statusreq[5] != STATUS_IDLE)) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (status != NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *status = statusreq[5];
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China } else if (idle_count++ > 60) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: command (0x%02x) timeout\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name, cmd);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ETIME);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China drv_usecwait(10 * 1000);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_send_command(struct atu_softc *sc, uint8_t *command, int size)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return atu_usb_request(sc, ATU_VENDOR_DEV_OUT, 0x0e, 0x0000,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0000, size, command);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_send_mib(struct atu_softc *sc, uint8_t type, uint8_t size,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t index, void *data)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_cmd_set_mib request;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(&request, sizeof (request));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.AtCmd = CMD_SET_MIB;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.AtSize = size + 4;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.MIBType = type;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.MIBSize = size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.MIBIndex = index;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.MIBReserved = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * For 1 and 2 byte requests we assume a direct value,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * everything bigger than 2 bytes we assume a pointer to the data
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (size) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case 0:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case 1:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.data[0] = (long)data & 0x000000ff;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case 2:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.data[0] = (long)data & 0x000000ff;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China request.data[1] = (long)data >> 8;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(data, request.data, size);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, ATU_VENDOR_DEV_OUT, 0x0e, 0x0000,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0000, size+8, (uint8_t *)&request);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (atu_wait_completion(sc, CMD_SET_MIB, NULL));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_switch_radio(struct atu_softc *sc, boolean_t on)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_cmd radio;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China boolean_t ostate;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* Intersil doesn't seem to support radio switch */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_radio == RadioIntersil)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ostate = ATU_RADIO_ON(sc) ? B_TRUE : B_FALSE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (on != ostate) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(&radio, sizeof (radio));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China radio.Cmd = on ? CMD_RADIO_ON : CMD_RADIO_OFF;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_send_command(sc, (uint8_t *)&radio,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sizeof (radio));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_wait_completion(sc, radio.Cmd, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (on)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags |= ATU_FLAG_RADIO_ON;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China else
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags &= ~ATU_FLAG_RADIO_ON;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_config(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_key *k;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_cmd_card_config cmd;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t rates[4] = {0x82, 0x84, 0x8B, 0x96};
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err, i;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_send_mib(sc, MIB_MAC_ADDR_STA, ic->ic_macaddr);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: setting MAC address failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(&cmd, sizeof (cmd));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.Cmd = CMD_STARTUP;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.Reserved = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.Size = sizeof (cmd) - 4;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.Channel = ATU_DEF_CHAN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.ShortRetryLimit = 7;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.RTS_Threshold = 2347;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.FragThreshold = 2346;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.PromiscuousMode = 1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.AutoRateFallback = 1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(rates, cmd.BasicRateSet, 4);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_flags & IEEE80211_F_PRIVACY) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China k = ic->ic_nw_keys + ic->ic_def_txkey;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (k->wk_keylen) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case 5:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.EncryptionType = ATU_ENC_WEP40;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case 13:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.EncryptionType = ATU_ENC_WEP104;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: key invalid (%d bytes)\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name, k->wk_keylen);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto nowep;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.PrivacyInvoked = 1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.ExcludeUnencrypted = 1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.WEP_DefaultKeyID = ic->ic_def_txkey;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China for (i = 0; i < IEEE80211_WEP_NKID; i++) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China k = ic->ic_nw_keys + i;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (k->wk_keylen == 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China continue;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(k->wk_key, cmd.WEP_DefaultKey + i, k->wk_keylen);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China } else {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinanowep:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.EncryptionType = ATU_ENC_NONE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(ic->ic_des_essid, cmd.SSID, ic->ic_des_esslen);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.SSID_Len = ic->ic_des_esslen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmd.BeaconPeriod = 100;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_send_command(sc, (uint8_t *)&cmd, sizeof (cmd));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_wait_completion(sc, CMD_STARTUP, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_switch_radio(sc, B_TRUE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_send_mib(sc, MIB_MAC_MGMT_POWER_MODE,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void *)ATU_POWER_ACTIVE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_start_scan(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_cmd_do_scan scan;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (!ATU_RUNNING(sc))
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(&scan, sizeof (scan));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.Cmd = CMD_START_SCAN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.Reserved = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.Size = sizeof (scan) - 4;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) memset(scan.BSSID, 0xff, sizeof (scan.BSSID));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(ic->ic_des_essid, scan.SSID, ic->ic_des_esslen);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.SSID_Len = ic->ic_des_esslen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.ScanType = ATU_SCAN_ACTIVE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.Channel = ieee80211_chan2ieee(ic, ic->ic_curchan);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.ProbeDelay = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.MinChannelTime = 20;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.MaxChannelTime = 40;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China scan.InternationalScan = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_send_command(sc, (uint8_t *)&scan, sizeof (scan));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: SCAN command failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_wait_completion(sc, CMD_START_SCAN, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: SCAN completion failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_join(struct atu_softc *sc, struct ieee80211_node *node)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_cmd_join join;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t status;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(&join, sizeof (join));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.Cmd = CMD_JOIN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.Reserved = 0x00;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.Size = sizeof (join) - 4;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(node->in_bssid, join.bssid, IEEE80211_ADDR_LEN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bcopy(node->in_essid, join.essid, node->in_esslen);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.essid_size = node->in_esslen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (node->in_capinfo & IEEE80211_CAPINFO_IBSS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.bss_type = ATU_MODE_IBSS;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China else
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.bss_type = ATU_MODE_STA;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.channel = ieee80211_chan2ieee(&sc->sc_ic, node->in_chan);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.timeout = ATU_JOIN_TIMEOUT;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China join.reserved = 0x00;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_send_command(sc, (uint8_t *)&join, sizeof (join));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: JOIN command failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_wait_completion(sc, CMD_JOIN, &status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (status != STATUS_COMPLETE) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: incorrect JOIN state (0x%02x)\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name, status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China enum ieee80211_state ostate = ic->ic_state;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ostate = ic->ic_state;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (nstate) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_SCAN:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (ostate) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_SCAN:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_AUTH:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_ASSOC:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_RUN:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_newstate(ic, nstate, arg);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if ((err = atu_start_scan(sc)) != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_cancel_scan(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = timeout(
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void (*) (void*))ieee80211_next_scan,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void *)&sc->sc_ic, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_AUTH:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (ostate) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_INIT:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_SCAN:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_join(sc, ic->ic_bss);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = sc->sc_newstate(ic, nstate, arg);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_open_pipes(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_ep_data_t *ep;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_policy_t policy = {0};
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int uret;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ep = usb_lookup_ep_data(sc->sc_dip, sc->sc_udev, 0, 0, 0,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_EP_ATTR_BULK, USB_EP_DIR_OUT);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China policy.pp_max_async_reqs = ATU_TX_LIST_CNT;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uret = usb_pipe_open(sc->sc_dip, &ep->ep_descr, &policy,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, &sc->sc_tx_pipe);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (uret != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ep = usb_lookup_ep_data(sc->sc_dip, sc->sc_udev, 0, 0, 0,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_EP_ATTR_BULK, USB_EP_DIR_IN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China policy.pp_max_async_reqs = ATU_RX_LIST_CNT + 32;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uret = usb_pipe_open(sc->sc_dip, &ep->ep_descr, &policy,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, &sc->sc_rx_pipe);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (uret != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_rx_pipe != NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_close(sc->sc_dip, sc->sc_rx_pipe,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_rx_pipe = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_tx_pipe != NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_close(sc->sc_dip, sc->sc_tx_pipe,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_FLAGS_SLEEP, NULL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_tx_pipe = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_close_pipes(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_flags_t flags = USB_FLAGS_SLEEP;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_rx_pipe != NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_reset(sc->sc_dip, sc->sc_rx_pipe, flags, NULL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_close(sc->sc_dip, sc->sc_rx_pipe, flags, NULL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_rx_pipe = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_tx_pipe != NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_reset(sc->sc_dip, sc->sc_tx_pipe, flags, NULL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_pipe_close(sc->sc_dip, sc->sc_tx_pipe, flags, NULL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_tx_pipe = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int atu_rx_trigger(struct atu_softc *sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_rxeof(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)req->bulk_client_private;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_node *ni;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_rx_hdr *h;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_frame *wh;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mblk_t *mp = req->bulk_data;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int len, pktlen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_data = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (req->bulk_completion_reason != USB_CR_OK) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_rx_err++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China len = msgdsize(mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (len < ATU_RX_HDRLEN + ATU_MIN_FRAMELEN) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_CONT, "%s: fragment (%d bytes)\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name, len);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_rx_err++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China h = (struct atu_rx_hdr *)mp->b_rptr;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China pktlen = h->length - 4;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (pktlen + ATU_RX_HDRLEN + 4 != len) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_CONT, "%s: jumbo (%d bytes -> %d bytes)\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name, len, pktlen);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_rx_err++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mp->b_rptr += ATU_RX_HDRLEN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mp->b_wptr = mp->b_rptr + pktlen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)mp->b_rptr;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (wh->i_fc[1] & IEEE80211_FC1_WEP)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ni = ieee80211_find_rxnode(ic, wh);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) ieee80211_input(ic, mp, ni, h->rssi, h->rx_time);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_free_node(ni);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinadone:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_free_bulk_req(req);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->rx_queued--;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ATU_RUNNING(sc))
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) atu_rx_trigger(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto done;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_txeof(usb_pipe_handle_t pipe, usb_bulk_req_t *req)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)req->bulk_client_private;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (req->bulk_completion_reason != USB_CR_OK)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_failed++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_free_bulk_req(req);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->tx_queued--;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_need_sched) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_need_sched = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_tx_update(ic->ic_mach);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_rx_trigger(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_bulk_req_t *req;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int uret;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req = usb_alloc_bulk_req(sc->sc_dip, ATU_RX_BUFSZ, USB_FLAGS_SLEEP);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (req == NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ENOMEM);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_len = ATU_RX_BUFSZ;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_client_private = (usb_opaque_t)sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_timeout = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_attributes = USB_ATTRS_SHORT_XFER_OK | USB_ATTRS_AUTOCLEARING;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_cb = atu_rxeof;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_exc_cb = atu_rxeof;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_completion_reason = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_cb_flags = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uret = usb_pipe_bulk_xfer(sc->sc_rx_pipe, req, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (uret != USB_SUCCESS) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_free_bulk_req(req);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->rx_queued++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_tx_trigger(struct atu_softc *sc, mblk_t *mp)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_bulk_req_t *req;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int uret;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req = usb_alloc_bulk_req(sc->sc_dip, 0, USB_FLAGS_SLEEP);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (req == NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_len = msgdsize(mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_data = mp;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_client_private = (usb_opaque_t)sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_timeout = 10;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_attributes = USB_ATTRS_AUTOCLEARING;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_cb = atu_txeof;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_exc_cb = atu_txeof;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_completion_reason = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_cb_flags = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uret = usb_pipe_bulk_xfer(sc->sc_tx_pipe, req, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (uret != USB_SUCCESS) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China req->bulk_data = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_free_bulk_req(req);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->tx_queued++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_init_rx_queue(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err, i;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->rx_queued = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China for (i = 0; i < ATU_RX_LIST_CNT; i++) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_rx_trigger(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_init_tx_queue(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->tx_queued = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_send(ieee80211com_t *ic, mblk_t *mp, uint8_t type)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_node *ni = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_tx_hdr *desc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_frame *wh;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mblk_t *m;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int pktlen = msgdsize(mp), err = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->tx_queued > ATU_TX_LIST_CNT) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_tx_nobuf++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = ENOMEM;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China m = allocb(ATU_TX_BUFSZ, BPRI_MED);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (m == NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_tx_nobuf++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = ENOMEM;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* reserve tx header space */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China m->b_rptr += ATU_TX_HDRLEN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China m->b_wptr += ATU_TX_HDRLEN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* copy and (implicitly) free old data */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mcopymsg(mp, m->b_wptr);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China m->b_wptr += pktlen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)m->b_rptr;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ni = ieee80211_find_txnode(ic, wh->i_addr1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ni == NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_failed++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China freemsg(m);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = ENXIO;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (type == IEEE80211_FC0_TYPE_DATA)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) ieee80211_encap(ic, m, ni);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* full WEP in device, prune WEP fields (IV, KID) */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) memmove(m->b_rptr + IEEE80211_WEP_IVLEN
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China + IEEE80211_WEP_KIDLEN, m->b_rptr,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sizeof (struct ieee80211_frame));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China m->b_rptr += IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China pktlen = msgdsize(m);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China m->b_rptr -= ATU_TX_HDRLEN;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* setup tx header */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China desc = (struct atu_tx_hdr *)m->b_rptr;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bzero(desc, ATU_TX_HDRLEN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China desc->length = (uint16_t)pktlen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China desc->tx_rate = ATU_DEF_TX_RATE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_tx_trigger(sc, m);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (!err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_frags++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_bytes += pktlen;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China } else {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_failed++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China freemsg(m);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ni != NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_free_node(ni);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_stop(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags &= ~ATU_FLAG_RUNNING;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_close_pipes(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (atu_switch_radio(sc, B_FALSE));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_init(struct atu_softc *sc)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_stop(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_open_pipes(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_config(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: startup config failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_init_tx_queue(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_init_rx_queue(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: rx queue init failed\n", sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags |= ATU_FLAG_RUNNING;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) atu_stop(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_watchdog(void *arg)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_stop_watchdog(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (!ATU_RUNNING(sc)) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (ic->ic_state) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_AUTH:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_ASSOC:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_bss->in_fails > 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China else
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_watchdog(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_dfu_stage1(void *arg)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t state, *ptr = NULL, status[6];
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int block_size, bytes_left = 0, block = 0, err, i, count = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Uploading firmware is done with the DFU (Device Firmware Upgrade)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * interface. See "Universal Serial Bus - Device Class Specification
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * for Device Firmware Upgrade" pdf for details of the protocol.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Maybe this could be moved to a separate 'firmware driver' once more
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * device drivers need it... For now we'll just do it here.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Just for your information, the Atmel's DFU descriptor looks like
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * this:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 07 size
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 21 type
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 01 capabilities : only firmware download, *need* reset
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * after download
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 13 05 detach timeout : max 1299ms between DFU_DETACH and
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * reset
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * 00 04 max bytes of firmware per transaction : 1024
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China for (i = 0; i < sizeof (atu_fw_table) / sizeof (atu_fw_table[0]); i++)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_radio == atu_fw_table[i].atur_type) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ptr = atu_fw_table[i].atur_int;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bytes_left = atu_fw_table[i].atur_int_size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China state = atu_get_dfu_state(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China while (block >= 0 && state > 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (state) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DFUState_DnLoadSync:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* get DFU status */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, DFU_GETSTATUS, 0, 0, 6,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU get status failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* success means state => DnLoadIdle */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China state = DFUState_DnLoadIdle;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China continue;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DFUState_DFUIdle:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DFUState_DnLoadIdle:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (bytes_left >= DFU_MaxBlockSize)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block_size = DFU_MaxBlockSize;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China else
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block_size = bytes_left;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, DFU_DNLOAD, block++, 0,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block_size, ptr);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU download failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ptr += block_size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bytes_left -= block_size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (block_size == 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block = -1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DFUState_DFUError:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU state error\n", sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China drv_usecwait(10*1000);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (++count > 100) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU timeout\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ETIME);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China state = atu_get_dfu_state(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (state != DFUState_ManifestSync)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU state (%d) != ManifestSync\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name, state);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, DFU_GETSTATUS, 0, 0, 6, status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU get status failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, DFU_REMAP, 0, 0, 0, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err && !(sc->sc_quirk & ATU_QUIRK_NO_REMAP)) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: DFU remap failed\n", sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * after a lot of trying and measuring I found out the device needs
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * about 56 miliseconds after sending the remap command before
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * it's ready to communicate again. So we'll wait just a little bit
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * longer than that to be sure...
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China drv_usecwait((56+100)*1000);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_dfu_stage2(void *arg)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t *ptr = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int block_size, bytes_left = 0, block = 0, err, i;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China for (i = 0; i < sizeof (atu_fw_table) / sizeof (atu_fw_table[0]); i++)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_radio == atu_fw_table[i].atur_type) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ptr = atu_fw_table[i].atur_ext;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bytes_left = atu_fw_table[i].atur_ext_size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China while (bytes_left) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (bytes_left > 1024)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block_size = 1024;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China else
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block_size = bytes_left;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, ATU_VENDOR_DEV_OUT, 0x0e,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China 0x0802, block, block_size, ptr);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: stage2 firmware load failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ptr += block_size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block++;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China bytes_left -= block_size;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_usb_request(sc, ATU_VENDOR_DEV_OUT, 0x0e, 0x0802,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China block, 0, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: zero-length block load failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * The SMC2662w V.4 seems to require some time to do its thing with
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * the stage2 firmware... 20 ms isn't enough, but 21 ms works 100
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * times out of 100 tries. We'll wait a bit longer just to be sure
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_quirk & ATU_QUIRK_FW_DELAY)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China drv_usecwait((21 + 100) * 1000);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_load_microcode(struct atu_softc *sc, boolean_t attach)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_dev_reset_lvl_t reset;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China uint8_t mode, chan;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China reset = attach ? USB_RESET_LVL_REATTACH : USB_RESET_LVL_DEFAULT;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_get_opmode(sc, &mode);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (!err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (mode == ATU_DEV_READY)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /*
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * Opmode of SMC2662 V.4 does not change after stage2
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * firmware download. If succeeded reading the channel
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China * number, stage2 firmware is already running.
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_radio != RadioIntersil &&
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_get_mib(sc, MIB_PHY_CHANNEL, &chan) == 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (mode == ATU_DEV_STAGE2)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastage2:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (atu_dfu_stage2(sc));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_dfu_stage1(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (usb_reset_device(sc->sc_dip, reset) != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EIO);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (attach)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (EAGAIN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China else
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto stage2;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_disconnect(dev_info_t *dip)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(atu_soft_state_p, ddi_get_instance(dip));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_stop_watchdog(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags &= ~(ATU_FLAG_RUNNING | ATU_FLAG_RADIO_ON);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_close_pipes(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_reconnect(dev_info_t *dip)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(atu_soft_state_p, ddi_get_instance(dip));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (usb_check_same_device(sc->sc_dip, NULL, USB_LOG_L2, -1,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_CHK_BASIC, NULL) != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_load_microcode(sc, B_FALSE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (!err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_init(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err ? DDI_FAILURE : DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_register_t *macp;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China wifi_data_t wd = {0};
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int instance, i, err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (cmd) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DDI_ATTACH:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DDI_RESUME:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(atu_soft_state_p,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ddi_get_instance(dip));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (usb_check_same_device(sc->sc_dip, NULL, USB_LOG_L2, -1,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China USB_CHK_BASIC, NULL) != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (atu_load_microcode(sc, B_FALSE) == 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) atu_init(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China instance = ddi_get_instance(dip);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ddi_soft_state_zalloc(atu_soft_state_p, instance) != DDI_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(atu_soft_state_p, instance);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_dip = dip;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) snprintf(sc->sc_name, sizeof (sc->sc_name), "%s%d",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China "atu", instance);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = usb_client_attach(dip, USBDRV_VERSION, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = usb_get_dev_data(dip, &sc->sc_udev, USB_PARSE_LVL_ALL, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err != USB_SUCCESS) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_udev = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail2;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China for (i = 0; i < sizeof (atu_dev_table)/sizeof (atu_dev_table[0]); i++) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_dev_type *t = &atu_dev_table[i];
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_udev->dev_descr->idVendor == t->atu_vid &&
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_udev->dev_descr->idProduct == t->atu_pid) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_radio = t->atu_radio;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_quirk = t->atu_quirk;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_load_microcode(sc, B_TRUE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err == EAGAIN) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags |= ATU_FLAG_REATTACH; /* reattaching */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China } else if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail2;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_flags &= ~ATU_FLAG_REATTACH;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China /* read device config & MAC address */
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_get_config(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: read device config failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail2;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_init(&sc->sc_genlock, NULL, MUTEX_DRIVER, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_init(&sc->sc_txlock, NULL, MUTEX_DRIVER, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_init(&sc->sc_rxlock, NULL, MUTEX_DRIVER, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_phytype = IEEE80211_T_DS;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_opmode = IEEE80211_M_STA;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_caps = IEEE80211_C_SHPREAMBLE | IEEE80211_C_WEP;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_rates[IEEE80211_MODE_11B] = atu_rateset;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_maxrssi = atu_fw_table[sc->sc_radio].max_rssi;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_state = IEEE80211_S_INIT;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China for (i = 1; i <= 14; i++) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_channels[i].ich_freq =
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_channels[i].ich_flags =
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China IEEE80211_CHAN_CCK | IEEE80211_CHAN_2GHZ |
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China IEEE80211_CHAN_PASSIVE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_xmit = atu_send;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_attach(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_newstate = ic->ic_newstate;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_newstate = atu_newstate;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_watchdog = atu_watchdog;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_media_init(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_def_txkey = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China wd.wd_opmode = ic->ic_opmode;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China wd.wd_secalloc = WIFI_SEC_NONE;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_bss->in_bssid);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp = mac_alloc(MAC_VERSION);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (macp == NULL)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail3;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_driver = sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_dip = dip;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_src_addr = ic->ic_macaddr;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_callbacks = &atu_m_callbacks;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_min_sdu = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_max_sdu = IEEE80211_MTU;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_pdata = &wd;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China macp->m_pdata_size = sizeof (wd);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = mac_register(macp, &ic->ic_mach);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_free(macp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail3;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = usb_register_hotplug_cbs(sc->sc_dip, atu_disconnect,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_reconnect);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err != USB_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China goto fail4;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = ddi_create_minor_node(dip, sc->sc_name, S_IFCHR,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China instance + 1, DDI_NT_NET_WIFI, 0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China cmn_err(CE_WARN, "%s: minor node creation failed\n",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_name);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_link_update(ic->ic_mach, LINK_STATE_DOWN);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail4:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) mac_unregister(ic->ic_mach);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail3:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_genlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail2:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_client_detach(sc->sc_dip, sc->sc_udev);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinafail1:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_free(atu_soft_state_p, instance);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(atu_soft_state_p, ddi_get_instance(dip));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (cmd) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DDI_DETACH:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case DDI_SUSPEND:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(&sc->sc_ic, IEEE80211_S_INIT, -1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_stop_watchdog(&sc->sc_ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) atu_stop(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (!ATU_REATTACH(sc)) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = mac_disable(sc->sc_ic.ic_mach);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) atu_stop(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_unregister_hotplug_cbs(dip);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) mac_unregister(sc->sc_ic.ic_mach);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_detach(&sc->sc_ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_genlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->sc_rxlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ddi_remove_minor_node(dip, NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China usb_client_detach(dip, sc->sc_udev);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_free(atu_soft_state_p, ddi_get_instance(dip));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing ChinaDDI_DEFINE_STREAM_OPS(atu_dev_ops, nulldev, nulldev, atu_attach,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_detach, nodev, NULL, D_MP, NULL, ddi_quiesce_not_needed);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic struct modldrv atu_modldrv = {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China &mod_driverops,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China "atu driver v1.1",
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China &atu_dev_ops
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China};
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic struct modlinkage modlinkage = {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China MODREV_1,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void *)&atu_modldrv,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China NULL
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China};
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaint
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China_info(struct modinfo *modinfop)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (mod_info(&modlinkage, modinfop));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaint
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China_init(void)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int status;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China status = ddi_soft_state_init(&atu_soft_state_p,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sizeof (struct atu_softc), 1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (status != 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_init_ops(&atu_dev_ops, "atu");
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China status = mod_install(&modlinkage);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (status != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_fini_ops(&atu_dev_ops);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_fini(&atu_soft_state_p);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaint
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China_fini(void)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int status;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China status = mod_remove(&modlinkage);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (status == 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mac_fini_ops(&atu_dev_ops);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_fini(&atu_soft_state_p);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (status);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_start(void *arg)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_init(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_stop(void *arg)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_stop_watchdog(ic);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) atu_stop(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_unicst(void *arg, const uint8_t *macaddr)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ENOTSUP);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_multicst(void *arg, boolean_t add, const uint8_t *mca)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ENOTSUP);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_promisc(void *arg, boolean_t on)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_setprop(void *arg, const char *name, mac_prop_id_t id, uint_t len,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China const void *buf)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = ieee80211_setprop(ic, name, id, len, buf);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err != ENETRESET)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_des_esslen == 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ATU_RUNNING(sc)) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_init(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (err);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic int
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyeratu_m_getprop(void *arg, const char *name, mac_prop_id_t id,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t length, void *buf)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct atu_softc *sc = (struct atu_softc *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct ieee80211com *ic = &sc->sc_ic;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer return (ieee80211_getprop(ic, name, id, length, buf));
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyeratu_m_propinfo(void *arg, const char *name, mac_prop_id_t id,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t mph)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct atu_softc *sc = (struct atu_softc *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct ieee80211com *ic = &sc->sc_ic;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ieee80211_propinfo(ic, name, id, mph);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic void
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_ioctl(void* arg, queue_t *wq, mblk_t *mp)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China int err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = ieee80211_ioctl(ic, wq, mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err != ENETRESET || ic->ic_des_esslen == 0)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ATU_RUNNING(sc)) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (sc->sc_scan_timer != 0) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->sc_scan_timer);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_scan_timer = 0;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China err = atu_init(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (err)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic mblk_t *
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_tx(void *arg, mblk_t *mp)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mblk_t *next;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_state != IEEE80211_S_RUN) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China freemsgchain(mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (NULL);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China while (mp != NULL) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China next = mp->b_next;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mp->b_next = NULL;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China if (atu_send(ic, mp, IEEE80211_FC0_TYPE_DATA) == ENOMEM) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China sc->sc_need_sched = 1;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->sc_txlock);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mp->b_next = next;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China mp = next;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (mp);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic int
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinaatu_m_stat(void *arg, uint_t stat, uint64_t *val)
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China{
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China struct atu_softc *sc = (struct atu_softc *)arg;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211com_t *ic = &sc->sc_ic;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ieee80211_node_t *in;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_LOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China switch (stat) {
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_IFSPEED:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China in = ic->ic_bss;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = ((ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) ?
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China IEEE80211_RATE(in->in_txrate) :
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ic->ic_fixed_rate) / 2 * 1000000;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_NOXMTBUF:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = sc->sc_tx_nobuf;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_NORCVBUF:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = sc->sc_rx_nobuf;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_IERRORS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = sc->sc_rx_err;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_RBYTES:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_bytes;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_IPACKETS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_frags;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_OBYTES:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_bytes;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_OPACKETS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_frags;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_OERRORS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_failed;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China break;
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_FRAGS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_TX:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_FAILED:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_RETRANS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_RERETRANS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RTS_SUCCESS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RTS_FAILURE:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_ACK_FAILURE:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RX_FRAGS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_RX:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_FCS_ERRORS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_WEP_ERRORS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RX_DUPS:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ieee80211_stat(ic, stat, val));
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China default:
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (ENOTSUP);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China }
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China ATU_UNLOCK(sc);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China return (0);
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China}
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing Chinastatic mac_callbacks_t atu_m_callbacks = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_stat,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_start,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_stop,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_promisc,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_multicst,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_unicst,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_tx,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_ioctl,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China NULL,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China NULL,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China NULL,
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China atu_m_setprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer atu_m_getprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer atu_m_propinfo
9f758caf94c37c3ad28c48cfe503f9fc830a66d5pengcheng chen - Sun Microsystems - Beijing China};