提交 932630fa 编写于 作者: D David S. Miller

Merge tag 'wireless-drivers-next-for-davem-2019-08-19' of...

Merge tag 'wireless-drivers-next-for-davem-2019-08-19' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next

Kalle Valo says:

====================
wireless-drivers-next patches for 5.4

First set of patches for 5.4.

Major changes:

brcmfmac

* enable 160 MHz channel support

rt2x00

* add support for PLANEX GW-USMicroN USB device

rtw88

* add Bluetooth coexistance support
====================
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
...@@ -260,8 +260,7 @@ static void bcma_host_pci_remove(struct pci_dev *dev) ...@@ -260,8 +260,7 @@ static void bcma_host_pci_remove(struct pci_dev *dev)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int bcma_host_pci_suspend(struct device *dev) static int bcma_host_pci_suspend(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct bcma_bus *bus = dev_get_drvdata(dev);
struct bcma_bus *bus = pci_get_drvdata(pdev);
bus->mapped_core = NULL; bus->mapped_core = NULL;
...@@ -270,8 +269,7 @@ static int bcma_host_pci_suspend(struct device *dev) ...@@ -270,8 +269,7 @@ static int bcma_host_pci_suspend(struct device *dev)
static int bcma_host_pci_resume(struct device *dev) static int bcma_host_pci_resume(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct bcma_bus *bus = dev_get_drvdata(dev);
struct bcma_bus *bus = pci_get_drvdata(pdev);
return bcma_bus_resume(bus); return bcma_bus_resume(bus);
} }
......
...@@ -69,17 +69,6 @@ static const s8 b43legacy_tssi2dbm_g_table[] = { ...@@ -69,17 +69,6 @@ static const s8 b43legacy_tssi2dbm_g_table[] = {
static void b43legacy_phy_initg(struct b43legacy_wldev *dev); static void b43legacy_phy_initg(struct b43legacy_wldev *dev);
static inline
void b43legacy_voluntary_preempt(void)
{
B43legacy_BUG_ON(!(!in_atomic() && !in_irq() &&
!in_interrupt() && !irqs_disabled()));
#ifndef CONFIG_PREEMPT
cond_resched();
#endif /* CONFIG_PREEMPT */
}
/* Lock the PHY registers against concurrent access from the microcode. /* Lock the PHY registers against concurrent access from the microcode.
* This lock is nonrecursive. */ * This lock is nonrecursive. */
void b43legacy_phy_lock(struct b43legacy_wldev *dev) void b43legacy_phy_lock(struct b43legacy_wldev *dev)
...@@ -1124,7 +1113,7 @@ static u16 b43legacy_phy_lo_b_r15_loop(struct b43legacy_wldev *dev) ...@@ -1124,7 +1113,7 @@ static u16 b43legacy_phy_lo_b_r15_loop(struct b43legacy_wldev *dev)
ret += b43legacy_phy_read(dev, 0x002C); ret += b43legacy_phy_read(dev, 0x002C);
} }
local_irq_restore(flags); local_irq_restore(flags);
b43legacy_voluntary_preempt(); cond_resched();
return ret; return ret;
} }
...@@ -1253,7 +1242,7 @@ u16 b43legacy_phy_lo_g_deviation_subval(struct b43legacy_wldev *dev, ...@@ -1253,7 +1242,7 @@ u16 b43legacy_phy_lo_g_deviation_subval(struct b43legacy_wldev *dev,
} }
ret = b43legacy_phy_read(dev, 0x002D); ret = b43legacy_phy_read(dev, 0x002D);
local_irq_restore(flags); local_irq_restore(flags);
b43legacy_voluntary_preempt(); cond_resched();
return ret; return ret;
} }
...@@ -1591,7 +1580,7 @@ void b43legacy_phy_lo_g_measure(struct b43legacy_wldev *dev) ...@@ -1591,7 +1580,7 @@ void b43legacy_phy_lo_g_measure(struct b43legacy_wldev *dev)
b43legacy_radio_write16(dev, 0x43, i); b43legacy_radio_write16(dev, 0x43, i);
b43legacy_radio_write16(dev, 0x52, phy->txctl2); b43legacy_radio_write16(dev, 0x52, phy->txctl2);
udelay(10); udelay(10);
b43legacy_voluntary_preempt(); cond_resched();
b43legacy_phy_set_baseband_attenuation(dev, j * 2); b43legacy_phy_set_baseband_attenuation(dev, j * 2);
...@@ -1642,7 +1631,7 @@ void b43legacy_phy_lo_g_measure(struct b43legacy_wldev *dev) ...@@ -1642,7 +1631,7 @@ void b43legacy_phy_lo_g_measure(struct b43legacy_wldev *dev)
phy->txctl2 phy->txctl2
| (3/*txctl1*/ << 4)); | (3/*txctl1*/ << 4));
udelay(10); udelay(10);
b43legacy_voluntary_preempt(); cond_resched();
b43legacy_phy_set_baseband_attenuation(dev, j * 2); b43legacy_phy_set_baseband_attenuation(dev, j * 2);
...@@ -1665,7 +1654,7 @@ void b43legacy_phy_lo_g_measure(struct b43legacy_wldev *dev) ...@@ -1665,7 +1654,7 @@ void b43legacy_phy_lo_g_measure(struct b43legacy_wldev *dev)
b43legacy_phy_write(dev, 0x0812, (r27 << 8) | 0xA2); b43legacy_phy_write(dev, 0x0812, (r27 << 8) | 0xA2);
udelay(2); udelay(2);
b43legacy_phy_write(dev, 0x0812, (r27 << 8) | 0xA3); b43legacy_phy_write(dev, 0x0812, (r27 << 8) | 0xA3);
b43legacy_voluntary_preempt(); cond_resched();
} else } else
b43legacy_phy_write(dev, 0x0015, r27 | 0xEFA0); b43legacy_phy_write(dev, 0x0015, r27 | 0xEFA0);
b43legacy_phy_lo_adjust(dev, is_initializing); b43legacy_phy_lo_adjust(dev, is_initializing);
......
...@@ -479,18 +479,11 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) ...@@ -479,18 +479,11 @@ int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr)
return -ENOMEM; return -ENOMEM;
} }
void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr) void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr)
{
struct brcmf_bcdc *bcdc = drvr->proto->pd;
brcmf_fws_detach_pre_delif(bcdc->fws);
}
void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr)
{ {
struct brcmf_bcdc *bcdc = drvr->proto->pd; struct brcmf_bcdc *bcdc = drvr->proto->pd;
drvr->proto->pd = NULL; drvr->proto->pd = NULL;
brcmf_fws_detach_post_delif(bcdc->fws); brcmf_fws_detach(bcdc->fws);
kfree(bcdc); kfree(bcdc);
} }
...@@ -7,16 +7,14 @@ ...@@ -7,16 +7,14 @@
#ifdef CONFIG_BRCMFMAC_PROTO_BCDC #ifdef CONFIG_BRCMFMAC_PROTO_BCDC
int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr); int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr);
void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr); void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr);
void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr);
void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state); void brcmf_proto_bcdc_txflowblock(struct device *dev, bool state);
void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp, void brcmf_proto_bcdc_txcomplete(struct device *dev, struct sk_buff *txp,
bool success); bool success);
struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr); struct brcmf_fws_info *drvr_to_fws(struct brcmf_pub *drvr);
#else #else
static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; } static inline int brcmf_proto_bcdc_attach(struct brcmf_pub *drvr) { return 0; }
static void brcmf_proto_bcdc_detach_pre_delif(struct brcmf_pub *drvr) {}; static inline void brcmf_proto_bcdc_detach(struct brcmf_pub *drvr) {}
static inline void brcmf_proto_bcdc_detach_post_delif(struct brcmf_pub *drvr) {}
#endif #endif
#endif /* BRCMFMAC_BCDC_H */ #endif /* BRCMFMAC_BCDC_H */
...@@ -189,9 +189,9 @@ static const struct ieee80211_regdomain brcmf_regdom = { ...@@ -189,9 +189,9 @@ static const struct ieee80211_regdomain brcmf_regdom = {
*/ */
REG_RULE(2484-10, 2484+10, 20, 6, 20, 0), REG_RULE(2484-10, 2484+10, 20, 6, 20, 0),
/* IEEE 802.11a, channel 36..64 */ /* IEEE 802.11a, channel 36..64 */
REG_RULE(5150-10, 5350+10, 80, 6, 20, 0), REG_RULE(5150-10, 5350+10, 160, 6, 20, 0),
/* IEEE 802.11a, channel 100..165 */ /* IEEE 802.11a, channel 100..165 */
REG_RULE(5470-10, 5850+10, 80, 6, 20, 0), } REG_RULE(5470-10, 5850+10, 160, 6, 20, 0), }
}; };
/* Note: brcmf_cipher_suites is an array of int defining which cipher suites /* Note: brcmf_cipher_suites is an array of int defining which cipher suites
...@@ -276,8 +276,26 @@ static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf, ...@@ -276,8 +276,26 @@ static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
else else
ch_inf.sb = BRCMU_CHAN_SB_UU; ch_inf.sb = BRCMU_CHAN_SB_UU;
break; break;
case NL80211_CHAN_WIDTH_80P80:
case NL80211_CHAN_WIDTH_160: case NL80211_CHAN_WIDTH_160:
ch_inf.bw = BRCMU_CHAN_BW_160;
if (primary_offset == -70)
ch_inf.sb = BRCMU_CHAN_SB_LLL;
else if (primary_offset == -50)
ch_inf.sb = BRCMU_CHAN_SB_LLU;
else if (primary_offset == -30)
ch_inf.sb = BRCMU_CHAN_SB_LUL;
else if (primary_offset == -10)
ch_inf.sb = BRCMU_CHAN_SB_LUU;
else if (primary_offset == 10)
ch_inf.sb = BRCMU_CHAN_SB_ULL;
else if (primary_offset == 30)
ch_inf.sb = BRCMU_CHAN_SB_ULU;
else if (primary_offset == 50)
ch_inf.sb = BRCMU_CHAN_SB_UUL;
else
ch_inf.sb = BRCMU_CHAN_SB_UUU;
break;
case NL80211_CHAN_WIDTH_80P80:
case NL80211_CHAN_WIDTH_5: case NL80211_CHAN_WIDTH_5:
case NL80211_CHAN_WIDTH_10: case NL80211_CHAN_WIDTH_10:
default: default:
...@@ -296,6 +314,7 @@ static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf, ...@@ -296,6 +314,7 @@ static u16 chandef_to_chanspec(struct brcmu_d11inf *d11inf,
} }
d11inf->encchspec(&ch_inf); d11inf->encchspec(&ch_inf);
brcmf_dbg(TRACE, "chanspec: 0x%x\n", ch_inf.chspec);
return ch_inf.chspec; return ch_inf.chspec;
} }
...@@ -1267,17 +1286,21 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason) ...@@ -1267,17 +1286,21 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
{ {
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy); struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(vif->wdev.wiphy);
struct brcmf_pub *drvr = cfg->pub; struct brcmf_pub *drvr = cfg->pub;
bool bus_up = drvr->bus_if->state == BRCMF_BUS_UP;
s32 err = 0; s32 err = 0;
brcmf_dbg(TRACE, "Enter\n"); brcmf_dbg(TRACE, "Enter\n");
if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) { if (test_and_clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state)) {
brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n"); if (bus_up) {
err = brcmf_fil_cmd_data_set(vif->ifp, brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n");
BRCMF_C_DISASSOC, NULL, 0); err = brcmf_fil_cmd_data_set(vif->ifp,
if (err) { BRCMF_C_DISASSOC, NULL, 0);
bphy_err(drvr, "WLC_DISASSOC failed (%d)\n", err); if (err)
bphy_err(drvr, "WLC_DISASSOC failed (%d)\n",
err);
} }
if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) || if ((vif->wdev.iftype == NL80211_IFTYPE_STATION) ||
(vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT)) (vif->wdev.iftype == NL80211_IFTYPE_P2P_CLIENT))
cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0, cfg80211_disconnected(vif->wdev.netdev, reason, NULL, 0,
...@@ -1287,7 +1310,8 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason) ...@@ -1287,7 +1310,8 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif, u16 reason)
clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status); clear_bit(BRCMF_SCAN_STATUS_SUPPRESS, &cfg->scan_status);
brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0); brcmf_btcoex_set_mode(vif, BRCMF_BTCOEX_ENABLED, 0);
if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) { if (vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_NONE) {
brcmf_set_pmk(vif->ifp, NULL, 0); if (bus_up)
brcmf_set_pmk(vif->ifp, NULL, 0);
vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE; vif->profile.use_fwsup = BRCMF_PROFILE_FWSUP_NONE;
} }
brcmf_dbg(TRACE, "Exit\n"); brcmf_dbg(TRACE, "Exit\n");
...@@ -2958,8 +2982,6 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg, ...@@ -2958,8 +2982,6 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
struct brcmf_pub *drvr = cfg->pub; struct brcmf_pub *drvr = cfg->pub;
struct brcmf_bss_info_le *bi; struct brcmf_bss_info_le *bi;
const struct brcmf_tlv *tim; const struct brcmf_tlv *tim;
u16 beacon_interval;
u8 dtim_period;
size_t ie_len; size_t ie_len;
u8 *ie; u8 *ie;
s32 err = 0; s32 err = 0;
...@@ -2983,12 +3005,9 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg, ...@@ -2983,12 +3005,9 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
ie = ((u8 *)bi) + le16_to_cpu(bi->ie_offset); ie = ((u8 *)bi) + le16_to_cpu(bi->ie_offset);
ie_len = le32_to_cpu(bi->ie_length); ie_len = le32_to_cpu(bi->ie_length);
beacon_interval = le16_to_cpu(bi->beacon_period);
tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM); tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
if (tim) if (!tim) {
dtim_period = tim->data[1];
else {
/* /*
* active scan was done so we could not get dtim * active scan was done so we could not get dtim
* information out of probe response. * information out of probe response.
...@@ -3000,7 +3019,6 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg, ...@@ -3000,7 +3019,6 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_info *cfg,
bphy_err(drvr, "wl dtim_assoc failed (%d)\n", err); bphy_err(drvr, "wl dtim_assoc failed (%d)\n", err);
goto update_bss_info_out; goto update_bss_info_out;
} }
dtim_period = (u8)var;
} }
update_bss_info_out: update_bss_info_out:
...@@ -4985,18 +5003,16 @@ static int brcmf_cfg80211_get_channel(struct wiphy *wiphy, ...@@ -4985,18 +5003,16 @@ static int brcmf_cfg80211_get_channel(struct wiphy *wiphy,
struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
struct net_device *ndev = wdev->netdev; struct net_device *ndev = wdev->netdev;
struct brcmf_pub *drvr = cfg->pub; struct brcmf_pub *drvr = cfg->pub;
struct brcmf_if *ifp;
struct brcmu_chan ch; struct brcmu_chan ch;
enum nl80211_band band = 0; enum nl80211_band band = 0;
enum nl80211_chan_width width = 0; enum nl80211_chan_width width = 0;
u32 chanspec; u32 chanspec;
int freq, err; int freq, err;
if (!ndev) if (!ndev || drvr->bus_if->state != BRCMF_BUS_UP)
return -ENODEV; return -ENODEV;
ifp = netdev_priv(ndev);
err = brcmf_fil_iovar_int_get(ifp, "chanspec", &chanspec); err = brcmf_fil_iovar_int_get(netdev_priv(ndev), "chanspec", &chanspec);
if (err) { if (err) {
bphy_err(drvr, "chanspec failed (%d)\n", err); bphy_err(drvr, "chanspec failed (%d)\n", err);
return err; return err;
...@@ -6714,6 +6730,11 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp) ...@@ -6714,6 +6730,11 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
} }
} }
if (wiphy->bands[NL80211_BAND_5GHZ] &&
brcmf_feat_is_enabled(ifp, BRCMF_FEAT_DOT11H))
wiphy_ext_feature_set(wiphy,
NL80211_EXT_FEATURE_DFS_OFFLOAD);
wiphy_read_of_freq_limits(wiphy); wiphy_read_of_freq_limits(wiphy);
return 0; return 0;
......
...@@ -258,7 +258,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp) ...@@ -258,7 +258,6 @@ int brcmf_c_preinit_dcmds(struct brcmf_if *ifp)
/* query for 'ver' to get version info from firmware */ /* query for 'ver' to get version info from firmware */
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
strlcpy(buf, "ver", sizeof(buf));
err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf)); err = brcmf_fil_iovar_data_get(ifp, "ver", buf, sizeof(buf));
if (err < 0) { if (err < 0) {
bphy_err(drvr, "Retrieving version information failed, %d\n", bphy_err(drvr, "Retrieving version information failed, %d\n",
......
...@@ -579,7 +579,8 @@ static int brcmf_netdev_stop(struct net_device *ndev) ...@@ -579,7 +579,8 @@ static int brcmf_netdev_stop(struct net_device *ndev)
brcmf_cfg80211_down(ndev); brcmf_cfg80211_down(ndev);
brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0); if (ifp->drvr->bus_if->state == BRCMF_BUS_UP)
brcmf_fil_iovar_data_set(ifp, "arp_hostip_clear", NULL, 0);
brcmf_net_setcarrier(ifp, false); brcmf_net_setcarrier(ifp, false);
...@@ -1307,27 +1308,26 @@ void brcmf_detach(struct device *dev) ...@@ -1307,27 +1308,26 @@ void brcmf_detach(struct device *dev)
unregister_inet6addr_notifier(&drvr->inet6addr_notifier); unregister_inet6addr_notifier(&drvr->inet6addr_notifier);
#endif #endif
/* stop firmware event handling */
brcmf_fweh_detach(drvr);
if (drvr->config)
brcmf_p2p_detach(&drvr->config->p2p);
brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN); brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
brcmf_bus_stop(drvr->bus_if);
brcmf_proto_detach_pre_delif(drvr); brcmf_fweh_detach(drvr);
brcmf_proto_detach(drvr);
/* make sure primary interface removed last */ /* make sure primary interface removed last */
for (i = BRCMF_MAX_IFS-1; i > -1; i--) for (i = BRCMF_MAX_IFS - 1; i > -1; i--) {
brcmf_remove_interface(drvr->iflist[i], false); if (drvr->iflist[i])
brcmf_del_if(drvr, drvr->iflist[i]->bsscfgidx, false);
brcmf_cfg80211_detach(drvr->config); }
drvr->config = NULL;
brcmf_bus_stop(drvr->bus_if);
brcmf_proto_detach_post_delif(drvr); if (drvr->config) {
brcmf_p2p_detach(&drvr->config->p2p);
brcmf_cfg80211_detach(drvr->config);
drvr->config = NULL;
}
bus_if->drvr = NULL; bus_if->drvr = NULL;
wiphy_free(drvr->wiphy); wiphy_free(drvr->wiphy);
} }
......
...@@ -39,6 +39,7 @@ static const struct brcmf_feat_fwcap brcmf_fwcap_map[] = { ...@@ -39,6 +39,7 @@ static const struct brcmf_feat_fwcap brcmf_fwcap_map[] = {
{ BRCMF_FEAT_P2P, "p2p" }, { BRCMF_FEAT_P2P, "p2p" },
{ BRCMF_FEAT_MONITOR, "monitor" }, { BRCMF_FEAT_MONITOR, "monitor" },
{ BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" }, { BRCMF_FEAT_MONITOR_FMT_RADIOTAP, "rtap" },
{ BRCMF_FEAT_DOT11H, "802.11h" }
}; };
#ifdef DEBUG #ifdef DEBUG
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* MONITOR: firmware can pass monitor packets to host. * MONITOR: firmware can pass monitor packets to host.
* MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header * MONITOR_FMT_RADIOTAP: firmware provides monitor packets with radiotap header
* MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header * MONITOR_FMT_HW_RX_HDR: firmware provides monitor packets with hw/ucode header
* DOT11H: firmware supports 802.11h
*/ */
#define BRCMF_FEAT_LIST \ #define BRCMF_FEAT_LIST \
BRCMF_FEAT_DEF(MBSS) \ BRCMF_FEAT_DEF(MBSS) \
...@@ -43,7 +44,8 @@ ...@@ -43,7 +44,8 @@
BRCMF_FEAT_DEF(FWSUP) \ BRCMF_FEAT_DEF(FWSUP) \
BRCMF_FEAT_DEF(MONITOR) \ BRCMF_FEAT_DEF(MONITOR) \
BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \ BRCMF_FEAT_DEF(MONITOR_FMT_RADIOTAP) \
BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) BRCMF_FEAT_DEF(MONITOR_FMT_HW_RX_HDR) \
BRCMF_FEAT_DEF(DOT11H)
/* /*
* Quirks: * Quirks:
......
...@@ -303,16 +303,7 @@ void brcmf_fweh_attach(struct brcmf_pub *drvr) ...@@ -303,16 +303,7 @@ void brcmf_fweh_attach(struct brcmf_pub *drvr)
void brcmf_fweh_detach(struct brcmf_pub *drvr) void brcmf_fweh_detach(struct brcmf_pub *drvr)
{ {
struct brcmf_fweh_info *fweh = &drvr->fweh; struct brcmf_fweh_info *fweh = &drvr->fweh;
struct brcmf_if *ifp = brcmf_get_ifp(drvr, 0);
s8 eventmask[BRCMF_EVENTING_MASK_LEN];
if (ifp) {
/* clear all events */
memset(eventmask, 0, BRCMF_EVENTING_MASK_LEN);
(void)brcmf_fil_iovar_data_set(ifp, "event_msgs",
eventmask,
BRCMF_EVENTING_MASK_LEN);
}
/* cancel the worker */ /* cancel the worker */
cancel_work_sync(&fweh->event_work); cancel_work_sync(&fweh->event_work);
WARN_ON(!list_empty(&fweh->event_q)); WARN_ON(!list_empty(&fweh->event_q));
......
...@@ -2432,25 +2432,17 @@ struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr) ...@@ -2432,25 +2432,17 @@ struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr)
return fws; return fws;
fail: fail:
brcmf_fws_detach_pre_delif(fws); brcmf_fws_detach(fws);
brcmf_fws_detach_post_delif(fws);
return ERR_PTR(rc); return ERR_PTR(rc);
} }
void brcmf_fws_detach_pre_delif(struct brcmf_fws_info *fws) void brcmf_fws_detach(struct brcmf_fws_info *fws)
{ {
if (!fws) if (!fws)
return; return;
if (fws->fws_wq) {
destroy_workqueue(fws->fws_wq);
fws->fws_wq = NULL;
}
}
void brcmf_fws_detach_post_delif(struct brcmf_fws_info *fws) if (fws->fws_wq)
{ destroy_workqueue(fws->fws_wq);
if (!fws)
return;
/* cleanup */ /* cleanup */
brcmf_fws_lock(fws); brcmf_fws_lock(fws);
......
...@@ -7,8 +7,7 @@ ...@@ -7,8 +7,7 @@
#define FWSIGNAL_H_ #define FWSIGNAL_H_
struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr); struct brcmf_fws_info *brcmf_fws_attach(struct brcmf_pub *drvr);
void brcmf_fws_detach_pre_delif(struct brcmf_fws_info *fws); void brcmf_fws_detach(struct brcmf_fws_info *fws);
void brcmf_fws_detach_post_delif(struct brcmf_fws_info *fws);
void brcmf_fws_debugfs_create(struct brcmf_pub *drvr); void brcmf_fws_debugfs_create(struct brcmf_pub *drvr);
bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws); bool brcmf_fws_queue_skbs(struct brcmf_fws_info *fws);
bool brcmf_fws_fc_active(struct brcmf_fws_info *fws); bool brcmf_fws_fc_active(struct brcmf_fws_info *fws);
......
...@@ -1398,6 +1398,13 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid) ...@@ -1398,6 +1398,13 @@ void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid)
u8 ifidx; u8 ifidx;
int err; int err;
/* no need to submit if firmware can not be reached */
if (drvr->bus_if->state != BRCMF_BUS_UP) {
brcmf_dbg(MSGBUF, "bus down, flowring will be removed\n");
brcmf_msgbuf_remove_flowring(msgbuf, flowid);
return;
}
commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT]; commonring = msgbuf->commonrings[BRCMF_H2D_MSGRING_CONTROL_SUBMIT];
brcmf_commonring_lock(commonring); brcmf_commonring_lock(commonring);
ret_ptr = brcmf_commonring_reserve_for_write(commonring); ret_ptr = brcmf_commonring_reserve_for_write(commonring);
......
...@@ -794,7 +794,8 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo, ...@@ -794,7 +794,8 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo,
if (ch == '\n') { if (ch == '\n') {
console->log_str[console->log_idx] = 0; console->log_str[console->log_idx] = 0;
if (error) if (error)
brcmf_err(bus, "CONSOLE: %s", console->log_str); __brcmf_err(bus, __func__, "CONSOLE: %s",
console->log_str);
else else
pr_debug("CONSOLE: %s", console->log_str); pr_debug("CONSOLE: %s", console->log_str);
console->log_idx = 0; console->log_idx = 0;
......
...@@ -56,22 +56,16 @@ int brcmf_proto_attach(struct brcmf_pub *drvr) ...@@ -56,22 +56,16 @@ int brcmf_proto_attach(struct brcmf_pub *drvr)
return -ENOMEM; return -ENOMEM;
} }
void brcmf_proto_detach_post_delif(struct brcmf_pub *drvr) void brcmf_proto_detach(struct brcmf_pub *drvr)
{ {
brcmf_dbg(TRACE, "Enter\n"); brcmf_dbg(TRACE, "Enter\n");
if (drvr->proto) { if (drvr->proto) {
if (drvr->bus_if->proto_type == BRCMF_PROTO_BCDC) if (drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
brcmf_proto_bcdc_detach_post_delif(drvr); brcmf_proto_bcdc_detach(drvr);
else if (drvr->bus_if->proto_type == BRCMF_PROTO_MSGBUF) else if (drvr->bus_if->proto_type == BRCMF_PROTO_MSGBUF)
brcmf_proto_msgbuf_detach(drvr); brcmf_proto_msgbuf_detach(drvr);
kfree(drvr->proto); kfree(drvr->proto);
drvr->proto = NULL; drvr->proto = NULL;
} }
} }
void brcmf_proto_detach_pre_delif(struct brcmf_pub *drvr)
{
if (drvr->proto && drvr->bus_if->proto_type == BRCMF_PROTO_BCDC)
brcmf_proto_bcdc_detach_pre_delif(drvr);
}
...@@ -43,8 +43,7 @@ struct brcmf_proto { ...@@ -43,8 +43,7 @@ struct brcmf_proto {
int brcmf_proto_attach(struct brcmf_pub *drvr); int brcmf_proto_attach(struct brcmf_pub *drvr);
void brcmf_proto_detach_pre_delif(struct brcmf_pub *drvr); void brcmf_proto_detach(struct brcmf_pub *drvr);
void brcmf_proto_detach_post_delif(struct brcmf_pub *drvr);
static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws, static inline int brcmf_proto_hdrpull(struct brcmf_pub *drvr, bool do_fws,
struct sk_buff *skb, struct sk_buff *skb,
......
...@@ -5248,15 +5248,7 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config) ...@@ -5248,15 +5248,7 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config)
/* Default to 54g Auto */ /* Default to 54g Auto */
/* Advertise and use shortslot (-1/0/1 Auto/Off/On) */ /* Advertise and use shortslot (-1/0/1 Auto/Off/On) */
s8 shortslot = BRCMS_SHORTSLOT_AUTO; s8 shortslot = BRCMS_SHORTSLOT_AUTO;
bool shortslot_restrict = false; /* Restrict association to stations
* that support shortslot
*/
bool ofdm_basic = false; /* Make 6, 12, and 24 basic rates */ bool ofdm_basic = false; /* Make 6, 12, and 24 basic rates */
/* Advertise and use short preambles (-1/0/1 Auto/Off/On) */
int preamble = BRCMS_PLCP_LONG;
bool preamble_restrict = false; /* Restrict association to stations
* that support short preambles
*/
struct brcms_band *band; struct brcms_band *band;
/* if N-support is enabled, allow Gmode set as long as requested /* if N-support is enabled, allow Gmode set as long as requested
...@@ -5297,16 +5289,11 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config) ...@@ -5297,16 +5289,11 @@ int brcms_c_set_gmode(struct brcms_c_info *wlc, u8 gmode, bool config)
case GMODE_ONLY: case GMODE_ONLY:
ofdm_basic = true; ofdm_basic = true;
preamble = BRCMS_PLCP_SHORT;
preamble_restrict = true;
break; break;
case GMODE_PERFORMANCE: case GMODE_PERFORMANCE:
shortslot = BRCMS_SHORTSLOT_ON; shortslot = BRCMS_SHORTSLOT_ON;
shortslot_restrict = true;
ofdm_basic = true; ofdm_basic = true;
preamble = BRCMS_PLCP_SHORT;
preamble_restrict = true;
break; break;
default: default:
......
...@@ -4413,7 +4413,7 @@ static void ipw2100_kill_works(struct ipw2100_priv *priv) ...@@ -4413,7 +4413,7 @@ static void ipw2100_kill_works(struct ipw2100_priv *priv)
static int ipw2100_tx_allocate(struct ipw2100_priv *priv) static int ipw2100_tx_allocate(struct ipw2100_priv *priv)
{ {
int i, j, err = -EINVAL; int i, j, err;
void *v; void *v;
dma_addr_t p; dma_addr_t p;
......
...@@ -4942,8 +4942,7 @@ EXPORT_SYMBOL(il_add_beacon_time); ...@@ -4942,8 +4942,7 @@ EXPORT_SYMBOL(il_add_beacon_time);
static int static int
il_pci_suspend(struct device *device) il_pci_suspend(struct device *device)
{ {
struct pci_dev *pdev = to_pci_dev(device); struct il_priv *il = dev_get_drvdata(device);
struct il_priv *il = pci_get_drvdata(pdev);
/* /*
* This function is called when system goes into suspend state * This function is called when system goes into suspend state
......
...@@ -766,19 +766,15 @@ static int if_spi_c2h_data(struct if_spi_card *card) ...@@ -766,19 +766,15 @@ static int if_spi_c2h_data(struct if_spi_card *card)
/* Read the data from the WLAN module into our skb... */ /* Read the data from the WLAN module into our skb... */
err = spu_read(card, IF_SPI_DATA_RDWRPORT_REG, data, ALIGN(len, 4)); err = spu_read(card, IF_SPI_DATA_RDWRPORT_REG, data, ALIGN(len, 4));
if (err) if (err) {
goto free_skb; dev_kfree_skb(skb);
goto out;
}
/* pass the SKB to libertas */ /* pass the SKB to libertas */
err = lbs_process_rxed_packet(card->priv, skb); err = lbs_process_rxed_packet(card->priv, skb);
if (err) /* lbs_process_rxed_packet() consumes the skb */
goto free_skb;
/* success */
goto out;
free_skb:
dev_kfree_skb(skb);
out: out:
if (err) if (err)
netdev_err(priv->dev, "%s: err=%d\n", __func__, err); netdev_err(priv->dev, "%s: err=%d\n", __func__, err);
......
...@@ -50,7 +50,8 @@ static const struct lbs_fw_table fw_table[] = { ...@@ -50,7 +50,8 @@ static const struct lbs_fw_table fw_table[] = {
{ MODEL_8388, "libertas/usb8388_v5.bin", NULL }, { MODEL_8388, "libertas/usb8388_v5.bin", NULL },
{ MODEL_8388, "libertas/usb8388.bin", NULL }, { MODEL_8388, "libertas/usb8388.bin", NULL },
{ MODEL_8388, "usb8388.bin", NULL }, { MODEL_8388, "usb8388.bin", NULL },
{ MODEL_8682, "libertas/usb8682.bin", NULL } { MODEL_8682, "libertas/usb8682.bin", NULL },
{ 0, NULL, NULL }
}; };
static const struct usb_device_id if_usb_table[] = { static const struct usb_device_id if_usb_table[] = {
......
...@@ -1046,7 +1046,7 @@ int lbs_rtap_supported(struct lbs_private *priv) ...@@ -1046,7 +1046,7 @@ int lbs_rtap_supported(struct lbs_private *priv)
int lbs_start_card(struct lbs_private *priv) int lbs_start_card(struct lbs_private *priv)
{ {
struct net_device *dev = priv->dev; struct net_device *dev = priv->dev;
int ret = -1; int ret;
/* poke the firmware */ /* poke the firmware */
ret = lbs_setup_firmware(priv); ret = lbs_setup_firmware(priv);
......
...@@ -65,7 +65,7 @@ static void lbtf_geo_init(struct lbtf_private *priv) ...@@ -65,7 +65,7 @@ static void lbtf_geo_init(struct lbtf_private *priv)
break; break;
} }
for (ch = priv->range.start; ch < priv->range.end; ch++) for (ch = range->start; ch < range->end; ch++)
priv->channels[CHAN_TO_IDX(ch)].flags = 0; priv->channels[CHAN_TO_IDX(ch)].flags = 0;
} }
......
...@@ -59,7 +59,7 @@ static void wakeup_timer_fn(struct timer_list *t) ...@@ -59,7 +59,7 @@ static void wakeup_timer_fn(struct timer_list *t)
adapter->hw_status = MWIFIEX_HW_STATUS_RESET; adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
mwifiex_cancel_all_pending_cmd(adapter); mwifiex_cancel_all_pending_cmd(adapter);
if (adapter->if_ops.card_reset && !adapter->hs_activated) if (adapter->if_ops.card_reset)
adapter->if_ops.card_reset(adapter); adapter->if_ops.card_reset(adapter);
} }
......
...@@ -150,10 +150,8 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter) ...@@ -150,10 +150,8 @@ static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
static int mwifiex_pcie_suspend(struct device *dev) static int mwifiex_pcie_suspend(struct device *dev)
{ {
struct mwifiex_adapter *adapter; struct mwifiex_adapter *adapter;
struct pcie_service_card *card; struct pcie_service_card *card = dev_get_drvdata(dev);
struct pci_dev *pdev = to_pci_dev(dev);
card = pci_get_drvdata(pdev);
/* Might still be loading firmware */ /* Might still be loading firmware */
wait_for_completion(&card->fw_done); wait_for_completion(&card->fw_done);
...@@ -195,10 +193,8 @@ static int mwifiex_pcie_suspend(struct device *dev) ...@@ -195,10 +193,8 @@ static int mwifiex_pcie_suspend(struct device *dev)
static int mwifiex_pcie_resume(struct device *dev) static int mwifiex_pcie_resume(struct device *dev)
{ {
struct mwifiex_adapter *adapter; struct mwifiex_adapter *adapter;
struct pcie_service_card *card; struct pcie_service_card *card = dev_get_drvdata(dev);
struct pci_dev *pdev = to_pci_dev(dev);
card = pci_get_drvdata(pdev);
if (!card->adapter) { if (!card->adapter) {
dev_err(dev, "adapter structure is not valid\n"); dev_err(dev, "adapter structure is not valid\n");
......
...@@ -1244,7 +1244,7 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, ...@@ -1244,7 +1244,7 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,
mwifiex_dbg(adapter, ERROR, mwifiex_dbg(adapter, ERROR,
"err: InterpretIE: in processing\t" "err: InterpretIE: in processing\t"
"IE, bytes left < IE length\n"); "IE, bytes left < IE length\n");
return -1; return -EINVAL;
} }
switch (element_id) { switch (element_id) {
case WLAN_EID_SSID: case WLAN_EID_SSID:
......
...@@ -731,7 +731,6 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv, ...@@ -731,7 +731,6 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv,
u16 status_code, struct sk_buff *skb) u16 status_code, struct sk_buff *skb)
{ {
struct ieee80211_mgmt *mgmt; struct ieee80211_mgmt *mgmt;
u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
int ret; int ret;
u16 capab; u16 capab;
struct ieee80211_ht_cap *ht_cap; struct ieee80211_ht_cap *ht_cap;
...@@ -765,7 +764,7 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv, ...@@ -765,7 +764,7 @@ mwifiex_construct_tdls_action_frame(struct mwifiex_private *priv,
memmove(pos + ETH_ALEN, &mgmt->u.action.category, memmove(pos + ETH_ALEN, &mgmt->u.action.category,
sizeof(mgmt->u.action.u.tdls_discover_resp)); sizeof(mgmt->u.action.u.tdls_discover_resp));
/* init address 4 */ /* init address 4 */
memcpy(pos, bc_addr, ETH_ALEN); eth_broadcast_addr(pos);
ret = mwifiex_tdls_append_rates_ie(priv, skb); ret = mwifiex_tdls_append_rates_ie(priv, skb);
if (ret) { if (ret) {
......
...@@ -557,6 +557,9 @@ mt76_init_sband_2g(struct mt7601u_dev *dev) ...@@ -557,6 +557,9 @@ mt76_init_sband_2g(struct mt7601u_dev *dev)
{ {
dev->sband_2g = devm_kzalloc(dev->dev, sizeof(*dev->sband_2g), dev->sband_2g = devm_kzalloc(dev->dev, sizeof(*dev->sband_2g),
GFP_KERNEL); GFP_KERNEL);
if (!dev->sband_2g)
return -ENOMEM;
dev->hw->wiphy->bands[NL80211_BAND_2GHZ] = dev->sband_2g; dev->hw->wiphy->bands[NL80211_BAND_2GHZ] = dev->sband_2g;
WARN_ON(dev->ee->reg.start - 1 + dev->ee->reg.num > WARN_ON(dev->ee->reg.start - 1 + dev->ee->reg.num >
......
...@@ -351,7 +351,7 @@ mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -351,7 +351,7 @@ mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ieee80211_sta *sta = params->sta; struct ieee80211_sta *sta = params->sta;
enum ieee80211_ampdu_mlme_action action = params->action; enum ieee80211_ampdu_mlme_action action = params->action;
u16 tid = params->tid; u16 tid = params->tid;
u16 *ssn = &params->ssn; u16 ssn = params->ssn;
struct mt76_sta *msta = (struct mt76_sta *) sta->drv_priv; struct mt76_sta *msta = (struct mt76_sta *) sta->drv_priv;
WARN_ON(msta->wcid.idx > GROUP_WCID(0)); WARN_ON(msta->wcid.idx > GROUP_WCID(0));
...@@ -371,7 +371,7 @@ mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -371,7 +371,7 @@ mt76_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
break; break;
case IEEE80211_AMPDU_TX_START: case IEEE80211_AMPDU_TX_START:
msta->agg_ssn[tid] = *ssn << 4; msta->agg_ssn[tid] = ssn << 4;
ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
break; break;
case IEEE80211_AMPDU_TX_STOP_CONT: case IEEE80211_AMPDU_TX_STOP_CONT:
......
...@@ -430,7 +430,7 @@ static int qtnf_pcie_suspend(struct device *dev) ...@@ -430,7 +430,7 @@ static int qtnf_pcie_suspend(struct device *dev)
struct qtnf_pcie_bus_priv *priv; struct qtnf_pcie_bus_priv *priv;
struct qtnf_bus *bus; struct qtnf_bus *bus;
bus = pci_get_drvdata(to_pci_dev(dev)); bus = dev_get_drvdata(dev);
if (!bus) if (!bus)
return -EFAULT; return -EFAULT;
...@@ -443,7 +443,7 @@ static int qtnf_pcie_resume(struct device *dev) ...@@ -443,7 +443,7 @@ static int qtnf_pcie_resume(struct device *dev)
struct qtnf_pcie_bus_priv *priv; struct qtnf_pcie_bus_priv *priv;
struct qtnf_bus *bus; struct qtnf_bus *bus;
bus = pci_get_drvdata(to_pci_dev(dev)); bus = dev_get_drvdata(dev);
if (!bus) if (!bus)
return -EFAULT; return -EFAULT;
......
...@@ -1086,6 +1086,7 @@ static const struct usb_device_id rt2800usb_device_table[] = { ...@@ -1086,6 +1086,7 @@ static const struct usb_device_id rt2800usb_device_table[] = {
{ USB_DEVICE(0x0846, 0x9013) }, { USB_DEVICE(0x0846, 0x9013) },
{ USB_DEVICE(0x0846, 0x9019) }, { USB_DEVICE(0x0846, 0x9019) },
/* Planex */ /* Planex */
{ USB_DEVICE(0x2019, 0xed14) },
{ USB_DEVICE(0x2019, 0xed19) }, { USB_DEVICE(0x2019, 0xed19) },
/* Ralink */ /* Ralink */
{ USB_DEVICE(0x148f, 0x3573) }, { USB_DEVICE(0x148f, 0x3573) },
......
...@@ -65,26 +65,6 @@ struct rt2x00debug_intf { ...@@ -65,26 +65,6 @@ struct rt2x00debug_intf {
* - crypto stats file * - crypto stats file
*/ */
struct dentry *driver_folder; struct dentry *driver_folder;
struct dentry *driver_entry;
struct dentry *chipset_entry;
struct dentry *dev_flags;
struct dentry *cap_flags;
struct dentry *restart_hw;
struct dentry *register_folder;
struct dentry *csr_off_entry;
struct dentry *csr_val_entry;
struct dentry *eeprom_off_entry;
struct dentry *eeprom_val_entry;
struct dentry *bbp_off_entry;
struct dentry *bbp_val_entry;
struct dentry *rf_off_entry;
struct dentry *rf_val_entry;
struct dentry *rfcsr_off_entry;
struct dentry *rfcsr_val_entry;
struct dentry *queue_folder;
struct dentry *queue_frame_dump_entry;
struct dentry *queue_stats_entry;
struct dentry *crypto_stats_entry;
/* /*
* The frame dump file only allows a single reader, * The frame dump file only allows a single reader,
...@@ -596,39 +576,34 @@ static const struct file_operations rt2x00debug_restart_hw = { ...@@ -596,39 +576,34 @@ static const struct file_operations rt2x00debug_restart_hw = {
.llseek = generic_file_llseek, .llseek = generic_file_llseek,
}; };
static struct dentry *rt2x00debug_create_file_driver(const char *name, static void rt2x00debug_create_file_driver(const char *name,
struct rt2x00debug_intf struct rt2x00debug_intf *intf,
*intf, struct debugfs_blob_wrapper *blob)
struct debugfs_blob_wrapper
*blob)
{ {
char *data; char *data;
data = kzalloc(3 * MAX_LINE_LENGTH, GFP_KERNEL); data = kzalloc(3 * MAX_LINE_LENGTH, GFP_KERNEL);
if (!data) if (!data)
return NULL; return;
blob->data = data; blob->data = data;
data += sprintf(data, "driver:\t%s\n", intf->rt2x00dev->ops->name); data += sprintf(data, "driver:\t%s\n", intf->rt2x00dev->ops->name);
data += sprintf(data, "version:\t%s\n", DRV_VERSION); data += sprintf(data, "version:\t%s\n", DRV_VERSION);
blob->size = strlen(blob->data); blob->size = strlen(blob->data);
return debugfs_create_blob(name, 0400, intf->driver_folder, blob); debugfs_create_blob(name, 0400, intf->driver_folder, blob);
} }
static struct dentry *rt2x00debug_create_file_chipset(const char *name, static void rt2x00debug_create_file_chipset(const char *name,
struct rt2x00debug_intf struct rt2x00debug_intf *intf,
*intf, struct debugfs_blob_wrapper *blob)
struct
debugfs_blob_wrapper
*blob)
{ {
const struct rt2x00debug *debug = intf->debug; const struct rt2x00debug *debug = intf->debug;
char *data; char *data;
data = kzalloc(9 * MAX_LINE_LENGTH, GFP_KERNEL); data = kzalloc(9 * MAX_LINE_LENGTH, GFP_KERNEL);
if (!data) if (!data)
return NULL; return;
blob->data = data; blob->data = data;
data += sprintf(data, "rt chip:\t%04x\n", intf->rt2x00dev->chip.rt); data += sprintf(data, "rt chip:\t%04x\n", intf->rt2x00dev->chip.rt);
...@@ -654,13 +629,15 @@ static struct dentry *rt2x00debug_create_file_chipset(const char *name, ...@@ -654,13 +629,15 @@ static struct dentry *rt2x00debug_create_file_chipset(const char *name,
blob->size = strlen(blob->data); blob->size = strlen(blob->data);
return debugfs_create_blob(name, 0400, intf->driver_folder, blob); debugfs_create_blob(name, 0400, intf->driver_folder, blob);
} }
void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
{ {
const struct rt2x00debug *debug = rt2x00dev->ops->debugfs; const struct rt2x00debug *debug = rt2x00dev->ops->debugfs;
struct rt2x00debug_intf *intf; struct rt2x00debug_intf *intf;
struct dentry *queue_folder;
struct dentry *register_folder;
intf = kzalloc(sizeof(struct rt2x00debug_intf), GFP_KERNEL); intf = kzalloc(sizeof(struct rt2x00debug_intf), GFP_KERNEL);
if (!intf) { if (!intf) {
...@@ -676,43 +653,27 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) ...@@ -676,43 +653,27 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
debugfs_create_dir(intf->rt2x00dev->ops->name, debugfs_create_dir(intf->rt2x00dev->ops->name,
rt2x00dev->hw->wiphy->debugfsdir); rt2x00dev->hw->wiphy->debugfsdir);
intf->driver_entry = rt2x00debug_create_file_driver("driver", intf, &intf->driver_blob);
rt2x00debug_create_file_driver("driver", intf, &intf->driver_blob); rt2x00debug_create_file_chipset("chipset", intf, &intf->chipset_blob);
debugfs_create_file("dev_flags", 0400, intf->driver_folder, intf,
&rt2x00debug_fop_dev_flags);
debugfs_create_file("cap_flags", 0400, intf->driver_folder, intf,
&rt2x00debug_fop_cap_flags);
debugfs_create_file("restart_hw", 0200, intf->driver_folder, intf,
&rt2x00debug_restart_hw);
intf->chipset_entry = register_folder = debugfs_create_dir("register", intf->driver_folder);
rt2x00debug_create_file_chipset("chipset",
intf, &intf->chipset_blob);
intf->dev_flags = debugfs_create_file("dev_flags", 0400,
intf->driver_folder, intf,
&rt2x00debug_fop_dev_flags);
intf->cap_flags = debugfs_create_file("cap_flags", 0400,
intf->driver_folder, intf,
&rt2x00debug_fop_cap_flags);
intf->restart_hw = debugfs_create_file("restart_hw", 0200,
intf->driver_folder, intf,
&rt2x00debug_restart_hw);
intf->register_folder =
debugfs_create_dir("register", intf->driver_folder);
#define RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(__intf, __name) \ #define RT2X00DEBUGFS_CREATE_REGISTER_ENTRY(__intf, __name) \
({ \ ({ \
if (debug->__name.read) { \ if (debug->__name.read) { \
(__intf)->__name##_off_entry = \ debugfs_create_u32(__stringify(__name) "_offset", 0600, \
debugfs_create_u32(__stringify(__name) "_offset", \ register_folder, \
0600, \ &(__intf)->offset_##__name); \
(__intf)->register_folder, \
&(__intf)->offset_##__name); \
\ \
(__intf)->__name##_val_entry = \ debugfs_create_file(__stringify(__name) "_value", 0600, \
debugfs_create_file(__stringify(__name) "_value", \ register_folder, (__intf), \
0600, \ &rt2x00debug_fop_##__name); \
(__intf)->register_folder, \
(__intf), \
&rt2x00debug_fop_##__name); \
} \ } \
}) })
...@@ -724,26 +685,21 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev) ...@@ -724,26 +685,21 @@ void rt2x00debug_register(struct rt2x00_dev *rt2x00dev)
#undef RT2X00DEBUGFS_CREATE_REGISTER_ENTRY #undef RT2X00DEBUGFS_CREATE_REGISTER_ENTRY
intf->queue_folder = queue_folder = debugfs_create_dir("queue", intf->driver_folder);
debugfs_create_dir("queue", intf->driver_folder);
intf->queue_frame_dump_entry = debugfs_create_file("dump", 0400, queue_folder, intf,
debugfs_create_file("dump", 0400, intf->queue_folder, &rt2x00debug_fop_queue_dump);
intf, &rt2x00debug_fop_queue_dump);
skb_queue_head_init(&intf->frame_dump_skbqueue); skb_queue_head_init(&intf->frame_dump_skbqueue);
init_waitqueue_head(&intf->frame_dump_waitqueue); init_waitqueue_head(&intf->frame_dump_waitqueue);
intf->queue_stats_entry = debugfs_create_file("queue", 0400, queue_folder, intf,
debugfs_create_file("queue", 0400, intf->queue_folder, &rt2x00debug_fop_queue_stats);
intf, &rt2x00debug_fop_queue_stats);
#ifdef CONFIG_RT2X00_LIB_CRYPTO #ifdef CONFIG_RT2X00_LIB_CRYPTO
if (rt2x00_has_cap_hw_crypto(rt2x00dev)) if (rt2x00_has_cap_hw_crypto(rt2x00dev))
intf->crypto_stats_entry = debugfs_create_file("crypto", 0444, queue_folder, intf,
debugfs_create_file("crypto", 0444, intf->queue_folder, &rt2x00debug_fop_crypto_stats);
intf,
&rt2x00debug_fop_crypto_stats);
#endif #endif
return; return;
...@@ -758,29 +714,7 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev) ...@@ -758,29 +714,7 @@ void rt2x00debug_deregister(struct rt2x00_dev *rt2x00dev)
skb_queue_purge(&intf->frame_dump_skbqueue); skb_queue_purge(&intf->frame_dump_skbqueue);
#ifdef CONFIG_RT2X00_LIB_CRYPTO debugfs_remove_recursive(intf->driver_folder);
debugfs_remove(intf->crypto_stats_entry);
#endif
debugfs_remove(intf->queue_stats_entry);
debugfs_remove(intf->queue_frame_dump_entry);
debugfs_remove(intf->queue_folder);
debugfs_remove(intf->rfcsr_val_entry);
debugfs_remove(intf->rfcsr_off_entry);
debugfs_remove(intf->rf_val_entry);
debugfs_remove(intf->rf_off_entry);
debugfs_remove(intf->bbp_val_entry);
debugfs_remove(intf->bbp_off_entry);
debugfs_remove(intf->eeprom_val_entry);
debugfs_remove(intf->eeprom_off_entry);
debugfs_remove(intf->csr_val_entry);
debugfs_remove(intf->csr_off_entry);
debugfs_remove(intf->register_folder);
debugfs_remove(intf->dev_flags);
debugfs_remove(intf->restart_hw);
debugfs_remove(intf->cap_flags);
debugfs_remove(intf->chipset_entry);
debugfs_remove(intf->driver_entry);
debugfs_remove(intf->driver_folder);
kfree(intf->chipset_blob.data); kfree(intf->chipset_blob.data);
kfree(intf->driver_blob.data); kfree(intf->driver_blob.data);
kfree(intf); kfree(intf);
......
...@@ -349,8 +349,7 @@ static void rt2x00usb_work_rxdone(struct work_struct *work) ...@@ -349,8 +349,7 @@ static void rt2x00usb_work_rxdone(struct work_struct *work)
while (!rt2x00queue_empty(rt2x00dev->rx)) { while (!rt2x00queue_empty(rt2x00dev->rx)) {
entry = rt2x00queue_get_entry(rt2x00dev->rx, Q_INDEX_DONE); entry = rt2x00queue_get_entry(rt2x00dev->rx, Q_INDEX_DONE);
if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
break; break;
/* /*
...@@ -389,8 +388,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) ...@@ -389,8 +388,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb)
rt2x00lib_dmadone(entry); rt2x00lib_dmadone(entry);
/* /*
* Schedule the delayed work for reading the RX status * Schedule the delayed work for processing RX data
* from the device.
*/ */
queue_work(rt2x00dev->workqueue, &rt2x00dev->rxdone_work); queue_work(rt2x00dev->workqueue, &rt2x00dev->rxdone_work);
} }
...@@ -402,8 +400,7 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data) ...@@ -402,8 +400,7 @@ static bool rt2x00usb_kick_rx_entry(struct queue_entry *entry, void *data)
struct queue_entry_priv_usb *entry_priv = entry->priv_data; struct queue_entry_priv_usb *entry_priv = entry->priv_data;
int status; int status;
if (test_and_set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) || if (test_and_set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags))
test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
return false; return false;
rt2x00lib_dmastart(entry); rt2x00lib_dmastart(entry);
......
...@@ -1525,7 +1525,7 @@ static void rtl8723b_enable_rf(struct rtl8xxxu_priv *priv) ...@@ -1525,7 +1525,7 @@ static void rtl8723b_enable_rf(struct rtl8xxxu_priv *priv)
/* /*
* WLAN action by PTA * WLAN action by PTA
*/ */
rtl8xxxu_write8(priv, REG_WLAN_ACT_CONTROL_8723B, 0x04); rtl8xxxu_write8(priv, REG_WLAN_ACT_CONTROL_8723B, 0x0c);
/* /*
* BT select S0/S1 controlled by WiFi * BT select S0/S1 controlled by WiFi
...@@ -1568,9 +1568,14 @@ static void rtl8723b_enable_rf(struct rtl8xxxu_priv *priv) ...@@ -1568,9 +1568,14 @@ static void rtl8723b_enable_rf(struct rtl8xxxu_priv *priv)
rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.ant_sel_rsv)); rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.ant_sel_rsv));
/* /*
* 0x280, 0x00, 0x200, 0x80 - not clear * Different settings per different antenna position.
* Antenna Position: | Normal Inverse
* --------------------------------------------------
* Antenna switch to BT: | 0x280, 0x00
* Antenna switch to WiFi: | 0x0, 0x280
* Antenna switch to PTA: | 0x200, 0x80
*/ */
rtl8xxxu_write32(priv, REG_S0S1_PATH_SWITCH, 0x00); rtl8xxxu_write32(priv, REG_S0S1_PATH_SWITCH, 0x80);
/* /*
* Software control, antenna at WiFi side * Software control, antenna at WiFi side
......
...@@ -3891,12 +3891,13 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw) ...@@ -3891,12 +3891,13 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
/* Check if MAC is already powered on */ /* Check if MAC is already powered on */
val8 = rtl8xxxu_read8(priv, REG_CR); val8 = rtl8xxxu_read8(priv, REG_CR);
val16 = rtl8xxxu_read16(priv, REG_SYS_CLKR);
/* /*
* Fix 92DU-VC S3 hang with the reason is that secondary mac is not * Fix 92DU-VC S3 hang with the reason is that secondary mac is not
* initialized. First MAC returns 0xea, second MAC returns 0x00 * initialized. First MAC returns 0xea, second MAC returns 0x00
*/ */
if (val8 == 0xea) if (val8 == 0xea || !(val16 & SYS_CLK_MAC_CLK_ENABLE))
macpower = false; macpower = false;
else else
macpower = true; macpower = true;
......
...@@ -509,13 +509,7 @@ static u32 halbtc_get_wifi_link_status(struct btc_coexist *btcoexist) ...@@ -509,13 +509,7 @@ static u32 halbtc_get_wifi_link_status(struct btc_coexist *btcoexist)
static s32 halbtc_get_wifi_rssi(struct rtl_priv *rtlpriv) static s32 halbtc_get_wifi_rssi(struct rtl_priv *rtlpriv)
{ {
int undec_sm_pwdb = 0; return rtlpriv->dm.undec_sm_pwdb;
if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
else /* associated entry pwdb */
undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
return undec_sm_pwdb;
} }
static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf) static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)
......
...@@ -2409,8 +2409,7 @@ EXPORT_SYMBOL(rtl_pci_disconnect); ...@@ -2409,8 +2409,7 @@ EXPORT_SYMBOL(rtl_pci_disconnect);
****************************************/ ****************************************/
int rtl_pci_suspend(struct device *dev) int rtl_pci_suspend(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct ieee80211_hw *hw = dev_get_drvdata(dev);
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
rtlpriv->cfg->ops->hw_suspend(hw); rtlpriv->cfg->ops->hw_suspend(hw);
...@@ -2422,8 +2421,7 @@ EXPORT_SYMBOL(rtl_pci_suspend); ...@@ -2422,8 +2421,7 @@ EXPORT_SYMBOL(rtl_pci_suspend);
int rtl_pci_resume(struct device *dev) int rtl_pci_resume(struct device *dev)
{ {
struct pci_dev *pdev = to_pci_dev(dev); struct ieee80211_hw *hw = dev_get_drvdata(dev);
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
rtlpriv->cfg->ops->hw_resume(hw); rtlpriv->cfg->ops->hw_resume(hw);
......
...@@ -276,22 +276,6 @@ static void _rtl_reg_apply_world_flags(struct wiphy *wiphy, ...@@ -276,22 +276,6 @@ static void _rtl_reg_apply_world_flags(struct wiphy *wiphy,
return; return;
} }
static void _rtl_dump_channel_map(struct wiphy *wiphy)
{
enum nl80211_band band;
struct ieee80211_supported_band *sband;
struct ieee80211_channel *ch;
unsigned int i;
for (band = 0; band < NUM_NL80211_BANDS; band++) {
if (!wiphy->bands[band])
continue;
sband = wiphy->bands[band];
for (i = 0; i < sband->n_channels; i++)
ch = &sband->channels[i];
}
}
static int _rtl_reg_notifier_apply(struct wiphy *wiphy, static int _rtl_reg_notifier_apply(struct wiphy *wiphy,
struct regulatory_request *request, struct regulatory_request *request,
struct rtl_regulatory *reg) struct rtl_regulatory *reg)
...@@ -309,8 +293,6 @@ static int _rtl_reg_notifier_apply(struct wiphy *wiphy, ...@@ -309,8 +293,6 @@ static int _rtl_reg_notifier_apply(struct wiphy *wiphy,
break; break;
} }
_rtl_dump_channel_map(wiphy);
return 0; return 0;
} }
......
...@@ -1411,12 +1411,13 @@ void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, ...@@ -1411,12 +1411,13 @@ void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
struct fast_ant_training *pfat_table = &rtldm->fat_table; struct fast_ant_training *pfat_table = &rtldm->fat_table;
__le32 *pdesc32 = (__le32 *)pdesc;
if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) || if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
(rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)) { (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)) {
SET_TX_DESC_ANTSEL_A(pdesc, pfat_table->antsel_a[mac_id]); set_tx_desc_antsel_a(pdesc32, pfat_table->antsel_a[mac_id]);
SET_TX_DESC_ANTSEL_B(pdesc, pfat_table->antsel_b[mac_id]); set_tx_desc_antsel_b(pdesc32, pfat_table->antsel_b[mac_id]);
SET_TX_DESC_ANTSEL_C(pdesc, pfat_table->antsel_c[mac_id]); set_tx_desc_antsel_c(pdesc32, pfat_table->antsel_c[mac_id]);
} }
} }
......
...@@ -115,10 +115,6 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw) ...@@ -115,10 +115,6 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
rtlpriv->cfg->mod_params->disable_watchdog =
rtlpriv->cfg->mod_params->disable_watchdog;
if (rtlpriv->cfg->mod_params->disable_watchdog) if (rtlpriv->cfg->mod_params->disable_watchdog)
pr_info("watchdog disabled\n"); pr_info("watchdog disabled\n");
if (!rtlpriv->psc.inactiveps) if (!rtlpriv->psc.inactiveps)
......
...@@ -25,7 +25,7 @@ static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue) ...@@ -25,7 +25,7 @@ static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
} }
static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw, static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
struct rtl_stats *pstatus, u8 *pdesc, struct rtl_stats *pstatus, __le32 *pdesc,
struct rx_fwinfo_88e *p_drvinfo, struct rx_fwinfo_88e *p_drvinfo,
bool bpacket_match_bssid, bool bpacket_match_bssid,
bool bpacket_toself, bool packet_beacon) bool bpacket_toself, bool packet_beacon)
...@@ -271,7 +271,7 @@ static void _rtl88ee_smart_antenna(struct ieee80211_hw *hw, ...@@ -271,7 +271,7 @@ static void _rtl88ee_smart_antenna(struct ieee80211_hw *hw,
static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw, static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
struct sk_buff *skb, struct sk_buff *skb,
struct rtl_stats *pstatus, struct rtl_stats *pstatus,
u8 *pdesc, __le32 *pdesc,
struct rx_fwinfo_88e *p_drvinfo) struct rx_fwinfo_88e *p_drvinfo)
{ {
struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
...@@ -313,13 +313,13 @@ static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw, ...@@ -313,13 +313,13 @@ static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
rtl_process_phyinfo(hw, tmp_buf, pstatus); rtl_process_phyinfo(hw, tmp_buf, pstatus);
} }
static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc, static void rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
u8 *virtualaddress) __le32 *virtualaddress)
{ {
u32 dwtmp = 0; u32 dwtmp = 0;
memset(virtualaddress, 0, 8); memset(virtualaddress, 0, 8);
SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num); set_earlymode_pktnum(virtualaddress, ptcb_desc->empkt_num);
if (ptcb_desc->empkt_num == 1) { if (ptcb_desc->empkt_num == 1) {
dwtmp = ptcb_desc->empkt_len[0]; dwtmp = ptcb_desc->empkt_len[0];
} else { } else {
...@@ -327,7 +327,7 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc, ...@@ -327,7 +327,7 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4; dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
dwtmp += ptcb_desc->empkt_len[1]; dwtmp += ptcb_desc->empkt_len[1];
} }
SET_EARLYMODE_LEN0(virtualaddress, dwtmp); set_earlymode_len0(virtualaddress, dwtmp);
if (ptcb_desc->empkt_num <= 3) { if (ptcb_desc->empkt_num <= 3) {
dwtmp = ptcb_desc->empkt_len[2]; dwtmp = ptcb_desc->empkt_len[2];
...@@ -336,7 +336,7 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc, ...@@ -336,7 +336,7 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4; dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
dwtmp += ptcb_desc->empkt_len[3]; dwtmp += ptcb_desc->empkt_len[3];
} }
SET_EARLYMODE_LEN1(virtualaddress, dwtmp); set_earlymode_len1(virtualaddress, dwtmp);
if (ptcb_desc->empkt_num <= 5) { if (ptcb_desc->empkt_num <= 5) {
dwtmp = ptcb_desc->empkt_len[4]; dwtmp = ptcb_desc->empkt_len[4];
} else { } else {
...@@ -344,8 +344,8 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc, ...@@ -344,8 +344,8 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4; dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
dwtmp += ptcb_desc->empkt_len[5]; dwtmp += ptcb_desc->empkt_len[5];
} }
SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF); set_earlymode_len2_1(virtualaddress, dwtmp & 0xF);
SET_EARLYMODE_LEN2_2(virtualaddress, dwtmp >> 4); set_earlymode_len2_2(virtualaddress, dwtmp >> 4);
if (ptcb_desc->empkt_num <= 7) { if (ptcb_desc->empkt_num <= 7) {
dwtmp = ptcb_desc->empkt_len[6]; dwtmp = ptcb_desc->empkt_len[6];
} else { } else {
...@@ -353,7 +353,7 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc, ...@@ -353,7 +353,7 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4; dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
dwtmp += ptcb_desc->empkt_len[7]; dwtmp += ptcb_desc->empkt_len[7];
} }
SET_EARLYMODE_LEN3(virtualaddress, dwtmp); set_earlymode_len3(virtualaddress, dwtmp);
if (ptcb_desc->empkt_num <= 9) { if (ptcb_desc->empkt_num <= 9) {
dwtmp = ptcb_desc->empkt_len[8]; dwtmp = ptcb_desc->empkt_len[8];
} else { } else {
...@@ -361,50 +361,51 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc, ...@@ -361,50 +361,51 @@ static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4; dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
dwtmp += ptcb_desc->empkt_len[9]; dwtmp += ptcb_desc->empkt_len[9];
} }
SET_EARLYMODE_LEN4(virtualaddress, dwtmp); set_earlymode_len4(virtualaddress, dwtmp);
} }
bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw, bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
struct rtl_stats *status, struct rtl_stats *status,
struct ieee80211_rx_status *rx_status, struct ieee80211_rx_status *rx_status,
u8 *pdesc, struct sk_buff *skb) u8 *pdesc8, struct sk_buff *skb)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rx_fwinfo_88e *p_drvinfo; struct rx_fwinfo_88e *p_drvinfo;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
u8 wake_match; u8 wake_match;
u32 phystatus = GET_RX_DESC_PHYST(pdesc); __le32 *pdesc = (__le32 *)pdesc8;
u32 phystatus = get_rx_desc_physt(pdesc);
status->packet_report_type = (u8)GET_RX_STATUS_DESC_RPT_SEL(pdesc); status->packet_report_type = (u8)get_rx_status_desc_rpt_sel(pdesc);
if (status->packet_report_type == TX_REPORT2) if (status->packet_report_type == TX_REPORT2)
status->length = (u16)GET_RX_RPT2_DESC_PKT_LEN(pdesc); status->length = (u16)get_rx_rpt2_desc_pkt_len(pdesc);
else else
status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc); status->length = (u16)get_rx_desc_pkt_len(pdesc);
status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) * status->rx_drvinfo_size = (u8)get_rx_desc_drv_info_size(pdesc) *
RX_DRV_INFO_SIZE_UNIT; RX_DRV_INFO_SIZE_UNIT;
status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03); status->rx_bufshift = (u8)(get_rx_desc_shift(pdesc) & 0x03);
status->icv = (u16)GET_RX_DESC_ICV(pdesc); status->icv = (u16)get_rx_desc_icv(pdesc);
status->crc = (u16)GET_RX_DESC_CRC32(pdesc); status->crc = (u16)get_rx_desc_crc32(pdesc);
status->hwerror = (status->crc | status->icv); status->hwerror = (status->crc | status->icv);
status->decrypted = !GET_RX_DESC_SWDEC(pdesc); status->decrypted = !get_rx_desc_swdec(pdesc);
status->rate = (u8)GET_RX_DESC_RXMCS(pdesc); status->rate = (u8)get_rx_desc_rxmcs(pdesc);
status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc); status->shortpreamble = (u16)get_rx_desc_splcp(pdesc);
status->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1); status->isampdu = (bool) (get_rx_desc_paggr(pdesc) == 1);
status->isfirst_ampdu = (bool)((GET_RX_DESC_PAGGR(pdesc) == 1) && status->isfirst_ampdu = (bool)((get_rx_desc_paggr(pdesc) == 1) &&
(GET_RX_DESC_FAGGR(pdesc) == 1)); (get_rx_desc_faggr(pdesc) == 1));
if (status->packet_report_type == NORMAL_RX) if (status->packet_report_type == NORMAL_RX)
status->timestamp_low = GET_RX_DESC_TSFL(pdesc); status->timestamp_low = get_rx_desc_tsfl(pdesc);
status->rx_is40mhzpacket = (bool)GET_RX_DESC_BW(pdesc); status->rx_is40mhzpacket = (bool)get_rx_desc_bw(pdesc);
status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); status->is_ht = (bool)get_rx_desc_rxht(pdesc);
status->is_cck = RTL8188_RX_HAL_IS_CCK_RATE(status->rate); status->is_cck = RTL8188_RX_HAL_IS_CCK_RATE(status->rate);
status->macid = GET_RX_DESC_MACID(pdesc); status->macid = get_rx_desc_macid(pdesc);
if (GET_RX_STATUS_DESC_PATTERN_MATCH(pdesc)) if (get_rx_status_desc_pattern_match(pdesc))
wake_match = BIT(2); wake_match = BIT(2);
else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc)) else if (get_rx_status_desc_magic_match(pdesc))
wake_match = BIT(1); wake_match = BIT(1);
else if (GET_RX_STATUS_DESC_UNICAST_MATCH(pdesc)) else if (get_rx_status_desc_unicast_match(pdesc))
wake_match = BIT(0); wake_match = BIT(0);
else else
wake_match = 0; wake_match = 0;
...@@ -465,15 +466,15 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw, ...@@ -465,15 +466,15 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
rx_status->signal = status->recvsignalpower + 10; rx_status->signal = status->recvsignalpower + 10;
if (status->packet_report_type == TX_REPORT2) { if (status->packet_report_type == TX_REPORT2) {
status->macid_valid_entry[0] = status->macid_valid_entry[0] =
GET_RX_RPT2_DESC_MACID_VALID_1(pdesc); get_rx_rpt2_desc_macid_valid_1(pdesc);
status->macid_valid_entry[1] = status->macid_valid_entry[1] =
GET_RX_RPT2_DESC_MACID_VALID_2(pdesc); get_rx_rpt2_desc_macid_valid_2(pdesc);
} }
return true; return true;
} }
void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
struct ieee80211_hdr *hdr, u8 *pdesc_tx, struct ieee80211_hdr *hdr, u8 *pdesc8,
u8 *txbd, struct ieee80211_tx_info *info, u8 *txbd, struct ieee80211_tx_info *info,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
struct sk_buff *skb, struct sk_buff *skb,
...@@ -484,7 +485,6 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -484,7 +485,6 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
struct rtl_hal *rtlhal = rtl_hal(rtlpriv); struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
u8 *pdesc = (u8 *)pdesc_tx;
u16 seq_number; u16 seq_number;
__le16 fc = hdr->frame_control; __le16 fc = hdr->frame_control;
unsigned int buf_len = 0; unsigned int buf_len = 0;
...@@ -497,6 +497,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -497,6 +497,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
dma_addr_t mapping; dma_addr_t mapping;
u8 bw_40 = 0; u8 bw_40 = 0;
u8 short_gi = 0; u8 short_gi = 0;
__le32 *pdesc = (u32 *)pdesc8;
if (mac->opmode == NL80211_IFTYPE_STATION) { if (mac->opmode == NL80211_IFTYPE_STATION) {
bw_40 = mac->bw_40; bw_40 = mac->bw_40;
...@@ -521,77 +522,77 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -521,77 +522,77 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
"DMA mapping error\n"); "DMA mapping error\n");
return; return;
} }
CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_88e)); clear_pci_tx_desc_content(pdesc, sizeof(struct tx_desc_88e));
if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) { if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
firstseg = true; firstseg = true;
lastseg = true; lastseg = true;
} }
if (firstseg) { if (firstseg) {
if (rtlhal->earlymode_enable) { if (rtlhal->earlymode_enable) {
SET_TX_DESC_PKT_OFFSET(pdesc, 1); set_tx_desc_pkt_offset(pdesc, 1);
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN + set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN +
EM_HDR_LEN); EM_HDR_LEN);
if (ptcb_desc->empkt_num) { if (ptcb_desc->empkt_num) {
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
"Insert 8 byte.pTcb->EMPktNum:%d\n", "Insert 8 byte.pTcb->EMPktNum:%d\n",
ptcb_desc->empkt_num); ptcb_desc->empkt_num);
_rtl88ee_insert_emcontent(ptcb_desc, rtl88ee_insert_emcontent(ptcb_desc,
(u8 *)(skb->data)); (__le32 *)(skb->data));
} }
} else { } else {
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
} }
ptcb_desc->use_driver_rate = true; ptcb_desc->use_driver_rate = true;
SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate); set_tx_desc_tx_rate(pdesc, ptcb_desc->hw_rate);
if (ptcb_desc->hw_rate > DESC92C_RATEMCS0) if (ptcb_desc->hw_rate > DESC92C_RATEMCS0)
short_gi = (ptcb_desc->use_shortgi) ? 1 : 0; short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
else else
short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0; short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
SET_TX_DESC_DATA_SHORTGI(pdesc, short_gi); set_tx_desc_data_shortgi(pdesc, short_gi);
if (info->flags & IEEE80211_TX_CTL_AMPDU) { if (info->flags & IEEE80211_TX_CTL_AMPDU) {
SET_TX_DESC_AGG_ENABLE(pdesc, 1); set_tx_desc_agg_enable(pdesc, 1);
SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x14); set_tx_desc_max_agg_num(pdesc, 0x14);
} }
SET_TX_DESC_SEQ(pdesc, seq_number); set_tx_desc_seq(pdesc, seq_number);
SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable && set_tx_desc_rts_enable(pdesc, ((ptcb_desc->rts_enable &&
!ptcb_desc->cts_enable) ? 1 : 0)); !ptcb_desc->cts_enable) ? 1 : 0));
SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0); set_tx_desc_hw_rts_enable(pdesc, 0);
SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0)); set_tx_desc_cts2self(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
SET_TX_DESC_RTS_STBC(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0)); set_tx_desc_rts_stbc(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0));
SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate); set_tx_desc_rts_rate(pdesc, ptcb_desc->rts_rate);
SET_TX_DESC_RTS_BW(pdesc, 0); set_tx_desc_rts_bw(pdesc, 0);
SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc); set_tx_desc_rts_sc(pdesc, ptcb_desc->rts_sc);
SET_TX_DESC_RTS_SHORT(pdesc, set_tx_desc_rts_short(pdesc,
((ptcb_desc->rts_rate <= DESC92C_RATE54M) ? ((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
(ptcb_desc->rts_use_shortpreamble ? 1 : 0) : (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
(ptcb_desc->rts_use_shortgi ? 1 : 0))); (ptcb_desc->rts_use_shortgi ? 1 : 0)));
if (ptcb_desc->tx_enable_sw_calc_duration) if (ptcb_desc->tx_enable_sw_calc_duration)
SET_TX_DESC_NAV_USE_HDR(pdesc, 1); set_tx_desc_nav_use_hdr(pdesc, 1);
if (bw_40) { if (bw_40) {
if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) { if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
SET_TX_DESC_DATA_BW(pdesc, 1); set_tx_desc_data_bw(pdesc, 1);
SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3); set_tx_desc_tx_sub_carrier(pdesc, 3);
} else { } else {
SET_TX_DESC_DATA_BW(pdesc, 0); set_tx_desc_data_bw(pdesc, 0);
SET_TX_DESC_TX_SUB_CARRIER(pdesc, set_tx_desc_tx_sub_carrier(pdesc,
mac->cur_40_prime_sc); mac->cur_40_prime_sc);
} }
} else { } else {
SET_TX_DESC_DATA_BW(pdesc, 0); set_tx_desc_data_bw(pdesc, 0);
SET_TX_DESC_TX_SUB_CARRIER(pdesc, 0); set_tx_desc_tx_sub_carrier(pdesc, 0);
} }
SET_TX_DESC_LINIP(pdesc, 0); set_tx_desc_linip(pdesc, 0);
SET_TX_DESC_PKT_SIZE(pdesc, (u16)skb_len); set_tx_desc_pkt_size(pdesc, (u16)skb_len);
if (sta) { if (sta) {
u8 ampdu_density = sta->ht_cap.ampdu_density; u8 ampdu_density = sta->ht_cap.ampdu_density;
SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density); set_tx_desc_ampdu_density(pdesc, ampdu_density);
} }
if (info->control.hw_key) { if (info->control.hw_key) {
struct ieee80211_key_conf *keyconf; struct ieee80211_key_conf *keyconf;
...@@ -601,76 +602,77 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -601,76 +602,77 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
case WLAN_CIPHER_SUITE_WEP40: case WLAN_CIPHER_SUITE_WEP40:
case WLAN_CIPHER_SUITE_WEP104: case WLAN_CIPHER_SUITE_WEP104:
case WLAN_CIPHER_SUITE_TKIP: case WLAN_CIPHER_SUITE_TKIP:
SET_TX_DESC_SEC_TYPE(pdesc, 0x1); set_tx_desc_sec_type(pdesc, 0x1);
break; break;
case WLAN_CIPHER_SUITE_CCMP: case WLAN_CIPHER_SUITE_CCMP:
SET_TX_DESC_SEC_TYPE(pdesc, 0x3); set_tx_desc_sec_type(pdesc, 0x3);
break; break;
default: default:
SET_TX_DESC_SEC_TYPE(pdesc, 0x0); set_tx_desc_sec_type(pdesc, 0x0);
break; break;
} }
} }
SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel); set_tx_desc_queue_sel(pdesc, fw_qsel);
SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F); set_tx_desc_data_rate_fb_limit(pdesc, 0x1F);
SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF); set_tx_desc_rts_rate_fb_limit(pdesc, 0xF);
SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ? set_tx_desc_disable_fb(pdesc, ptcb_desc->disable_ratefallback ?
1 : 0); 1 : 0);
SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0); set_tx_desc_use_rate(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
/*SET_TX_DESC_PWR_STATUS(pdesc, pwr_status);*/ /*set_tx_desc_pwr_status(pdesc, pwr_status);*/
/* Set TxRate and RTSRate in TxDesc */ /* Set TxRate and RTSRate in TxDesc */
/* This prevent Tx initial rate of new-coming packets */ /* This prevent Tx initial rate of new-coming packets */
/* from being overwritten by retried packet rate.*/ /* from being overwritten by retried packet rate.*/
if (!ptcb_desc->use_driver_rate) { if (!ptcb_desc->use_driver_rate) {
/*SET_TX_DESC_RTS_RATE(pdesc, 0x08); */ /*set_tx_desc_rts_rate(pdesc, 0x08); */
/* SET_TX_DESC_TX_RATE(pdesc, 0x0b); */ /* set_tx_desc_tx_rate(pdesc, 0x0b); */
} }
if (ieee80211_is_data_qos(fc)) { if (ieee80211_is_data_qos(fc)) {
if (mac->rdg_en) { if (mac->rdg_en) {
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
"Enable RDG function.\n"); "Enable RDG function.\n");
SET_TX_DESC_RDG_ENABLE(pdesc, 1); set_tx_desc_rdg_enable(pdesc, 1);
SET_TX_DESC_HTC(pdesc, 1); set_tx_desc_htc(pdesc, 1);
} }
} }
} }
SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0)); set_tx_desc_first_seg(pdesc, (firstseg ? 1 : 0));
SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0)); set_tx_desc_last_seg(pdesc, (lastseg ? 1 : 0));
SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)buf_len); set_tx_desc_tx_buffer_size(pdesc, (u16)buf_len);
SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); set_tx_desc_tx_buffer_address(pdesc, mapping);
if (rtlpriv->dm.useramask) { if (rtlpriv->dm.useramask) {
SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index); set_tx_desc_rate_id(pdesc, ptcb_desc->ratr_index);
SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id); set_tx_desc_macid(pdesc, ptcb_desc->mac_id);
} else { } else {
SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index); set_tx_desc_rate_id(pdesc, 0xC + ptcb_desc->ratr_index);
SET_TX_DESC_MACID(pdesc, ptcb_desc->ratr_index); set_tx_desc_macid(pdesc, ptcb_desc->ratr_index);
} }
if (ieee80211_is_data_qos(fc)) if (ieee80211_is_data_qos(fc))
SET_TX_DESC_QOS(pdesc, 1); set_tx_desc_qos(pdesc, 1);
if (!ieee80211_is_data_qos(fc)) if (!ieee80211_is_data_qos(fc))
SET_TX_DESC_HWSEQ_EN(pdesc, 1); set_tx_desc_hwseq_en(pdesc, 1);
SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1)); set_tx_desc_more_frag(pdesc, (lastseg ? 0 : 1));
if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) || if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
is_broadcast_ether_addr(ieee80211_get_DA(hdr))) { is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
SET_TX_DESC_BMC(pdesc, 1); set_tx_desc_bmc(pdesc, 1);
} }
rtl88e_dm_set_tx_ant_by_tx_info(hw, pdesc, ptcb_desc->mac_id); rtl88e_dm_set_tx_ant_by_tx_info(hw, pdesc8, ptcb_desc->mac_id);
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n"); RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
} }
void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw, void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw,
u8 *pdesc, bool firstseg, u8 *pdesc8, bool firstseg,
bool lastseg, struct sk_buff *skb) bool lastseg, struct sk_buff *skb)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
u8 fw_queue = QSLT_BEACON; u8 fw_queue = QSLT_BEACON;
__le32 *pdesc = (__le32 *)pdesc8;
dma_addr_t mapping = pci_map_single(rtlpci->pdev, dma_addr_t mapping = pci_map_single(rtlpci->pdev,
skb->data, skb->len, skb->data, skb->len,
...@@ -684,58 +686,60 @@ void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw, ...@@ -684,58 +686,60 @@ void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw,
"DMA mapping error\n"); "DMA mapping error\n");
return; return;
} }
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); clear_pci_tx_desc_content(pdesc, TX_DESC_SIZE);
if (firstseg) if (firstseg)
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M); set_tx_desc_tx_rate(pdesc, DESC92C_RATE1M);
SET_TX_DESC_SEQ(pdesc, 0); set_tx_desc_seq(pdesc, 0);
SET_TX_DESC_LINIP(pdesc, 0); set_tx_desc_linip(pdesc, 0);
SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue); set_tx_desc_queue_sel(pdesc, fw_queue);
SET_TX_DESC_FIRST_SEG(pdesc, 1); set_tx_desc_first_seg(pdesc, 1);
SET_TX_DESC_LAST_SEG(pdesc, 1); set_tx_desc_last_seg(pdesc, 1);
SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)(skb->len)); set_tx_desc_tx_buffer_size(pdesc, (u16)(skb->len));
SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); set_tx_desc_tx_buffer_address(pdesc, mapping);
SET_TX_DESC_RATE_ID(pdesc, 7); set_tx_desc_rate_id(pdesc, 7);
SET_TX_DESC_MACID(pdesc, 0); set_tx_desc_macid(pdesc, 0);
SET_TX_DESC_OWN(pdesc, 1); set_tx_desc_own(pdesc, 1);
SET_TX_DESC_PKT_SIZE(pdesc, (u16)(skb->len)); set_tx_desc_pkt_size(pdesc, (u16)(skb->len));
SET_TX_DESC_FIRST_SEG(pdesc, 1); set_tx_desc_first_seg(pdesc, 1);
SET_TX_DESC_LAST_SEG(pdesc, 1); set_tx_desc_last_seg(pdesc, 1);
SET_TX_DESC_OFFSET(pdesc, 0x20); set_tx_desc_offset(pdesc, 0x20);
SET_TX_DESC_USE_RATE(pdesc, 1); set_tx_desc_use_rate(pdesc, 1);
if (!ieee80211_is_data_qos(fc)) if (!ieee80211_is_data_qos(fc))
SET_TX_DESC_HWSEQ_EN(pdesc, 1); set_tx_desc_hwseq_en(pdesc, 1);
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
"H2C Tx Cmd Content\n", "H2C Tx Cmd Content\n",
pdesc, TX_DESC_SIZE); pdesc, TX_DESC_SIZE);
} }
void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc8,
bool istx, u8 desc_name, u8 *val) bool istx, u8 desc_name, u8 *val)
{ {
__le32 *pdesc = (__le32 *)pdesc8;
if (istx == true) { if (istx == true) {
switch (desc_name) { switch (desc_name) {
case HW_DESC_OWN: case HW_DESC_OWN:
SET_TX_DESC_OWN(pdesc, 1); set_tx_desc_own(pdesc, 1);
break; break;
case HW_DESC_TX_NEXTDESC_ADDR: case HW_DESC_TX_NEXTDESC_ADDR:
SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val); set_tx_desc_next_desc_address(pdesc, *(u32 *)val);
break; break;
default: default:
WARN_ONCE(true, "rtl8188ee: ERR txdesc :%d not processed\n", WARN_ONCE(true, "rtl8188ee: ERR txdesc :%d not processed\n",
...@@ -745,16 +749,16 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, ...@@ -745,16 +749,16 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
} else { } else {
switch (desc_name) { switch (desc_name) {
case HW_DESC_RXOWN: case HW_DESC_RXOWN:
SET_RX_DESC_OWN(pdesc, 1); set_rx_desc_own(pdesc, 1);
break; break;
case HW_DESC_RXBUFF_ADDR: case HW_DESC_RXBUFF_ADDR:
SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *)val); set_rx_desc_buff_addr(pdesc, *(u32 *)val);
break; break;
case HW_DESC_RXPKT_LEN: case HW_DESC_RXPKT_LEN:
SET_RX_DESC_PKT_LEN(pdesc, *(u32 *)val); set_rx_desc_pkt_len(pdesc, *(u32 *)val);
break; break;
case HW_DESC_RXERO: case HW_DESC_RXERO:
SET_RX_DESC_EOR(pdesc, 1); set_rx_desc_eor(pdesc, 1);
break; break;
default: default:
WARN_ONCE(true, "rtl8188ee: ERR rxdesc :%d not processed\n", WARN_ONCE(true, "rtl8188ee: ERR rxdesc :%d not processed\n",
...@@ -765,17 +769,18 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, ...@@ -765,17 +769,18 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
} }
u64 rtl88ee_get_desc(struct ieee80211_hw *hw, u64 rtl88ee_get_desc(struct ieee80211_hw *hw,
u8 *pdesc, bool istx, u8 desc_name) u8 *pdesc8, bool istx, u8 desc_name)
{ {
u32 ret = 0; u32 ret = 0;
__le32 *pdesc = (__le32 *)pdesc8;
if (istx == true) { if (istx == true) {
switch (desc_name) { switch (desc_name) {
case HW_DESC_OWN: case HW_DESC_OWN:
ret = GET_TX_DESC_OWN(pdesc); ret = get_tx_desc_own(pdesc);
break; break;
case HW_DESC_TXBUFF_ADDR: case HW_DESC_TXBUFF_ADDR:
ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc); ret = get_tx_desc_tx_buffer_address(pdesc);
break; break;
default: default:
WARN_ONCE(true, "rtl8188ee: ERR txdesc :%d not processed\n", WARN_ONCE(true, "rtl8188ee: ERR txdesc :%d not processed\n",
...@@ -785,13 +790,13 @@ u64 rtl88ee_get_desc(struct ieee80211_hw *hw, ...@@ -785,13 +790,13 @@ u64 rtl88ee_get_desc(struct ieee80211_hw *hw,
} else { } else {
switch (desc_name) { switch (desc_name) {
case HW_DESC_OWN: case HW_DESC_OWN:
ret = GET_RX_DESC_OWN(pdesc); ret = get_rx_desc_own(pdesc);
break; break;
case HW_DESC_RXPKT_LEN: case HW_DESC_RXPKT_LEN:
ret = GET_RX_DESC_PKT_LEN(pdesc); ret = get_rx_desc_pkt_len(pdesc);
break; break;
case HW_DESC_RXBUFF_ADDR: case HW_DESC_RXBUFF_ADDR:
ret = GET_RX_DESC_BUFF_ADDR(pdesc); ret = get_rx_desc_buff_addr(pdesc);
break; break;
default: default:
WARN_ONCE(true, "rtl8188ee: ERR rxdesc :%d not processed\n", WARN_ONCE(true, "rtl8188ee: ERR rxdesc :%d not processed\n",
......
...@@ -113,8 +113,6 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw) ...@@ -113,8 +113,6 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
if (!rtlpriv->psc.inactiveps) if (!rtlpriv->psc.inactiveps)
pr_info("rtl8192ce: Power Save off (module option)\n"); pr_info("rtl8192ce: Power Save off (module option)\n");
if (!rtlpriv->psc.fwctrl_lps) if (!rtlpriv->psc.fwctrl_lps)
......
...@@ -251,8 +251,8 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw, ...@@ -251,8 +251,8 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
*/ */
if (i == 0) if (i == 0)
pstats->signalquality = pstats->signalquality =
(u8) (evm & 0xff); (u8)(evm & 0xff);
pstats->rx_mimo_sig_qual[i] = (u8) (evm & 0xff); pstats->rx_mimo_sig_qual[i] = (u8)(evm & 0xff);
} }
} }
} }
...@@ -262,10 +262,10 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw, ...@@ -262,10 +262,10 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
*/ */
if (is_cck_rate) if (is_cck_rate)
pstats->signalstrength = pstats->signalstrength =
(u8) (_rtl92ce_signal_scale_mapping(hw, pwdb_all)); (u8)(_rtl92ce_signal_scale_mapping(hw, pwdb_all));
else if (rf_rx_num != 0) else if (rf_rx_num != 0)
pstats->signalstrength = pstats->signalstrength =
(u8) (_rtl92ce_signal_scale_mapping (u8)(_rtl92ce_signal_scale_mapping
(hw, total_rssi /= rf_rx_num)); (hw, total_rssi /= rf_rx_num));
} }
...@@ -317,29 +317,30 @@ static void _rtl92ce_translate_rx_signal_stuff(struct ieee80211_hw *hw, ...@@ -317,29 +317,30 @@ static void _rtl92ce_translate_rx_signal_stuff(struct ieee80211_hw *hw,
bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw, bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
struct rtl_stats *stats, struct rtl_stats *stats,
struct ieee80211_rx_status *rx_status, struct ieee80211_rx_status *rx_status,
u8 *p_desc, struct sk_buff *skb) u8 *p_desc8, struct sk_buff *skb)
{ {
struct rx_fwinfo_92c *p_drvinfo; struct rx_fwinfo_92c *p_drvinfo;
struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc; struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc8;
struct ieee80211_hdr *hdr; struct ieee80211_hdr *hdr;
u32 phystatus = GET_RX_DESC_PHYST(pdesc); __le32 *p_desc = (__le32 *)p_desc8;
u32 phystatus = get_rx_desc_physt(p_desc);
stats->length = (u16) GET_RX_DESC_PKT_LEN(pdesc); stats->length = (u16)get_rx_desc_pkt_len(p_desc);
stats->rx_drvinfo_size = (u8) GET_RX_DESC_DRV_INFO_SIZE(pdesc) * stats->rx_drvinfo_size = (u8)get_rx_desc_drv_info_size(p_desc) *
RX_DRV_INFO_SIZE_UNIT; RX_DRV_INFO_SIZE_UNIT;
stats->rx_bufshift = (u8) (GET_RX_DESC_SHIFT(pdesc) & 0x03); stats->rx_bufshift = (u8)(get_rx_desc_shift(p_desc) & 0x03);
stats->icv = (u16) GET_RX_DESC_ICV(pdesc); stats->icv = (u16)get_rx_desc_icv(p_desc);
stats->crc = (u16) GET_RX_DESC_CRC32(pdesc); stats->crc = (u16)get_rx_desc_crc32(p_desc);
stats->hwerror = (stats->crc | stats->icv); stats->hwerror = (stats->crc | stats->icv);
stats->decrypted = !GET_RX_DESC_SWDEC(pdesc); stats->decrypted = !get_rx_desc_swdec(p_desc);
stats->rate = (u8) GET_RX_DESC_RXMCS(pdesc); stats->rate = (u8)get_rx_desc_rxmcs(p_desc);
stats->shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc); stats->shortpreamble = (u16)get_rx_desc_splcp(p_desc);
stats->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1); stats->isampdu = (bool)(get_rx_desc_paggr(p_desc) == 1);
stats->isfirst_ampdu = (bool) ((GET_RX_DESC_PAGGR(pdesc) == 1) stats->isfirst_ampdu = (bool)((get_rx_desc_paggr(p_desc) == 1) &&
&& (GET_RX_DESC_FAGGR(pdesc) == 1)); (get_rx_desc_faggr(p_desc) == 1));
stats->timestamp_low = GET_RX_DESC_TSFL(pdesc); stats->timestamp_low = get_rx_desc_tsfl(p_desc);
stats->rx_is40mhzpacket = (bool)GET_RX_DESC_BW(pdesc); stats->rx_is40mhzpacket = (bool)get_rx_desc_bw(p_desc);
stats->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); stats->is_ht = (bool)get_rx_desc_rxht(p_desc);
stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc->rxmcs); stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
...@@ -400,7 +401,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw, ...@@ -400,7 +401,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
} }
void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw, void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
struct ieee80211_hdr *hdr, u8 *pdesc_tx, struct ieee80211_hdr *hdr, u8 *pdesc8,
u8 *pbd_desc_tx, struct ieee80211_tx_info *info, u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
struct sk_buff *skb, struct sk_buff *skb,
...@@ -411,7 +412,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -411,7 +412,7 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
bool defaultadapter = true; bool defaultadapter = true;
u8 *pdesc = pdesc_tx; __le32 *pdesc = (__le32 *)pdesc8;
u16 seq_number; u16 seq_number;
__le16 fc = hdr->frame_control; __le16 fc = hdr->frame_control;
u8 fw_qsel = _rtl92ce_map_hwqueue_to_fwqueue(skb, hw_queue); u8 fw_qsel = _rtl92ce_map_hwqueue_to_fwqueue(skb, hw_queue);
...@@ -447,64 +448,64 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -447,64 +448,64 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
rtl_get_tcb_desc(hw, info, sta, skb, tcb_desc); rtl_get_tcb_desc(hw, info, sta, skb, tcb_desc);
CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92c)); clear_pci_tx_desc_content(pdesc, sizeof(struct tx_desc_92c));
if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) { if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
firstseg = true; firstseg = true;
lastseg = true; lastseg = true;
} }
if (firstseg) { if (firstseg) {
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
SET_TX_DESC_TX_RATE(pdesc, tcb_desc->hw_rate); set_tx_desc_tx_rate(pdesc, tcb_desc->hw_rate);
if (tcb_desc->use_shortgi || tcb_desc->use_shortpreamble) if (tcb_desc->use_shortgi || tcb_desc->use_shortpreamble)
SET_TX_DESC_DATA_SHORTGI(pdesc, 1); set_tx_desc_data_shortgi(pdesc, 1);
if (info->flags & IEEE80211_TX_CTL_AMPDU) { if (info->flags & IEEE80211_TX_CTL_AMPDU) {
SET_TX_DESC_AGG_BREAK(pdesc, 1); set_tx_desc_agg_break(pdesc, 1);
SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x14); set_tx_desc_max_agg_num(pdesc, 0x14);
} }
SET_TX_DESC_SEQ(pdesc, seq_number); set_tx_desc_seq(pdesc, seq_number);
SET_TX_DESC_RTS_ENABLE(pdesc, ((tcb_desc->rts_enable && set_tx_desc_rts_enable(pdesc, ((tcb_desc->rts_enable &&
!tcb_desc-> !tcb_desc->
cts_enable) ? 1 : 0)); cts_enable) ? 1 : 0));
SET_TX_DESC_HW_RTS_ENABLE(pdesc, set_tx_desc_hw_rts_enable(pdesc,
((tcb_desc->rts_enable ((tcb_desc->rts_enable
|| tcb_desc->cts_enable) ? 1 : 0)); || tcb_desc->cts_enable) ? 1 : 0));
SET_TX_DESC_CTS2SELF(pdesc, ((tcb_desc->cts_enable) ? 1 : 0)); set_tx_desc_cts2self(pdesc, ((tcb_desc->cts_enable) ? 1 : 0));
SET_TX_DESC_RTS_STBC(pdesc, ((tcb_desc->rts_stbc) ? 1 : 0)); set_tx_desc_rts_stbc(pdesc, ((tcb_desc->rts_stbc) ? 1 : 0));
SET_TX_DESC_RTS_RATE(pdesc, tcb_desc->rts_rate); set_tx_desc_rts_rate(pdesc, tcb_desc->rts_rate);
SET_TX_DESC_RTS_BW(pdesc, 0); set_tx_desc_rts_bw(pdesc, 0);
SET_TX_DESC_RTS_SC(pdesc, tcb_desc->rts_sc); set_tx_desc_rts_sc(pdesc, tcb_desc->rts_sc);
SET_TX_DESC_RTS_SHORT(pdesc, set_tx_desc_rts_short(pdesc,
((tcb_desc->rts_rate <= DESC_RATE54M) ? ((tcb_desc->rts_rate <= DESC_RATE54M) ?
(tcb_desc->rts_use_shortpreamble ? 1 : 0) (tcb_desc->rts_use_shortpreamble ? 1 : 0)
: (tcb_desc->rts_use_shortgi ? 1 : 0))); : (tcb_desc->rts_use_shortgi ? 1 : 0)));
if (bw_40) { if (bw_40) {
if (tcb_desc->packet_bw) { if (tcb_desc->packet_bw) {
SET_TX_DESC_DATA_BW(pdesc, 1); set_tx_desc_data_bw(pdesc, 1);
SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3); set_tx_desc_tx_sub_carrier(pdesc, 3);
} else { } else {
SET_TX_DESC_DATA_BW(pdesc, 0); set_tx_desc_data_bw(pdesc, 0);
SET_TX_DESC_TX_SUB_CARRIER(pdesc, set_tx_desc_tx_sub_carrier(pdesc,
mac->cur_40_prime_sc); mac->cur_40_prime_sc);
} }
} else { } else {
SET_TX_DESC_DATA_BW(pdesc, 0); set_tx_desc_data_bw(pdesc, 0);
SET_TX_DESC_TX_SUB_CARRIER(pdesc, 0); set_tx_desc_tx_sub_carrier(pdesc, 0);
} }
SET_TX_DESC_LINIP(pdesc, 0); set_tx_desc_linip(pdesc, 0);
SET_TX_DESC_PKT_SIZE(pdesc, (u16) skb->len); set_tx_desc_pkt_size(pdesc, (u16)skb->len);
if (sta) { if (sta) {
u8 ampdu_density = sta->ht_cap.ampdu_density; u8 ampdu_density = sta->ht_cap.ampdu_density;
SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density); set_tx_desc_ampdu_density(pdesc, ampdu_density);
} }
if (info->control.hw_key) { if (info->control.hw_key) {
...@@ -515,77 +516,78 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw, ...@@ -515,77 +516,78 @@ void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
case WLAN_CIPHER_SUITE_WEP40: case WLAN_CIPHER_SUITE_WEP40:
case WLAN_CIPHER_SUITE_WEP104: case WLAN_CIPHER_SUITE_WEP104:
case WLAN_CIPHER_SUITE_TKIP: case WLAN_CIPHER_SUITE_TKIP:
SET_TX_DESC_SEC_TYPE(pdesc, 0x1); set_tx_desc_sec_type(pdesc, 0x1);
break; break;
case WLAN_CIPHER_SUITE_CCMP: case WLAN_CIPHER_SUITE_CCMP:
SET_TX_DESC_SEC_TYPE(pdesc, 0x3); set_tx_desc_sec_type(pdesc, 0x3);
break; break;
default: default:
SET_TX_DESC_SEC_TYPE(pdesc, 0x0); set_tx_desc_sec_type(pdesc, 0x0);
break; break;
} }
} }
SET_TX_DESC_PKT_ID(pdesc, 0); set_tx_desc_pkt_id(pdesc, 0);
SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel); set_tx_desc_queue_sel(pdesc, fw_qsel);
SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F); set_tx_desc_data_rate_fb_limit(pdesc, 0x1F);
SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF); set_tx_desc_rts_rate_fb_limit(pdesc, 0xF);
SET_TX_DESC_DISABLE_FB(pdesc, 0); set_tx_desc_disable_fb(pdesc, 0);
SET_TX_DESC_USE_RATE(pdesc, tcb_desc->use_driver_rate ? 1 : 0); set_tx_desc_use_rate(pdesc, tcb_desc->use_driver_rate ? 1 : 0);
if (ieee80211_is_data_qos(fc)) { if (ieee80211_is_data_qos(fc)) {
if (mac->rdg_en) { if (mac->rdg_en) {
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
"Enable RDG function\n"); "Enable RDG function\n");
SET_TX_DESC_RDG_ENABLE(pdesc, 1); set_tx_desc_rdg_enable(pdesc, 1);
SET_TX_DESC_HTC(pdesc, 1); set_tx_desc_htc(pdesc, 1);
} }
} }
} }
rcu_read_unlock(); rcu_read_unlock();
SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0)); set_tx_desc_first_seg(pdesc, (firstseg ? 1 : 0));
SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0)); set_tx_desc_last_seg(pdesc, (lastseg ? 1 : 0));
SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) skb->len); set_tx_desc_tx_buffer_size(pdesc, (u16)skb->len);
SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); set_tx_desc_tx_buffer_address(pdesc, mapping);
if (rtlpriv->dm.useramask) { if (rtlpriv->dm.useramask) {
SET_TX_DESC_RATE_ID(pdesc, tcb_desc->ratr_index); set_tx_desc_rate_id(pdesc, tcb_desc->ratr_index);
SET_TX_DESC_MACID(pdesc, tcb_desc->mac_id); set_tx_desc_macid(pdesc, tcb_desc->mac_id);
} else { } else {
SET_TX_DESC_RATE_ID(pdesc, 0xC + tcb_desc->ratr_index); set_tx_desc_rate_id(pdesc, 0xC + tcb_desc->ratr_index);
SET_TX_DESC_MACID(pdesc, tcb_desc->ratr_index); set_tx_desc_macid(pdesc, tcb_desc->ratr_index);
} }
if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) { if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
SET_TX_DESC_HWSEQ_EN(pdesc, 1); set_tx_desc_hwseq_en(pdesc, 1);
SET_TX_DESC_PKT_ID(pdesc, 8); set_tx_desc_pkt_id(pdesc, 8);
if (!defaultadapter) if (!defaultadapter)
SET_TX_DESC_QOS(pdesc, 1); set_tx_desc_qos(pdesc, 1);
} }
SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1)); set_tx_desc_more_frag(pdesc, (lastseg ? 0 : 1));
if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) || if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
is_broadcast_ether_addr(ieee80211_get_DA(hdr))) { is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
SET_TX_DESC_BMC(pdesc, 1); set_tx_desc_bmc(pdesc, 1);
} }
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n"); RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
} }
void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
u8 *pdesc, bool firstseg, u8 *pdesc8, bool firstseg,
bool lastseg, struct sk_buff *skb) bool lastseg, struct sk_buff *skb)
{ {
struct rtl_priv *rtlpriv = rtl_priv(hw); struct rtl_priv *rtlpriv = rtl_priv(hw);
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
u8 fw_queue = QSLT_BEACON; u8 fw_queue = QSLT_BEACON;
__le32 *pdesc = (__le32 *)pdesc8;
dma_addr_t mapping = pci_map_single(rtlpci->pdev, dma_addr_t mapping = pci_map_single(rtlpci->pdev,
skb->data, skb->len, skb->data, skb->len,
...@@ -599,60 +601,62 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, ...@@ -599,60 +601,62 @@ void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
"DMA mapping error\n"); "DMA mapping error\n");
return; return;
} }
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE); clear_pci_tx_desc_content(pdesc, TX_DESC_SIZE);
if (firstseg) if (firstseg)
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M); set_tx_desc_tx_rate(pdesc, DESC_RATE1M);
SET_TX_DESC_SEQ(pdesc, 0); set_tx_desc_seq(pdesc, 0);
SET_TX_DESC_LINIP(pdesc, 0); set_tx_desc_linip(pdesc, 0);
SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue); set_tx_desc_queue_sel(pdesc, fw_queue);
SET_TX_DESC_FIRST_SEG(pdesc, 1); set_tx_desc_first_seg(pdesc, 1);
SET_TX_DESC_LAST_SEG(pdesc, 1); set_tx_desc_last_seg(pdesc, 1);
SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) (skb->len)); set_tx_desc_tx_buffer_size(pdesc, (u16)(skb->len));
SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); set_tx_desc_tx_buffer_address(pdesc, mapping);
SET_TX_DESC_RATE_ID(pdesc, 7); set_tx_desc_rate_id(pdesc, 7);
SET_TX_DESC_MACID(pdesc, 0); set_tx_desc_macid(pdesc, 0);
SET_TX_DESC_OWN(pdesc, 1); set_tx_desc_own(pdesc, 1);
SET_TX_DESC_PKT_SIZE(pdesc, (u16) (skb->len)); set_tx_desc_pkt_size(pdesc, (u16)(skb->len));
SET_TX_DESC_FIRST_SEG(pdesc, 1); set_tx_desc_first_seg(pdesc, 1);
SET_TX_DESC_LAST_SEG(pdesc, 1); set_tx_desc_last_seg(pdesc, 1);
SET_TX_DESC_OFFSET(pdesc, 0x20); set_tx_desc_offset(pdesc, 0x20);
SET_TX_DESC_USE_RATE(pdesc, 1); set_tx_desc_use_rate(pdesc, 1);
if (!ieee80211_is_data_qos(fc)) { if (!ieee80211_is_data_qos(fc)) {
SET_TX_DESC_HWSEQ_EN(pdesc, 1); set_tx_desc_hwseq_en(pdesc, 1);
SET_TX_DESC_PKT_ID(pdesc, 8); set_tx_desc_pkt_id(pdesc, 8);
} }
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
"H2C Tx Cmd Content", pdesc, TX_DESC_SIZE); "H2C Tx Cmd Content", pdesc, TX_DESC_SIZE);
} }
void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc8, bool istx,
u8 desc_name, u8 *val) u8 desc_name, u8 *val)
{ {
__le32 *pdesc = (__le32 *)pdesc8;
if (istx) { if (istx) {
switch (desc_name) { switch (desc_name) {
case HW_DESC_OWN: case HW_DESC_OWN:
wmb(); wmb();
SET_TX_DESC_OWN(pdesc, 1); set_tx_desc_own(pdesc, 1);
break; break;
case HW_DESC_TX_NEXTDESC_ADDR: case HW_DESC_TX_NEXTDESC_ADDR:
SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *) val); set_tx_desc_next_desc_address(pdesc, *(u32 *)val);
break; break;
default: default:
WARN_ONCE(true, "rtl8192ce: ERR txdesc :%d not processed\n", WARN_ONCE(true, "rtl8192ce: ERR txdesc :%d not processed\n",
...@@ -663,16 +667,16 @@ void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, ...@@ -663,16 +667,16 @@ void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
switch (desc_name) { switch (desc_name) {
case HW_DESC_RXOWN: case HW_DESC_RXOWN:
wmb(); wmb();
SET_RX_DESC_OWN(pdesc, 1); set_rx_desc_own(pdesc, 1);
break; break;
case HW_DESC_RXBUFF_ADDR: case HW_DESC_RXBUFF_ADDR:
SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *) val); set_rx_desc_buff_addr(pdesc, *(u32 *)val);
break; break;
case HW_DESC_RXPKT_LEN: case HW_DESC_RXPKT_LEN:
SET_RX_DESC_PKT_LEN(pdesc, *(u32 *) val); set_rx_desc_pkt_len(pdesc, *(u32 *)val);
break; break;
case HW_DESC_RXERO: case HW_DESC_RXERO:
SET_RX_DESC_EOR(pdesc, 1); set_rx_desc_eor(pdesc, 1);
break; break;
default: default:
WARN_ONCE(true, "rtl8192ce: ERR rxdesc :%d not processed\n", WARN_ONCE(true, "rtl8192ce: ERR rxdesc :%d not processed\n",
...@@ -682,18 +686,19 @@ void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, ...@@ -682,18 +686,19 @@ void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
} }
} }
u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc, u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc8,
bool istx, u8 desc_name) bool istx, u8 desc_name)
{ {
u32 ret = 0; u32 ret = 0;
__le32 *p_desc = (__le32 *)p_desc8;
if (istx) { if (istx) {
switch (desc_name) { switch (desc_name) {
case HW_DESC_OWN: case HW_DESC_OWN:
ret = GET_TX_DESC_OWN(p_desc); ret = get_tx_desc_own(p_desc);
break; break;
case HW_DESC_TXBUFF_ADDR: case HW_DESC_TXBUFF_ADDR:
ret = GET_TX_DESC_TX_BUFFER_ADDRESS(p_desc); ret = get_tx_desc_tx_buffer_address(p_desc);
break; break;
default: default:
WARN_ONCE(true, "rtl8192ce: ERR txdesc :%d not processed\n", WARN_ONCE(true, "rtl8192ce: ERR txdesc :%d not processed\n",
...@@ -703,13 +708,13 @@ u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc, ...@@ -703,13 +708,13 @@ u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc,
} else { } else {
switch (desc_name) { switch (desc_name) {
case HW_DESC_OWN: case HW_DESC_OWN:
ret = GET_RX_DESC_OWN(p_desc); ret = get_rx_desc_own(p_desc);
break; break;
case HW_DESC_RXPKT_LEN: case HW_DESC_RXPKT_LEN:
ret = GET_RX_DESC_PKT_LEN(p_desc); ret = get_rx_desc_pkt_len(p_desc);
break; break;
case HW_DESC_RXBUFF_ADDR: case HW_DESC_RXBUFF_ADDR:
ret = GET_RX_DESC_BUFF_ADDR(p_desc); ret = get_rx_desc_buff_addr(p_desc);
break; break;
default: default:
WARN_ONCE(true, "rtl8192ce: ERR rxdesc :%d not processed\n", WARN_ONCE(true, "rtl8192ce: ERR rxdesc :%d not processed\n",
......
...@@ -39,8 +39,6 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw) ...@@ -39,8 +39,6 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->dm.dm_flag = 0; rtlpriv->dm.dm_flag = 0;
rtlpriv->dm.disable_framebursting = false; rtlpriv->dm.disable_framebursting = false;
rtlpriv->dm.thermalvalue = 0; rtlpriv->dm.thermalvalue = 0;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
/* for firmware buf */ /* for firmware buf */
rtlpriv->rtlhal.pfirmware = vzalloc(0x4000); rtlpriv->rtlhal.pfirmware = vzalloc(0x4000);
......
...@@ -161,8 +161,6 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw) ...@@ -161,8 +161,6 @@ static int rtl92s_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
if (!rtlpriv->psc.inactiveps) if (!rtlpriv->psc.inactiveps)
pr_info("Power Save off (module option)\n"); pr_info("Power Save off (module option)\n");
if (!rtlpriv->psc.fwctrl_lps) if (!rtlpriv->psc.fwctrl_lps)
......
...@@ -129,10 +129,6 @@ int rtl8723e_init_sw_vars(struct ieee80211_hw *hw) ...@@ -129,10 +129,6 @@ int rtl8723e_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
rtlpriv->cfg->mod_params->disable_watchdog =
rtlpriv->cfg->mod_params->disable_watchdog;
if (rtlpriv->cfg->mod_params->disable_watchdog) if (rtlpriv->cfg->mod_params->disable_watchdog)
pr_info("watchdog disabled\n"); pr_info("watchdog disabled\n");
rtlpriv->psc.reg_fwctrl_lps = 3; rtlpriv->psc.reg_fwctrl_lps = 3;
......
...@@ -128,10 +128,6 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw) ...@@ -128,10 +128,6 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
rtlpriv->cfg->mod_params->disable_watchdog =
rtlpriv->cfg->mod_params->disable_watchdog;
if (rtlpriv->cfg->mod_params->disable_watchdog) if (rtlpriv->cfg->mod_params->disable_watchdog)
pr_info("watchdog disabled\n"); pr_info("watchdog disabled\n");
rtlpriv->psc.reg_fwctrl_lps = 2; rtlpriv->psc.reg_fwctrl_lps = 2;
......
...@@ -145,10 +145,6 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw) ...@@ -145,10 +145,6 @@ int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support; rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
rtlpci->int_clear = rtlpriv->cfg->mod_params->int_clear; rtlpci->int_clear = rtlpriv->cfg->mod_params->int_clear;
rtlpriv->cfg->mod_params->sw_crypto =
rtlpriv->cfg->mod_params->sw_crypto;
rtlpriv->cfg->mod_params->disable_watchdog =
rtlpriv->cfg->mod_params->disable_watchdog;
if (rtlpriv->cfg->mod_params->disable_watchdog) if (rtlpriv->cfg->mod_params->disable_watchdog)
pr_info("watchdog disabled\n"); pr_info("watchdog disabled\n");
rtlpriv->psc.reg_fwctrl_lps = 2; rtlpriv->psc.reg_fwctrl_lps = 2;
......
...@@ -9,6 +9,7 @@ rtw88-y += main.o \ ...@@ -9,6 +9,7 @@ rtw88-y += main.o \
rx.o \ rx.o \
mac.o \ mac.o \
phy.o \ phy.o \
coex.o \
efuse.o \ efuse.o \
fw.o \ fw.o \
ps.o \ ps.o \
......
此差异已折叠。
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
/* Copyright(c) 2018-2019 Realtek Corporation
*/
#ifndef __RTW_COEX_H__
#define __RTW_COEX_H__
/* BT profile map bit definition */
#define BPM_HFP BIT(0)
#define BPM_HID BIT(1)
#define BPM_A2DP BIT(2)
#define BPM_PAN BIT(3)
#define COEX_RESP_ACK_BY_WL_FW 0x1
#define COEX_REQUEST_TIMEOUT msecs_to_jiffies(10)
#define COEX_MIN_DELAY 10 /* delay unit in ms */
#define COEX_RFK_TIMEOUT 600 /* RFK timeout in ms */
#define COEX_RF_OFF 0x0
#define COEX_RF_ON 0x1
#define COEX_H2C69_WL_LEAKAP 0xc
#define PARA1_H2C69_DIS_5MS 0x1
#define PARA1_H2C69_EN_5MS 0x0
#define COEX_H2C69_TDMA_SLOT 0xb
#define PARA1_H2C69_TDMA_4SLOT 0xc1
#define PARA1_H2C69_TDMA_2SLOT 0x1
#define TDMA_4SLOT BIT(8)
#define COEX_RSSI_STEP 4
#define COEX_RSSI_HIGH(rssi) \
({ typeof(rssi) __rssi__ = rssi; \
(__rssi__ == COEX_RSSI_STATE_HIGH || \
__rssi__ == COEX_RSSI_STATE_STAY_HIGH ? true : false); })
#define COEX_RSSI_MEDIUM(rssi) \
({ typeof(rssi) __rssi__ = rssi; \
(__rssi__ == COEX_RSSI_STATE_MEDIUM || \
__rssi__ == COEX_RSSI_STATE_STAY_MEDIUM ? true : false); })
#define COEX_RSSI_LOW(rssi) \
({ typeof(rssi) __rssi__ = rssi; \
(__rssi__ == COEX_RSSI_STATE_LOW || \
__rssi__ == COEX_RSSI_STATE_STAY_LOW ? true : false); })
#define GET_COEX_RESP_BT_SCAN_TYPE(payload) \
le64_get_bits(*((__le64 *)(payload)), GENMASK(31, 24))
enum coex_mp_info_op {
BT_MP_INFO_OP_PATCH_VER = 0x00,
BT_MP_INFO_OP_READ_REG = 0x11,
BT_MP_INFO_OP_SUPP_FEAT = 0x2a,
BT_MP_INFO_OP_SUPP_VER = 0x2b,
BT_MP_INFO_OP_SCAN_TYPE = 0x2d,
BT_MP_INFO_OP_LNA_CONSTRAINT = 0x32,
};
enum coex_set_ant_phase {
COEX_SET_ANT_INIT,
COEX_SET_ANT_WONLY,
COEX_SET_ANT_WOFF,
COEX_SET_ANT_2G,
COEX_SET_ANT_5G,
COEX_SET_ANT_POWERON,
COEX_SET_ANT_2G_WLBT,
COEX_SET_ANT_2G_FREERUN,
COEX_SET_ANT_MAX
};
enum coex_runreason {
COEX_RSN_2GSCANSTART = 0,
COEX_RSN_5GSCANSTART = 1,
COEX_RSN_SCANFINISH = 2,
COEX_RSN_2GSWITCHBAND = 3,
COEX_RSN_5GSWITCHBAND = 4,
COEX_RSN_2GCONSTART = 5,
COEX_RSN_5GCONSTART = 6,
COEX_RSN_2GCONFINISH = 7,
COEX_RSN_5GCONFINISH = 8,
COEX_RSN_2GMEDIA = 9,
COEX_RSN_5GMEDIA = 10,
COEX_RSN_MEDIADISCON = 11,
COEX_RSN_BTINFO = 12,
COEX_RSN_LPS = 13,
COEX_RSN_WLSTATUS = 14,
COEX_RSN_MAX
};
enum coex_lte_coex_table_type {
COEX_CTT_WL_VS_LTE,
COEX_CTT_BT_VS_LTE,
};
enum coex_gnt_setup_state {
COEX_GNT_SET_HW_PTA = 0x0,
COEX_GNT_SET_SW_LOW = 0x1,
COEX_GNT_SET_SW_HIGH = 0x3,
};
enum coex_ext_ant_switch_pos_type {
COEX_SWITCH_TO_BT,
COEX_SWITCH_TO_WLG,
COEX_SWITCH_TO_WLA,
COEX_SWITCH_TO_NOCARE,
COEX_SWITCH_TO_WLG_BT,
COEX_SWITCH_TO_MAX
};
enum coex_ext_ant_switch_ctrl_type {
COEX_SWITCH_CTRL_BY_BBSW,
COEX_SWITCH_CTRL_BY_PTA,
COEX_SWITCH_CTRL_BY_ANTDIV,
COEX_SWITCH_CTRL_BY_MAC,
COEX_SWITCH_CTRL_BY_BT,
COEX_SWITCH_CTRL_BY_FW,
COEX_SWITCH_CTRL_MAX
};
enum coex_algorithm {
COEX_ALGO_NOPROFILE = 0,
COEX_ALGO_HFP = 1,
COEX_ALGO_HID = 2,
COEX_ALGO_A2DP = 3,
COEX_ALGO_PAN = 4,
COEX_ALGO_A2DP_HID = 5,
COEX_ALGO_A2DP_PAN = 6,
COEX_ALGO_PAN_HID = 7,
COEX_ALGO_A2DP_PAN_HID = 8,
COEX_ALGO_MAX
};
enum coex_wl_link_mode {
COEX_WLINK_2G1PORT = 0x0,
COEX_WLINK_5G = 0x3,
COEX_WLINK_MAX
};
enum coex_wl2bt_scoreboard {
COEX_SCBD_ACTIVE = BIT(0),
COEX_SCBD_ONOFF = BIT(1),
COEX_SCBD_SCAN = BIT(2),
COEX_SCBD_UNDERTEST = BIT(3),
COEX_SCBD_RXGAIN = BIT(4),
COEX_SCBD_BT_RFK = BIT(5),
COEX_SCBD_WLBUSY = BIT(6),
COEX_SCBD_EXTFEM = BIT(8),
COEX_SCBD_TDMA = BIT(9),
COEX_SCBD_FIX2M = BIT(10),
COEX_SCBD_ALL = GENMASK(15, 0),
};
enum coex_power_save_type {
COEX_PS_WIFI_NATIVE = 0,
COEX_PS_LPS_ON = 1,
COEX_PS_LPS_OFF = 2,
};
enum coex_rssi_state {
COEX_RSSI_STATE_HIGH,
COEX_RSSI_STATE_MEDIUM,
COEX_RSSI_STATE_LOW,
COEX_RSSI_STATE_STAY_HIGH,
COEX_RSSI_STATE_STAY_MEDIUM,
COEX_RSSI_STATE_STAY_LOW,
};
enum coex_notify_type_ips {
COEX_IPS_LEAVE = 0x0,
COEX_IPS_ENTER = 0x1,
};
enum coex_notify_type_lps {
COEX_LPS_DISABLE = 0x0,
COEX_LPS_ENABLE = 0x1,
};
enum coex_notify_type_scan {
COEX_SCAN_FINISH,
COEX_SCAN_START,
COEX_SCAN_START_2G,
COEX_SCAN_START_5G,
};
enum coex_notify_type_switchband {
COEX_NOT_SWITCH,
COEX_SWITCH_TO_24G,
COEX_SWITCH_TO_5G,
COEX_SWITCH_TO_24G_NOFORSCAN,
};
enum coex_notify_type_associate {
COEX_ASSOCIATE_FINISH,
COEX_ASSOCIATE_START,
COEX_ASSOCIATE_5G_FINISH,
COEX_ASSOCIATE_5G_START,
};
enum coex_notify_type_media_status {
COEX_MEDIA_DISCONNECT,
COEX_MEDIA_CONNECT,
COEX_MEDIA_CONNECT_5G,
};
enum coex_bt_status {
COEX_BTSTATUS_NCON_IDLE = 0,
COEX_BTSTATUS_CON_IDLE = 1,
COEX_BTSTATUS_INQ_PAGE = 2,
COEX_BTSTATUS_ACL_BUSY = 3,
COEX_BTSTATUS_SCO_BUSY = 4,
COEX_BTSTATUS_ACL_SCO_BUSY = 5,
COEX_BTSTATUS_MAX
};
enum coex_wl_tput_dir {
COEX_WL_TPUT_TX = 0x0,
COEX_WL_TPUT_RX = 0x1,
COEX_WL_TPUT_MAX
};
enum coex_wl_priority_mask {
COEX_WLPRI_RX_RSP = 2,
COEX_WLPRI_TX_RSP = 3,
COEX_WLPRI_TX_BEACON = 4,
COEX_WLPRI_TX_OFDM = 11,
COEX_WLPRI_TX_CCK = 12,
COEX_WLPRI_TX_BEACONQ = 27,
COEX_WLPRI_RX_CCK = 28,
COEX_WLPRI_RX_OFDM = 29,
COEX_WLPRI_MAX
};
enum coex_commom_chip_setup {
COEX_CSETUP_INIT_HW = 0x0,
COEX_CSETUP_ANT_SWITCH = 0x1,
COEX_CSETUP_GNT_FIX = 0x2,
COEX_CSETUP_GNT_DEBUG = 0x3,
COEX_CSETUP_RFE_TYPE = 0x4,
COEX_CSETUP_COEXINFO_HW = 0x5,
COEX_CSETUP_WL_TX_POWER = 0x6,
COEX_CSETUP_WL_RX_GAIN = 0x7,
COEX_CSETUP_WLAN_ACT_IPS = 0x8,
COEX_CSETUP_MAX
};
enum coex_indirect_reg_type {
COEX_INDIRECT_1700 = 0x0,
COEX_INDIRECT_7C0 = 0x1,
COEX_INDIRECT_MAX
};
enum coex_pstdma_type {
COEX_PSTDMA_FORCE_LPSOFF = 0x0,
COEX_PSTDMA_FORCE_LPSON = 0x1,
COEX_PSTDMA_MAX
};
enum coex_btrssi_type {
COEX_BTRSSI_RATIO = 0x0,
COEX_BTRSSI_DBM = 0x1,
COEX_BTRSSI_MAX
};
struct coex_table_para {
u32 bt;
u32 wl;
};
struct coex_tdma_para {
u8 para[5];
};
struct coex_5g_afh_map {
u32 wl_5g_ch;
u8 bt_skip_ch;
u8 bt_skip_span;
};
struct coex_rf_para {
u8 wl_pwr_dec_lvl;
u8 bt_pwr_dec_lvl;
bool wl_low_gain_en;
u8 bt_lna_lvl;
};
static inline void rtw_coex_set_init(struct rtw_dev *rtwdev)
{
struct rtw_chip_info *chip = rtwdev->chip;
chip->ops->coex_set_init(rtwdev);
}
static inline
void rtw_coex_set_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, u8 pos_type)
{
struct rtw_chip_info *chip = rtwdev->chip;
if (!chip->ops->coex_set_ant_switch)
return;
chip->ops->coex_set_ant_switch(rtwdev, ctrl_type, pos_type);
}
static inline void rtw_coex_set_gnt_fix(struct rtw_dev *rtwdev)
{
struct rtw_chip_info *chip = rtwdev->chip;
chip->ops->coex_set_gnt_fix(rtwdev);
}
static inline void rtw_coex_set_gnt_debug(struct rtw_dev *rtwdev)
{
struct rtw_chip_info *chip = rtwdev->chip;
chip->ops->coex_set_gnt_debug(rtwdev);
}
static inline void rtw_coex_set_rfe_type(struct rtw_dev *rtwdev)
{
struct rtw_chip_info *chip = rtwdev->chip;
chip->ops->coex_set_rfe_type(rtwdev);
}
static inline void rtw_coex_set_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
{
struct rtw_chip_info *chip = rtwdev->chip;
chip->ops->coex_set_wl_tx_power(rtwdev, wl_pwr);
}
static inline
void rtw_coex_set_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
{
struct rtw_chip_info *chip = rtwdev->chip;
chip->ops->coex_set_wl_rx_gain(rtwdev, low_gain);
}
void rtw_coex_info_response(struct rtw_dev *rtwdev, struct sk_buff *skb);
void rtw_coex_write_indirect_reg(struct rtw_dev *rtwdev, u16 addr,
u32 mask, u32 val);
void rtw_coex_write_scbd(struct rtw_dev *rtwdev, u16 bitpos, bool set);
void rtw_coex_bt_relink_work(struct work_struct *work);
void rtw_coex_bt_reenable_work(struct work_struct *work);
void rtw_coex_defreeze_work(struct work_struct *work);
void rtw_coex_power_on_setting(struct rtw_dev *rtwdev);
void rtw_coex_init_hw_config(struct rtw_dev *rtwdev, bool wifi_only);
void rtw_coex_ips_notify(struct rtw_dev *rtwdev, u8 type);
void rtw_coex_lps_notify(struct rtw_dev *rtwdev, u8 type);
void rtw_coex_scan_notify(struct rtw_dev *rtwdev, u8 type);
void rtw_coex_connect_notify(struct rtw_dev *rtwdev, u8 action);
void rtw_coex_media_status_notify(struct rtw_dev *rtwdev, u8 status);
void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 len);
void rtw_coex_wl_fwdbginfo_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length);
void rtw_coex_switchband_notify(struct rtw_dev *rtwdev, u8 type);
void rtw_coex_wl_status_change_notify(struct rtw_dev *rtwdev);
#endif
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "sec.h" #include "sec.h"
#include "fw.h" #include "fw.h"
#include "debug.h" #include "debug.h"
#include "phy.h"
#ifdef CONFIG_RTW88_DEBUGFS #ifdef CONFIG_RTW88_DEBUGFS
...@@ -460,6 +461,112 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) ...@@ -460,6 +461,112 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
return 0; return 0;
} }
static void rtw_print_cck_rate_txt(struct seq_file *m, u8 rate)
{
static const char * const
cck_rate[] = {"1M", "2M", "5.5M", "11M"};
u8 idx = rate - DESC_RATE1M;
seq_printf(m, " CCK_%-5s", cck_rate[idx]);
}
static void rtw_print_ofdm_rate_txt(struct seq_file *m, u8 rate)
{
static const char * const
ofdm_rate[] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M"};
u8 idx = rate - DESC_RATE6M;
seq_printf(m, " OFDM_%-4s", ofdm_rate[idx]);
}
static void rtw_print_ht_rate_txt(struct seq_file *m, u8 rate)
{
u8 mcs_n = rate - DESC_RATEMCS0;
seq_printf(m, " MCS%-6u", mcs_n);
}
static void rtw_print_vht_rate_txt(struct seq_file *m, u8 rate)
{
u8 idx = rate - DESC_RATEVHT1SS_MCS0;
u8 n_ss, mcs_n;
/* n spatial stream */
n_ss = 1 + idx / 10;
/* MCS n */
mcs_n = idx % 10;
seq_printf(m, " VHT%uSMCS%u", n_ss, mcs_n);
}
static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
{
struct rtw_debugfs_priv *debugfs_priv = m->private;
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
struct rtw_hal *hal = &rtwdev->hal;
void (*print_rate)(struct seq_file *, u8) = NULL;
u8 path, rate;
struct rtw_power_params pwr_param = {0};
u8 bw = hal->current_band_width;
u8 ch = hal->current_channel;
u8 regd = rtwdev->regd.txpwr_regd;
seq_printf(m, "%-4s %-10s %-3s%6s %-4s %4s (%-4s %-4s)\n",
"path", "rate", "pwr", "", "base", "", "byr", "lmt");
mutex_lock(&hal->tx_power_mutex);
for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
/* there is no CCK rates used in 5G */
if (hal->current_band_type == RTW_BAND_5G)
rate = DESC_RATE6M;
else
rate = DESC_RATE1M;
/* now, not support vht 3ss and vht 4ss*/
for (; rate <= DESC_RATEVHT2SS_MCS9; rate++) {
/* now, not support ht 3ss and ht 4ss*/
if (rate > DESC_RATEMCS15 &&
rate < DESC_RATEVHT1SS_MCS0)
continue;
switch (rate) {
case DESC_RATE1M...DESC_RATE11M:
print_rate = rtw_print_cck_rate_txt;
break;
case DESC_RATE6M...DESC_RATE54M:
print_rate = rtw_print_ofdm_rate_txt;
break;
case DESC_RATEMCS0...DESC_RATEMCS15:
print_rate = rtw_print_ht_rate_txt;
break;
case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT2SS_MCS9:
print_rate = rtw_print_vht_rate_txt;
break;
default:
print_rate = NULL;
break;
}
rtw_get_tx_power_params(rtwdev, path, rate, bw,
ch, regd, &pwr_param);
seq_printf(m, "%4c ", path + 'A');
if (print_rate)
print_rate(m, rate);
seq_printf(m, " %3u(0x%02x) %4u %4d (%4d %4d)\n",
hal->tx_pwr_tbl[path][rate],
hal->tx_pwr_tbl[path][rate],
pwr_param.pwr_base,
min_t(s8, pwr_param.pwr_offset,
pwr_param.pwr_limit),
pwr_param.pwr_offset, pwr_param.pwr_limit);
}
}
mutex_unlock(&hal->tx_power_mutex);
return 0;
}
#define rtw_debug_impl_mac(page, addr) \ #define rtw_debug_impl_mac(page, addr) \
static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = { \ static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = { \
.cb_read = rtw_debug_get_mac_page, \ .cb_read = rtw_debug_get_mac_page, \
...@@ -514,6 +621,10 @@ static struct rtw_debugfs_priv rtw_debug_priv_rf_dump = { ...@@ -514,6 +621,10 @@ static struct rtw_debugfs_priv rtw_debug_priv_rf_dump = {
.cb_read = rtw_debug_get_rf_dump, .cb_read = rtw_debug_get_rf_dump,
}; };
static struct rtw_debugfs_priv rtw_debug_priv_tx_pwr_tbl = {
.cb_read = rtw_debugfs_get_tx_pwr_tbl,
};
static struct rtw_debugfs_priv rtw_debug_priv_write_reg = { static struct rtw_debugfs_priv rtw_debug_priv_write_reg = {
.cb_write = rtw_debugfs_set_write_reg, .cb_write = rtw_debugfs_set_write_reg,
}; };
...@@ -610,6 +721,7 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev) ...@@ -610,6 +721,7 @@ void rtw_debugfs_init(struct rtw_dev *rtwdev)
rtw_debugfs_add_r(bb_41); rtw_debugfs_add_r(bb_41);
} }
rtw_debugfs_add_r(rf_dump); rtw_debugfs_add_r(rf_dump);
rtw_debugfs_add_r(tx_pwr_tbl);
} }
#endif /* CONFIG_RTW88_DEBUGFS */ #endif /* CONFIG_RTW88_DEBUGFS */
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
*/ */
#include "main.h" #include "main.h"
#include "coex.h"
#include "fw.h" #include "fw.h"
#include "tx.h" #include "tx.h"
#include "reg.h" #include "reg.h"
...@@ -36,17 +37,51 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb) ...@@ -36,17 +37,51 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset); c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset);
len = skb->len - pkt_offset - 2; len = skb->len - pkt_offset - 2;
rtw_dbg(rtwdev, RTW_DBG_FW, "recv C2H, id=0x%02x, seq=0x%02x, len=%d\n", mutex_lock(&rtwdev->mutex);
c2h->id, c2h->seq, len);
switch (c2h->id) { switch (c2h->id) {
case C2H_BT_INFO:
rtw_coex_bt_info_notify(rtwdev, c2h->payload, len);
break;
case C2H_WLAN_INFO:
rtw_coex_wl_fwdbginfo_notify(rtwdev, c2h->payload, len);
break;
case C2H_HALMAC: case C2H_HALMAC:
rtw_fw_c2h_cmd_handle_ext(rtwdev, skb); rtw_fw_c2h_cmd_handle_ext(rtwdev, skb);
break; break;
default: default:
break; break;
} }
mutex_unlock(&rtwdev->mutex);
}
void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
struct sk_buff *skb)
{
struct rtw_c2h_cmd *c2h;
u8 len;
c2h = (struct rtw_c2h_cmd *)(skb->data + pkt_offset);
len = skb->len - pkt_offset - 2;
*((u32 *)skb->cb) = pkt_offset;
rtw_dbg(rtwdev, RTW_DBG_FW, "recv C2H, id=0x%02x, seq=0x%02x, len=%d\n",
c2h->id, c2h->seq, len);
switch (c2h->id) {
case C2H_BT_MP_INFO:
rtw_coex_info_response(rtwdev, skb);
break;
default:
/* pass offset for further operation */
*((u32 *)skb->cb) = pkt_offset;
skb_queue_tail(&rtwdev->c2h_queue, skb);
ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work);
break;
}
} }
EXPORT_SYMBOL(rtw_fw_c2h_cmd_rx_irqsafe);
static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev,
u8 *h2c) u8 *h2c)
...@@ -181,6 +216,102 @@ void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para) ...@@ -181,6 +216,102 @@ void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para)
rtw_fw_send_h2c_packet(rtwdev, h2c_pkt); rtw_fw_send_h2c_packet(rtwdev, h2c_pkt);
} }
void rtw_fw_query_bt_info(struct rtw_dev *rtwdev)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_QUERY_BT_INFO);
SET_QUERY_BT_INFO(h2c_pkt, true);
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_WL_CH_INFO);
SET_WL_CH_INFO_LINK(h2c_pkt, link);
SET_WL_CH_INFO_CHNL(h2c_pkt, ch);
SET_WL_CH_INFO_BW(h2c_pkt, bw);
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_query_bt_mp_info(struct rtw_dev *rtwdev,
struct rtw_coex_info_req *req)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_QUERY_BT_MP_INFO);
SET_BT_MP_INFO_SEQ(h2c_pkt, req->seq);
SET_BT_MP_INFO_OP_CODE(h2c_pkt, req->op_code);
SET_BT_MP_INFO_PARA1(h2c_pkt, req->para1);
SET_BT_MP_INFO_PARA2(h2c_pkt, req->para2);
SET_BT_MP_INFO_PARA3(h2c_pkt, req->para3);
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
u8 index = 0 - bt_pwr_dec_lvl;
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_FORCE_BT_TX_POWER);
SET_BT_TX_POWER_INDEX(h2c_pkt, index);
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_IGNORE_WLAN_ACTION);
SET_IGNORE_WLAN_ACTION_EN(h2c_pkt, enable);
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev,
u8 para1, u8 para2, u8 para3, u8 para4, u8 para5)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_COEX_TDMA_TYPE);
SET_COEX_TDMA_TYPE_PARA1(h2c_pkt, para1);
SET_COEX_TDMA_TYPE_PARA2(h2c_pkt, para2);
SET_COEX_TDMA_TYPE_PARA3(h2c_pkt, para3);
SET_COEX_TDMA_TYPE_PARA4(h2c_pkt, para4);
SET_COEX_TDMA_TYPE_PARA5(h2c_pkt, para5);
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data)
{
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_BT_WIFI_CONTROL);
SET_BT_WIFI_CONTROL_OP_CODE(h2c_pkt, op_code);
SET_BT_WIFI_CONTROL_DATA1(h2c_pkt, *data);
SET_BT_WIFI_CONTROL_DATA2(h2c_pkt, *(data + 1));
SET_BT_WIFI_CONTROL_DATA3(h2c_pkt, *(data + 2));
SET_BT_WIFI_CONTROL_DATA4(h2c_pkt, *(data + 3));
SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, *(data + 4));
rtw_fw_send_h2c_command(rtwdev, h2c_pkt);
}
void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si) void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si)
{ {
u8 h2c_pkt[H2C_PKT_SIZE] = {0}; u8 h2c_pkt[H2C_PKT_SIZE] = {0};
......
...@@ -35,7 +35,9 @@ ...@@ -35,7 +35,9 @@
enum rtw_c2h_cmd_id { enum rtw_c2h_cmd_id {
C2H_BT_INFO = 0x09, C2H_BT_INFO = 0x09,
C2H_BT_MP_INFO = 0x0b,
C2H_HW_FEATURE_REPORT = 0x19, C2H_HW_FEATURE_REPORT = 0x19,
C2H_WLAN_INFO = 0x27,
C2H_HW_FEATURE_DUMP = 0xfd, C2H_HW_FEATURE_DUMP = 0xfd,
C2H_HALMAC = 0xff, C2H_HALMAC = 0xff,
}; };
...@@ -71,6 +73,14 @@ enum rtw_fw_rf_type { ...@@ -71,6 +73,14 @@ enum rtw_fw_rf_type {
FW_RF_MAX_TYPE = 0xF, FW_RF_MAX_TYPE = 0xF,
}; };
struct rtw_coex_info_req {
u8 seq;
u8 op_code;
u8 para1;
u8 para2;
u8 para3;
};
struct rtw_iqk_para { struct rtw_iqk_para {
u8 clear; u8 clear;
u8 segment_iqk; u8 segment_iqk;
...@@ -139,6 +149,14 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) ...@@ -139,6 +149,14 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
#define H2C_CMD_RA_INFO 0x40 #define H2C_CMD_RA_INFO 0x40
#define H2C_CMD_RSSI_MONITOR 0x42 #define H2C_CMD_RSSI_MONITOR 0x42
#define H2C_CMD_COEX_TDMA_TYPE 0x60
#define H2C_CMD_QUERY_BT_INFO 0x61
#define H2C_CMD_FORCE_BT_TX_POWER 0x62
#define H2C_CMD_IGNORE_WLAN_ACTION 0x63
#define H2C_CMD_WL_CH_INFO 0x66
#define H2C_CMD_QUERY_BT_MP_INFO 0x67
#define H2C_CMD_BT_WIFI_CONTROL 0x69
#define SET_H2C_CMD_ID_CLASS(h2c_pkt, value) \ #define SET_H2C_CMD_ID_CLASS(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(7, 0)) le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(7, 0))
...@@ -191,6 +209,50 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) ...@@ -191,6 +209,50 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16)) le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
#define SET_RA_INFO_RA_MASK3(h2c_pkt, value) \ #define SET_RA_INFO_RA_MASK3(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(31, 24)) le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(31, 24))
#define SET_QUERY_BT_INFO(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
#define SET_WL_CH_INFO_LINK(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
#define SET_WL_CH_INFO_CHNL(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
#define SET_WL_CH_INFO_BW(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
#define SET_BT_MP_INFO_SEQ(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 12))
#define SET_BT_MP_INFO_OP_CODE(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
#define SET_BT_MP_INFO_PARA1(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
#define SET_BT_MP_INFO_PARA2(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
#define SET_BT_MP_INFO_PARA3(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
#define SET_BT_TX_POWER_INDEX(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
#define SET_IGNORE_WLAN_ACTION_EN(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
#define SET_COEX_TDMA_TYPE_PARA1(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
#define SET_COEX_TDMA_TYPE_PARA2(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
#define SET_COEX_TDMA_TYPE_PARA3(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
#define SET_COEX_TDMA_TYPE_PARA4(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
#define SET_COEX_TDMA_TYPE_PARA5(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
#define SET_BT_WIFI_CONTROL_OP_CODE(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
#define SET_BT_WIFI_CONTROL_DATA1(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
#define SET_BT_WIFI_CONTROL_DATA2(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
#define SET_BT_WIFI_CONTROL_DATA3(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
#define SET_BT_WIFI_CONTROL_DATA4(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
#define SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, value) \
le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
static inline struct rtw_c2h_cmd *get_c2h_from_skb(struct sk_buff *skb) static inline struct rtw_c2h_cmd *get_c2h_from_skb(struct sk_buff *skb)
{ {
...@@ -200,12 +262,23 @@ static inline struct rtw_c2h_cmd *get_c2h_from_skb(struct sk_buff *skb) ...@@ -200,12 +262,23 @@ static inline struct rtw_c2h_cmd *get_c2h_from_skb(struct sk_buff *skb)
return (struct rtw_c2h_cmd *)(skb->data + pkt_offset); return (struct rtw_c2h_cmd *)(skb->data + pkt_offset);
} }
void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
struct sk_buff *skb);
void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
void rtw_fw_send_general_info(struct rtw_dev *rtwdev); void rtw_fw_send_general_info(struct rtw_dev *rtwdev);
void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev); void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev);
void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para); void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para);
void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev); void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev);
void rtw_fw_query_bt_info(struct rtw_dev *rtwdev);
void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw);
void rtw_fw_query_bt_mp_info(struct rtw_dev *rtwdev,
struct rtw_coex_info_req *req);
void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl);
void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable);
void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev,
u8 para1, u8 para2, u8 para3, u8 para4, u8 para5);
void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data);
void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si); void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si); void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool conn); void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool conn);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "tx.h" #include "tx.h"
#include "fw.h" #include "fw.h"
#include "mac.h" #include "mac.h"
#include "coex.h"
#include "ps.h" #include "ps.h"
#include "reg.h" #include "reg.h"
#include "debug.h" #include "debug.h"
...@@ -253,6 +254,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, ...@@ -253,6 +254,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
enum rtw_net_type net_type; enum rtw_net_type net_type;
if (conf->assoc) { if (conf->assoc) {
rtw_coex_connect_notify(rtwdev, COEX_ASSOCIATE_FINISH);
net_type = RTW_NET_MGD_LINKED; net_type = RTW_NET_MGD_LINKED;
chip->ops->do_iqk(rtwdev); chip->ops->do_iqk(rtwdev);
...@@ -262,6 +264,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, ...@@ -262,6 +264,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw,
rtw_add_rsvd_page(rtwdev, RSVD_NULL, true); rtw_add_rsvd_page(rtwdev, RSVD_NULL, true);
rtw_fw_download_rsvd_page(rtwdev, vif); rtw_fw_download_rsvd_page(rtwdev, vif);
rtw_send_rsvd_page_h2c(rtwdev); rtw_send_rsvd_page_h2c(rtwdev);
rtw_coex_media_status_notify(rtwdev, conf->assoc);
} else { } else {
net_type = RTW_NET_NO_LINK; net_type = RTW_NET_NO_LINK;
rtwvif->aid = 0; rtwvif->aid = 0;
...@@ -469,6 +472,8 @@ static void rtw_ops_sw_scan_start(struct ieee80211_hw *hw, ...@@ -469,6 +472,8 @@ static void rtw_ops_sw_scan_start(struct ieee80211_hw *hw,
config |= PORT_SET_MAC_ADDR; config |= PORT_SET_MAC_ADDR;
rtw_vif_port_config(rtwdev, rtwvif, config); rtw_vif_port_config(rtwdev, rtwvif, config);
rtw_coex_scan_notify(rtwdev, COEX_SCAN_START);
rtw_flag_set(rtwdev, RTW_FLAG_DIG_DISABLE); rtw_flag_set(rtwdev, RTW_FLAG_DIG_DISABLE);
rtw_flag_set(rtwdev, RTW_FLAG_SCANNING); rtw_flag_set(rtwdev, RTW_FLAG_SCANNING);
...@@ -491,6 +496,19 @@ static void rtw_ops_sw_scan_complete(struct ieee80211_hw *hw, ...@@ -491,6 +496,19 @@ static void rtw_ops_sw_scan_complete(struct ieee80211_hw *hw,
config |= PORT_SET_MAC_ADDR; config |= PORT_SET_MAC_ADDR;
rtw_vif_port_config(rtwdev, rtwvif, config); rtw_vif_port_config(rtwdev, rtwvif, config);
rtw_coex_scan_notify(rtwdev, COEX_SCAN_FINISH);
mutex_unlock(&rtwdev->mutex);
}
static void rtw_ops_mgd_prepare_tx(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
u16 duration)
{
struct rtw_dev *rtwdev = hw->priv;
mutex_lock(&rtwdev->mutex);
rtw_coex_connect_notify(rtwdev, COEX_ASSOCIATE_START);
mutex_unlock(&rtwdev->mutex); mutex_unlock(&rtwdev->mutex);
} }
...@@ -509,5 +527,6 @@ const struct ieee80211_ops rtw_ops = { ...@@ -509,5 +527,6 @@ const struct ieee80211_ops rtw_ops = {
.ampdu_action = rtw_ops_ampdu_action, .ampdu_action = rtw_ops_ampdu_action,
.sw_scan_start = rtw_ops_sw_scan_start, .sw_scan_start = rtw_ops_sw_scan_start,
.sw_scan_complete = rtw_ops_sw_scan_complete, .sw_scan_complete = rtw_ops_sw_scan_complete,
.mgd_prepare_tx = rtw_ops_mgd_prepare_tx,
}; };
EXPORT_SYMBOL(rtw_ops); EXPORT_SYMBOL(rtw_ops);
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "ps.h" #include "ps.h"
#include "sec.h" #include "sec.h"
#include "mac.h" #include "mac.h"
#include "coex.h"
#include "phy.h" #include "phy.h"
#include "reg.h" #include "reg.h"
#include "efuse.h" #include "efuse.h"
...@@ -149,6 +150,7 @@ static void rtw_watch_dog_work(struct work_struct *work) ...@@ -149,6 +150,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
struct rtw_dev *rtwdev = container_of(work, struct rtw_dev, struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
watch_dog_work.work); watch_dog_work.work);
struct rtw_watch_dog_iter_data data = {}; struct rtw_watch_dog_iter_data data = {};
bool busy_traffic = rtw_flag_check(rtwdev, RTW_FLAG_BUSY_TRAFFIC);
if (!rtw_flag_check(rtwdev, RTW_FLAG_RUNNING)) if (!rtw_flag_check(rtwdev, RTW_FLAG_RUNNING))
return; return;
...@@ -156,6 +158,14 @@ static void rtw_watch_dog_work(struct work_struct *work) ...@@ -156,6 +158,14 @@ static void rtw_watch_dog_work(struct work_struct *work)
ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->watch_dog_work, ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->watch_dog_work,
RTW_WATCH_DOG_DELAY_TIME); RTW_WATCH_DOG_DELAY_TIME);
if (rtwdev->stats.tx_cnt > 100 || rtwdev->stats.rx_cnt > 100)
rtw_flag_set(rtwdev, RTW_FLAG_BUSY_TRAFFIC);
else
rtw_flag_clear(rtwdev, RTW_FLAG_BUSY_TRAFFIC);
if (busy_traffic != rtw_flag_check(rtwdev, RTW_FLAG_BUSY_TRAFFIC))
rtw_coex_wl_status_change_notify(rtwdev);
/* reset tx/rx statictics */ /* reset tx/rx statictics */
rtwdev->stats.tx_unicast = 0; rtwdev->stats.tx_unicast = 0;
rtwdev->stats.rx_unicast = 0; rtwdev->stats.rx_unicast = 0;
...@@ -298,6 +308,15 @@ void rtw_set_channel(struct rtw_dev *rtwdev) ...@@ -298,6 +308,15 @@ void rtw_set_channel(struct rtw_dev *rtwdev)
chip->ops->set_channel(rtwdev, center_chan, bandwidth, primary_chan_idx); chip->ops->set_channel(rtwdev, center_chan, bandwidth, primary_chan_idx);
if (hal->current_band_type == RTW_BAND_5G) {
rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_5G);
} else {
if (rtw_flag_check(rtwdev, RTW_FLAG_SCANNING))
rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_24G);
else
rtw_coex_switchband_notify(rtwdev, COEX_SWITCH_TO_24G_NOFORSCAN);
}
rtw_phy_set_tx_power_level(rtwdev, center_chan); rtw_phy_set_tx_power_level(rtwdev, center_chan);
} }
...@@ -641,6 +660,7 @@ static int rtw_power_on(struct rtw_dev *rtwdev) ...@@ -641,6 +660,7 @@ static int rtw_power_on(struct rtw_dev *rtwdev)
{ {
struct rtw_chip_info *chip = rtwdev->chip; struct rtw_chip_info *chip = rtwdev->chip;
struct rtw_fw_state *fw = &rtwdev->fw; struct rtw_fw_state *fw = &rtwdev->fw;
bool wifi_only;
int ret; int ret;
ret = rtw_hci_setup(rtwdev); ret = rtw_hci_setup(rtwdev);
...@@ -684,6 +704,10 @@ static int rtw_power_on(struct rtw_dev *rtwdev) ...@@ -684,6 +704,10 @@ static int rtw_power_on(struct rtw_dev *rtwdev)
goto err_off; goto err_off;
} }
wifi_only = !rtwdev->efuse.btcoex;
rtw_coex_power_on_setting(rtwdev);
rtw_coex_init_hw_config(rtwdev, wifi_only);
return 0; return 0;
err_off: err_off:
...@@ -722,10 +746,15 @@ static void rtw_power_off(struct rtw_dev *rtwdev) ...@@ -722,10 +746,15 @@ static void rtw_power_off(struct rtw_dev *rtwdev)
void rtw_core_stop(struct rtw_dev *rtwdev) void rtw_core_stop(struct rtw_dev *rtwdev)
{ {
struct rtw_coex *coex = &rtwdev->coex;
rtw_flag_clear(rtwdev, RTW_FLAG_RUNNING); rtw_flag_clear(rtwdev, RTW_FLAG_RUNNING);
rtw_flag_clear(rtwdev, RTW_FLAG_FW_RUNNING); rtw_flag_clear(rtwdev, RTW_FLAG_FW_RUNNING);
cancel_delayed_work_sync(&rtwdev->watch_dog_work); cancel_delayed_work_sync(&rtwdev->watch_dog_work);
cancel_delayed_work_sync(&coex->bt_relink_work);
cancel_delayed_work_sync(&coex->bt_reenable_work);
cancel_delayed_work_sync(&coex->defreeze_work);
rtw_power_off(rtwdev); rtw_power_off(rtwdev);
} }
...@@ -876,7 +905,6 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) ...@@ -876,7 +905,6 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev)
struct rtw_chip_info *chip = rtwdev->chip; struct rtw_chip_info *chip = rtwdev->chip;
struct rtw_hal *hal = &rtwdev->hal; struct rtw_hal *hal = &rtwdev->hal;
struct rtw_efuse *efuse = &rtwdev->efuse; struct rtw_efuse *efuse = &rtwdev->efuse;
u32 wl_bt_pwr_ctrl;
int ret = 0; int ret = 0;
switch (rtw_hci_type(rtwdev)) { switch (rtw_hci_type(rtwdev)) {
...@@ -888,9 +916,6 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) ...@@ -888,9 +916,6 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev)
return -EINVAL; return -EINVAL;
} }
wl_bt_pwr_ctrl = rtw_read32(rtwdev, REG_WL_BT_PWR_CTRL);
if (wl_bt_pwr_ctrl & BIT_BT_FUNC_EN)
rtwdev->efuse.btcoex = true;
hal->chip_version = rtw_read32(rtwdev, REG_SYS_CFG1); hal->chip_version = rtw_read32(rtwdev, REG_SYS_CFG1);
hal->fab_version = BIT_GET_VENDOR_ID(hal->chip_version) >> 2; hal->fab_version = BIT_GET_VENDOR_ID(hal->chip_version) >> 2;
hal->cut_version = BIT_GET_CHIP_VER(hal->chip_version); hal->cut_version = BIT_GET_CHIP_VER(hal->chip_version);
...@@ -1044,11 +1069,14 @@ static int rtw_chip_efuse_info_setup(struct rtw_dev *rtwdev) ...@@ -1044,11 +1069,14 @@ static int rtw_chip_efuse_info_setup(struct rtw_dev *rtwdev)
efuse->lna_type_5g = 0; efuse->lna_type_5g = 0;
if (efuse->channel_plan == 0xff) if (efuse->channel_plan == 0xff)
efuse->channel_plan = 0x7f; efuse->channel_plan = 0x7f;
if (efuse->rf_board_option == 0xff)
efuse->rf_board_option = 0;
if (efuse->bt_setting & BIT(0)) if (efuse->bt_setting & BIT(0))
efuse->share_ant = true; efuse->share_ant = true;
if (efuse->regd == 0xff) if (efuse->regd == 0xff)
efuse->regd = 0; efuse->regd = 0;
efuse->btcoex = (efuse->rf_board_option & 0xe0) == 0x20;
efuse->ext_pa_2g = efuse->pa_type_2g & BIT(4) ? 1 : 0; efuse->ext_pa_2g = efuse->pa_type_2g & BIT(4) ? 1 : 0;
efuse->ext_lna_2g = efuse->lna_type_2g & BIT(3) ? 1 : 0; efuse->ext_lna_2g = efuse->lna_type_2g & BIT(3) ? 1 : 0;
efuse->ext_pa_5g = efuse->pa_type_5g & BIT(0) ? 1 : 0; efuse->ext_pa_5g = efuse->pa_type_5g & BIT(0) ? 1 : 0;
...@@ -1111,6 +1139,7 @@ EXPORT_SYMBOL(rtw_chip_info_setup); ...@@ -1111,6 +1139,7 @@ EXPORT_SYMBOL(rtw_chip_info_setup);
int rtw_core_init(struct rtw_dev *rtwdev) int rtw_core_init(struct rtw_dev *rtwdev)
{ {
struct rtw_coex *coex = &rtwdev->coex;
int ret; int ret;
INIT_LIST_HEAD(&rtwdev->rsvd_page_list); INIT_LIST_HEAD(&rtwdev->rsvd_page_list);
...@@ -1120,8 +1149,12 @@ int rtw_core_init(struct rtw_dev *rtwdev) ...@@ -1120,8 +1149,12 @@ int rtw_core_init(struct rtw_dev *rtwdev)
INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work); INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work);
INIT_DELAYED_WORK(&rtwdev->lps_work, rtw_lps_work); INIT_DELAYED_WORK(&rtwdev->lps_work, rtw_lps_work);
INIT_DELAYED_WORK(&coex->bt_relink_work, rtw_coex_bt_relink_work);
INIT_DELAYED_WORK(&coex->bt_reenable_work, rtw_coex_bt_reenable_work);
INIT_DELAYED_WORK(&coex->defreeze_work, rtw_coex_defreeze_work);
INIT_WORK(&rtwdev->c2h_work, rtw_c2h_work); INIT_WORK(&rtwdev->c2h_work, rtw_c2h_work);
skb_queue_head_init(&rtwdev->c2h_queue); skb_queue_head_init(&rtwdev->c2h_queue);
skb_queue_head_init(&rtwdev->coex.queue);
skb_queue_head_init(&rtwdev->tx_report.queue); skb_queue_head_init(&rtwdev->tx_report.queue);
spin_lock_init(&rtwdev->dm_lock); spin_lock_init(&rtwdev->dm_lock);
...@@ -1130,8 +1163,11 @@ int rtw_core_init(struct rtw_dev *rtwdev) ...@@ -1130,8 +1163,11 @@ int rtw_core_init(struct rtw_dev *rtwdev)
spin_lock_init(&rtwdev->tx_report.q_lock); spin_lock_init(&rtwdev->tx_report.q_lock);
mutex_init(&rtwdev->mutex); mutex_init(&rtwdev->mutex);
mutex_init(&rtwdev->coex.mutex);
mutex_init(&rtwdev->hal.tx_power_mutex); mutex_init(&rtwdev->hal.tx_power_mutex);
init_waitqueue_head(&rtwdev->coex.wait);
rtwdev->sec.total_cam_num = 32; rtwdev->sec.total_cam_num = 32;
rtwdev->hal.current_channel = 1; rtwdev->hal.current_channel = 1;
set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map); set_bit(RTW_BC_MC_MACID, rtwdev->mac_id_map);
...@@ -1174,6 +1210,7 @@ void rtw_core_deinit(struct rtw_dev *rtwdev) ...@@ -1174,6 +1210,7 @@ void rtw_core_deinit(struct rtw_dev *rtwdev)
} }
mutex_destroy(&rtwdev->mutex); mutex_destroy(&rtwdev->mutex);
mutex_destroy(&rtwdev->coex.mutex);
mutex_destroy(&rtwdev->hal.tx_power_mutex); mutex_destroy(&rtwdev->hal.tx_power_mutex);
} }
EXPORT_SYMBOL(rtw_core_deinit); EXPORT_SYMBOL(rtw_core_deinit);
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "pci.h" #include "pci.h"
#include "tx.h" #include "tx.h"
#include "rx.h" #include "rx.h"
#include "fw.h"
#include "debug.h" #include "debug.h"
static u32 rtw_pci_tx_queue_idx_addr[] = { static u32 rtw_pci_tx_queue_idx_addr[] = {
...@@ -206,6 +207,23 @@ static int rtw_pci_reset_rx_desc(struct rtw_dev *rtwdev, struct sk_buff *skb, ...@@ -206,6 +207,23 @@ static int rtw_pci_reset_rx_desc(struct rtw_dev *rtwdev, struct sk_buff *skb,
return 0; return 0;
} }
static void rtw_pci_sync_rx_desc_device(struct rtw_dev *rtwdev, dma_addr_t dma,
struct rtw_pci_rx_ring *rx_ring,
u32 idx, u32 desc_sz)
{
struct device *dev = rtwdev->dev;
struct rtw_pci_rx_buffer_desc *buf_desc;
int buf_sz = RTK_PCI_RX_BUF_SIZE;
dma_sync_single_for_device(dev, dma, buf_sz, DMA_FROM_DEVICE);
buf_desc = (struct rtw_pci_rx_buffer_desc *)(rx_ring->r.head +
idx * desc_sz);
memset(buf_desc, 0, sizeof(*buf_desc));
buf_desc->buf_size = cpu_to_le16(RTK_PCI_RX_BUF_SIZE);
buf_desc->dma = cpu_to_le32(dma);
}
static int rtw_pci_init_rx_ring(struct rtw_dev *rtwdev, static int rtw_pci_init_rx_ring(struct rtw_dev *rtwdev,
struct rtw_pci_rx_ring *rx_ring, struct rtw_pci_rx_ring *rx_ring,
u8 desc_size, u32 len) u8 desc_size, u32 len)
...@@ -765,6 +783,7 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci, ...@@ -765,6 +783,7 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
u32 pkt_offset; u32 pkt_offset;
u32 pkt_desc_sz = chip->rx_pkt_desc_sz; u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
u32 buf_desc_sz = chip->rx_buf_desc_sz; u32 buf_desc_sz = chip->rx_buf_desc_sz;
u32 new_len;
u8 *rx_desc; u8 *rx_desc;
dma_addr_t dma; dma_addr_t dma;
...@@ -783,8 +802,8 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci, ...@@ -783,8 +802,8 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
rtw_pci_dma_check(rtwdev, ring, cur_rp); rtw_pci_dma_check(rtwdev, ring, cur_rp);
skb = ring->buf[cur_rp]; skb = ring->buf[cur_rp];
dma = *((dma_addr_t *)skb->cb); dma = *((dma_addr_t *)skb->cb);
pci_unmap_single(rtwpci->pdev, dma, RTK_PCI_RX_BUF_SIZE, dma_sync_single_for_cpu(rtwdev->dev, dma, RTK_PCI_RX_BUF_SIZE,
PCI_DMA_FROMDEVICE); DMA_FROM_DEVICE);
rx_desc = skb->data; rx_desc = skb->data;
chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status); chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
...@@ -792,40 +811,32 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci, ...@@ -792,40 +811,32 @@ static void rtw_pci_rx_isr(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz + pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
pkt_stat.shift; pkt_stat.shift;
if (pkt_stat.is_c2h) { /* allocate a new skb for this frame,
/* keep rx_desc, halmac needs it */ * discard the frame if none available
skb_put(skb, pkt_stat.pkt_len + pkt_offset); */
new_len = pkt_stat.pkt_len + pkt_offset;
new = dev_alloc_skb(new_len);
if (WARN_ONCE(!new, "rx routine starvation\n"))
goto next_rp;
/* pass offset for further operation */ /* put the DMA data including rx_desc from phy to new skb */
*((u32 *)skb->cb) = pkt_offset; skb_put_data(new, skb->data, new_len);
skb_queue_tail(&rtwdev->c2h_queue, skb);
ieee80211_queue_work(rtwdev->hw, &rtwdev->c2h_work); if (pkt_stat.is_c2h) {
rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, new);
} else { } else {
/* remove rx_desc, maybe use skb_pull? */ /* remove rx_desc */
skb_put(skb, pkt_stat.pkt_len); skb_pull(new, pkt_offset);
skb_reserve(skb, pkt_offset);
rtw_rx_stats(rtwdev, pkt_stat.vif, new);
/* alloc a smaller skb to mac80211 */
new = dev_alloc_skb(pkt_stat.pkt_len);
if (!new) {
new = skb;
} else {
skb_put_data(new, skb->data, skb->len);
dev_kfree_skb_any(skb);
}
/* TODO: merge into rx.c */
rtw_rx_stats(rtwdev, pkt_stat.vif, skb);
memcpy(new->cb, &rx_status, sizeof(rx_status)); memcpy(new->cb, &rx_status, sizeof(rx_status));
ieee80211_rx_irqsafe(rtwdev->hw, new); ieee80211_rx_irqsafe(rtwdev->hw, new);
} }
/* skb delivered to mac80211, alloc a new one in rx ring */ next_rp:
new = dev_alloc_skb(RTK_PCI_RX_BUF_SIZE); /* new skb delivered to mac80211, re-enable original skb DMA */
if (WARN(!new, "rx routine starvation\n")) rtw_pci_sync_rx_desc_device(rtwdev, dma, ring, cur_rp,
return; buf_desc_sz);
ring->buf[cur_rp] = new;
rtw_pci_reset_rx_desc(rtwdev, new, ring, cur_rp, buf_desc_sz);
/* host read next element in ring */ /* host read next element in ring */
if (++cur_rp >= ring->r.len) if (++cur_rp >= ring->r.len)
...@@ -977,7 +988,6 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev) ...@@ -977,7 +988,6 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
u16 cut; u16 cut;
u16 value; u16 value;
u16 offset; u16 offset;
u16 ip_sel;
int i; int i;
cut = BIT(0) << rtwdev->hal.cut_version; cut = BIT(0) << rtwdev->hal.cut_version;
...@@ -990,7 +1000,6 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev) ...@@ -990,7 +1000,6 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
break; break;
offset = para->offset; offset = para->offset;
value = para->value; value = para->value;
ip_sel = para->ip_sel;
if (para->ip_sel == RTW_IP_SEL_PHY) if (para->ip_sel == RTW_IP_SEL_PHY)
rtw_mdio_write(rtwdev, offset, value, true); rtw_mdio_write(rtwdev, offset, value, true);
else else
...@@ -1005,7 +1014,6 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev) ...@@ -1005,7 +1014,6 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
break; break;
offset = para->offset; offset = para->offset;
value = para->value; value = para->value;
ip_sel = para->ip_sel;
if (para->ip_sel == RTW_IP_SEL_PHY) if (para->ip_sel == RTW_IP_SEL_PHY)
rtw_mdio_write(rtwdev, offset, value, false); rtw_mdio_write(rtwdev, offset, value, false);
else else
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册