Skip to content

Commit 014bba7

Browse files
Bitterblue SmithPing-Ke Shih
authored andcommitted
wifi: rtlwifi: Adjust rtl8192d-common for USB
A few of the shared functions need small changes for the USB driver: - firmware loading - efuse reading - rate mask updating - rf register reading - initial gain for scanning Also, add a few macros to wifi.h and initialise rtlhal.interfaceindex for USB devices. Signed-off-by: Bitterblue Smith <[email protected]> Acked-by: Ping-Ke Shih <[email protected]> Signed-off-by: Ping-Ke Shih <[email protected]> Link: https://msgid.link/[email protected]
1 parent d75589a commit 014bba7

File tree

10 files changed

+268
-44
lines changed

10 files changed

+268
-44
lines changed

drivers/net/wireless/realtek/rtlwifi/efuse.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1211,7 +1211,7 @@ static u8 efuse_calculate_word_cnts(u8 word_en)
12111211
}
12121212

12131213
int rtl_get_hwinfo(struct ieee80211_hw *hw, struct rtl_priv *rtlpriv,
1214-
int max_size, u8 *hwinfo, int *params)
1214+
int max_size, u8 *hwinfo, const int *params)
12151215
{
12161216
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
12171217
struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);

drivers/net/wireless/realtek/rtlwifi/efuse.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void efuse_force_write_vendor_id(struct ieee80211_hw *hw);
8989
void efuse_re_pg_section(struct ieee80211_hw *hw, u8 section_idx);
9090
void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate);
9191
int rtl_get_hwinfo(struct ieee80211_hw *hw, struct rtl_priv *rtlpriv,
92-
int max_size, u8 *hwinfo, int *params);
92+
int max_size, u8 *hwinfo, const int *params);
9393
void rtl_fill_dummy(u8 *pfwbuf, u32 *pfwlen);
9494
void rtl_fw_page_write(struct ieee80211_hw *hw, u32 page, u8 *buffer,
9595
u32 size);

drivers/net/wireless/realtek/rtlwifi/rtl8192d/fw_common.c

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,24 +98,45 @@ int rtl92d_fw_free_to_go(struct ieee80211_hw *hw)
9898
}
9999
EXPORT_SYMBOL_GPL(rtl92d_fw_free_to_go);
100100

