e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Use is subject to license terms.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2007 by Lukas Turek <turek@ksvi.mff.cuni.cz>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2007 by Jiri Svoboda <jirik.svoboda@seznam.cz>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2007 by Martin Krulis <martin.krulis@matfyz.cz>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2006 by Damien Bergamini <damien.bergamini@free.fr>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Copyright (c) 2006 by Florian Stoehr <ich@florian-stoehr.de>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Permission to use, copy, modify, and distribute this software for any
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * purpose with or without fee is hereby granted, provided that the above
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * copyright notice and this permission notice appear in all copies.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * ZD1211 wLAN driver
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Driver major routines
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/byteorder.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/ddi.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/sunddi.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/conf.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/modctl.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/mac_provider.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/mac_wifi.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/strsun.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include <sys/ksynch.h>
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include "zyd.h"
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#include "zyd_reg.h"
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_stat(void *arg, uint_t stat, uint64_t *val);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_start(void *arg);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic void zyd_m_stop(void *arg);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_unicst(void *arg, const uint8_t *macaddr);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_multicst(void *arg, boolean_t add, const uint8_t *m);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_promisc(void *arg, boolean_t on);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic void zyd_m_ioctl(void *arg, queue_t *wq, mblk_t *mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic mblk_t *zyd_m_tx(void *arg, mblk_t *mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_getprop(void *arg, const char *pr_name,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_id_t wldp_pr_num, uint_t wldp_length, void *wldp_buf);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void zyd_m_propinfo(void *arg, const char *pr_name,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_id_t wldp_pr_num, mac_prop_info_handle_t mph);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_m_setprop(void *arg, const char *pr_name,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mac_prop_id_t wldp_pr_num, uint_t wldp_length, const void *wldp_buf);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int zyd_newstate(struct ieee80211com *ic,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China enum ieee80211_state state, int arg);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/* Driver identification */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic char zyd_ident[] = ZYD_DRV_DESC " " ZYD_DRV_REV;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/* Global state pointer for managing per-device soft states */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid *zyd_ssp;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Mac Call Back entries
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic mac_callbacks_t zyd_m_callbacks = {
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer MC_IOCTL | MC_SETPROP | MC_GETPROP | MC_PROPINFO,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_stat, /* Get the value of a statistic */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_start, /* Start the device */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_stop, /* Stop the device */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_promisc, /* Enable or disable promiscuous mode */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_multicst, /* Enable or disable a multicast addr */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_unicst, /* Set the unicast MAC address */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_tx, /* Transmit a packet */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer NULL,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_ioctl, /* Process an unknown ioctl */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China NULL, /* mc_getcapab */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China NULL,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China NULL,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_setprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer zyd_m_getprop,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer zyd_m_propinfo
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China};
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Module Loading Data & Entry Points
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing ChinaDDI_DEFINE_STREAM_OPS(zyd_devops, /* name */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China nulldev, /* identify */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China nulldev, /* probe */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_attach, /* attach */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_detach, /* detach */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China nodev, /* reset */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China NULL, /* getinfo */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China D_MP, /* flag */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China NULL, /* stream_tab */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_quiesce_not_needed /* quiesce */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic struct modldrv zyd_modldrv = {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China &mod_driverops, /* drv_modops */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_ident, /* drv_linkinfo */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China &zyd_devops /* drv_dev_ops */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China};
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic struct modlinkage zyd_ml = {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China MODREV_1, /* ml_rev */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China {&zyd_modldrv, NULL} /* ml_linkage */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China};
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Wireless-specific structures
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic const struct ieee80211_rateset zyd_rateset_11b = {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China 4, {2, 4, 11, 22} /* units are 0.5Mbit! */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China};
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic const struct ieee80211_rateset zyd_rateset_11g = {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China 12, {2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China};
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#ifdef DEBUG
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinauint32_t zyd_dbg_flags;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_dbg(uint32_t dbg_mask, const int8_t *fmt, ...)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China va_list args;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (dbg_mask & zyd_dbg_flags) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China va_start(args, fmt);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China vcmn_err(CE_CONT, fmt, args);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China va_end(args);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China#endif
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_warn(const int8_t *fmt, ...)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China va_list args;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China va_start(args, fmt);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China vcmn_err(CE_WARN, fmt, args);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China va_end(args);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Internal functions
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic uint8_t
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_plcp_signal(uint16_t rate)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China switch (rate) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* CCK rates (returned values are device-dependent) */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 2:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0x0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 4:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0x1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 11:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0x2);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 22:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0x3);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 12:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xb);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 18:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xf);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 24:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xa);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 36:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xe);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 48:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0x9);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 72:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xd);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 96:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0x8);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case 108:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* unsupported rates (should not get there) */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China default:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0xff);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Timeout function for scanning.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Called at the end of each scanning round.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic void
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_next_scan(void *arg)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_DEBUG((ZYD_DBG_SCAN, "scan timer: fired\n"));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_state == IEEE80211_S_SCAN) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_next_scan(ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_DEBUG((ZYD_DBG_SCAN, "scan timer: no work\n"));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Extract a 802.11 frame from the received packet and forward it to net80211.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_receive(struct zyd_softc *sc, const uint8_t *buf, uint16_t len)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China const struct zyd_rx_stat *stat;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_frame *wh;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_node *in;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int rlen; /* Actual frame length */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China uint8_t rssi;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mblk_t *m;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (len < ZYD_MIN_FRAGSZ) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Packet is too short, silently drop it */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->rx_err++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China stat = (const struct zyd_rx_stat *)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (buf + len - sizeof (struct zyd_rx_stat));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (stat->flags & ZYD_RX_ERROR) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Frame is corrupted, silently drop it */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->rx_err++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* compute actual frame length */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rlen = len - sizeof (struct zyd_plcphdr) -
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sizeof (struct zyd_rx_stat) - IEEE80211_CRC_LEN;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m = allocb(rlen, BPRI_MED);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (m == NULL) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->rx_nobuf++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Copy frame to new buffer */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China bcopy(buf + sizeof (struct zyd_plcphdr), m->b_wptr, rlen);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m->b_wptr += rlen;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Send frame to net80211 stack */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)m->b_rptr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China in = ieee80211_find_rxnode(ic, wh);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rssi = (stat->rssi < 25) ? 230 : (255 - stat->rssi) / 2;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) ieee80211_input(ic, m, in, (int32_t)rssi, 0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_free_node(in);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * xxx_send callback for net80211.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Transmit a 802.11 frame.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Constructs a packet from zyd_tx_header and 802.11 frame data
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * and sends it to the chip.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_send(ieee80211com_t *ic, mblk_t *mp, uint8_t type)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = ZYD_IC_TO_SOFTC(ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_tx_header *buf_hdr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_frame *wh;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_node *in;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_key *k;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mblk_t *m, *m0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int len, off, mblen;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China uint16_t frame_size, additional_size, rate;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China uint8_t service;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int res;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(mp->b_next == NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* device not ready, drop all frames */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!sc->usb.connected || sc->suspended || !sc->running) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (type == IEEE80211_FC0_TYPE_DATA)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China else
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* device queue overrun */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (sc->tx_queued >= ZYD_TX_LIST_COUNT) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* drop management frames */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (type != IEEE80211_FC0_TYPE_DATA) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_serial_enter(sc, ZYD_NO_SIG);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->resched = B_TRUE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m = allocb(msgdsize(mp) + sizeof (struct zyd_tx_header) + 32,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China BPRI_MED);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (m == NULL) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->tx_nobuf++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_serial_enter(sc, ZYD_NO_SIG);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->resched = B_TRUE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m->b_rptr += sizeof (struct zyd_tx_header);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m->b_wptr = m->b_rptr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China for (off = 0, m0 = mp; m0 != NULL; m0 = m0->b_cont) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mblen = MBLKL(m0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) memcpy(m->b_rptr + off, m0->b_rptr, mblen);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China off += mblen;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m->b_wptr += off;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)m->b_rptr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China in = ieee80211_find_txnode(ic, wh->i_addr1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (in == NULL) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(m);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->tx_err++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China in->in_inact = 0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (type == IEEE80211_FC0_TYPE_DATA)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) ieee80211_encap(ic, m, in);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China k = ieee80211_crypto_encap(ic, m);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (k == NULL) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->tx_err++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_free_node(in);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(m);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* packet header may have moved, reset our local pointer */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wh = (struct ieee80211_frame *)m->b_rptr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * pickup a rate. May need work to make adaptive - at present,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * picks best rate for mode.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (type == IEEE80211_FC0_TYPE_MGT) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* mgmt frames are sent at 1M */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rate = (uint16_t)in->in_rates.ir_rates[0];
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rate = (uint16_t)ic->ic_sup_rates[ic->ic_curmode].
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ir_rates[ic->ic_fixed_rate];
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rate = (uint16_t)ic->ic_sup_rates[ic->ic_curmode].
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ir_rates[in->in_txrate];
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rate &= IEEE80211_RATE_VAL;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (rate == 0) /* should not happen */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China rate = 2;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Get total length of frame */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China len = msgsize(m);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China m->b_rptr -= sizeof (struct zyd_tx_header);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr = (struct zyd_tx_header *)m->b_rptr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China frame_size = (uint16_t)len + 4; /* include CRC32 */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->frame_size = LE_16(frame_size);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Compute "packet size". What the 10 stands for,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * nobody knows.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China additional_size = sizeof (struct zyd_tx_header) + 10;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (sc->mac_rev == ZYD_ZD1211)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->packet_size = LE_16(frame_size + additional_size);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China else
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->packet_size = LE_16(additional_size);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->rate_mod_flags = LE_8(zyd_plcp_signal(rate));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->type_flags = LE_8(ZYD_TX_FLAG_BACKOFF);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* multicast frames are not sent at OFDM rates in 802.11b/g */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (frame_size > ic->ic_rtsthreshold) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->type_flags |= ZYD_TX_FLAG_RTS;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else if (ZYD_RATE_IS_OFDM(rate) &&
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (ic->ic_flags & IEEE80211_F_USEPROT)) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->type_flags |=
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_TX_FLAG_CTS_TO_SELF;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->type_flags |= ZYD_TX_FLAG_RTS;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->type_flags |= ZYD_TX_FLAG_MULTICAST;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if ((type == IEEE80211_FC0_TYPE_CTL) &&
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China == IEEE80211_FC0_SUBTYPE_PS_POLL)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->type_flags |= ZYD_TX_FLAG_TYPE(ZYD_TX_TYPE_PS_POLL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (ZYD_RATE_IS_OFDM(rate)) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->rate_mod_flags |= ZYD_TX_RMF_OFDM;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_curmode == IEEE80211_MODE_11A)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->rate_mod_flags |= ZYD_TX_RMF_5GHZ;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else if (rate != 2 && (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->rate_mod_flags |= ZYD_TX_RMF_SH_PREAMBLE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Compute frame duration and length-extension service flag.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China service = 0x00;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->frame_duration = LE_16((16 * frame_size + rate - 1) / rate);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->service = service;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->next_frame_duration = LE_16(0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (rate == 22) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China const int remainder = (16 * frame_size) % 22;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (remainder != 0 && remainder < 7)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China buf_hdr->service |= ZYD_TX_SERVICE_LENGTH_EXTENSION;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China res = zyd_usb_send_packet(&sc->usb, m);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (res != ZYD_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->tx_err++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_serial_enter(sc, ZYD_NO_SIG);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->tx_queued++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_frags++;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_stats.is_tx_bytes += len;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_free_node(in);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Register with the MAC layer.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic zyd_res
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_mac_init(struct zyd_softc *sc)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mac_register_t *macp;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wifi_data_t wd = { 0 };
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Initialize mac structure
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp = mac_alloc(MAC_VERSION);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (macp == NULL) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_WARN("failed to allocate MAC structure\n");
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ZYD_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Initialize pointer to device specific functions
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wd.wd_secalloc = WIFI_SEC_NONE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wd.wd_opmode = sc->ic.ic_opmode;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(wd.wd_bssid, ic->ic_macaddr);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_type_ident = MAC_PLUGIN_IDENT_WIFI;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_driver = sc;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_dip = sc->dip;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_src_addr = ic->ic_macaddr;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_callbacks = &zyd_m_callbacks;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_min_sdu = 0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_max_sdu = IEEE80211_MTU;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_pdata = &wd;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China macp->m_pdata_size = sizeof (wd);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Register the macp to mac
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = mac_register(macp, &sc->ic.ic_mach);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mac_free(macp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_WARN("failed to register MAC structure\n");
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ZYD_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ZYD_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Register with net80211.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic void
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_wifi_init(struct zyd_softc *sc)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int i;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Initialize the WiFi part, which will be used by generic layer
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_phytype = IEEE80211_T_OFDM;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_opmode = IEEE80211_M_STA;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_state = IEEE80211_S_INIT;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_maxrssi = 255;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_xmit = zyd_send;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* set device capabilities */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_caps = IEEE80211_C_TXPMGT | /* tx power management */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_C_SHPREAMBLE | /* short preamble supported */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_C_SHSLOT | IEEE80211_C_WPA; /* Support WPA/WPA2 */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Copy MAC address */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_ADDR_COPY(ic->ic_macaddr, sc->macaddr);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * set supported .11b and .11g rates
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_rates[IEEE80211_MODE_11B] = zyd_rateset_11b;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_rates[IEEE80211_MODE_11G] = zyd_rateset_11g;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * set supported .11b and .11g channels(1 through 14)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China for (i = 1; i <= 14; i++) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_channels[i].ich_freq =
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_sup_channels[i].ich_flags =
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Init generic layer (it cannot fail)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_attach(ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* register WPA door */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_register_door(ic, ddi_driver_name(sc->dip),
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_get_instance(sc->dip));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* Must be after attach! */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->newstate = ic->ic_newstate;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_newstate = zyd_newstate;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_media_init(ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_def_txkey = 0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Device operations
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Binding the driver to a device.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Concurrency: Until zyd_attach() returns with success,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * the only other entry point that can be executed is getinfo().
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Thus no locking here yet.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China char strbuf[32];
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int instance;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China switch (cmd) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case DDI_ATTACH:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case DDI_RESUME:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(zyd_ssp, ddi_get_instance(dip));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(sc != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_resume(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China default:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China instance = ddi_get_instance(dip);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = ddi_soft_state_zalloc(zyd_ssp, instance);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_WARN("failed to allocate soft state\n");
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(zyd_ssp, instance);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->dip = dip;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->timeout_id = 0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (zyd_usb_init(sc) != ZYD_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_free(zyd_ssp, instance);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (zyd_hw_init(sc) != ZYD_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_usb_deinit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_free(zyd_ssp, instance);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_wifi_init(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (zyd_mac_init(sc) != DDI_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_detach(&sc->ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_usb_deinit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_free(zyd_ssp, instance);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Create minor node of type DDI_NT_NET_WIFI
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) snprintf(strbuf, sizeof (strbuf), ZYD_DRV_NAME"%d", instance);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = ddi_create_minor_node(dip, strbuf, S_IFCHR,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China instance + 1, DDI_NT_NET_WIFI, 0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_WARN("failed to create minor node\n");
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* initialize locking */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_init(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Detach the driver from a device.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Concurrency: Will be called only after a successful attach
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * (and not concurrently).
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = NULL;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China switch (cmd) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case DDI_DETACH:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case DDI_SUSPEND:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(zyd_ssp, ddi_get_instance(dip));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(sc != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (zyd_suspend(sc));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China default:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc = ddi_get_soft_state(zyd_ssp, ddi_get_instance(dip));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(sc != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (mac_disable(sc->ic.ic_mach) != 0)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Unregister from the MAC layer subsystem
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) mac_unregister(sc->ic.ic_mach);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Detach ieee80211
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_detach(&sc->ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_hw_deinit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_usb_deinit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* At this point it should be safe to release & destroy the locks */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_deinit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_remove_minor_node(dip, NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_free(zyd_ssp, ddi_get_instance(dip));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Mac Call Back functions
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Read device statistic information.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_stat(void *arg, uint_t stat, uint64_t *val)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211com_t *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_node_t *in;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China switch (stat) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_IFSPEED:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!sc->usb.connected || sc->suspended || !sc->running)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ENOTSUP);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China in = ieee80211_ref_node(ic->ic_bss);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = ((ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) ?
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China IEEE80211_RATE(in->in_txrate) :
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ic->ic_fixed_rate) / 2 * 1000000;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_free_node(in);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_NOXMTBUF:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = sc->tx_nobuf;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_NORCVBUF:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = sc->rx_nobuf;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_IERRORS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = sc->rx_err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_RBYTES:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_bytes;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_IPACKETS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_rx_frags;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_OBYTES:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_bytes;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_OPACKETS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = ic->ic_stats.is_tx_frags;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case MAC_STAT_OERRORS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_FAILED:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *val = sc->tx_err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_RETRANS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_FCS_ERRORS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_WEP_ERRORS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_TX_FRAGS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_TX:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RTS_SUCCESS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RTS_FAILURE:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_ACK_FAILURE:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RX_FRAGS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_MCAST_RX:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case WIFI_STAT_RX_DUPS:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ieee80211_stat(ic, stat, val));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China default:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ENOTSUP);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Start the device.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Concurrency: Presumably fully concurrent, must lock.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_start(void *arg)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_serial_enter(sc, ZYD_NO_SIG);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if ((!sc->usb.connected) || (zyd_hw_start(sc) != ZYD_SUCCESS)) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(&sc->ic, IEEE80211_S_INIT, -1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->running = B_TRUE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Stop the device.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic void
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_stop(void *arg)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->running = B_FALSE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(&sc->ic, IEEE80211_S_INIT, -1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_serial_enter(sc, ZYD_NO_SIG);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->resched = B_FALSE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_hw_stop(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Change the MAC address of the device.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_unicst(void *arg, const uint8_t *macaddr)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Enable/disable multicast.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_multicst(void *arg, boolean_t add, const uint8_t *m)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_DEBUG((ZYD_DBG_GLD, "multicast not implemented\n"));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Enable/disable promiscuous mode.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*ARGSUSED*/
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_promisc(void *arg, boolean_t on)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_DEBUG((ZYD_DBG_GLD, "promiscuous not implemented\n"));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * IOCTL request.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic void
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_ioctl(void *arg, queue_t *wq, mblk_t *mp)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!sc->usb.connected || sc->suspended || !sc->running) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China miocnak(wq, mp, 0, ENXIO);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (ieee80211_ioctl(ic, wq, mp) == ENETRESET) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (sc->running && ic->ic_des_esslen) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_stop(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (zyd_m_start(sc) != DDI_SUCCESS)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * callback functions for /get/set properties
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_setprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China uint_t wldp_length, const void *wldp_buf)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!sc->usb.connected || sc->suspended || !sc->running) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (ENXIO);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = ieee80211_setprop(ic, pr_name, wldp_pr_num, wldp_length,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China wldp_buf);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err == ENETRESET) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (sc->running && ic->ic_des_esslen) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_m_stop(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (zyd_m_start(sc) != DDI_SUCCESS)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = 0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (err);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_getprop(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer uint_t wldp_length, void *wldp_buf)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!sc->usb.connected || sc->suspended || !sc->running) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_FAILURE);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = ieee80211_getprop(&sc->ic, pr_name, wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer wldp_length, wldp_buf);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (err);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerstatic void
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerzyd_m_propinfo(void *arg, const char *pr_name, mac_prop_id_t wldp_pr_num,
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer mac_prop_info_handle_t mph)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer struct zyd_softc *sc = (struct zyd_softc *)arg;
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer ieee80211_propinfo(&sc->ic, pr_name, wldp_pr_num, mph);
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer}
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Transmit a data frame.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic mblk_t *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_m_tx(void *arg, mblk_t *mp)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = (struct zyd_softc *)arg;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211com *ic = &sc->ic;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mblk_t *next;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(mp != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* not associated, drop data frames */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (ic->ic_state != IEEE80211_S_RUN) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China freemsg(mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China while (mp != NULL) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China next = mp->b_next;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mp->b_next = NULL;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (zyd_send(ic, mp, IEEE80211_FC0_TYPE_DATA) != DDI_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mp->b_next = next;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mp = next;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (mp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * xxx_newstate callback for net80211.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Called by net80211 whenever the ieee80211 state changes.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinastatic int
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct zyd_softc *sc = ZYD_IC_TO_SOFTC(ic);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China struct ieee80211_node *in;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China uint_t chan;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (sc->timeout_id != 0) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) untimeout(sc->timeout_id);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->timeout_id = 0;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (!sc->usb.connected || sc->suspended || !sc->running) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (sc->newstate(ic, nstate, arg));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China switch (nstate) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_SCAN:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_DEBUG((ZYD_DBG_SCAN, "scan timer: starting next\n"));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->timeout_id = timeout(zyd_next_scan, sc,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China drv_usectohz(ZYD_DWELL_TIME));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /*FALLTHRU*/
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_AUTH:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_ASSOC:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China case IEEE80211_S_RUN:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China chan = ieee80211_chan2ieee(ic, ic->ic_curchan);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (chan == 0 || chan == IEEE80211_CHAN_ANY) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ZYD_WARN("invalid channel number\n");
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (0);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) zyd_serial_enter(sc, ZYD_SER_SIG);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_hw_set_channel(sc, chan);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_serial_exit(sc);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China in = ic->ic_bss;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China in->in_txrate = in->in_rates.ir_nrates - 1;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China default:
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (sc->newstate(ic, nstate, arg));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * USB-safe synchronization.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Debugging routines.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Kmutexes should never be held when making calls to USBA
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * or when sleeping. Thus, we implement our own "mutex" on top
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * of kmutexes and kcondvars.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Usage: Any (possibly concurrent) access to the soft state or device must
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * be serialized with a pair of zyd_serial_enter()/zyd_serial_exit().
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Initialize the serialization object.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_serial_init(struct zyd_softc *sc)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_init(&sc->serial.lock, NULL, MUTEX_DRIVER,
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->usb.cdata->dev_iblock_cookie);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_init(&sc->serial.wait, NULL, CV_DRIVER, NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->serial.held = B_FALSE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->serial.initialized = B_TRUE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Wait for the serialization object.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * If wait_sig is ZYD_SER_SIG, the function may return
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * a signal is received. In this case, the serialization object
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * is not acquired (but the mutex is) and the return value is ZYD_FAILURE.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * In any other case the function returns ZYD_SUCCESS and the
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * serialization object is acquired.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_res
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_serial_enter(struct zyd_softc *sc, boolean_t wait_sig)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_res res;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China res = ZYD_SUCCESS;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China while (sc->serial.held != B_FALSE) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (wait_sig == ZYD_SER_SIG) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China res = cv_wait_sig(&sc->serial.wait, &sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_wait(&sc->serial.wait, &sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->serial.held = B_TRUE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (res);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Release the serialization object.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_serial_exit(struct zyd_softc *sc)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->serial.held = B_FALSE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_broadcast(&sc->serial.wait);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Destroy the serialization object.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_serial_deinit(struct zyd_softc *sc)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_destroy(&sc->serial.wait);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&sc->serial.lock);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China sc->serial.initialized = B_FALSE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * zyd_cb_lock: a special signal structure that is used for notification
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * that a callback function has been called.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/* Initializes the zyd_cb_lock structure. */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_cb_lock_init(struct zyd_cb_lock *lock)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(lock != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_init(&lock->mutex, NULL, MUTEX_DRIVER, NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_init(&lock->cv, NULL, CV_DRIVER, NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China lock->done = B_FALSE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/* Deinitalizes the zyd_cb_lock structure. */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_cb_lock_destroy(struct zyd_cb_lock *lock)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(lock != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_destroy(&lock->mutex);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_destroy(&lock->cv);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Wait on lock until someone calls the "signal" function or the timeout
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * expires. Note: timeout is in microseconds.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_res
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_cb_lock_wait(struct zyd_cb_lock *lock, clock_t timeout)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China zyd_res res;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China clock_t etime;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int cv_res;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(lock != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&lock->mutex);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (timeout < 0) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* no timeout - wait as long as needed */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China while (lock->done == B_FALSE)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China (void) cv_wait(&lock->cv, &lock->mutex);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China } else {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China /* wait with timeout (given in usec) */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China etime = ddi_get_lbolt() + drv_usectohz(timeout);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China while (lock->done == B_FALSE) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_res =
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_timedwait_sig(&lock->cv, &lock->mutex, etime);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (cv_res <= 0)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China break;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China res = (lock->done == B_TRUE) ? ZYD_SUCCESS : ZYD_FAILURE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&lock->mutex);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (res);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/* Signal that the job (eg. callback) is done and unblock anyone who waits. */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinavoid
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinazyd_cb_lock_signal(struct zyd_cb_lock *lock)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ASSERT(lock != NULL);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_enter(&lock->mutex);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China lock->done = B_TRUE;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China cv_broadcast(&lock->cv);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mutex_exit(&lock->mutex);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Loadable module configuration entry points
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * _init module entry point.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Called when the module is being loaded into memory.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinaint
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China_init(void)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = ddi_soft_state_init(&zyd_ssp, sizeof (struct zyd_softc), 1);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err != DDI_SUCCESS)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (err);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mac_init_ops(&zyd_devops, ZYD_DRV_NAME);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = mod_install(&zyd_ml);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err != DDI_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mac_fini_ops(&zyd_devops);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_fini(&zyd_ssp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (err);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * _info module entry point.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Called to obtain information about the module.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinaint
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China_info(struct modinfo *modinfop)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (mod_info(&zyd_ml, modinfop));
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China/*
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * _fini module entry point.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China *
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China * Called when the module is being unloaded.
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China */
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing Chinaint
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China_fini(void)
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China{
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China int err;
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China err = mod_remove(&zyd_ml);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China if (err == DDI_SUCCESS) {
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China mac_fini_ops(&zyd_devops);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China ddi_soft_state_fini(&zyd_ssp);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China }
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China return (err);
e8da18d8c173d57b68019b8d92471843c44ec746pengcheng chen - Sun Microsystems - Beijing China}