diff options
author | Rafał Miłecki <zajec5@gmail.com> | 2013-03-07 10:47:20 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-03-13 14:27:49 -0400 |
commit | 4cce0956239d324aca045be2b589c43b9baa561d (patch) | |
tree | 25bfce4b8baaa31de1284990f577beed81b189d3 /drivers/net/wireless/b43 | |
parent | d7bb7ca8e5613991b522f21b74bb67447a36eacd (diff) |
b43: HT-PHY: implement CCA reset
It was just another similar-to-N-PHY and easy-to-track routine:
write32 0xb0601408 <- 0x00002057
phy_read(0x0001) -> 0x0000
phy_write(0x0001) <- 0x4000
phy_write(0x0001) <- 0x0000
write32 0xb0601408 <- 0x00002055
(b43_phy_ht_force_rf_sequence was moved up unmodified)
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43')
-rw-r--r-- | drivers/net/wireless/b43/phy_ht.c | 68 |
1 files changed, 47 insertions, 21 deletions
diff --git a/drivers/net/wireless/b43/phy_ht.c b/drivers/net/wireless/b43/phy_ht.c index 9d2a7e545bf6..23a46c667974 100644 --- a/drivers/net/wireless/b43/phy_ht.c +++ b/drivers/net/wireless/b43/phy_ht.c | |||
@@ -154,6 +154,31 @@ static void b43_radio_2059_init(struct b43_wldev *dev) | |||
154 | } | 154 | } |
155 | 155 | ||
156 | /************************************************** | 156 | /************************************************** |
157 | * RF | ||
158 | **************************************************/ | ||
159 | |||
160 | static void b43_phy_ht_force_rf_sequence(struct b43_wldev *dev, u16 rf_seq) | ||
161 | { | ||
162 | u8 i; | ||
163 | |||
164 | u16 save_seq_mode = b43_phy_read(dev, B43_PHY_HT_RF_SEQ_MODE); | ||
165 | b43_phy_set(dev, B43_PHY_HT_RF_SEQ_MODE, 0x3); | ||
166 | |||
167 | b43_phy_set(dev, B43_PHY_HT_RF_SEQ_TRIG, rf_seq); | ||
168 | for (i = 0; i < 200; i++) { | ||
169 | if (!(b43_phy_read(dev, B43_PHY_HT_RF_SEQ_STATUS) & rf_seq)) { | ||
170 | i = 0; | ||
171 | break; | ||
172 | } | ||
173 | msleep(1); | ||
174 | } | ||
175 | if (i) | ||
176 | b43err(dev->wl, "Forcing RF sequence timeout\n"); | ||
177 | |||
178 | b43_phy_write(dev, B43_PHY_HT_RF_SEQ_MODE, save_seq_mode); | ||
179 | } | ||
180 | |||
181 | /************************************************** | ||
157 | * Various PHY ops | 182 | * Various PHY ops |
158 | **************************************************/ | 183 | **************************************************/ |
159 | 184 | ||
@@ -173,6 +198,20 @@ static u16 b43_phy_ht_classifier(struct b43_wldev *dev, u16 mask, u16 val) | |||
173 | return tmp; | 198 | return tmp; |
174 | } | 199 | } |
175 | 200 | ||
201 | static void b43_phy_ht_reset_cca(struct b43_wldev *dev) | ||
202 | { | ||
203 | u16 bbcfg; | ||
204 | |||
205 | b43_phy_force_clock(dev, true); | ||
206 | bbcfg = b43_phy_read(dev, B43_PHY_HT_BBCFG); | ||
207 | b43_phy_write(dev, B43_PHY_HT_BBCFG, bbcfg | B43_PHY_HT_BBCFG_RSTCCA); | ||
208 | udelay(1); | ||
209 | b43_phy_write(dev, B43_PHY_HT_BBCFG, bbcfg & ~B43_PHY_HT_BBCFG_RSTCCA); | ||
210 | b43_phy_force_clock(dev, false); | ||
211 | |||
212 | b43_phy_ht_force_rf_sequence(dev, B43_PHY_HT_RF_SEQ_TRIG_RST2RX); | ||
213 | } | ||
214 | |||
176 | static void b43_phy_ht_zero_extg(struct b43_wldev *dev) | 215 | static void b43_phy_ht_zero_extg(struct b43_wldev *dev) |
177 | { | 216 | { |
178 | u8 i, j; | 217 | u8 i, j; |
@@ -209,27 +248,6 @@ static void b43_phy_ht_afe_unk1(struct b43_wldev *dev) | |||
209 | } | 248 | } |
210 | } | 249 | } |
211 | 250 | ||
212 | static void b43_phy_ht_force_rf_sequence(struct b43_wldev *dev, u16 rf_seq) | ||
213 | { | ||
214 | u8 i; | ||
215 | |||
216 | u16 save_seq_mode = b43_phy_read(dev, B43_PHY_HT_RF_SEQ_MODE); | ||
217 | b43_phy_set(dev, B43_PHY_HT_RF_SEQ_MODE, 0x3); | ||
218 | |||
219 | b43_phy_set(dev, B43_PHY_HT_RF_SEQ_TRIG, rf_seq); | ||
220 | for (i = 0; i < 200; i++) { | ||
221 | if (!(b43_phy_read(dev, B43_PHY_HT_RF_SEQ_STATUS) & rf_seq)) { | ||
222 | i = 0; | ||
223 | break; | ||
224 | } | ||
225 | msleep(1); | ||
226 | } | ||
227 | if (i) | ||
228 | b43err(dev->wl, "Forcing RF sequence timeout\n"); | ||
229 | |||
230 | b43_phy_write(dev, B43_PHY_HT_RF_SEQ_MODE, save_seq_mode); | ||
231 | } | ||
232 | |||
233 | static void b43_phy_ht_read_clip_detection(struct b43_wldev *dev, u16 *clip_st) | 251 | static void b43_phy_ht_read_clip_detection(struct b43_wldev *dev, u16 *clip_st) |
234 | { | 252 | { |
235 | clip_st[0] = b43_phy_read(dev, B43_PHY_HT_C1_CLIP1THRES); | 253 | clip_st[0] = b43_phy_read(dev, B43_PHY_HT_C1_CLIP1THRES); |
@@ -319,6 +337,14 @@ static void b43_phy_ht_spur_avoid(struct b43_wldev *dev, | |||
319 | b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); | 337 | b43_write16(dev, B43_MMIO_TSF_CLK_FRAC_HIGH, 0x8); |
320 | 338 | ||
321 | /* TODO: reset PLL */ | 339 | /* TODO: reset PLL */ |
340 | |||
341 | if (spuravoid) | ||
342 | b43_phy_set(dev, B43_PHY_HT_BBCFG, B43_PHY_HT_BBCFG_RSTRX); | ||
343 | else | ||
344 | b43_phy_mask(dev, B43_PHY_HT_BBCFG, | ||
345 | ~B43_PHY_HT_BBCFG_RSTRX & 0xFFFF); | ||
346 | |||
347 | b43_phy_ht_reset_cca(dev); | ||
322 | } | 348 | } |
323 | 349 | ||
324 | static void b43_phy_ht_channel_setup(struct b43_wldev *dev, | 350 | static void b43_phy_ht_channel_setup(struct b43_wldev *dev, |