101+
#define RTL_USB_DELAY_FACTOR 60
102+
101103
void rtl92d_firmware_selfreset(struct ieee80211_hw *hw)
102104
{
103105
struct rtl_priv *rtlpriv = rtl_priv(hw);
106+
struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
104107
u8 u1b_tmp;
105108
u8 delay = 100;
106109

110+
if (rtlhal->interface == INTF_USB) {
111+
delay *= RTL_USB_DELAY_FACTOR;
112+
113+
rtl_write_byte(rtlpriv, REG_FSIMR, 0);
114+
115+
/* We need to disable other HRCV INT to influence 8051 reset. */
116+
rtl_write_byte(rtlpriv, REG_FWIMR, 0x20);
117+
118+
/* Close mask to prevent incorrect FW write operation. */
119+
rtl_write_byte(rtlpriv, REG_FTIMR, 0);
120+
}
121+
107122
/* Set (REG_HMETFR + 3) to 0x20 is reset 8051 */
108123
rtl_write_byte(rtlpriv, REG_HMETFR + 3, 0x20);
109124

110125
u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
111126

112-
while (u1b_tmp & BIT(2)) {
127+
while (u1b_tmp & (FEN_CPUEN >> 8)) {
113128
delay--;
114129
if (delay == 0)
115130
break;
116131
udelay(50);
117132
u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
118133
}
134+
135+
if (rtlhal->interface == INTF_USB) {
136+
if ((u1b_tmp & (FEN_CPUEN >> 8)) && delay == 0)
137+
rtl_write_byte(rtlpriv, REG_FWIMR, 0);
138+
}
139+
119140
WARN_ONCE((delay <= 0), "rtl8192de: 8051 reset failed!\n");
120141
rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
121142
"=====> 8051 reset success (%d)\n", delay);

drivers/net/wireless/realtek/rtlwifi/rtl8192d/fw_common.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,16 @@
2525
#define GET_FIRMWARE_HDR_SUB_VER(__fwhdr) \
2626
le32_get_bits(*(__le32 *)((__fwhdr) + 4), GENMASK(23, 16))
2727

28+
#define RAID_MASK GENMASK(31, 28)
29+
#define RATE_MASK_MASK GENMASK(27, 0)
30+
#define SHORT_GI_MASK BIT(5)
31+
#define MACID_MASK GENMASK(4, 0)
32+
33+
struct rtl92d_rate_mask_h2c {
34+
__le32 rate_mask_and_raid;
35+
u8 macid_and_short_gi;
36+
} __packed;
37+
2838
bool rtl92d_is_fw_downloaded(struct rtl_priv *rtlpriv);
2939
void rtl92d_enable_fw_download(struct ieee80211_hw *hw, bool enable);
3040
void rtl92d_write_fw(struct ieee80211_hw *hw,

drivers/net/wireless/realtek/rtlwifi/rtl8192d/hw_common.c

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -618,9 +618,14 @@ static void _rtl92de_read_macphymode_from_prom(struct ieee80211_hw *hw,
618618
{
619619
struct rtl_priv *rtlpriv = rtl_priv(hw);
620620
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
621-
u8 macphy_crvalue = content[EEPROM_MAC_FUNCTION];
621+
bool is_single_mac = true;
622622

623-
if (macphy_crvalue & BIT(3)) {
623+
if (rtlhal->interface == INTF_PCI)
624+
is_single_mac = !!(content[EEPROM_MAC_FUNCTION] & BIT(3));
625+
else if (rtlhal->interface == INTF_USB)
626+
is_single_mac = !(content[EEPROM_ENDPOINT_SETTING] & BIT(0));
627+
628+
if (is_single_mac) {
624629
rtlhal->macphymode = SINGLEMAC_SINGLEPHY;
625630
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
626631
"MacPhyMode SINGLEMAC_SINGLEPHY\n");
@@ -659,6 +664,7 @@ static void _rtl92de_efuse_update_chip_version(struct ieee80211_hw *hw)
659664
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "D-CUT!!!\n");
660665
break;
661666
case 0xCC33:
667+
case 0x33CC:
662668
chipver |= CHIP_92D_E_CUT;
663669
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "E-CUT!!!\n");
664670
break;
@@ -672,15 +678,27 @@ static void _rtl92de_efuse_update_chip_version(struct ieee80211_hw *hw)
672678

673679
static void _rtl92de_read_adapter_info(struct ieee80211_hw *hw)
674680
{
681+
static const int params_pci[] = {
682+
RTL8190_EEPROM_ID, EEPROM_VID, EEPROM_DID,
683+
EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR_MAC0_92D,
684+
EEPROM_CHANNEL_PLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
685+
COUNTRY_CODE_WORLD_WIDE_13
686+
};
687+
static const int params_usb[] = {
688+
RTL8190_EEPROM_ID, EEPROM_VID_USB, EEPROM_PID_USB,
689+
EEPROM_VID_USB, EEPROM_PID_USB, EEPROM_MAC_ADDR_MAC0_92DU,
690+
EEPROM_CHANNEL_PLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
691+
COUNTRY_CODE_WORLD_WIDE_13
692+
};
675693
struct rtl_priv *rtlpriv = rtl_priv(hw);
676694
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
677695
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
678-
int params[] = {RTL8190_EEPROM_ID, EEPROM_VID, EEPROM_DID,
679-
EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR_MAC0_92D,
680-
EEPROM_CHANNEL_PLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
681-
COUNTRY_CODE_WORLD_WIDE_13};
696+
const int *params = params_pci;
682697
u8 *hwinfo;
683698

699+
if (rtlhal->interface == INTF_USB)
700+
params = params_usb;
701+
684702
hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL);
685703
if (!hwinfo)
686704
return;
@@ -842,14 +860,14 @@ static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
842860
struct rtl_priv *rtlpriv = rtl_priv(hw);
843861
struct rtl_phy *rtlphy = &rtlpriv->phy;
844862
struct rtl_sta_info *sta_entry = NULL;
863+
struct rtl92d_rate_mask_h2c rate_mask;
845864
enum wireless_mode wirelessmode;
846865
bool shortgi = false;
847866
u8 curshortgi_40mhz;
848867
u8 curshortgi_20mhz;
849868
u8 curtxbw_40mhz;
850869
u32 ratr_bitmap;
851870
u8 ratr_index;
852-
u32 value[2];
853871
u8 macid = 0;
854872
u8 mimo_ps;
855873

@@ -965,12 +983,28 @@ static void rtl92de_update_hal_rate_mask(struct ieee80211_hw *hw,
965983
break;
966984
}
967985

968-
value[0] = (ratr_bitmap & 0x0fffffff) | (ratr_index << 28);
969-
value[1] = macid | (shortgi ? 0x20 : 0x00) | 0x80;
986+
le32p_replace_bits(&rate_mask.rate_mask_and_raid, ratr_bitmap, RATE_MASK_MASK);
987+
le32p_replace_bits(&rate_mask.rate_mask_and_raid, ratr_index, RAID_MASK);
988+
u8p_replace_bits(&rate_mask.macid_and_short_gi, macid, MACID_MASK);
989+
u8p_replace_bits(&rate_mask.macid_and_short_gi, shortgi, SHORT_GI_MASK);
990+
u8p_replace_bits(&rate_mask.macid_and_short_gi, 1, BIT(7));
991+
970992
rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
971-
"ratr_bitmap :%x value0:%x value1:%x\n",
972-
ratr_bitmap, value[0], value[1]);
973-
rtl92d_fill_h2c_cmd(hw, H2C_RA_MASK, 5, (u8 *)value);
993+
"Rate_index:%x, ratr_val:%x, %5phC\n",
994+
ratr_index, ratr_bitmap, &rate_mask);
995+
996+
if (rtlhal->interface == INTF_PCI) {
997+
rtl92d_fill_h2c_cmd(hw, H2C_RA_MASK, sizeof(rate_mask),
998+
(u8 *)&rate_mask);
999+
} else {
1000+
/* rtl92d_fill_h2c_cmd() does USB I/O and will result in a
1001+
* "scheduled while atomic" if called directly
1002+
*/
1003+
memcpy(rtlpriv->rate_mask, &rate_mask,
1004+
sizeof(rtlpriv->rate_mask));
1005+
schedule_work(&rtlpriv->works.fill_h2c_cmd);
1006+
}
1007+
9741008
if (macid != 0)
9751009
sta_entry->ratr_index = ratr_index;
9761010
}
@@ -1014,7 +1048,8 @@ bool rtl92de_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
10141048
bool actuallyset = false;
10151049
unsigned long flag;
10161050

