]>
Commit | Line | Data |
---|---|---|
32ddf071 CL |
1 | #ifndef P54_H |
2 | #define P54_H | |
eff1a59c MW |
3 | |
4 | /* | |
5 | * Shared defines for all mac80211 Prism54 code | |
6 | * | |
7 | * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net> | |
8 | * | |
9 | * Based on the islsm (softmac prism54) driver, which is: | |
10 | * Copyright 2004-2006 Jean-Baptiste Note <jbnote@gmail.com>, et al. | |
11 | * | |
12 | * This program is free software; you can redistribute it and/or modify | |
13 | * it under the terms of the GNU General Public License version 2 as | |
14 | * published by the Free Software Foundation. | |
15 | */ | |
16 | ||
d0b45aef CL |
17 | #ifdef CONFIG_MAC80211_LEDS |
18 | #include <linux/leds.h> | |
19 | #endif /* CONFIG_MAC80211_LEDS */ | |
20 | ||
27df605e | 21 | enum p54_control_frame_types { |
5e73444e | 22 | P54_CONTROL_TYPE_SETUP = 0, |
27df605e JL |
23 | P54_CONTROL_TYPE_SCAN, |
24 | P54_CONTROL_TYPE_TRAP, | |
eff1a59c | 25 | P54_CONTROL_TYPE_DCFINIT, |
27df605e | 26 | P54_CONTROL_TYPE_RX_KEYCACHE, |
19c19d54 | 27 | P54_CONTROL_TYPE_TIM, |
27df605e JL |
28 | P54_CONTROL_TYPE_PSM, |
29 | P54_CONTROL_TYPE_TXCANCEL, | |
eff1a59c | 30 | P54_CONTROL_TYPE_TXDONE, |
27df605e | 31 | P54_CONTROL_TYPE_BURST, |
eff1a59c MW |
32 | P54_CONTROL_TYPE_STAT_READBACK, |
33 | P54_CONTROL_TYPE_BBP, | |
34 | P54_CONTROL_TYPE_EEPROM_READBACK, | |
19c19d54 CL |
35 | P54_CONTROL_TYPE_LED, |
36 | P54_CONTROL_TYPE_GPIO, | |
37 | P54_CONTROL_TYPE_TIMER, | |
38 | P54_CONTROL_TYPE_MODULATION, | |
39 | P54_CONTROL_TYPE_SYNTH_CONFIG, | |
40 | P54_CONTROL_TYPE_DETECTOR_VALUE, | |
41 | P54_CONTROL_TYPE_XBOW_SYNTH_CFG, | |
42 | P54_CONTROL_TYPE_CCE_QUIET, | |
43 | P54_CONTROL_TYPE_PSM_STA_UNLOCK, | |
27df605e JL |
44 | P54_CONTROL_TYPE_PCS, |
45 | P54_CONTROL_TYPE_BT_BALANCER = 28, | |
46 | P54_CONTROL_TYPE_GROUP_ADDRESS_TABLE = 30, | |
47 | P54_CONTROL_TYPE_ARPTABLE = 31, | |
48 | P54_CONTROL_TYPE_BT_OPTIONS = 35 | |
eff1a59c MW |
49 | }; |
50 | ||
3cd08b38 CL |
51 | /* provide 16 bytes for the transport back-end */ |
52 | #define P54_TX_INFO_DATA_SIZE 16 | |
53 | ||
54 | /* stored in ieee80211_tx_info's rate_driver_data */ | |
55 | struct p54_tx_info { | |
56 | u32 start_addr; | |
57 | u32 end_addr; | |
58 | void *data[P54_TX_INFO_DATA_SIZE / sizeof(void *)]; | |
59 | }; | |
60 | ||
63f2dc9f CL |
61 | #define P54_MAX_CTRL_FRAME_LEN 0x1000 |
62 | ||
0a5ec96a CL |
63 | #define P54_HDR_FLAG_CONTROL BIT(15) |
64 | #define P54_HDR_FLAG_CONTROL_OPSET (BIT(15) + BIT(0)) | |
65 | ||
27df605e JL |
66 | struct p54_hdr { |
67 | __le16 flags; | |
eff1a59c MW |
68 | __le16 len; |
69 | __le32 req_id; | |
27df605e JL |
70 | __le16 type; /* enum p54_control_frame_types */ |
71 | u8 rts_tries; | |
72 | u8 tries; | |
eff1a59c MW |
73 | u8 data[0]; |
74 | } __attribute__ ((packed)); | |
75 | ||
0a5ec96a CL |
76 | #define FREE_AFTER_TX(skb) \ |
77 | ((((struct p54_hdr *) ((struct sk_buff *) skb)->data)-> \ | |
78 | flags) == cpu_to_le16(P54_HDR_FLAG_CONTROL_OPSET)) | |
79 | ||
0fdd7c5d CL |
80 | struct p54_edcf_queue_param { |
81 | __le16 aifs; | |
82 | __le16 cwmin; | |
83 | __le16 cwmax; | |
84 | __le16 txop; | |
85 | } __attribute__ ((packed)); | |
86 | ||
69ba3e5d CL |
87 | struct p54_rssi_linear_approximation { |
88 | s16 mul; | |
89 | s16 add; | |
90 | s16 longbow_unkn; | |
91 | s16 longbow_unk2; | |
92 | }; | |
93 | ||
83cf1b6e CL |
94 | struct p54_cal_database { |
95 | size_t entries; | |
96 | size_t entry_size; | |
97 | size_t offset; | |
98 | size_t len; | |
99 | u8 data[0]; | |
100 | }; | |
101 | ||
7cb77072 | 102 | #define EEPROM_READBACK_LEN 0x3fc |
eff1a59c MW |
103 | |
104 | #define ISL38XX_DEV_FIRMWARE_ADDR 0x20000 | |
105 | ||
2b80848e CL |
106 | #define FW_FMAC 0x464d4143 |
107 | #define FW_LM86 0x4c4d3836 | |
108 | #define FW_LM87 0x4c4d3837 | |
109 | #define FW_LM20 0x4c4d3230 | |
110 | ||
cd8d3d32 CL |
111 | enum fw_state { |
112 | FW_STATE_OFF, | |
113 | FW_STATE_BOOTING, | |
114 | FW_STATE_READY, | |
115 | FW_STATE_RESET, | |
116 | FW_STATE_RESETTING, | |
117 | }; | |
118 | ||
d0b45aef CL |
119 | #ifdef CONFIG_MAC80211_LEDS |
120 | ||
121 | #define P54_LED_MAX_NAME_LEN 31 | |
122 | ||
123 | struct p54_led_dev { | |
124 | struct ieee80211_hw *hw_dev; | |
125 | struct led_classdev led_dev; | |
126 | char name[P54_LED_MAX_NAME_LEN + 1]; | |
127 | ||
128 | unsigned int index; | |
129 | unsigned int registered; | |
130 | }; | |
131 | ||
132 | #endif /* CONFIG_MAC80211_LEDS */ | |
133 | ||
eff1a59c | 134 | struct p54_common { |
54fdb040 | 135 | struct ieee80211_hw *hw; |
eff1a59c MW |
136 | u32 rx_start; |
137 | u32 rx_end; | |
138 | struct sk_buff_head tx_queue; | |
0a5ec96a | 139 | void (*tx)(struct ieee80211_hw *dev, struct sk_buff *skb); |
eff1a59c MW |
140 | int (*open)(struct ieee80211_hw *dev); |
141 | void (*stop)(struct ieee80211_hw *dev); | |
142 | int mode; | |
4e416a6f CL |
143 | u16 rx_mtu; |
144 | u8 headroom; | |
145 | u8 tailroom; | |
6041e2a0 | 146 | struct mutex conf_mutex; |
4150c572 JB |
147 | u8 mac_addr[ETH_ALEN]; |
148 | u8 bssid[ETH_ALEN]; | |
78eb7484 CL |
149 | u8 rx_diversity_mask; |
150 | u8 tx_diversity_mask; | |
eff1a59c MW |
151 | struct pda_iq_autocal_entry *iq_autocal; |
152 | unsigned int iq_autocal_len; | |
83cf1b6e CL |
153 | struct p54_cal_database *output_limit; |
154 | struct p54_cal_database *curve_data; | |
69ba3e5d | 155 | struct p54_rssi_linear_approximation rssical_db[IEEE80211_NUM_BANDS]; |
78d57eb2 | 156 | unsigned int filter_flags; |
40333e4f | 157 | bool use_short_slot; |
7cb77072 | 158 | u16 rxhw; |
eff1a59c MW |
159 | u8 version; |
160 | unsigned int tx_hdr_len; | |
eff1a59c | 161 | unsigned int fw_var; |
2b80848e | 162 | unsigned int fw_interface; |
09adf284 | 163 | unsigned int output_power; |
a0db663f CL |
164 | u32 tsf_low32; |
165 | u32 tsf_high32; | |
881d948c | 166 | u32 basic_rate_mask; |
ced09574 CL |
167 | u16 wakeup_timer; |
168 | u16 aid; | |
84df3ed3 | 169 | struct ieee80211_tx_queue_stats tx_stats[8]; |
0fdd7c5d | 170 | struct p54_edcf_queue_param qos_params[8]; |
cc6de669 | 171 | struct ieee80211_low_level_stats stats; |
54fdb040 | 172 | struct delayed_work work; |
e5ea92a7 | 173 | struct sk_buff *cached_beacon; |
cc6de669 | 174 | int noise; |
7cb77072 CL |
175 | void *eeprom; |
176 | struct completion eeprom_comp; | |
25900ef0 CL |
177 | u8 privacy_caps; |
178 | u8 rx_keycache_size; | |
d0b45aef CL |
179 | /* LED management */ |
180 | #ifdef CONFIG_MAC80211_LEDS | |
181 | struct p54_led_dev assoc_led; | |
182 | struct p54_led_dev tx_led; | |
183 | #endif /* CONFIG_MAC80211_LEDS */ | |
184 | u16 softled_state; /* bit field of glowing LEDs */ | |
eff1a59c MW |
185 | }; |
186 | ||
187 | int p54_rx(struct ieee80211_hw *dev, struct sk_buff *skb); | |
b92f30d6 | 188 | void p54_free_skb(struct ieee80211_hw *dev, struct sk_buff *skb); |
4e416a6f | 189 | int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw); |
cd8d3d32 | 190 | int p54_parse_eeprom(struct ieee80211_hw *dev, void *eeprom, int len); |
7cb77072 | 191 | int p54_read_eeprom(struct ieee80211_hw *dev); |
eff1a59c | 192 | struct ieee80211_hw *p54_init_common(size_t priv_data_len); |
2ac71072 | 193 | int p54_register_common(struct ieee80211_hw *dev, struct device *pdev); |
eff1a59c MW |
194 | void p54_free_common(struct ieee80211_hw *dev); |
195 | ||
32ddf071 | 196 | #endif /* P54_H */ |