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 33 struct 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 50 struct 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 73 struct bootrec_comp_id { 74 __le32 fw_variant; 75 } __packed; 76 77 struct bootrec_comp_ver { 78 char fw_version[24]; 79 } __packed; 80 81 struct 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 */ 91 struct 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) \ 105 do { \ 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 112 struct p54_edcf_queue_param { 113 __le16 aifs; 114 __le16 cwmin; 115 __le16 cwmax; 116 __le16 txop; 117 } __packed; 118 119 struct p54_rssi_db_entry { 120 u16 freq; 121 s16 mul; 122 s16 add; 123 s16 longbow_unkn; 124 s16 longbow_unk2; 125 }; 126 127 struct 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 137 enum 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 149 struct 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 161 struct p54_tx_queue_stats { 162 unsigned int len; 163 unsigned int limit; 164 unsigned int count; 165 }; 166 167 struct 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 */ 269 int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb); 270 void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb); 271 int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw); 272 int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len); 273 int p54_read_eeprom(struct ieee80211_hw *dev); 274 275 struct ieee80211_hw *p54_init_common(size_t priv_data_len); 276 int p54_register_common(struct ieee80211_hw *dev, struct device *pdev); 277 void p54_free_common(struct ieee80211_hw *dev); 278 279 void p54_unregister_common(struct ieee80211_hw *dev); 280 281 #endif /* P54_H */ 282