zd_mac.h revision db888aed7e83559d61cff04bf002d0fb80ecbfa7
1/* zd_mac.h 2 * 3 * This program is free software; you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation; either version 2 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 */ 17 18#ifndef _ZD_MAC_H 19#define _ZD_MAC_H 20 21#include <linux/wireless.h> 22#include <linux/kernel.h> 23#include <net/ieee80211.h> 24#include <net/ieee80211softmac.h> 25 26#include "zd_chip.h" 27#include "zd_netdev.h" 28 29struct zd_ctrlset { 30 u8 modulation; 31 __le16 tx_length; 32 u8 control; 33 /* stores only the difference to tx_length on ZD1211B */ 34 __le16 packet_length; 35 __le16 current_length; 36 u8 service; 37 __le16 next_frame_length; 38} __attribute__((packed)); 39 40#define ZD_CS_RESERVED_SIZE 25 41 42/* zd_crtlset field modulation */ 43#define ZD_CS_RATE_MASK 0x0f 44#define ZD_CS_TYPE_MASK 0x10 45#define ZD_CS_RATE(modulation) ((modulation) & ZD_CS_RATE_MASK) 46#define ZD_CS_TYPE(modulation) ((modulation) & ZD_CS_TYPE_MASK) 47 48#define ZD_CS_CCK 0x00 49#define ZD_CS_OFDM 0x10 50 51#define ZD_CS_CCK_RATE_1M 0x00 52#define ZD_CS_CCK_RATE_2M 0x01 53#define ZD_CS_CCK_RATE_5_5M 0x02 54#define ZD_CS_CCK_RATE_11M 0x03 55/* The rates for OFDM are encoded as in the PLCP header. Use ZD_OFDM_RATE_*. 56 */ 57 58/* bit 5 is preamble (when in CCK mode), or a/g selection (when in OFDM mode) */ 59#define ZD_CS_CCK_PREA_LONG 0x00 60#define ZD_CS_CCK_PREA_SHORT 0x20 61#define ZD_CS_OFDM_MODE_11G 0x00 62#define ZD_CS_OFDM_MODE_11A 0x20 63 64/* zd_ctrlset control field */ 65#define ZD_CS_NEED_RANDOM_BACKOFF 0x01 66#define ZD_CS_MULTICAST 0x02 67 68#define ZD_CS_FRAME_TYPE_MASK 0x0c 69#define ZD_CS_DATA_FRAME 0x00 70#define ZD_CS_PS_POLL_FRAME 0x04 71#define ZD_CS_MANAGEMENT_FRAME 0x08 72#define ZD_CS_NO_SEQUENCE_CTL_FRAME 0x0c 73 74#define ZD_CS_WAKE_DESTINATION 0x10 75#define ZD_CS_RTS 0x20 76#define ZD_CS_ENCRYPT 0x40 77#define ZD_CS_SELF_CTS 0x80 78 79/* Incoming frames are prepended by a PLCP header */ 80#define ZD_PLCP_HEADER_SIZE 5 81 82struct rx_length_info { 83 __le16 length[3]; 84 __le16 tag; 85} __attribute__((packed)); 86 87#define RX_LENGTH_INFO_TAG 0x697e 88 89struct rx_status { 90 u8 signal_quality_cck; 91 /* rssi */ 92 u8 signal_strength; 93 u8 signal_quality_ofdm; 94 u8 decryption_type; 95 u8 frame_status; 96} __attribute__((packed)); 97 98/* rx_status field decryption_type */ 99#define ZD_RX_NO_WEP 0 100#define ZD_RX_WEP64 1 101#define ZD_RX_TKIP 2 102#define ZD_RX_AES 4 103#define ZD_RX_WEP128 5 104#define ZD_RX_WEP256 6 105 106/* rx_status field frame_status */ 107#define ZD_RX_FRAME_MODULATION_MASK 0x01 108#define ZD_RX_CCK 0x00 109#define ZD_RX_OFDM 0x01 110 111#define ZD_RX_TIMEOUT_ERROR 0x02 112#define ZD_RX_FIFO_OVERRUN_ERROR 0x04 113#define ZD_RX_DECRYPTION_ERROR 0x08 114#define ZD_RX_CRC32_ERROR 0x10 115#define ZD_RX_NO_ADDR1_MATCH_ERROR 0x20 116#define ZD_RX_CRC16_ERROR 0x40 117#define ZD_RX_ERROR 0x80 118 119enum mac_flags { 120 MAC_FIXED_CHANNEL = 0x01, 121}; 122 123#define ZD_MAC_STATS_BUFFER_SIZE 16 124 125struct zd_mac { 126 struct net_device *netdev; 127 struct zd_chip chip; 128 spinlock_t lock; 129 /* Unlocked reading possible */ 130 struct iw_statistics iw_stats; 131 unsigned int stats_count; 132 u8 qual_buffer[ZD_MAC_STATS_BUFFER_SIZE]; 133 u8 rssi_buffer[ZD_MAC_STATS_BUFFER_SIZE]; 134 u8 regdomain; 135 u8 default_regdomain; 136 u8 requested_channel; 137}; 138 139static inline struct ieee80211_device *zd_mac_to_ieee80211(struct zd_mac *mac) 140{ 141 return zd_netdev_ieee80211(mac->netdev); 142} 143 144static inline struct zd_mac *zd_netdev_mac(struct net_device *netdev) 145{ 146 return ieee80211softmac_priv(netdev); 147} 148 149static inline struct zd_mac *zd_chip_to_mac(struct zd_chip *chip) 150{ 151 return container_of(chip, struct zd_mac, chip); 152} 153 154static inline struct zd_mac *zd_usb_to_mac(struct zd_usb *usb) 155{ 156 return zd_chip_to_mac(zd_usb_to_chip(usb)); 157} 158 159#define zd_mac_dev(mac) (zd_chip_dev(&(mac)->chip)) 160 161int zd_mac_init(struct zd_mac *mac, 162 struct net_device *netdev, 163 struct usb_interface *intf); 164void zd_mac_clear(struct zd_mac *mac); 165 166int zd_mac_init_hw(struct zd_mac *mac, u8 device_type); 167 168int zd_mac_open(struct net_device *netdev); 169int zd_mac_stop(struct net_device *netdev); 170int zd_mac_set_mac_address(struct net_device *dev, void *p); 171 172int zd_mac_rx(struct zd_mac *mac, const u8 *buffer, unsigned int length); 173 174int zd_mac_set_regdomain(struct zd_mac *zd_mac, u8 regdomain); 175u8 zd_mac_get_regdomain(struct zd_mac *zd_mac); 176 177int zd_mac_request_channel(struct zd_mac *mac, u8 channel); 178int zd_mac_get_channel(struct zd_mac *mac, u8 *channel, u8 *flags); 179 180int zd_mac_set_mode(struct zd_mac *mac, u32 mode); 181int zd_mac_get_mode(struct zd_mac *mac, u32 *mode); 182 183int zd_mac_get_range(struct zd_mac *mac, struct iw_range *range); 184 185struct iw_statistics *zd_mac_get_wireless_stats(struct net_device *ndev); 186 187#ifdef DEBUG 188void zd_dump_rx_status(const struct rx_status *status); 189#else 190#define zd_dump_rx_status(status) 191#endif /* DEBUG */ 192 193#endif /* _ZD_MAC_H */ 194