1017-
if (rtlpci->being_init_adapter)
1051+
if (rtlpriv->rtlhal.interface == INTF_PCI &&
1052+
rtlpci->being_init_adapter)
10181053
return false;
10191054
if (ppsc->swrf_processing)
10201055
return false;

drivers/net/wireless/realtek/rtlwifi/rtl8192d/phy_common.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
8989
rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
9090
"regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
9191
regaddr, rfpath, bitmask);
92-
spin_lock(&rtlpriv->locks.rf_lock);
92+
rtl92d_pci_lock(rtlpriv);
9393
original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
9494
bitshift = calculate_bit_shift(bitmask);
9595
readback_value = (original_value & bitmask) >> bitshift;
96-
spin_unlock(&rtlpriv->locks.rf_lock);
96+
rtl92d_pci_unlock(rtlpriv);
9797
rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
9898
"regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
9999
regaddr, rfpath, bitmask, original_value);
@@ -113,7 +113,7 @@ void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
113113
regaddr, bitmask, data, rfpath);
114114
if (bitmask == 0)
115115
return;
116-
spin_lock(&rtlpriv->locks.rf_lock);
116+
rtl92d_pci_lock(rtlpriv);
117117
if (rtlphy->rf_mode != RF_OP_BY_FW) {
118118
if (bitmask != RFREG_OFFSET_MASK) {
119119
original_value = _rtl92d_phy_rf_serial_read(hw,
@@ -125,7 +125,7 @@ void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
125125
}
126126
_rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
127127
}
128-
spin_unlock(&rtlpriv->locks.rf_lock);
128+
rtl92d_pci_unlock(rtlpriv);
129129
rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
130130
"regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
131131
regaddr, bitmask, data, rfpath);
@@ -650,6 +650,8 @@ static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
650650
case IO_CMD_PAUSE_DM_BY_SCAN:
651651
rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
652652
de_digtable->cur_igvalue = 0x37;
653+
if (rtlpriv->rtlhal.interface == INTF_USB)
654+
de_digtable->cur_igvalue = 0x17;
653655
rtl92d_dm_write_dig(hw);
654656
break;
655657
default:
@@ -710,22 +712,28 @@ void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
710712
struct rtl_priv *rtlpriv = rtl_priv(hw);
711713
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
712714
u8 offset = REG_MAC_PHY_CTRL_NORMAL;
715+
u8 phy_ctrl = 0xf0;
716+
717+
if (rtlhal->interface == INTF_USB) {
718+
phy_ctrl = rtl_read_byte(rtlpriv, offset);
719+
phy_ctrl &= ~(BIT(0) | BIT(1) | BIT(2));
720+
}
713721

