rtw88: add beacon function setting
authorChin-Yen Lee <timlee@realtek.com>
Fri, 14 Jun 2019 07:24:07 +0000 (15:24 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 25 Jun 2019 05:08:55 +0000 (08:08 +0300)
Add beacon function setting routines for each hardware port.
If beacon function is not enabled, the hardware is not able
to synchronize with AP's beacon and can miss the beacons
under some scenarios such as PS mode.

For AP and Adhoc modes that require to send beacons, do not
update the TSF, otherwise the beacon interval may be affected.

Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/mac80211.c
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h

index 61436bb37427cecc97f0ff81216b7a0c2d82a7c0..abe6a148673bf4134a7f0217cc7fecf0eb0b6c21 100644 (file)
@@ -85,30 +85,35 @@ static const struct rtw_vif_port rtw_vif_port[] = {
                .bssid          = {.addr = 0x0618},
                .net_type       = {.addr = 0x0100, .mask = 0x30000},
                .aid            = {.addr = 0x06a8, .mask = 0x7ff},
+               .bcn_ctrl       = {.addr = 0x0550, .mask = 0xff},
        },
        [1] = {
                .mac_addr       = {.addr = 0x0700},
                .bssid          = {.addr = 0x0708},
                .net_type       = {.addr = 0x0100, .mask = 0xc0000},
                .aid            = {.addr = 0x0710, .mask = 0x7ff},
+               .bcn_ctrl       = {.addr = 0x0551, .mask = 0xff},
        },
        [2] = {
                .mac_addr       = {.addr = 0x1620},
                .bssid          = {.addr = 0x1628},
                .net_type       = {.addr = 0x1100, .mask = 0x3},
                .aid            = {.addr = 0x1600, .mask = 0x7ff},
+               .bcn_ctrl       = {.addr = 0x0578, .mask = 0xff},
        },
        [3] = {
                .mac_addr       = {.addr = 0x1630},
                .bssid          = {.addr = 0x1638},
                .net_type       = {.addr = 0x1100, .mask = 0xc},
                .aid            = {.addr = 0x1604, .mask = 0x7ff},
+               .bcn_ctrl       = {.addr = 0x0579, .mask = 0xff},
        },
        [4] = {
                .mac_addr       = {.addr = 0x1640},
                .bssid          = {.addr = 0x1648},
                .net_type       = {.addr = 0x1100, .mask = 0x30},
                .aid            = {.addr = 0x1608, .mask = 0x7ff},
+               .bcn_ctrl       = {.addr = 0x057a, .mask = 0xff},
        },
 };
 
@@ -120,6 +125,7 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw,
        enum rtw_net_type net_type;
        u32 config = 0;
        u8 port = 0;
+       u8 bcn_ctrl = 0;
 
        rtwvif->port = port;
        rtwvif->vif = vif;
@@ -136,13 +142,16 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw,
        case NL80211_IFTYPE_AP:
        case NL80211_IFTYPE_MESH_POINT:
                net_type = RTW_NET_AP_MODE;
+               bcn_ctrl = BIT_EN_BCN_FUNCTION | BIT_DIS_TSF_UDT;
                break;
        case NL80211_IFTYPE_ADHOC:
                net_type = RTW_NET_AD_HOC;
+               bcn_ctrl = BIT_EN_BCN_FUNCTION | BIT_DIS_TSF_UDT;
                break;
        case NL80211_IFTYPE_STATION:
        default:
                net_type = RTW_NET_NO_LINK;
+               bcn_ctrl = BIT_EN_BCN_FUNCTION;
                break;
        }
 
@@ -150,6 +159,8 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw,
        config |= PORT_SET_MAC_ADDR;
        rtwvif->net_type = net_type;
        config |= PORT_SET_NET_TYPE;
+       rtwvif->bcn_ctrl = bcn_ctrl;
+       config |= PORT_SET_BCN_CTRL;
        rtw_vif_port_config(rtwdev, rtwvif, config);
 
        mutex_unlock(&rtwdev->mutex);
@@ -173,6 +184,8 @@ static void rtw_ops_remove_interface(struct ieee80211_hw *hw,
        config |= PORT_SET_MAC_ADDR;
        rtwvif->net_type = RTW_NET_NO_LINK;
        config |= PORT_SET_NET_TYPE;
+       rtwvif->bcn_ctrl = 0;
+       config |= PORT_SET_BCN_CTRL;
        rtw_vif_port_config(rtwdev, rtwvif, config);
 
        mutex_unlock(&rtwdev->mutex);
index 306d7992138885a29a515860baad23455e0fb227..b8e0519f655f4544923ba361d55ed741f92ac2e2 100644 (file)
@@ -308,6 +308,11 @@ void rtw_vif_port_config(struct rtw_dev *rtwdev,
                mask = rtwvif->conf->aid.mask;
                rtw_write32_mask(rtwdev, addr, mask, rtwvif->aid);
        }
+       if (config & PORT_SET_BCN_CTRL) {
+               addr = rtwvif->conf->bcn_ctrl.addr;
+               mask = rtwvif->conf->bcn_ctrl.mask;
+               rtw_write8_mask(rtwdev, addr, mask, rtwvif->bcn_ctrl);
+       }
 }
 
 static u8 hw_bw_cap_to_bitamp(u8 bw_cap)
index 00fc77fb9b5497c59fc3c8454ee550a2019c70a6..414d21f987dde187d60587d786e6af75e2a2a76e 100644 (file)
@@ -431,6 +431,7 @@ enum rtw_vif_port_set {
        PORT_SET_BSSID          = BIT(1),
        PORT_SET_NET_TYPE       = BIT(2),
        PORT_SET_AID            = BIT(3),
+       PORT_SET_BCN_CTRL       = BIT(4),
 };
 
 struct rtw_vif_port {
@@ -438,6 +439,7 @@ struct rtw_vif_port {
        struct rtw_hw_reg bssid;
        struct rtw_hw_reg net_type;
        struct rtw_hw_reg aid;
+       struct rtw_hw_reg bcn_ctrl;
 };
 
 struct rtw_tx_pkt_info {
@@ -591,6 +593,7 @@ struct rtw_vif {
        u8 mac_addr[ETH_ALEN];
        u8 bssid[ETH_ALEN];
        u8 port;
+       u8 bcn_ctrl;
        const struct rtw_vif_port *conf;
 
        struct rtw_traffic_stats stats;