hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/******************************************************************************
 *
 * Copyright(c) 2019 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 ******************************************************************************/
#include "spatial_reuse.h"
 
u32 mac_sr_update(struct mac_ax_adapter *adapter,
         struct rtw_mac_ax_sr_info *sr_info,
         enum mac_ax_band band)
{
   struct mac_ax_intf_ops *ops = adapter_to_intf_ops(adapter);
   u8 val8;
   u32 val32, ret, reg;
 
   ret = check_mac_en(adapter, band, MAC_AX_CMAC_SEL);
   if (ret != MACSUCCESS)
       return ret;
 
   reg = band == MAC_AX_BAND_1 ? R_AX_RX_SR_CTRL_C1 : R_AX_RX_SR_CTRL;
   val8 = MAC_REG_R8(reg);
   val8 = (sr_info->sr_en) ? (val8 | B_AX_SR_EN) : (val8 & ~B_AX_SR_EN);
   MAC_REG_W8(reg, val8);
 
   reg = band == MAC_AX_BAND_1 ? R_AX_TCR0_C1 : R_AX_TCR0;
   val8 = MAC_REG_R8(reg);
   val8 = (sr_info->sr_field_v15_allowed) ?
       (val8 | B_AX_TCR_SR_VAL15_ALLOW) :
       (val8 & ~B_AX_TCR_SR_VAL15_ALLOW);
   MAC_REG_W8(reg, val8);
 
   reg = band == MAC_AX_BAND_1 ? R_AX_SR_OBSS_PD_C1 : R_AX_SR_OBSS_PD;
   val32 = MAC_REG_R32(reg);
   val32 = SET_CLR_WORD(val32, sr_info->non_srg_obss_pd_min,
                B_AX_NONSRG_OBSS_PD_MIN);
   val32 = SET_CLR_WORD(val32, sr_info->non_srg_obss_pd_max,
                B_AX_NONSRG_OBSS_PD_MAX);
   val32 = SET_CLR_WORD(val32, sr_info->srg_obss_pd_min,
                B_AX_SRG_OBSS_PD_MIN);
   val32 = SET_CLR_WORD(val32, sr_info->srg_obss_pd_max,
                B_AX_SRG_OBSS_PD_MAX);
   MAC_REG_W32(reg, val32);
 
   reg = band == MAC_AX_BAND_1 ?
         R_AX_SR_BSSCOLOR_BITMAP_C1 : R_AX_SR_BSSCOLOR_BITMAP;
   MAC_REG_W32(reg, sr_info->srg_bsscolor_bitmap_0);
   MAC_REG_W32(reg + 4, sr_info->srg_bsscolor_bitmap_1);
 
   reg = band == MAC_AX_BAND_1 ?
         R_AX_SR_PARTIAL_BSSCOLOR_BITMAP_C1 :
         R_AX_SR_PARTIAL_BSSCOLOR_BITMAP;
   MAC_REG_W32(reg, sr_info->srg_partbsid_bitmap_0);
   MAC_REG_W32(reg + 4, sr_info->srg_partbsid_bitmap_1);
 
   return MACSUCCESS;
}
 
u32 spatial_reuse_init(struct mac_ax_adapter *adapter,
              enum mac_ax_band band)
{
   struct mac_ax_intf_ops *ops = adapter_to_intf_ops(adapter);
   u8 val8;
   u32 ret, reg;
 
   ret = check_mac_en(adapter, band, MAC_AX_CMAC_SEL);
   if (ret != MACSUCCESS)
       return ret;
 
   reg = band == MAC_AX_BAND_1 ? R_AX_RX_SR_CTRL_C1 : R_AX_RX_SR_CTRL;
   val8 = MAC_REG_R8(reg) & ~(B_AX_SR_EN | B_AX_SR_CTRL_PLCP_EN);
   MAC_REG_W8(reg, val8);
 
   return MACSUCCESS;
}