aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/b43
diff options
context:
space:
mode:
authorRafał Miłecki <zajec5@gmail.com>2013-03-07 10:47:20 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-03-13 14:27:49 -0400
commit4cce0956239d324aca045be2b589c43b9baa561d (patch)
tree25bfce4b8baaa31de1284990f577beed81b189d3 /drivers/net/wireless/b43
parentd7bb7ca8e5613991b522f21b74bb67447a36eacd (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.c68
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
160static 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
201static 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
176static void b43_phy_ht_zero_extg(struct b43_wldev *dev) 215static 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
212static 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
233static void b43_phy_ht_read_clip_detection(struct b43_wldev *dev, u16 *clip_st) 251static 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
324static void b43_phy_ht_channel_setup(struct b43_wldev *dev, 350static void b43_phy_ht_channel_setup(struct b43_wldev *dev,