diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-core.h')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 221 |
1 files changed, 190 insertions, 31 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 7193d97630dc..288b6a800e03 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -70,7 +70,7 @@ struct iwl_host_cmd; | |||
70 | struct iwl_cmd; | 70 | struct iwl_cmd; |
71 | 71 | ||
72 | 72 | ||
73 | #define IWLWIFI_VERSION "1.2.26k" | 73 | #define IWLWIFI_VERSION "1.3.27k" |
74 | #define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation" | 74 | #define DRV_COPYRIGHT "Copyright(c) 2003-2008 Intel Corporation" |
75 | 75 | ||
76 | #define IWL_PCI_DEVICE(dev, subdev, cfg) \ | 76 | #define IWL_PCI_DEVICE(dev, subdev, cfg) \ |
@@ -86,28 +86,64 @@ struct iwl_hcmd_ops { | |||
86 | int (*rxon_assoc)(struct iwl_priv *priv); | 86 | int (*rxon_assoc)(struct iwl_priv *priv); |
87 | }; | 87 | }; |
88 | struct iwl_hcmd_utils_ops { | 88 | struct iwl_hcmd_utils_ops { |
89 | int (*enqueue_hcmd)(struct iwl_priv *priv, struct iwl_host_cmd *cmd); | 89 | u16 (*get_hcmd_size)(u8 cmd_id, u16 len); |
90 | u16 (*build_addsta_hcmd)(const struct iwl_addsta_cmd *cmd, u8 *data); | ||
91 | void (*gain_computation)(struct iwl_priv *priv, | ||
92 | u32 *average_noise, | ||
93 | u16 min_average_noise_antennat_i, | ||
94 | u32 min_average_noise); | ||
95 | void (*chain_noise_reset)(struct iwl_priv *priv); | ||
96 | void (*rts_tx_cmd_flag)(struct ieee80211_tx_info *info, | ||
97 | __le32 *tx_flags); | ||
98 | int (*calc_rssi)(struct iwl_priv *priv, | ||
99 | struct iwl_rx_phy_res *rx_resp); | ||
90 | }; | 100 | }; |
91 | 101 | ||
92 | struct iwl_lib_ops { | 102 | struct iwl_lib_ops { |
93 | /* iwlwifi driver (priv) init */ | ||
94 | int (*init_drv)(struct iwl_priv *priv); | ||
95 | /* set hw dependant perameters */ | 103 | /* set hw dependant perameters */ |
96 | int (*set_hw_params)(struct iwl_priv *priv); | 104 | int (*set_hw_params)(struct iwl_priv *priv); |
97 | 105 | /* ucode shared memory */ | |
106 | int (*alloc_shared_mem)(struct iwl_priv *priv); | ||
107 | void (*free_shared_mem)(struct iwl_priv *priv); | ||
108 | int (*shared_mem_rx_idx)(struct iwl_priv *priv); | ||
109 | /* Handling TX */ | ||
98 | void (*txq_update_byte_cnt_tbl)(struct iwl_priv *priv, | 110 | void (*txq_update_byte_cnt_tbl)(struct iwl_priv *priv, |
99 | struct iwl4965_tx_queue *txq, | 111 | struct iwl_tx_queue *txq, |
100 | u16 byte_cnt); | 112 | u16 byte_cnt); |
101 | /* nic init */ | 113 | void (*txq_inval_byte_cnt_tbl)(struct iwl_priv *priv, |
102 | int (*hw_nic_init)(struct iwl_priv *priv); | 114 | struct iwl_tx_queue *txq); |
115 | void (*txq_set_sched)(struct iwl_priv *priv, u32 mask); | ||
116 | /* aggregations */ | ||
117 | int (*txq_agg_enable)(struct iwl_priv *priv, int txq_id, int tx_fifo, | ||
118 | int sta_id, int tid, u16 ssn_idx); | ||
119 | int (*txq_agg_disable)(struct iwl_priv *priv, u16 txq_id, u16 ssn_idx, | ||
120 | u8 tx_fifo); | ||
121 | /* setup Rx handler */ | ||
122 | void (*rx_handler_setup)(struct iwl_priv *priv); | ||
123 | /* setup deferred work */ | ||
124 | void (*setup_deferred_work)(struct iwl_priv *priv); | ||
125 | /* cancel deferred work */ | ||
126 | void (*cancel_deferred_work)(struct iwl_priv *priv); | ||
127 | /* alive notification after init uCode load */ | ||
128 | void (*init_alive_start)(struct iwl_priv *priv); | ||
103 | /* alive notification */ | 129 | /* alive notification */ |
104 | int (*alive_notify)(struct iwl_priv *priv); | 130 | int (*alive_notify)(struct iwl_priv *priv); |
105 | /* check validity of rtc data address */ | 131 | /* check validity of rtc data address */ |
106 | int (*is_valid_rtc_data_addr)(u32 addr); | 132 | int (*is_valid_rtc_data_addr)(u32 addr); |
107 | /* 1st ucode load */ | 133 | /* 1st ucode load */ |
108 | int (*load_ucode)(struct iwl_priv *priv); | 134 | int (*load_ucode)(struct iwl_priv *priv); |
109 | /* rfkill */ | 135 | /* power management */ |
110 | void (*radio_kill_sw)(struct iwl_priv *priv, int disable_radio); | 136 | struct { |
137 | int (*init)(struct iwl_priv *priv); | ||
138 | int (*reset)(struct iwl_priv *priv); | ||
139 | void (*stop)(struct iwl_priv *priv); | ||
140 | void (*config)(struct iwl_priv *priv); | ||
141 | int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src); | ||
142 | } apm_ops; | ||
143 | /* power */ | ||
144 | int (*send_tx_power) (struct iwl_priv *priv); | ||
145 | void (*update_chain_flags)(struct iwl_priv *priv); | ||
146 | void (*temperature) (struct iwl_priv *priv); | ||
111 | /* eeprom operations (as defined in iwl-eeprom.h) */ | 147 | /* eeprom operations (as defined in iwl-eeprom.h) */ |
112 | struct iwl_eeprom_ops eeprom_ops; | 148 | struct iwl_eeprom_ops eeprom_ops; |
113 | }; | 149 | }; |
@@ -124,15 +160,19 @@ struct iwl_mod_params { | |||
124 | int debug; /* def: 0 = minimal debug log messages */ | 160 | int debug; /* def: 0 = minimal debug log messages */ |
125 | int disable_hw_scan; /* def: 0 = use h/w scan */ | 161 | int disable_hw_scan; /* def: 0 = use h/w scan */ |
126 | int num_of_queues; /* def: HW dependent */ | 162 | int num_of_queues; /* def: HW dependent */ |
163 | int num_of_ampdu_queues;/* def: HW dependent */ | ||
127 | int enable_qos; /* def: 1 = use quality of service */ | 164 | int enable_qos; /* def: 1 = use quality of service */ |
165 | int disable_11n; /* def: 0 = disable 11n capabilities */ | ||
128 | int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ | 166 | int amsdu_size_8K; /* def: 1 = enable 8K amsdu size */ |
129 | int antenna; /* def: 0 = both antennas (use diversity) */ | 167 | int antenna; /* def: 0 = both antennas (use diversity) */ |
168 | int restart_fw; /* def: 1 = restart firmware */ | ||
130 | }; | 169 | }; |
131 | 170 | ||
132 | struct iwl_cfg { | 171 | struct iwl_cfg { |
133 | const char *name; | 172 | const char *name; |
134 | const char *fw_name; | 173 | const char *fw_name; |
135 | unsigned int sku; | 174 | unsigned int sku; |
175 | int eeprom_size; | ||
136 | const struct iwl_ops *ops; | 176 | const struct iwl_ops *ops; |
137 | const struct iwl_mod_params *mod_params; | 177 | const struct iwl_mod_params *mod_params; |
138 | }; | 178 | }; |
@@ -143,14 +183,111 @@ struct iwl_cfg { | |||
143 | 183 | ||
144 | struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg, | 184 | struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg, |
145 | struct ieee80211_ops *hw_ops); | 185 | struct ieee80211_ops *hw_ops); |
186 | void iwl_hw_detect(struct iwl_priv *priv); | ||
187 | void iwl_clear_stations_table(struct iwl_priv *priv); | ||
188 | void iwl_reset_qos(struct iwl_priv *priv); | ||
189 | void iwl_set_rxon_chain(struct iwl_priv *priv); | ||
190 | int iwl_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch); | ||
191 | void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_info *ht_info); | ||
192 | u8 iwl_is_fat_tx_allowed(struct iwl_priv *priv, | ||
193 | struct ieee80211_ht_info *sta_ht_inf); | ||
194 | int iwl_hw_nic_init(struct iwl_priv *priv); | ||
195 | int iwl_setup_mac(struct iwl_priv *priv); | ||
196 | int iwl_set_hw_params(struct iwl_priv *priv); | ||
197 | int iwl_init_drv(struct iwl_priv *priv); | ||
198 | void iwl_uninit_drv(struct iwl_priv *priv); | ||
199 | /* "keep warm" functions */ | ||
200 | int iwl_kw_init(struct iwl_priv *priv); | ||
201 | int iwl_kw_alloc(struct iwl_priv *priv); | ||
202 | void iwl_kw_free(struct iwl_priv *priv); | ||
203 | |||
204 | /***************************************************** | ||
205 | * RX | ||
206 | ******************************************************/ | ||
207 | void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq); | ||
208 | int iwl_rx_queue_alloc(struct iwl_priv *priv); | ||
209 | void iwl_rx_handle(struct iwl_priv *priv); | ||
210 | int iwl_rx_queue_update_write_ptr(struct iwl_priv *priv, | ||
211 | struct iwl_rx_queue *q); | ||
212 | void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq); | ||
213 | void iwl_rx_replenish(struct iwl_priv *priv); | ||
214 | int iwl_rx_init(struct iwl_priv *priv, struct iwl_rx_queue *rxq); | ||
215 | int iwl_rx_agg_start(struct iwl_priv *priv, const u8 *addr, int tid, u16 ssn); | ||
216 | int iwl_rx_agg_stop(struct iwl_priv *priv, const u8 *addr, int tid); | ||
217 | int iwl_rx_queue_restock(struct iwl_priv *priv); | ||
218 | int iwl_rx_queue_space(const struct iwl_rx_queue *q); | ||
219 | void iwl_rx_allocate(struct iwl_priv *priv); | ||
220 | void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb); | ||
221 | int iwl_tx_queue_reclaim(struct iwl_priv *priv, int txq_id, int index); | ||
222 | /* Handlers */ | ||
223 | void iwl_rx_missed_beacon_notif(struct iwl_priv *priv, | ||
224 | struct iwl_rx_mem_buffer *rxb); | ||
225 | void iwl_rx_statistics(struct iwl_priv *priv, | ||
226 | struct iwl_rx_mem_buffer *rxb); | ||
227 | |||
228 | /* TX helpers */ | ||
146 | 229 | ||
147 | void iwlcore_clear_stations_table(struct iwl_priv *priv); | 230 | /***************************************************** |
148 | void iwlcore_reset_qos(struct iwl_priv *priv); | 231 | * TX |
149 | int iwlcore_set_rxon_channel(struct iwl_priv *priv, | 232 | ******************************************************/ |
150 | enum ieee80211_band band, | 233 | int iwl_txq_ctx_reset(struct iwl_priv *priv); |
151 | u16 channel); | 234 | int iwl_tx_skb(struct iwl_priv *priv, struct sk_buff *skb); |
235 | void iwl_hw_txq_ctx_free(struct iwl_priv *priv); | ||
236 | int iwl_txq_update_write_ptr(struct iwl_priv *priv, struct iwl_tx_queue *txq); | ||
237 | int iwl_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn); | ||
238 | int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid); | ||
239 | int iwl_txq_check_empty(struct iwl_priv *priv, int sta_id, u8 tid, int txq_id); | ||
152 | 240 | ||
153 | int iwl_setup(struct iwl_priv *priv); | 241 | /***************************************************** |
242 | * TX power | ||
243 | ****************************************************/ | ||
244 | int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force); | ||
245 | |||
246 | /***************************************************** | ||
247 | * RF -Kill - here and not in iwl-rfkill.h to be available when | ||
248 | * RF-kill subsystem is not compiled. | ||
249 | ****************************************************/ | ||
250 | void iwl_rf_kill(struct iwl_priv *priv); | ||
251 | void iwl_radio_kill_sw_disable_radio(struct iwl_priv *priv); | ||
252 | int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv); | ||
253 | |||
254 | /******************************************************************************* | ||
255 | * Rate | ||
256 | ******************************************************************************/ | ||
257 | |||
258 | void iwl_hwrate_to_tx_control(struct iwl_priv *priv, u32 rate_n_flags, | ||
259 | struct ieee80211_tx_info *info); | ||
260 | int iwl_hwrate_to_plcp_idx(u32 rate_n_flags); | ||
261 | |||
262 | static inline u8 iwl_hw_get_rate(__le32 rate_n_flags) | ||
263 | { | ||
264 | return le32_to_cpu(rate_n_flags) & 0xFF; | ||
265 | } | ||
266 | static inline u32 iwl_hw_get_rate_n_flags(__le32 rate_n_flags) | ||
267 | { | ||
268 | return le32_to_cpu(rate_n_flags) & 0x1FFFF; | ||
269 | } | ||
270 | static inline __le32 iwl_hw_set_rate_n_flags(u8 rate, u32 flags) | ||
271 | { | ||
272 | return cpu_to_le32(flags|(u32)rate); | ||
273 | } | ||
274 | |||
275 | /******************************************************************************* | ||
276 | * Scanning | ||
277 | ******************************************************************************/ | ||
278 | void iwl_init_scan_params(struct iwl_priv *priv); | ||
279 | int iwl_scan_cancel(struct iwl_priv *priv); | ||
280 | int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms); | ||
281 | int iwl_scan_initiate(struct iwl_priv *priv); | ||
282 | void iwl_setup_rx_scan_handlers(struct iwl_priv *priv); | ||
283 | void iwl_setup_scan_deferred_work(struct iwl_priv *priv); | ||
284 | |||
285 | /******************************************************************************* | ||
286 | * Calibrations - implemented in iwl-calib.c | ||
287 | ******************************************************************************/ | ||
288 | int iwl_send_calib_results(struct iwl_priv *priv); | ||
289 | int iwl_calib_set(struct iwl_calib_result *res, const u8 *buf, int len); | ||
290 | void iwl_calib_free_results(struct iwl_priv *priv); | ||
154 | 291 | ||
155 | /***************************************************** | 292 | /***************************************************** |
156 | * S e n d i n g H o s t C o m m a n d s * | 293 | * S e n d i n g H o s t C o m m a n d s * |
@@ -167,6 +304,15 @@ int iwl_send_cmd_pdu_async(struct iwl_priv *priv, u8 id, u16 len, | |||
167 | int (*callback)(struct iwl_priv *priv, | 304 | int (*callback)(struct iwl_priv *priv, |
168 | struct iwl_cmd *cmd, | 305 | struct iwl_cmd *cmd, |
169 | struct sk_buff *skb)); | 306 | struct sk_buff *skb)); |
307 | |||
308 | int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd); | ||
309 | |||
310 | /***************************************************** | ||
311 | * Error Handling Debugging | ||
312 | ******************************************************/ | ||
313 | void iwl_dump_nic_error_log(struct iwl_priv *priv); | ||
314 | void iwl_dump_nic_event_log(struct iwl_priv *priv); | ||
315 | |||
170 | /*************** DRIVER STATUS FUNCTIONS *****/ | 316 | /*************** DRIVER STATUS FUNCTIONS *****/ |
171 | 317 | ||
172 | #define STATUS_HCMD_ACTIVE 0 /* host command in progress */ | 318 | #define STATUS_HCMD_ACTIVE 0 /* host command in progress */ |
@@ -187,7 +333,7 @@ int iwl_send_cmd_pdu_async(struct iwl_priv *priv, u8 id, u16 len, | |||
187 | #define STATUS_SCAN_HW 15 | 333 | #define STATUS_SCAN_HW 15 |
188 | #define STATUS_POWER_PMI 16 | 334 | #define STATUS_POWER_PMI 16 |
189 | #define STATUS_FW_ERROR 17 | 335 | #define STATUS_FW_ERROR 17 |
190 | #define STATUS_CONF_PENDING 18 | 336 | #define STATUS_MODE_PENDING 18 |
191 | 337 | ||
192 | 338 | ||
193 | static inline int iwl_is_ready(struct iwl_priv *priv) | 339 | static inline int iwl_is_ready(struct iwl_priv *priv) |
@@ -209,10 +355,19 @@ static inline int iwl_is_init(struct iwl_priv *priv) | |||
209 | return test_bit(STATUS_INIT, &priv->status); | 355 | return test_bit(STATUS_INIT, &priv->status); |
210 | } | 356 | } |
211 | 357 | ||
358 | static inline int iwl_is_rfkill_sw(struct iwl_priv *priv) | ||
359 | { | ||
360 | return test_bit(STATUS_RF_KILL_SW, &priv->status); | ||
361 | } | ||
362 | |||
363 | static inline int iwl_is_rfkill_hw(struct iwl_priv *priv) | ||
364 | { | ||
365 | return test_bit(STATUS_RF_KILL_HW, &priv->status); | ||
366 | } | ||
367 | |||
212 | static inline int iwl_is_rfkill(struct iwl_priv *priv) | 368 | static inline int iwl_is_rfkill(struct iwl_priv *priv) |
213 | { | 369 | { |
214 | return test_bit(STATUS_RF_KILL_HW, &priv->status) || | 370 | return iwl_is_rfkill_hw(priv) || iwl_is_rfkill_sw(priv); |
215 | test_bit(STATUS_RF_KILL_SW, &priv->status); | ||
216 | } | 371 | } |
217 | 372 | ||
218 | static inline int iwl_is_ready_rf(struct iwl_priv *priv) | 373 | static inline int iwl_is_ready_rf(struct iwl_priv *priv) |
@@ -224,23 +379,27 @@ static inline int iwl_is_ready_rf(struct iwl_priv *priv) | |||
224 | return iwl_is_ready(priv); | 379 | return iwl_is_ready(priv); |
225 | } | 380 | } |
226 | 381 | ||
227 | 382 | extern void iwl_rf_kill_ct_config(struct iwl_priv *priv); | |
228 | enum iwlcore_card_notify { | ||
229 | IWLCORE_INIT_EVT = 0, | ||
230 | IWLCORE_START_EVT = 1, | ||
231 | IWLCORE_STOP_EVT = 2, | ||
232 | IWLCORE_REMOVE_EVT = 3, | ||
233 | }; | ||
234 | |||
235 | int iwlcore_low_level_notify(struct iwl_priv *priv, | ||
236 | enum iwlcore_card_notify notify); | ||
237 | extern int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags); | 383 | extern int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags); |
238 | int iwl_send_lq_cmd(struct iwl_priv *priv, | 384 | extern int iwl_verify_ucode(struct iwl_priv *priv); |
239 | struct iwl_link_quality_cmd *lq, u8 flags); | 385 | extern int iwl_send_lq_cmd(struct iwl_priv *priv, |
386 | struct iwl_link_quality_cmd *lq, u8 flags); | ||
387 | extern void iwl_rx_reply_rx(struct iwl_priv *priv, | ||
388 | struct iwl_rx_mem_buffer *rxb); | ||
389 | extern void iwl_rx_reply_rx_phy(struct iwl_priv *priv, | ||
390 | struct iwl_rx_mem_buffer *rxb); | ||
391 | void iwl_rx_reply_compressed_ba(struct iwl_priv *priv, | ||
392 | struct iwl_rx_mem_buffer *rxb); | ||
240 | 393 | ||
241 | static inline int iwl_send_rxon_assoc(struct iwl_priv *priv) | 394 | static inline int iwl_send_rxon_assoc(struct iwl_priv *priv) |
242 | { | 395 | { |
243 | return priv->cfg->ops->hcmd->rxon_assoc(priv); | 396 | return priv->cfg->ops->hcmd->rxon_assoc(priv); |
244 | } | 397 | } |
245 | 398 | ||
399 | static inline const struct ieee80211_supported_band *iwl_get_hw_mode( | ||
400 | struct iwl_priv *priv, enum ieee80211_band band) | ||
401 | { | ||
402 | return priv->hw->wiphy->bands[band]; | ||
403 | } | ||
404 | |||
246 | #endif /* __iwl_core_h__ */ | 405 | #endif /* __iwl_core_h__ */ |