714722
switch (rtlhal->macphymode) {
715723
case DUALMAC_DUALPHY:
716724
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
717725
"MacPhyMode: DUALMAC_DUALPHY\n");
718-
rtl_write_byte(rtlpriv, offset, 0xF3);
726+
rtl_write_byte(rtlpriv, offset, phy_ctrl | BIT(0) | BIT(1));
719727
break;
720728
case SINGLEMAC_SINGLEPHY:
721729
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
722730
"MacPhyMode: SINGLEMAC_SINGLEPHY\n");
723-
rtl_write_byte(rtlpriv, offset, 0xF4);
731+
rtl_write_byte(rtlpriv, offset, phy_ctrl | BIT(2));
724732
break;
725733
case DUALMAC_SINGLEPHY:
726734
rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
727735
"MacPhyMode: DUALMAC_SINGLEPHY\n");
728-
rtl_write_byte(rtlpriv, offset, 0xF1);
736+
rtl_write_byte(rtlpriv, offset, phy_ctrl | BIT(0));
729737
break;
730738
}
731739
}

drivers/net/wireless/realtek/rtlwifi/rtl8192d/phy_common.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ static inline void rtl92d_acquire_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
3232
{
3333
struct rtl_priv *rtlpriv = rtl_priv(hw);
3434

35+
if (rtlpriv->rtlhal.interface == INTF_USB)
36+
return;
37+
3538
if (rtlpriv->rtlhal.interfaceindex == 1)
3639
spin_lock_irqsave(&rtlpriv->locks.cck_and_rw_pagea_lock, *flag);
3740
}
@@ -41,6 +44,9 @@ static inline void rtl92d_release_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
4144
{
4245
struct rtl_priv *rtlpriv = rtl_priv(hw);
4346

47+
if (rtlpriv->rtlhal.interface == INTF_USB)
48+
return;
49+
4450
if (rtlpriv->rtlhal.interfaceindex == 1)
4551
spin_unlock_irqrestore(&rtlpriv->locks.cck_and_rw_pagea_lock,
4652
*flag);
@@ -84,4 +90,22 @@ void rtl92d_acquire_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
8490
void rtl92d_release_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
8591
unsigned long *flag);
8692

93+
/* Without these helpers and the declarations sparse warns about
94+
* context imbalance.
95+
*/
96+
static inline void rtl92d_pci_lock(struct rtl_priv *rtlpriv)
97+
{
98+
if (rtlpriv->rtlhal.interface == INTF_PCI)
99+
spin_lock(&rtlpriv->locks.rf_lock);
100+
}
101+
102+
static inline void rtl92d_pci_unlock(struct rtl_priv *rtlpriv)
103+
{
104+
if (rtlpriv->rtlhal.interface == INTF_PCI)
105+
spin_unlock(&rtlpriv->locks.rf_lock);
106+
}
107+
108+
void rtl92d_pci_lock(struct rtl_priv *rtlpriv);
109+
void rtl92d_pci_unlock(struct rtl_priv *rtlpriv);
110+
87111
#endif

0 commit comments

Comments
 (0)