linux/drivers/net/wireless/intersil/p54/p54.h
<<
>>
Prefs
   1/*
   2 * Shared defines for all mac80211 Prism54 code
   3 *
   4 * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
   5 *
   6 * Based on the islsm (softmac prism54) driver, which is:
   7 * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al.
   8 *
   9 * This program is free software; you can redistribute it and/or modify
  10 * it under the terms of the GNU General Public License version 2 as
  11 * published by the Free Software Foundation.
  12 */
  13
  14#ifndef P54_H
  15#define P54_H
  16
  17#ifdef CONFIG_P54_LEDS
  18#include <linux/leds.h>
  19#endif /* CONFIG_P54_LEDS */
  20
  21#define ISL38XX_DEV_FIRMWARE_ADDR 0x20000
  22
  23#define BR_CODE_MIN                     0x80000000
  24#define BR_CODE_COMPONENT_ID            0x80000001
  25#define BR_CODE_COMPONENT_VERSION       0x80000002
  26#define BR_CODE_DEPENDENT_IF            0x80000003
  27#define BR_CODE_EXPOSED_IF              0x80000004
  28#define BR_CODE_DESCR                   0x80000101
  29#define BR_CODE_MAX                     0x8FFFFFFF
  30#define BR_CODE_END_OF_BRA              0xFF0000FF
  31#define LEGACY_BR_CODE_END_OF_BRA       0xFFFFFFFF
  32
  33struct bootrec {
  34        __le32 code;
  35        __le32 len;
  36        u32 data[10];
  37} __packed;
  38
  39/* Interface role definitions */
  40#define BR_INTERFACE_ROLE_SERVER        0x0000
  41#define BR_INTERFACE_ROLE_CLIENT        0x8000
  42
  43#define BR_DESC_PRIV_CAP_WEP            BIT(0)
  44#define BR_DESC_PRIV_CAP_TKIP           BIT(1)
  45#define BR_DESC_PRIV_CAP_MICHAEL        BIT(2)
  46#define BR_DESC_PRIV_CAP_CCX_CP         BIT(3)
  47#define BR_DESC_PRIV_CAP_CCX_MIC        BIT(4)
  48#define BR_DESC_PRIV_CAP_AESCCMP        BIT(5)
  49
  50struct bootrec_desc {
  51        __le16 modes;
  52        __le16 flags;
  53        __le32 rx_start;
  54        __le32 rx_end;
  55        u8 headroom;
  56        u8 tailroom;
  57        u8 tx_queues;
  58        u8 tx_depth;
  59        u8 privacy_caps;
  60        u8 rx_keycache_size;
  61        u8 time_size;
  62        u8 padding;
  63        u8 rates[16];
  64        u8 padding2[4];
  65        __le16 rx_mtu;
  66} __packed;
  67
  68#define FW_FMAC 0x464d4143
  69#define FW_LM86 0x4c4d3836
  70#define FW_LM87 0x4c4d3837
  71#define FW_LM20 0x4c4d3230
  72
  73struct bootrec_comp_id {
  74        __le32 fw_variant;
  75} __packed;
  76
  77struct bootrec_comp_ver {
  78        char fw_version[24];
  79} __packed;
  80
  81struct bootrec_end {
  82        __le16 crc;
  83        u8 padding[2];
  84        u8 md5[16];
  85} __packed;
  86
  87/* provide 16 bytes for the transport back-end */
  88#define P54_TX_INFO_DATA_SIZE           16
  89
  90/* stored in ieee80211_tx_info's rate_driver_data */
  91struct p54_tx_info {
  92        u32 start_addr;
  93        u32 end_addr;
  94        union {
  95                void *data[P54_TX_INFO_DATA_SIZE / sizeof(void *)];
  96                struct {
  97                        u32 extra_len;
  98                };
  99        };
 100};
 101
 102#define P54_MAX_CTRL_FRAME_LEN          0x1000
 103
 104#define P54_SET_QUEUE(queue, ai_fs, cw_min, cw_max, _txop)      \
 105do {                                                            \
 106        queue.aifs = cpu_to_le16(ai_fs);                        \
 107        queue.cwmin = cpu_to_le16(cw_min);                      \
 108        queue.cwmax = cpu_to_le16(cw_max);                      \
 109        queue.txop = cpu_to_le16(_txop);                        \
 110} while (0)
 111
 112struct p54_edcf_queue_param {
 113        __le16 aifs;
 114        __le16 cwmin;
 115        __le16 cwmax;
 116        __le16 txop;
 117} __packed;
 118
 119struct p54_rssi_db_entry {
 120        u16 freq;
 121        s16 mul;
 122        s16 add;
 123        s16 longbow_unkn;
 124        s16 longbow_unk2;
 125};
 126
 127struct p54_cal_database {
 128        size_t entries;
 129        size_t entry_size;
 130        size_t offset;
 131        size_t len;
 132        u8 data[0];
 133};
 134
 135#define EEPROM_READBACK_LEN 0x3fc
 136
 137enum fw_state {
 138        FW_STATE_OFF,
 139        FW_STATE_BOOTING,
 140        FW_STATE_READY,
 141        FW_STATE_RESET,
 142        FW_STATE_RESETTING,
 143};
 144
 145#ifdef CONFIG_P54_LEDS
 146
 147#define P54_LED_MAX_NAME_LEN 31
 148
 149struct p54_led_dev {
 150        struct ieee80211_hw *hw_dev;
 151        struct led_classdev led_dev;
 152        char name[P54_LED_MAX_NAME_LEN + 1];
 153
 154        unsigned int toggled;
 155        unsigned int index;
 156        unsigned int registered;
 157};
 158
 159#endif /* CONFIG_P54_LEDS */
 160
 161struct p54_tx_queue_stats {
 162        unsigned int len;
 163        unsigned int limit;
 164        unsigned int count;
 165};
 166
 167struct p54_common {
 168        struct ieee80211_hw *hw;
 169        struct ieee80211_vif *vif;
 170        void (*tx)(struct ieee80211_hw *dev, struct sk_buff *skb);
 171        int (*open)(struct ieee80211_hw *dev);
 172        void (*stop)(struct ieee80211_hw *dev);
 173        struct sk_buff_head tx_pending;
 174        struct sk_buff_head tx_queue;
 175        struct mutex conf_mutex;
 176        bool registered;
 177
 178        /* memory management (as seen by the firmware) */
 179        u32 rx_start;
 180        u32 rx_end;
 181        u16 rx_mtu;
 182        u8 headroom;
 183        u8 tailroom;
 184
 185        /* firmware/hardware info */
 186        unsigned int tx_hdr_len;
 187        unsigned int fw_var;
 188        unsigned int fw_interface;
 189        u8 version;
 190
 191        /* (e)DCF / QOS state */
 192        bool use_short_slot;
 193        spinlock_t tx_stats_lock;
 194        struct p54_tx_queue_stats tx_stats[8];
 195        struct p54_edcf_queue_param qos_params[8];
 196
 197        /* Radio data */
 198        u16 rxhw;
 199        u8 rx_diversity_mask;
 200        u8 tx_diversity_mask;
 201        unsigned int output_power;
 202        struct p54_rssi_db_entry *cur_rssi;
 203        struct ieee80211_channel *curchan;
 204        struct survey_info *survey;
 205        unsigned int chan_num;
 206        struct completion stat_comp;
 207        bool update_stats;
 208        struct {
 209                unsigned int timestamp;
 210                unsigned int cached_cca;
 211                unsigned int cached_tx;
 212                unsigned int cached_rssi;
 213                u64 active;
 214                u64 cca;
 215                u64 tx;
 216                u64 rssi;
 217        } survey_raw;
 218
 219        int noise;
 220        /* calibration, output power limit and rssi<->dBm conversation data */
 221        struct pda_iq_autocal_entry *iq_autocal;
 222        unsigned int iq_autocal_len;
 223        struct p54_cal_database *curve_data;
 224        struct p54_cal_database *output_limit;
 225        struct p54_cal_database *rssi_db;
 226        struct ieee80211_supported_band *band_table[NUM_NL80211_BANDS];
 227
 228        /* BBP/MAC state */
 229        u8 mac_addr[ETH_ALEN];
 230        u8 bssid[ETH_ALEN];
 231        u8 mc_maclist[4][ETH_ALEN];
 232        u16 wakeup_timer;
 233        unsigned int filter_flags;
 234        int mc_maclist_num;
 235        int mode;
 236        u32 tsf_low32, tsf_high32;
 237        u32 basic_rate_mask;
 238        u16 aid;
 239        u8 coverage_class;
 240        bool phy_idle;
 241        bool phy_ps;
 242        bool powersave_override;
 243        __le32 beacon_req_id;
 244        struct completion beacon_comp;
 245
 246        /* cryptographic engine information */
 247        u8 privacy_caps;
 248        u8 rx_keycache_size;
 249        unsigned long *used_rxkeys;
 250
 251        /* LED management */
 252#ifdef CONFIG_P54_LEDS
 253        struct p54_led_dev leds[4];
 254        struct delayed_work led_work;
 255#endif /* CONFIG_P54_LEDS */
 256        u16 softled_state;              /* bit field of glowing LEDs */
 257
 258        /* statistics */
 259        struct ieee80211_low_level_stats stats;
 260        struct delayed_work work;
 261
 262        /* eeprom handling */
 263        void *eeprom;
 264        struct completion eeprom_comp;
 265        struct mutex eeprom_mutex;
 266};
 267
 268/* interfaces for the drivers */
 269int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb);
 270void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb);
 271int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw);
 272int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len);
 273int p54_read_eeprom(struct ieee80211_hw *dev);
 274
 275struct ieee80211_hw *p54_init_common(size_t priv_data_len);
 276int p54_register_common(struct ieee80211_hw *dev, struct device *pdev);
 277void p54_free_common(struct ieee80211_hw *dev);
 278
 279void p54_unregister_common(struct ieee80211_hw *dev);
 280
 281#endif /* P54_H */
 282