diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2008-12-18 21:37:15 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-01-29 15:59:01 -0500 |
commit | d20b3c65f2a3e18ea86542e6ca4fe1c6d16c91df (patch) | |
tree | 78f8c8e4861160f0751240a8c65e2d8b0d9ab785 /drivers/net/wireless/iwlwifi | |
parent | 1125eff3ae26b2e39c6bf940b5e0b8774ebd2896 (diff) |
iwl3945: iwl3945_queue and iwl3945_channel_info replacement
This patch replaces the queue and channel info 3945 structures with the iwl
ones.
The initial goal was to replace the channel info structure. Once we do that,
and then include iwl-dev.h instead of iwl-3945.h, we still get build errors
due to several routines and macro redefinitions. This is why this patch also
includes:
- TFD39_MAX_PAYLOAD definition for 3945.
- CMD_SIZE, CMD_HUGE, CMD_SKB duplication removal.
- iwl3945_queue replacement in order to also get rid of the duplicated
get_cmd_index routine.
Getting rid of any of those needs the iwl-dev.h inclusion which then creates
build errors due to definitions duplication. This is why we include all those
in the same patch.
Signed-off-by: Samuel Ortiz <samuel.ortiz@intel.com>
Signed-off-by: Abhijeet Kolekar <abhijeet.kolekar@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-hw.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.h | 155 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 33 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 69 |
5 files changed, 71 insertions, 209 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h index 1182e6847a05..5d461bd77567 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h | |||
@@ -265,9 +265,6 @@ struct iwl3945_eeprom { | |||
265 | #define TFD_TX_CMD_SLOTS 256 | 265 | #define TFD_TX_CMD_SLOTS 256 |
266 | #define TFD_CMD_SLOTS 32 | 266 | #define TFD_CMD_SLOTS 32 |
267 | 267 | ||
268 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl3945_cmd) - \ | ||
269 | sizeof(struct iwl3945_cmd_meta)) | ||
270 | |||
271 | /* | 268 | /* |
272 | * RX related structures and functions | 269 | * RX related structures and functions |
273 | */ | 270 | */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index d7d40ecc6b64..14f0923a4751 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -306,7 +306,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl3945_priv *priv, | |||
306 | int txq_id, int index) | 306 | int txq_id, int index) |
307 | { | 307 | { |
308 | struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; | 308 | struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; |
309 | struct iwl3945_queue *q = &txq->q; | 309 | struct iwl_queue *q = &txq->q; |
310 | struct iwl3945_tx_info *tx_info; | 310 | struct iwl3945_tx_info *tx_info; |
311 | 311 | ||
312 | BUG_ON(txq_id == IWL_CMD_QUEUE_NUM); | 312 | BUG_ON(txq_id == IWL_CMD_QUEUE_NUM); |
@@ -320,7 +320,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl3945_priv *priv, | |||
320 | iwl3945_hw_txq_free_tfd(priv, txq); | 320 | iwl3945_hw_txq_free_tfd(priv, txq); |
321 | } | 321 | } |
322 | 322 | ||
323 | if (iwl3945_queue_space(q) > q->low_mark && (txq_id >= 0) && | 323 | if (iwl_queue_space(q) > q->low_mark && (txq_id >= 0) && |
324 | (txq_id != IWL_CMD_QUEUE_NUM) && | 324 | (txq_id != IWL_CMD_QUEUE_NUM) && |
325 | priv->mac80211_registered) | 325 | priv->mac80211_registered) |
326 | ieee80211_wake_queue(priv->hw, txq_id); | 326 | ieee80211_wake_queue(priv->hw, txq_id); |
@@ -1618,7 +1618,7 @@ static inline u8 iwl3945_hw_reg_fix_power_index(int index) | |||
1618 | */ | 1618 | */ |
1619 | static void iwl3945_hw_reg_set_scan_power(struct iwl3945_priv *priv, u32 scan_tbl_index, | 1619 | static void iwl3945_hw_reg_set_scan_power(struct iwl3945_priv *priv, u32 scan_tbl_index, |
1620 | s32 rate_index, const s8 *clip_pwrs, | 1620 | s32 rate_index, const s8 *clip_pwrs, |
1621 | struct iwl3945_channel_info *ch_info, | 1621 | struct iwl_channel_info *ch_info, |
1622 | int band_index) | 1622 | int band_index) |
1623 | { | 1623 | { |
1624 | struct iwl3945_scan_power_info *scan_power_info; | 1624 | struct iwl3945_scan_power_info *scan_power_info; |
@@ -1675,7 +1675,7 @@ static void iwl3945_hw_reg_set_scan_power(struct iwl3945_priv *priv, u32 scan_tb | |||
1675 | int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv) | 1675 | int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv) |
1676 | { | 1676 | { |
1677 | int rate_idx, i; | 1677 | int rate_idx, i; |
1678 | const struct iwl3945_channel_info *ch_info = NULL; | 1678 | const struct iwl_channel_info *ch_info = NULL; |
1679 | struct iwl3945_txpowertable_cmd txpower = { | 1679 | struct iwl3945_txpowertable_cmd txpower = { |
1680 | .channel = priv->active_rxon.channel, | 1680 | .channel = priv->active_rxon.channel, |
1681 | }; | 1681 | }; |
@@ -1748,7 +1748,7 @@ int iwl3945_hw_reg_send_txpower(struct iwl3945_priv *priv) | |||
1748 | * and send changes to NIC | 1748 | * and send changes to NIC |
1749 | */ | 1749 | */ |
1750 | static int iwl3945_hw_reg_set_new_power(struct iwl3945_priv *priv, | 1750 | static int iwl3945_hw_reg_set_new_power(struct iwl3945_priv *priv, |
1751 | struct iwl3945_channel_info *ch_info) | 1751 | struct iwl_channel_info *ch_info) |
1752 | { | 1752 | { |
1753 | struct iwl3945_channel_power_info *power_info; | 1753 | struct iwl3945_channel_power_info *power_info; |
1754 | int power_changed = 0; | 1754 | int power_changed = 0; |
@@ -1810,7 +1810,7 @@ static int iwl3945_hw_reg_set_new_power(struct iwl3945_priv *priv, | |||
1810 | * based strictly on regulatory (eeprom and spectrum mgt) limitations | 1810 | * based strictly on regulatory (eeprom and spectrum mgt) limitations |
1811 | * (no consideration for h/w clipping limitations). | 1811 | * (no consideration for h/w clipping limitations). |
1812 | */ | 1812 | */ |
1813 | static int iwl3945_hw_reg_get_ch_txpower_limit(struct iwl3945_channel_info *ch_info) | 1813 | static int iwl3945_hw_reg_get_ch_txpower_limit(struct iwl_channel_info *ch_info) |
1814 | { | 1814 | { |
1815 | s8 max_power; | 1815 | s8 max_power; |
1816 | 1816 | ||
@@ -1840,7 +1840,7 @@ static int iwl3945_hw_reg_get_ch_txpower_limit(struct iwl3945_channel_info *ch_i | |||
1840 | */ | 1840 | */ |
1841 | static int iwl3945_hw_reg_comp_txpower_temp(struct iwl3945_priv *priv) | 1841 | static int iwl3945_hw_reg_comp_txpower_temp(struct iwl3945_priv *priv) |
1842 | { | 1842 | { |
1843 | struct iwl3945_channel_info *ch_info = NULL; | 1843 | struct iwl_channel_info *ch_info = NULL; |
1844 | int delta_index; | 1844 | int delta_index; |
1845 | const s8 *clip_pwrs; /* array of h/w max power levels for each rate */ | 1845 | const s8 *clip_pwrs; /* array of h/w max power levels for each rate */ |
1846 | u8 a_band; | 1846 | u8 a_band; |
@@ -1901,7 +1901,7 @@ static int iwl3945_hw_reg_comp_txpower_temp(struct iwl3945_priv *priv) | |||
1901 | 1901 | ||
1902 | int iwl3945_hw_reg_set_txpower(struct iwl3945_priv *priv, s8 power) | 1902 | int iwl3945_hw_reg_set_txpower(struct iwl3945_priv *priv, s8 power) |
1903 | { | 1903 | { |
1904 | struct iwl3945_channel_info *ch_info; | 1904 | struct iwl_channel_info *ch_info; |
1905 | s8 max_power; | 1905 | s8 max_power; |
1906 | u8 a_band; | 1906 | u8 a_band; |
1907 | u8 i; | 1907 | u8 i; |
@@ -1999,7 +1999,7 @@ static void iwl3945_bg_reg_txpower_periodic(struct work_struct *work) | |||
1999 | * channel in each group 1-4. Group 5 All B/G channels are in group 0. | 1999 | * channel in each group 1-4. Group 5 All B/G channels are in group 0. |
2000 | */ | 2000 | */ |
2001 | static u16 iwl3945_hw_reg_get_ch_grp_index(struct iwl3945_priv *priv, | 2001 | static u16 iwl3945_hw_reg_get_ch_grp_index(struct iwl3945_priv *priv, |
2002 | const struct iwl3945_channel_info *ch_info) | 2002 | const struct iwl_channel_info *ch_info) |
2003 | { | 2003 | { |
2004 | struct iwl3945_eeprom_txpower_group *ch_grp = &priv->eeprom.groups[0]; | 2004 | struct iwl3945_eeprom_txpower_group *ch_grp = &priv->eeprom.groups[0]; |
2005 | u8 group; | 2005 | u8 group; |
@@ -2162,7 +2162,7 @@ static void iwl3945_hw_reg_init_channel_groups(struct iwl3945_priv *priv) | |||
2162 | */ | 2162 | */ |
2163 | int iwl3945_txpower_set_from_eeprom(struct iwl3945_priv *priv) | 2163 | int iwl3945_txpower_set_from_eeprom(struct iwl3945_priv *priv) |
2164 | { | 2164 | { |
2165 | struct iwl3945_channel_info *ch_info = NULL; | 2165 | struct iwl_channel_info *ch_info = NULL; |
2166 | struct iwl3945_channel_power_info *pwr_info; | 2166 | struct iwl3945_channel_power_info *pwr_info; |
2167 | int delta_index; | 2167 | int delta_index; |
2168 | u8 rate_index; | 2168 | u8 rate_index; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index dd15b3203a6f..46bbd8180bad 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
@@ -48,6 +48,7 @@ extern struct pci_device_id iwl3945_hw_card_ids[]; | |||
48 | #include "iwl-3945-hw.h" | 48 | #include "iwl-3945-hw.h" |
49 | #include "iwl-debug.h" | 49 | #include "iwl-debug.h" |
50 | #include "iwl-power.h" | 50 | #include "iwl-power.h" |
51 | #include "iwl-dev.h" | ||
51 | #include "iwl-3945-led.h" | 52 | #include "iwl-3945-led.h" |
52 | 53 | ||
53 | /* Highest firmware API version supported */ | 54 | /* Highest firmware API version supported */ |
@@ -111,26 +112,7 @@ struct iwl3945_rx_mem_buffer { | |||
111 | struct list_head list; | 112 | struct list_head list; |
112 | }; | 113 | }; |
113 | 114 | ||
114 | /* | 115 | int iwl3945_x2_queue_used(const struct iwl_queue *q, int i); |
115 | * Generic queue structure | ||
116 | * | ||
117 | * Contains common data for Rx and Tx queues | ||
118 | */ | ||
119 | struct iwl3945_queue { | ||
120 | int n_bd; /* number of BDs in this queue */ | ||
121 | int write_ptr; /* 1-st empty entry (index) host_w*/ | ||
122 | int read_ptr; /* last used entry (index) host_r*/ | ||
123 | dma_addr_t dma_addr; /* physical addr for BD's */ | ||
124 | int n_window; /* safe queue window */ | ||
125 | u32 id; | ||
126 | int low_mark; /* low watermark, resume queue if free | ||
127 | * space more than this */ | ||
128 | int high_mark; /* high watermark, stop queue if free | ||
129 | * space less than this */ | ||
130 | } __attribute__ ((packed)); | ||
131 | |||
132 | int iwl3945_queue_space(const struct iwl3945_queue *q); | ||
133 | int iwl3945_x2_queue_used(const struct iwl3945_queue *q, int i); | ||
134 | 116 | ||
135 | #define MAX_NUM_OF_TBS (20) | 117 | #define MAX_NUM_OF_TBS (20) |
136 | 118 | ||
@@ -152,7 +134,7 @@ struct iwl3945_tx_info { | |||
152 | * descriptors) and required locking structures. | 134 | * descriptors) and required locking structures. |
153 | */ | 135 | */ |
154 | struct iwl3945_tx_queue { | 136 | struct iwl3945_tx_queue { |
155 | struct iwl3945_queue q; | 137 | struct iwl_queue q; |
156 | struct iwl3945_tfd_frame *bd; | 138 | struct iwl3945_tfd_frame *bd; |
157 | struct iwl3945_cmd *cmd; | 139 | struct iwl3945_cmd *cmd; |
158 | dma_addr_t dma_addr_cmd; | 140 | dma_addr_t dma_addr_cmd; |
@@ -161,73 +143,6 @@ struct iwl3945_tx_queue { | |||
161 | int active; | 143 | int active; |
162 | }; | 144 | }; |
163 | 145 | ||
164 | #define IWL_NUM_SCAN_RATES (2) | ||
165 | |||
166 | struct iwl3945_channel_tgd_info { | ||
167 | u8 type; | ||
168 | s8 max_power; | ||
169 | }; | ||
170 | |||
171 | struct iwl3945_channel_tgh_info { | ||
172 | s64 last_radar_time; | ||
173 | }; | ||
174 | |||
175 | /* current Tx power values to use, one for each rate for each channel. | ||
176 | * requested power is limited by: | ||
177 | * -- regulatory EEPROM limits for this channel | ||
178 | * -- hardware capabilities (clip-powers) | ||
179 | * -- spectrum management | ||
180 | * -- user preference (e.g. iwconfig) | ||
181 | * when requested power is set, base power index must also be set. */ | ||
182 | struct iwl3945_channel_power_info { | ||
183 | struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */ | ||
184 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
185 | s8 base_power_index; /* gain index for power at factory temp. */ | ||
186 | s8 requested_power; /* power (dBm) requested for this chnl/rate */ | ||
187 | }; | ||
188 | |||
189 | /* current scan Tx power values to use, one for each scan rate for each | ||
190 | * channel. */ | ||
191 | struct iwl3945_scan_power_info { | ||
192 | struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */ | ||
193 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
194 | s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ | ||
195 | }; | ||
196 | |||
197 | /* | ||
198 | * One for each channel, holds all channel setup data | ||
199 | * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant | ||
200 | * with one another! | ||
201 | */ | ||
202 | #define IWL4965_MAX_RATE (33) | ||
203 | |||
204 | struct iwl3945_channel_info { | ||
205 | struct iwl3945_channel_tgd_info tgd; | ||
206 | struct iwl3945_channel_tgh_info tgh; | ||
207 | struct iwl_eeprom_channel eeprom; /* EEPROM regulatory limit */ | ||
208 | struct iwl_eeprom_channel fat_eeprom; /* EEPROM regulatory limit for | ||
209 | * FAT channel */ | ||
210 | |||
211 | u8 channel; /* channel number */ | ||
212 | u8 flags; /* flags copied from EEPROM */ | ||
213 | s8 max_power_avg; /* (dBm) regul. eeprom, normal Tx, any rate */ | ||
214 | s8 curr_txpow; /* (dBm) regulatory/spectrum/user (not h/w) */ | ||
215 | s8 min_power; /* always 0 */ | ||
216 | s8 scan_power; /* (dBm) regul. eeprom, direct scans, any rate */ | ||
217 | |||
218 | u8 group_index; /* 0-4, maps channel to group1/2/3/4/5 */ | ||
219 | u8 band_index; /* 0-4, maps channel to band1/2/3/4/5 */ | ||
220 | enum ieee80211_band band; | ||
221 | |||
222 | /* Radio/DSP gain settings for each "normal" data Tx rate. | ||
223 | * These include, in addition to RF and DSP gain, a few fields for | ||
224 | * remembering/modifying gain settings (indexes). */ | ||
225 | struct iwl3945_channel_power_info power_info[IWL4965_MAX_RATE]; | ||
226 | |||
227 | /* Radio/DSP gain settings for each scan rate, for directed scans. */ | ||
228 | struct iwl3945_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES]; | ||
229 | }; | ||
230 | |||
231 | struct iwl3945_clip_group { | 146 | struct iwl3945_clip_group { |
232 | /* maximum power level to prevent clipping for each rate, derived by | 147 | /* maximum power level to prevent clipping for each rate, derived by |
233 | * us from this band's saturation power in EEPROM */ | 148 | * us from this band's saturation power in EEPROM */ |
@@ -266,15 +181,6 @@ struct iwl3945_frame { | |||
266 | #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) | 181 | #define SN_TO_SEQ(ssn) (((ssn) << 4) & IEEE80211_SCTL_SEQ) |
267 | #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) | 182 | #define MAX_SN ((IEEE80211_SCTL_SEQ) >> 4) |
268 | 183 | ||
269 | enum { | ||
270 | /* CMD_SIZE_NORMAL = 0, */ | ||
271 | CMD_SIZE_HUGE = (1 << 0), | ||
272 | /* CMD_SYNC = 0, */ | ||
273 | CMD_ASYNC = (1 << 1), | ||
274 | /* CMD_NO_SKB = 0, */ | ||
275 | CMD_WANT_SKB = (1 << 2), | ||
276 | }; | ||
277 | |||
278 | struct iwl3945_cmd; | 184 | struct iwl3945_cmd; |
279 | struct iwl3945_priv; | 185 | struct iwl3945_priv; |
280 | 186 | ||
@@ -328,7 +234,7 @@ struct iwl3945_host_cmd { | |||
328 | const void *data; | 234 | const void *data; |
329 | }; | 235 | }; |
330 | 236 | ||
331 | #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl3945_cmd) - \ | 237 | #define TFD39_MAX_PAYLOAD_SIZE (sizeof(struct iwl3945_cmd) - \ |
332 | sizeof(struct iwl3945_cmd_meta)) | 238 | sizeof(struct iwl3945_cmd_meta)) |
333 | 239 | ||
334 | /* | 240 | /* |
@@ -453,13 +359,6 @@ struct iwl3945_station_entry { | |||
453 | struct iwl3945_hw_key keyinfo; | 359 | struct iwl3945_hw_key keyinfo; |
454 | }; | 360 | }; |
455 | 361 | ||
456 | /* one for each uCode image (inst/data, boot/init/runtime) */ | ||
457 | struct fw_desc { | ||
458 | void *v_addr; /* access by driver */ | ||
459 | dma_addr_t p_addr; /* access by card's busmaster DMA */ | ||
460 | u32 len; /* bytes */ | ||
461 | }; | ||
462 | |||
463 | /* uCode file layout */ | 362 | /* uCode file layout */ |
464 | struct iwl3945_ucode { | 363 | struct iwl3945_ucode { |
465 | __le32 ver; /* major/minor/API/serial */ | 364 | __le32 ver; /* major/minor/API/serial */ |
@@ -629,16 +528,6 @@ extern int iwl3945_txpower_set_from_eeprom(struct iwl3945_priv *priv); | |||
629 | extern u8 iwl3945_sync_sta(struct iwl3945_priv *priv, int sta_id, | 528 | extern u8 iwl3945_sync_sta(struct iwl3945_priv *priv, int sta_id, |
630 | u16 tx_rate, u8 flags); | 529 | u16 tx_rate, u8 flags); |
631 | 530 | ||
632 | |||
633 | #ifdef CONFIG_IWL3945_SPECTRUM_MEASUREMENT | ||
634 | |||
635 | enum { | ||
636 | MEASUREMENT_READY = (1 << 0), | ||
637 | MEASUREMENT_ACTIVE = (1 << 1), | ||
638 | }; | ||
639 | |||
640 | #endif | ||
641 | |||
642 | #ifdef CONFIG_IWL3945_RFKILL | 531 | #ifdef CONFIG_IWL3945_RFKILL |
643 | struct iwl3945_priv; | 532 | struct iwl3945_priv; |
644 | 533 | ||
@@ -682,7 +571,7 @@ struct iwl3945_priv { | |||
682 | 571 | ||
683 | /* we allocate array of iwl3945_channel_info for NIC's valid channels. | 572 | /* we allocate array of iwl3945_channel_info for NIC's valid channels. |
684 | * Access via channel # using indirect index array */ | 573 | * Access via channel # using indirect index array */ |
685 | struct iwl3945_channel_info *channel_info; /* channel info array */ | 574 | struct iwl_channel_info *channel_info; /* channel info array */ |
686 | u8 channel_count; /* # of channels */ | 575 | u8 channel_count; /* # of channels */ |
687 | 576 | ||
688 | /* each calibration channel group in the EEPROM has a derived | 577 | /* each calibration channel group in the EEPROM has a derived |
@@ -873,39 +762,7 @@ static inline int iwl3945_is_associated(struct iwl3945_priv *priv) | |||
873 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; | 762 | return (priv->active_rxon.filter_flags & RXON_FILTER_ASSOC_MSK) ? 1 : 0; |
874 | } | 763 | } |
875 | 764 | ||
876 | static inline int is_channel_valid(const struct iwl3945_channel_info *ch_info) | 765 | extern const struct iwl_channel_info *iwl3945_get_channel_info( |
877 | { | ||
878 | if (ch_info == NULL) | ||
879 | return 0; | ||
880 | return (ch_info->flags & EEPROM_CHANNEL_VALID) ? 1 : 0; | ||
881 | } | ||
882 | |||
883 | static inline int is_channel_radar(const struct iwl3945_channel_info *ch_info) | ||
884 | { | ||
885 | return (ch_info->flags & EEPROM_CHANNEL_RADAR) ? 1 : 0; | ||
886 | } | ||
887 | |||
888 | static inline u8 is_channel_a_band(const struct iwl3945_channel_info *ch_info) | ||
889 | { | ||
890 | return ch_info->band == IEEE80211_BAND_5GHZ; | ||
891 | } | ||
892 | |||
893 | static inline u8 is_channel_bg_band(const struct iwl3945_channel_info *ch_info) | ||
894 | { | ||
895 | return ch_info->band == IEEE80211_BAND_2GHZ; | ||
896 | } | ||
897 | |||
898 | static inline int is_channel_passive(const struct iwl3945_channel_info *ch) | ||
899 | { | ||
900 | return (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) ? 1 : 0; | ||
901 | } | ||
902 | |||
903 | static inline int is_channel_ibss(const struct iwl3945_channel_info *ch) | ||
904 | { | ||
905 | return ((ch->flags & EEPROM_CHANNEL_IBSS)) ? 1 : 0; | ||
906 | } | ||
907 | |||
908 | extern const struct iwl3945_channel_info *iwl3945_get_channel_info( | ||
909 | const struct iwl3945_priv *priv, enum ieee80211_band band, u16 channel); | 766 | const struct iwl3945_priv *priv, enum ieee80211_band band, u16 channel); |
910 | 767 | ||
911 | extern int iwl3945_rs_next_rate(struct iwl3945_priv *priv, int rate); | 768 | extern int iwl3945_rs_next_rate(struct iwl3945_priv *priv, int rate); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 73a0b6c53e18..f63209aaeaf6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -39,6 +39,7 @@ | |||
39 | #include "iwl-rfkill.h" | 39 | #include "iwl-rfkill.h" |
40 | #include "iwl-eeprom.h" | 40 | #include "iwl-eeprom.h" |
41 | #include "iwl-4965-hw.h" | 41 | #include "iwl-4965-hw.h" |
42 | #include "iwl-3945-hw.h" | ||
42 | #include "iwl-csr.h" | 43 | #include "iwl-csr.h" |
43 | #include "iwl-prph.h" | 44 | #include "iwl-prph.h" |
44 | #include "iwl-debug.h" | 45 | #include "iwl-debug.h" |
@@ -153,6 +154,30 @@ struct iwl4965_channel_tgh_info { | |||
153 | s64 last_radar_time; | 154 | s64 last_radar_time; |
154 | }; | 155 | }; |
155 | 156 | ||
157 | #define IWL4965_MAX_RATE (33) | ||
158 | |||
159 | /* current Tx power values to use, one for each rate for each channel. | ||
160 | * requested power is limited by: | ||
161 | * -- regulatory EEPROM limits for this channel | ||
162 | * -- hardware capabilities (clip-powers) | ||
163 | * -- spectrum management | ||
164 | * -- user preference (e.g. iwconfig) | ||
165 | * when requested power is set, base power index must also be set. */ | ||
166 | struct iwl3945_channel_power_info { | ||
167 | struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */ | ||
168 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
169 | s8 base_power_index; /* gain index for power at factory temp. */ | ||
170 | s8 requested_power; /* power (dBm) requested for this chnl/rate */ | ||
171 | }; | ||
172 | |||
173 | /* current scan Tx power values to use, one for each scan rate for each | ||
174 | * channel. */ | ||
175 | struct iwl3945_scan_power_info { | ||
176 | struct iwl3945_tx_power tpc; /* actual radio and DSP gain settings */ | ||
177 | s8 power_table_index; /* actual (compenst'd) index into gain table */ | ||
178 | s8 requested_power; /* scan pwr (dBm) requested for chnl/rate */ | ||
179 | }; | ||
180 | |||
156 | /* | 181 | /* |
157 | * One for each channel, holds all channel setup data | 182 | * One for each channel, holds all channel setup data |
158 | * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant | 183 | * Some of the fields (e.g. eeprom and flags/max_power_avg) are redundant |
@@ -183,6 +208,14 @@ struct iwl_channel_info { | |||
183 | s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */ | 208 | s8 fat_scan_power; /* (dBm) eeprom, direct scans, any rate */ |
184 | u8 fat_flags; /* flags copied from EEPROM */ | 209 | u8 fat_flags; /* flags copied from EEPROM */ |
185 | u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */ | 210 | u8 fat_extension_channel; /* HT_IE_EXT_CHANNEL_* */ |
211 | |||
212 | /* Radio/DSP gain settings for each "normal" data Tx rate. | ||
213 | * These include, in addition to RF and DSP gain, a few fields for | ||
214 | * remembering/modifying gain settings (indexes). */ | ||
215 | struct iwl3945_channel_power_info power_info[IWL4965_MAX_RATE]; | ||
216 | |||
217 | /* Radio/DSP gain settings for each scan rate, for directed scans. */ | ||
218 | struct iwl3945_scan_power_info scan_pwr_info[IWL_NUM_SCAN_RATES]; | ||
186 | }; | 219 | }; |
187 | 220 | ||
188 | 221 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index aac8825237f4..421c944b1877 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -53,6 +53,7 @@ | |||
53 | #include "iwl-3945.h" | 53 | #include "iwl-3945.h" |
54 | #include "iwl-3945-fh.h" | 54 | #include "iwl-3945-fh.h" |
55 | #include "iwl-helpers.h" | 55 | #include "iwl-helpers.h" |
56 | #include "iwl-dev.h" | ||
56 | 57 | ||
57 | static int iwl3945_tx_queue_update_write_ptr(struct iwl3945_priv *priv, | 58 | static int iwl3945_tx_queue_update_write_ptr(struct iwl3945_priv *priv, |
58 | struct iwl3945_tx_queue *txq); | 59 | struct iwl3945_tx_queue *txq); |
@@ -132,44 +133,17 @@ static const struct ieee80211_supported_band *iwl3945_get_band( | |||
132 | * (#0-3) for data tx via EDCA. An additional 2 HCCA queues are unused. | 133 | * (#0-3) for data tx via EDCA. An additional 2 HCCA queues are unused. |
133 | ***************************************************/ | 134 | ***************************************************/ |
134 | 135 | ||
135 | int iwl3945_queue_space(const struct iwl3945_queue *q) | 136 | int iwl3945_x2_queue_used(const struct iwl_queue *q, int i) |
136 | { | ||
137 | int s = q->read_ptr - q->write_ptr; | ||
138 | |||
139 | if (q->read_ptr > q->write_ptr) | ||
140 | s -= q->n_bd; | ||
141 | |||
142 | if (s <= 0) | ||
143 | s += q->n_window; | ||
144 | /* keep some reserve to not confuse empty and full situations */ | ||
145 | s -= 2; | ||
146 | if (s < 0) | ||
147 | s = 0; | ||
148 | return s; | ||
149 | } | ||
150 | |||
151 | int iwl3945_x2_queue_used(const struct iwl3945_queue *q, int i) | ||
152 | { | 137 | { |
153 | return q->write_ptr > q->read_ptr ? | 138 | return q->write_ptr > q->read_ptr ? |
154 | (i >= q->read_ptr && i < q->write_ptr) : | 139 | (i >= q->read_ptr && i < q->write_ptr) : |
155 | !(i < q->read_ptr && i >= q->write_ptr); | 140 | !(i < q->read_ptr && i >= q->write_ptr); |
156 | } | 141 | } |
157 | 142 | ||
158 | |||
159 | static inline u8 get_cmd_index(struct iwl3945_queue *q, u32 index, int is_huge) | ||
160 | { | ||
161 | /* This is for scan command, the big buffer at end of command array */ | ||
162 | if (is_huge) | ||
163 | return q->n_window; /* must be power of 2 */ | ||
164 | |||
165 | /* Otherwise, use normal size buffers */ | ||
166 | return index & (q->n_window - 1); | ||
167 | } | ||
168 | |||
169 | /** | 143 | /** |
170 | * iwl3945_queue_init - Initialize queue's high/low-water and read/write indexes | 144 | * iwl3945_queue_init - Initialize queue's high/low-water and read/write indexes |
171 | */ | 145 | */ |
172 | static int iwl3945_queue_init(struct iwl3945_priv *priv, struct iwl3945_queue *q, | 146 | static int iwl3945_queue_init(struct iwl3945_priv *priv, struct iwl_queue *q, |
173 | int count, int slots_num, u32 id) | 147 | int count, int slots_num, u32 id) |
174 | { | 148 | { |
175 | q->n_bd = count; | 149 | q->n_bd = count; |
@@ -297,7 +271,7 @@ int iwl3945_tx_queue_init(struct iwl3945_priv *priv, | |||
297 | */ | 271 | */ |
298 | void iwl3945_tx_queue_free(struct iwl3945_priv *priv, struct iwl3945_tx_queue *txq) | 272 | void iwl3945_tx_queue_free(struct iwl3945_priv *priv, struct iwl3945_tx_queue *txq) |
299 | { | 273 | { |
300 | struct iwl3945_queue *q = &txq->q; | 274 | struct iwl_queue *q = &txq->q; |
301 | struct pci_dev *dev = priv->pci_dev; | 275 | struct pci_dev *dev = priv->pci_dev; |
302 | int len; | 276 | int len; |
303 | 277 | ||
@@ -581,7 +555,7 @@ static const char *get_cmd_string(u8 cmd) | |||
581 | static int iwl3945_enqueue_hcmd(struct iwl3945_priv *priv, struct iwl3945_host_cmd *cmd) | 555 | static int iwl3945_enqueue_hcmd(struct iwl3945_priv *priv, struct iwl3945_host_cmd *cmd) |
582 | { | 556 | { |
583 | struct iwl3945_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; | 557 | struct iwl3945_tx_queue *txq = &priv->txq[IWL_CMD_QUEUE_NUM]; |
584 | struct iwl3945_queue *q = &txq->q; | 558 | struct iwl_queue *q = &txq->q; |
585 | struct iwl3945_tfd_frame *tfd; | 559 | struct iwl3945_tfd_frame *tfd; |
586 | u32 *control_flags; | 560 | u32 *control_flags; |
587 | struct iwl3945_cmd *out_cmd; | 561 | struct iwl3945_cmd *out_cmd; |
@@ -596,7 +570,7 @@ static int iwl3945_enqueue_hcmd(struct iwl3945_priv *priv, struct iwl3945_host_c | |||
596 | /* If any of the command structures end up being larger than | 570 | /* If any of the command structures end up being larger than |
597 | * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then | 571 | * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then |
598 | * we will need to increase the size of the TFD entries */ | 572 | * we will need to increase the size of the TFD entries */ |
599 | BUG_ON((fix_size > TFD_MAX_PAYLOAD_SIZE) && | 573 | BUG_ON((fix_size > TFD39_MAX_PAYLOAD_SIZE) && |
600 | !(cmd->meta.flags & CMD_SIZE_HUGE)); | 574 | !(cmd->meta.flags & CMD_SIZE_HUGE)); |
601 | 575 | ||
602 | 576 | ||
@@ -605,7 +579,7 @@ static int iwl3945_enqueue_hcmd(struct iwl3945_priv *priv, struct iwl3945_host_c | |||
605 | return -EIO; | 579 | return -EIO; |
606 | } | 580 | } |
607 | 581 | ||
608 | if (iwl3945_queue_space(q) < ((cmd->meta.flags & CMD_ASYNC) ? 2 : 1)) { | 582 | if (iwl_queue_space(q) < ((cmd->meta.flags & CMD_ASYNC) ? 2 : 1)) { |
609 | IWL_ERROR("No space for Tx\n"); | 583 | IWL_ERROR("No space for Tx\n"); |
610 | return -ENOSPC; | 584 | return -ENOSPC; |
611 | } | 585 | } |
@@ -2171,7 +2145,7 @@ static void iwl3945_set_flags_for_phymode(struct iwl3945_priv *priv, | |||
2171 | static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv, | 2145 | static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv, |
2172 | int mode) | 2146 | int mode) |
2173 | { | 2147 | { |
2174 | const struct iwl3945_channel_info *ch_info; | 2148 | const struct iwl_channel_info *ch_info; |
2175 | 2149 | ||
2176 | memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon)); | 2150 | memset(&priv->staging_rxon, 0, sizeof(priv->staging_rxon)); |
2177 | 2151 | ||
@@ -2241,7 +2215,7 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv, | |||
2241 | static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode) | 2215 | static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode) |
2242 | { | 2216 | { |
2243 | if (mode == NL80211_IFTYPE_ADHOC) { | 2217 | if (mode == NL80211_IFTYPE_ADHOC) { |
2244 | const struct iwl3945_channel_info *ch_info; | 2218 | const struct iwl_channel_info *ch_info; |
2245 | 2219 | ||
2246 | ch_info = iwl3945_get_channel_info(priv, | 2220 | ch_info = iwl3945_get_channel_info(priv, |
2247 | priv->band, | 2221 | priv->band, |
@@ -2457,7 +2431,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) | |||
2457 | u32 *control_flags; | 2431 | u32 *control_flags; |
2458 | int txq_id = skb_get_queue_mapping(skb); | 2432 | int txq_id = skb_get_queue_mapping(skb); |
2459 | struct iwl3945_tx_queue *txq = NULL; | 2433 | struct iwl3945_tx_queue *txq = NULL; |
2460 | struct iwl3945_queue *q = NULL; | 2434 | struct iwl_queue *q = NULL; |
2461 | dma_addr_t phys_addr; | 2435 | dma_addr_t phys_addr; |
2462 | dma_addr_t txcmd_phys; | 2436 | dma_addr_t txcmd_phys; |
2463 | struct iwl3945_cmd *out_cmd = NULL; | 2437 | struct iwl3945_cmd *out_cmd = NULL; |
@@ -2652,7 +2626,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, struct sk_buff *skb) | |||
2652 | if (rc) | 2626 | if (rc) |
2653 | return rc; | 2627 | return rc; |
2654 | 2628 | ||
2655 | if ((iwl3945_queue_space(q) < q->high_mark) | 2629 | if ((iwl_queue_space(q) < q->high_mark) |
2656 | && priv->mac80211_registered) { | 2630 | && priv->mac80211_registered) { |
2657 | if (wait_write_ptr) { | 2631 | if (wait_write_ptr) { |
2658 | spin_lock_irqsave(&priv->lock, flags); | 2632 | spin_lock_irqsave(&priv->lock, flags); |
@@ -3305,7 +3279,7 @@ static void iwl3945_cmd_queue_reclaim(struct iwl3945_priv *priv, | |||
3305 | int txq_id, int index) | 3279 | int txq_id, int index) |
3306 | { | 3280 | { |
3307 | struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; | 3281 | struct iwl3945_tx_queue *txq = &priv->txq[txq_id]; |
3308 | struct iwl3945_queue *q = &txq->q; | 3282 | struct iwl_queue *q = &txq->q; |
3309 | int nfreed = 0; | 3283 | int nfreed = 0; |
3310 | 3284 | ||
3311 | if ((index >= q->n_bd) || (iwl3945_x2_queue_used(q, index) == 0)) { | 3285 | if ((index >= q->n_bd) || (iwl3945_x2_queue_used(q, index) == 0)) { |
@@ -4524,8 +4498,9 @@ static void iwl3945_init_band_reference(const struct iwl3945_priv *priv, int ban | |||
4524 | * | 4498 | * |
4525 | * Based on band and channel number. | 4499 | * Based on band and channel number. |
4526 | */ | 4500 | */ |
4527 | const struct iwl3945_channel_info *iwl3945_get_channel_info(const struct iwl3945_priv *priv, | 4501 | const struct iwl_channel_info * |
4528 | enum ieee80211_band band, u16 channel) | 4502 | iwl3945_get_channel_info(const struct iwl3945_priv *priv, |
4503 | enum ieee80211_band band, u16 channel) | ||
4529 | { | 4504 | { |
4530 | int i; | 4505 | int i; |
4531 | 4506 | ||
@@ -4560,7 +4535,7 @@ static int iwl3945_init_channel_map(struct iwl3945_priv *priv) | |||
4560 | const u8 *eeprom_ch_index = NULL; | 4535 | const u8 *eeprom_ch_index = NULL; |
4561 | const struct iwl_eeprom_channel *eeprom_ch_info = NULL; | 4536 | const struct iwl_eeprom_channel *eeprom_ch_info = NULL; |
4562 | int band, ch; | 4537 | int band, ch; |
4563 | struct iwl3945_channel_info *ch_info; | 4538 | struct iwl_channel_info *ch_info; |
4564 | 4539 | ||
4565 | if (priv->channel_count) { | 4540 | if (priv->channel_count) { |
4566 | IWL_DEBUG_INFO("Channel map already initialized.\n"); | 4541 | IWL_DEBUG_INFO("Channel map already initialized.\n"); |
@@ -4584,7 +4559,7 @@ static int iwl3945_init_channel_map(struct iwl3945_priv *priv) | |||
4584 | 4559 | ||
4585 | IWL_DEBUG_INFO("Parsing data for %d channels.\n", priv->channel_count); | 4560 | IWL_DEBUG_INFO("Parsing data for %d channels.\n", priv->channel_count); |
4586 | 4561 | ||
4587 | priv->channel_info = kzalloc(sizeof(struct iwl3945_channel_info) * | 4562 | priv->channel_info = kzalloc(sizeof(struct iwl_channel_info) * |
4588 | priv->channel_count, GFP_KERNEL); | 4563 | priv->channel_count, GFP_KERNEL); |
4589 | if (!priv->channel_info) { | 4564 | if (!priv->channel_info) { |
4590 | IWL_ERROR("Could not allocate channel_info\n"); | 4565 | IWL_ERROR("Could not allocate channel_info\n"); |
@@ -4746,7 +4721,7 @@ static int iwl3945_get_channels_for_scan(struct iwl3945_priv *priv, | |||
4746 | { | 4721 | { |
4747 | const struct ieee80211_channel *channels = NULL; | 4722 | const struct ieee80211_channel *channels = NULL; |
4748 | const struct ieee80211_supported_band *sband; | 4723 | const struct ieee80211_supported_band *sband; |
4749 | const struct iwl3945_channel_info *ch_info; | 4724 | const struct iwl_channel_info *ch_info; |
4750 | u16 passive_dwell = 0; | 4725 | u16 passive_dwell = 0; |
4751 | u16 active_dwell = 0; | 4726 | u16 active_dwell = 0; |
4752 | int added, i; | 4727 | int added, i; |
@@ -4858,7 +4833,7 @@ static void iwl3945_init_hw_rates(struct iwl3945_priv *priv, | |||
4858 | */ | 4833 | */ |
4859 | static int iwl3945_init_geos(struct iwl3945_priv *priv) | 4834 | static int iwl3945_init_geos(struct iwl3945_priv *priv) |
4860 | { | 4835 | { |
4861 | struct iwl3945_channel_info *ch; | 4836 | struct iwl_channel_info *ch; |
4862 | struct ieee80211_supported_band *sband; | 4837 | struct ieee80211_supported_band *sband; |
4863 | struct ieee80211_channel *channels; | 4838 | struct ieee80211_channel *channels; |
4864 | struct ieee80211_channel *geo_ch; | 4839 | struct ieee80211_channel *geo_ch; |
@@ -6585,7 +6560,7 @@ static int iwl3945_mac_add_interface(struct ieee80211_hw *hw, | |||
6585 | static int iwl3945_mac_config(struct ieee80211_hw *hw, u32 changed) | 6560 | static int iwl3945_mac_config(struct ieee80211_hw *hw, u32 changed) |
6586 | { | 6561 | { |
6587 | struct iwl3945_priv *priv = hw->priv; | 6562 | struct iwl3945_priv *priv = hw->priv; |
6588 | const struct iwl3945_channel_info *ch_info; | 6563 | const struct iwl_channel_info *ch_info; |
6589 | struct ieee80211_conf *conf = &hw->conf; | 6564 | struct ieee80211_conf *conf = &hw->conf; |
6590 | unsigned long flags; | 6565 | unsigned long flags; |
6591 | int ret = 0; | 6566 | int ret = 0; |
@@ -7112,7 +7087,7 @@ static int iwl3945_mac_get_tx_stats(struct ieee80211_hw *hw, | |||
7112 | struct iwl3945_priv *priv = hw->priv; | 7087 | struct iwl3945_priv *priv = hw->priv; |
7113 | int i, avail; | 7088 | int i, avail; |
7114 | struct iwl3945_tx_queue *txq; | 7089 | struct iwl3945_tx_queue *txq; |
7115 | struct iwl3945_queue *q; | 7090 | struct iwl_queue *q; |
7116 | unsigned long flags; | 7091 | unsigned long flags; |
7117 | 7092 | ||
7118 | IWL_DEBUG_MAC80211("enter\n"); | 7093 | IWL_DEBUG_MAC80211("enter\n"); |
@@ -7127,7 +7102,7 @@ static int iwl3945_mac_get_tx_stats(struct ieee80211_hw *hw, | |||
7127 | for (i = 0; i < AC_NUM; i++) { | 7102 | for (i = 0; i < AC_NUM; i++) { |
7128 | txq = &priv->txq[i]; | 7103 | txq = &priv->txq[i]; |
7129 | q = &txq->q; | 7104 | q = &txq->q; |
7130 | avail = iwl3945_queue_space(q); | 7105 | avail = iwl_queue_space(q); |
7131 | 7106 | ||
7132 | stats[i].len = q->n_window - avail; | 7107 | stats[i].len = q->n_window - avail; |
7133 | stats[i].limit = q->n_window - q->high_mark; | 7108 | stats[i].limit = q->n_window - q->high_mark; |