aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/realtek
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2017-04-16 20:32:07 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-25 09:44:34 -0400
commit444df795edf433aa75f10fc62ae171996dbd833c (patch)
treebd528a0fb7a04283c34c326518846be6bf7b5c8d /drivers/net/wireless/realtek
parent7e789787878321fc2b1b7869963fa5eeede7402e (diff)
rtlwifi: rtl8821ae: setup 8812ae RFE according to device type
commit 46cfa2148e7371c537efff1a1c693e58f523089d upstream. Current channel switch implementation sets 8812ae RFE reg value assuming that device always has type 2. Extend possible RFE types set and write corresponding reg values. Source for new code is http://dlcdnet.asus.com/pub/ASUS/wireless/PCE-AC51/DR_PCE_AC51_20232801152016.zip Signed-off-by: Maxim Samoylov <max7255@gmail.com> Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Cc: Yan-Hsuan Chuang <yhchuang@realtek.com> Cc: Pkshih <pkshih@realtek.com> Cc: Birming Chiu <birming@realtek.com> Cc: Shaofu <shaofu@realtek.com> Cc: Steven Ting <steventing@realtek.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/net/wireless/realtek')
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c122
-rw-r--r--drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h1
2 files changed, 107 insertions, 16 deletions
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
index 5dad402171c2..a74fad6e53c1 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
@@ -359,6 +359,107 @@ bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
359 return rtl8821ae_phy_rf6052_config(hw); 359 return rtl8821ae_phy_rf6052_config(hw);
360} 360}
361 361
362static void _rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw *hw)
363{
364 struct rtl_priv *rtlpriv = rtl_priv(hw);
365 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
366 u8 tmp;
367
368 switch (rtlhal->rfe_type) {
369 case 3:
370 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337770);
371 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337770);
372 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
373 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
374 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
375 break;
376 case 4:
377 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
378 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
379 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x001);
380 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x001);
381 break;
382 case 5:
383 rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x77);
384 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
385 tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
386 rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp & ~0x1);
387 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
388 break;
389 case 1:
390 if (rtlpriv->btcoexist.bt_coexistence) {
391 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x777777);
392 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
393 0x77777777);
394 rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
395 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
396 break;
397 }
398 case 0:
399 case 2:
400 default:
401 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777);
402 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777);
403 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
404 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
405 break;
406 }
407}
408
409static void _rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw *hw)
410{
411 struct rtl_priv *rtlpriv = rtl_priv(hw);
412 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
413 u8 tmp;
414
415 switch (rtlhal->rfe_type) {
416 case 0:
417 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337717);
418 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337717);
419 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
420 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
421 break;
422 case 1:
423 if (rtlpriv->btcoexist.bt_coexistence) {
424 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x337717);
425 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
426 0x77337717);
427 rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000);
428 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
429 } else {
430 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
431 0x77337717);
432 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
433 0x77337717);
434 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000);
435 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000);
436 }
437 break;
438 case 3:
439 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337717);
440 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337717);
441 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
442 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
443 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1);
444 break;
445 case 5:
446 rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x33);
447 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
448 tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3);
449 rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp | 0x1);
450 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
451 break;
452 case 2:
453 case 4:
454 default:
455 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337777);
456 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777);
457 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010);
458 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010);
459 break;
460 }
461}
462
362u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band, 463u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band,
363 u8 rf_path) 464 u8 rf_path)
364{ 465{
@@ -553,14 +654,9 @@ void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
553 /* 0x82C[1:0] = 2b'00 */ 654 /* 0x82C[1:0] = 2b'00 */
554 rtl_set_bbreg(hw, 0x82c, 0x3, 0); 655 rtl_set_bbreg(hw, 0x82c, 0x3, 0);
555 } 656 }
556 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 657
557 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 658 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
558 0x77777777); 659 _rtl8812ae_phy_set_rfe_reg_24g(hw);
559 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
560 0x77777777);
561 rtl_set_bbreg(hw, RA_RFE_INV, 0x3ff00000, 0x000);
562 rtl_set_bbreg(hw, RB_RFE_INV, 0x3ff00000, 0x000);
563 }
564 660
565 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1); 661 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
566 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1); 662 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
@@ -615,14 +711,8 @@ void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
615 /* 0x82C[1:0] = 2'b00 */ 711 /* 0x82C[1:0] = 2'b00 */
616 rtl_set_bbreg(hw, 0x82c, 0x3, 1); 712 rtl_set_bbreg(hw, 0x82c, 0x3, 1);
617 713
618 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 714 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
619 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 715 _rtl8812ae_phy_set_rfe_reg_5g(hw);
620 0x77337777);
621 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
622 0x77337777);
623 rtl_set_bbreg(hw, RA_RFE_INV, 0x3ff00000, 0x010);
624 rtl_set_bbreg(hw, RB_RFE_INV, 0x3ff00000, 0x010);
625 }
626 716
627 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0); 717 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
628 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf); 718 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h
index 1d6110f9c1fb..ed69dbe178ff 100644
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/reg.h
@@ -2424,6 +2424,7 @@
2424#define BMASKH4BITS 0xf0000000 2424#define BMASKH4BITS 0xf0000000
2425#define BMASKOFDM_D 0xffc00000 2425#define BMASKOFDM_D 0xffc00000
2426#define BMASKCCK 0x3f3f3f3f 2426#define BMASKCCK 0x3f3f3f3f
2427#define BMASKRFEINV 0x3ff00000
2427 2428
2428#define BRFREGOFFSETMASK 0xfffff 2429#define BRFREGOFFSETMASK 0xfffff
2429 2430