hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_iapsta.c
....@@ -154,6 +154,12 @@
154154 ENC_TKIPAES
155155 } encmode_t;
156156
157
+typedef enum MAPSTA_MODE {
158
+ MCHAN_APSTA_NOT_ALLOW = 0,
159
+ MCHAN_APSTA_SBSC,
160
+ MCHAN_APSTA_NO_RESTRICT
161
+} mapsta_mode_t;
162
+
157163 #ifdef STA_MGMT
158164 typedef struct wl_sta_info {
159165 int ifidx;
....@@ -270,12 +276,13 @@
270276 #endif /* WL_EXT_RECONNECT && WL_CFG80211 */
271277 } wl_if_info_t;
272278
279
+u8 *g_ioctl_buf = NULL;
280
+
273281 typedef struct wl_apsta_params {
274282 struct wl_if_info if_info[MAX_IF_NUM];
275283 #ifdef WLDWDS
276284 struct wl_dwds_info dwds_info[MAX_DWDS_IF_NUM];
277285 #endif /* WLDWDS */
278
- u8 *ioctl_buf;
279286 bool init;
280287 int rsdb;
281288 bool vsdb;
....@@ -1933,6 +1940,7 @@
19331940 if (!auto_chan) {
19341941 auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
19351942 cur_chan_info->band);
1943
+ auto_chan = wf_chspec_ctlchan(auto_chan);
19361944 }
19371945 if (auto_chan)
19381946 cur_chan_info->chan = auto_chan;
....@@ -1954,6 +1962,7 @@
19541962 if (!auto_chan) {
19551963 auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
19561964 cur_chan_info->band);
1965
+ auto_chan = wf_chspec_ctlchan(auto_chan);
19571966 }
19581967 if (auto_chan) {
19591968 cur_chan_info->chan = auto_chan;
....@@ -1967,6 +1976,7 @@
19671976 } else {
19681977 auto_chan = wl_ext_autochannel(cur_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
19691978 cur_chan_info->band);
1979
+ auto_chan = wf_chspec_ctlchan(auto_chan);
19701980 if (auto_chan) {
19711981 cur_chan_info->chan = auto_chan;
19721982 }
....@@ -2005,6 +2015,7 @@
20052015 if (!auto_chan) {
20062016 auto_chan = wl_ext_autochannel(tgt_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
20072017 tgt_chan_info->band);
2018
+ auto_chan = wf_chspec_ctlchan(auto_chan);
20082019 }
20092020 if (auto_chan) {
20102021 tgt_chan_info->chan = auto_chan;
....@@ -2017,6 +2028,7 @@
20172028 if (!auto_chan) {
20182029 auto_chan = wl_ext_autochannel(tgt_if->dev, ACS_FW_BIT|ACS_DRV_BIT,
20192030 tgt_chan_info->band);
2031
+ auto_chan = wf_chspec_ctlchan(auto_chan);
20202032 }
20212033 } else {
20222034 tgt_chan_info->chan = 0;
....@@ -2488,6 +2500,7 @@
24882500 if (wl_ext_master_if(cur_if) && apsta_params->acs) {
24892501 chan_info->chan = wl_ext_autochannel(cur_if->dev, apsta_params->acs,
24902502 chan_info->band);
2503
+ chan_info->chan = wf_chspec_ctlchan(chan_info->chan);
24912504 }
24922505 chan_info->chan = wl_ext_move_cur_channel(apsta_params, cur_if);
24932506 if (chan_info->chan) {
....@@ -4289,7 +4302,8 @@
42894302 }
42904303 }
42914304 } else {
4292
- WL_ERR(("Unknown auth_alg=%d or auth_seq=%d\n", auth_alg, auth_seq));
4305
+ IAPSTA_ERROR(dev->name, "Unknown auth_alg=%d or auth_seq=%d\n",
4306
+ auth_alg, auth_seq);
42934307 }
42944308
42954309 return;
....@@ -4395,16 +4409,11 @@
43954409 static void
43964410 wl_ampdu_dump(struct net_device *dev)
43974411 {
4398
- struct dhd_pub *dhd = dhd_get_pub(dev);
4399
- struct wl_apsta_params *apsta_params = dhd->iapsta_params;
4400
- char *ioctl_buf = apsta_params->ioctl_buf, *buf = NULL;
4412
+ char *ioctl_buf = g_ioctl_buf, *buf = NULL;
44014413 char *tx_pch_start, *tx_pch_end, *rx_pch_start, *rx_pch_end;
44024414 int ret = 0, max_len, tx_len, rx_len;
44034415
44044416 if (!(android_msg_level & ANDROID_AMPDU_LEVEL))
4405
- return;
4406
-
4407
- if (!ioctl_buf)
44084417 return;
44094418
44104419 memset(ioctl_buf, 0, WL_DUMP_BUF_LEN);
....@@ -4470,11 +4479,9 @@
44704479 static void
44714480 wl_tvpm_dump(struct net_device *dev)
44724481 {
4473
- struct dhd_pub *dhd = dhd_get_pub(dev);
4474
- struct wl_apsta_params *apsta_params = dhd->iapsta_params;
44754482 wl_tvpm_req_t* tvpm_req = NULL;
44764483 size_t reqlen = sizeof(wl_tvpm_req_t) + sizeof(wl_tvpm_status_t);
4477
- uint8 *outbuf = apsta_params->ioctl_buf;
4484
+ uint8 *outbuf = g_ioctl_buf;
44784485 size_t outlen = WLC_IOCTL_MEDLEN;
44794486 wl_tvpm_status_t* status;
44804487 int ret, phy_temp = 0;
....@@ -4545,6 +4552,8 @@
45454552 wldev_ioctl(dev, WLC_GET_RSSI, &scb_val, sizeof(scb_val_t), 0);
45464553 rssi_ant_p->count = 1;
45474554 rssi_ant_p->rssi_ant[0] = dtoh32(scb_val.val);
4555
+ } else {
4556
+ rssi_ant_p->count = 0;
45484557 }
45494558 }
45504559 for (i=0; i<rssi_ant_p->count && rssi_ant_p->rssi_ant[i]; i++) {
....@@ -4570,9 +4579,7 @@
45704579 static void
45714580 wl_sta_info_dump(struct net_device *dev, struct ether_addr *mac)
45724581 {
4573
- struct dhd_pub *dhd = dhd_get_pub(dev);
4574
- struct wl_apsta_params *apsta_params = dhd->iapsta_params;
4575
- void *buf = apsta_params->ioctl_buf;
4582
+ void *buf = g_ioctl_buf;
45764583 sta_info_v4_t *sta = NULL;
45774584 char rssi_buf[16];
45784585 int ret;
....@@ -4723,7 +4730,7 @@
47234730 tmp_if = &apsta_params->if_info[i];
47244731 if (tmp_if->dev &&
47254732 (tmp_if->ifmode == ISTA_MODE || tmp_if->ifmode == IGC_MODE) &&
4726
- wl_ext_associated(tmp_if->dev)) {
4733
+ wl_get_isam_status(tmp_if, STA_CONNECTED)) {
47274734 wl_tput_monitor(dhd, tmp_if->ifidx, &tmp_if->tput_info);
47284735 monitor_if[i] = TRUE;
47294736 }
....@@ -5112,7 +5119,7 @@
51125119 {
51135120 struct dhd_pub *dhd = dhd_get_pub(cur_if->dev);
51145121 struct wl_apsta_params *apsta_params = dhd->iapsta_params;
5115
- char *iovar_buf = apsta_params->ioctl_buf;
5122
+ char *iovar_buf = g_ioctl_buf;
51165123 uint32 corerev = 0;
51175124 wl_cnt_info_t *cntinfo;
51185125 uint16 ver;
....@@ -5971,6 +5978,7 @@
59715978 (chan_5g && cur_if->chan_info.band == WLC_BAND_5G)) {
59725979 cur_if->chan_info.chan = wl_ext_autochannel(cur_if->dev, apsta_params->acs,
59735980 cur_if->chan_info.band);
5981
+ cur_if->chan_info.chan = wf_chspec_ctlchan(cur_if->chan_info.chan);
59745982 } else {
59755983 IAPSTA_ERROR(ifname, "invalid channel\n");
59765984 ret = -1;
....@@ -6688,6 +6696,28 @@
66886696 }
66896697
66906698 static void
6699
+wl_ext_iapsta_get_mapsta_mode(struct net_device *net)
6700
+{
6701
+ struct dhd_pub *dhd = dhd_get_pub(net);
6702
+ struct wl_apsta_params *apsta_params = dhd->iapsta_params;
6703
+ int ret, mapsta_mode;
6704
+
6705
+ ret = wldev_iovar_getint(net, "mapsta_mode", &mapsta_mode);
6706
+ if (ret) {
6707
+ IAPSTA_INFO(net->name, "not supported %d\n", ret);
6708
+ mapsta_mode = MCHAN_APSTA_NOT_ALLOW;
6709
+ }
6710
+
6711
+ if (mapsta_mode == MCHAN_APSTA_SBSC)
6712
+ apsta_params->rsdb = 1;
6713
+ else if (mapsta_mode == MCHAN_APSTA_NO_RESTRICT)
6714
+ apsta_params->vsdb = TRUE;
6715
+
6716
+ IAPSTA_INFO(net->name, "mapsta_mode=%d(rsdb=%d, vsdb=%d)\n",
6717
+ mapsta_mode, apsta_params->rsdb, apsta_params->vsdb);
6718
+}
6719
+
6720
+static void
66916721 wl_ext_iapsta_postinit(struct net_device *net, struct wl_if_info *cur_if)
66926722 {
66936723 struct dhd_pub *dhd = dhd_get_pub(net);
....@@ -6698,6 +6728,7 @@
66986728 if (cur_if->ifidx == 0) {
66996729 apsta_params->rsdb = wl_ext_iapsta_get_rsdb(net, dhd);
67006730 apsta_params->vsdb = FALSE;
6731
+ wl_ext_iapsta_get_mapsta_mode(net);
67016732 apsta_params->csa = 0;
67026733 apsta_params->acs = 0;
67036734 apsta_params->radar = wl_ext_radar_detect(net);
....@@ -6873,12 +6904,6 @@
68736904 struct dhd_pub *dhd = dhd_get_pub(net);
68746905 struct wl_apsta_params *apsta_params = dhd->iapsta_params;
68756906
6876
- if (!apsta_params->ioctl_buf) {
6877
- apsta_params->ioctl_buf = kmalloc(WL_DUMP_BUF_LEN, GFP_KERNEL);
6878
- if (unlikely(!apsta_params->ioctl_buf)) {
6879
- IAPSTA_ERROR(net->name, "Can not allocate ioctl_buf\n");
6880
- }
6881
- }
68826907 init_waitqueue_head(&apsta_params->netif_change_event);
68836908 mutex_init(&apsta_params->usr_sync);
68846909 mutex_init(&apsta_params->in4way_sync);
....@@ -6896,10 +6921,6 @@
68966921 struct dhd_pub *dhd = dhd_get_pub(net);
68976922 struct wl_apsta_params *apsta_params = dhd->iapsta_params;
68986923
6899
- if (apsta_params->ioctl_buf) {
6900
- kfree(apsta_params->ioctl_buf);
6901
- apsta_params->ioctl_buf = NULL;
6902
- }
69036924 memset(apsta_params, 0, sizeof(struct wl_apsta_params));
69046925 }
69056926
....@@ -7028,24 +7049,6 @@
70287049 return 0;
70297050 }
70307051
7031
-int
7032
-wl_ext_iapsta_attach(struct net_device *net)
7033
-{
7034
- struct dhd_pub *dhd = dhd_get_pub(net);
7035
- struct wl_apsta_params *iapsta_params;
7036
-
7037
- IAPSTA_TRACE(net->name, "Enter\n");
7038
-
7039
- iapsta_params = kzalloc(sizeof(struct wl_apsta_params), GFP_KERNEL);
7040
- if (unlikely(!iapsta_params)) {
7041
- IAPSTA_ERROR(net->name, "Can not allocate apsta_params\n");
7042
- return -ENOMEM;
7043
- }
7044
- dhd->iapsta_params = (void *)iapsta_params;
7045
-
7046
- return 0;
7047
-}
7048
-
70497052 void
70507053 wl_ext_iapsta_dettach(struct net_device *net)
70517054 {
....@@ -7053,10 +7056,47 @@
70537056
70547057 IAPSTA_TRACE(net->name, "Enter\n");
70557058
7059
+ if (g_ioctl_buf) {
7060
+ kfree(g_ioctl_buf);
7061
+ g_ioctl_buf = NULL;
7062
+ }
7063
+
70567064 if (dhd->iapsta_params) {
70577065 wl_ext_iapsta_deinit_priv(net);
70587066 kfree(dhd->iapsta_params);
70597067 dhd->iapsta_params = NULL;
70607068 }
70617069 }
7070
+
7071
+int
7072
+wl_ext_iapsta_attach(struct net_device *net)
7073
+{
7074
+ struct dhd_pub *dhd = dhd_get_pub(net);
7075
+ struct wl_apsta_params *iapsta_params;
7076
+ int ret = 0;
7077
+
7078
+ IAPSTA_TRACE(net->name, "Enter\n");
7079
+
7080
+ iapsta_params = kzalloc(sizeof(struct wl_apsta_params), GFP_KERNEL);
7081
+ if (unlikely(!iapsta_params)) {
7082
+ IAPSTA_ERROR(net->name, "Can not allocate apsta_params\n");
7083
+ ret = -ENOMEM;
7084
+ goto exit;
7085
+ }
7086
+ dhd->iapsta_params = (void *)iapsta_params;
7087
+
7088
+ if (!g_ioctl_buf) {
7089
+ g_ioctl_buf = kmalloc(WL_DUMP_BUF_LEN, GFP_KERNEL);
7090
+ if (unlikely(!g_ioctl_buf)) {
7091
+ IAPSTA_ERROR(net->name, "Can not allocate g_ioctl_buf\n");
7092
+ ret = -ENOMEM;
7093
+ goto exit;
7094
+ }
7095
+ }
7096
+
7097
+exit:
7098
+ if (ret)
7099
+ wl_ext_iapsta_dettach(net);
7100
+ return ret;
7101
+}
70627102 #endif /* WL_EXT_IAPSTA */