Changeset 20852


Ignore:
Timestamp:
2010-04-14T04:35:56+02:00 (8 years ago)
Author:
nbd
Message:

ath9k: fix a crash in ath9k_hw_reset on older hw

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mac80211/patches/300-ar9300_support.patch

    r20849 r20852  
    979979--- /dev/null 
    980980+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c 
    981 @@ -0,0 +1,1278 @@ 
     981@@ -0,0 +1,1345 @@ 
    982982+/* 
    983983+ * Copyright (c) 2008-2010 Atheros Communications Inc. 
     
    22272227+} 
    22282228+ 
     2229+static void ar5008_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) 
     2230+{ 
     2231+       struct ath9k_nfcal_hist *h; 
     2232+       int i, j; 
     2233+       int32_t val; 
     2234+       const u32 ar5416_cca_regs[6] = { 
     2235+               AR_PHY_CCA, 
     2236+               AR_PHY_CH1_CCA, 
     2237+               AR_PHY_CH2_CCA, 
     2238+               AR_PHY_EXT_CCA, 
     2239+               AR_PHY_CH1_EXT_CCA, 
     2240+               AR_PHY_CH2_EXT_CCA 
     2241+       }; 
     2242+       u8 chainmask, rx_chain_status; 
     2243+ 
     2244+       rx_chain_status = REG_READ(ah, AR_PHY_RX_CHAINMASK); 
     2245+       if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) 
     2246+               chainmask = 0x9; 
     2247+       else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { 
     2248+               if ((rx_chain_status & 0x2) || (rx_chain_status & 0x4)) 
     2249+                       chainmask = 0x1B; 
     2250+               else 
     2251+                       chainmask = 0x09; 
     2252+       } else { 
     2253+               if (rx_chain_status & 0x4) 
     2254+                       chainmask = 0x3F; 
     2255+               else if (rx_chain_status & 0x2) 
     2256+                       chainmask = 0x1B; 
     2257+               else 
     2258+                       chainmask = 0x09; 
     2259+       } 
     2260+ 
     2261+       h = ah->nfCalHist; 
     2262+ 
     2263+       for (i = 0; i < NUM_NF_READINGS; i++) { 
     2264+               if (chainmask & (1 << i)) { 
     2265+                       val = REG_READ(ah, ar5416_cca_regs[i]); 
     2266+                       val &= 0xFFFFFE00; 
     2267+                       val |= (((u32) (h[i].privNF) << 1) & 0x1ff); 
     2268+                       REG_WRITE(ah, ar5416_cca_regs[i], val); 
     2269+               } 
     2270+       } 
     2271+ 
     2272+       REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, 
     2273+                   AR_PHY_AGC_CONTROL_ENABLE_NF); 
     2274+       REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, 
     2275+                   AR_PHY_AGC_CONTROL_NO_UPDATE_NF); 
     2276+       REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); 
     2277+ 
     2278+       for (j = 0; j < 5; j++) { 
     2279+               if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & 
     2280+                    AR_PHY_AGC_CONTROL_NF) == 0) 
     2281+                       break; 
     2282+               udelay(50); 
     2283+       } 
     2284+ 
     2285+       for (i = 0; i < NUM_NF_READINGS; i++) { 
     2286+               if (chainmask & (1 << i)) { 
     2287+                       val = REG_READ(ah, ar5416_cca_regs[i]); 
     2288+                       val &= 0xFFFFFE00; 
     2289+                       val |= (((u32) (-50) << 1) & 0x1ff); 
     2290+                       REG_WRITE(ah, ar5416_cca_regs[i], val); 
     2291+               } 
     2292+       } 
     2293+} 
     2294+ 
    22292295+void ar5008_hw_attach_phy_ops(struct ath_hw *ah) 
    22302296+{ 
     
    22502316+       priv_ops->ani_control = ar5008_hw_ani_control; 
    22512317+       priv_ops->do_getnf = ar5008_hw_do_getnf; 
     2318+       priv_ops->loadnf = ar5008_hw_loadnf; 
    22522319+ 
    22532320+       if (AR_SREV_9100(ah)) 
     
    1079210859--- /dev/null 
    1079310860+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c 
    10794 @@ -0,0 +1,601 @@ 
     10861@@ -0,0 +1,534 @@ 
    1079510862+/* 
    1079610863+ * Copyright (c) 2008-2010 Atheros Communications Inc. 
     
    1131411381+} 
    1131511382+ 
    11316 +static void ar9002_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) 
    11317 +{ 
    11318 +       struct ath9k_nfcal_hist *h; 
    11319 +       int i, j; 
    11320 +       int32_t val; 
    11321 +       const u32 ar5416_cca_regs[6] = { 
    11322 +               AR_PHY_CCA, 
    11323 +               AR_PHY_CH1_CCA, 
    11324 +               AR_PHY_CH2_CCA, 
    11325 +               AR_PHY_EXT_CCA, 
    11326 +               AR_PHY_CH1_EXT_CCA, 
    11327 +               AR_PHY_CH2_EXT_CCA 
    11328 +       }; 
    11329 +       u8 chainmask, rx_chain_status; 
    11330 + 
    11331 +       rx_chain_status = REG_READ(ah, AR_PHY_RX_CHAINMASK); 
    11332 +       if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) 
    11333 +               chainmask = 0x9; 
    11334 +       else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { 
    11335 +               if ((rx_chain_status & 0x2) || (rx_chain_status & 0x4)) 
    11336 +                       chainmask = 0x1B; 
    11337 +               else 
    11338 +                       chainmask = 0x09; 
    11339 +       } else { 
    11340 +               if (rx_chain_status & 0x4) 
    11341 +                       chainmask = 0x3F; 
    11342 +               else if (rx_chain_status & 0x2) 
    11343 +                       chainmask = 0x1B; 
    11344 +               else 
    11345 +                       chainmask = 0x09; 
    11346 +       } 
    11347 + 
    11348 +       h = ah->nfCalHist; 
    11349 + 
    11350 +       for (i = 0; i < NUM_NF_READINGS; i++) { 
    11351 +               if (chainmask & (1 << i)) { 
    11352 +                       val = REG_READ(ah, ar5416_cca_regs[i]); 
    11353 +                       val &= 0xFFFFFE00; 
    11354 +                       val |= (((u32) (h[i].privNF) << 1) & 0x1ff); 
    11355 +                       REG_WRITE(ah, ar5416_cca_regs[i], val); 
    11356 +               } 
    11357 +       } 
    11358 + 
    11359 +       REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, 
    11360 +                   AR_PHY_AGC_CONTROL_ENABLE_NF); 
    11361 +       REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, 
    11362 +                   AR_PHY_AGC_CONTROL_NO_UPDATE_NF); 
    11363 +       REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); 
    11364 + 
    11365 +       for (j = 0; j < 5; j++) { 
    11366 +               if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & 
    11367 +                    AR_PHY_AGC_CONTROL_NF) == 0) 
    11368 +                       break; 
    11369 +               udelay(50); 
    11370 +       } 
    11371 + 
    11372 +       for (i = 0; i < NUM_NF_READINGS; i++) { 
    11373 +               if (chainmask & (1 << i)) { 
    11374 +                       val = REG_READ(ah, ar5416_cca_regs[i]); 
    11375 +                       val &= 0xFFFFFE00; 
    11376 +                       val |= (((u32) (-50) << 1) & 0x1ff); 
    11377 +                       REG_WRITE(ah, ar5416_cca_regs[i], val); 
    11378 +               } 
    11379 +       } 
    11380 +} 
    11381 + 
    1138211383+void ar9002_hw_attach_phy_ops(struct ath_hw *ah) 
    1138311384+{ 
     
    1139211393+       priv_ops->compute_pll_control = ar9002_hw_compute_pll_control; 
    1139311394+       priv_ops->do_getnf = ar9002_hw_do_getnf; 
    11394 +       priv_ops->loadnf = ar9002_hw_loadnf; 
    1139511395+} 
    1139611396--- /dev/null 
Note: See TracChangeset for help on using the changeset viewer.