6e965789907fbca19f228a5fdcf260b4f6f3aa04
[oweals/openwrt.git] /
1 From: Arend van Spriel <arend.vanspriel@broadcom.com>
2 Date: Wed, 5 Sep 2018 09:48:58 +0200
3 Subject: [PATCH] brcmfmac: fix for proper support of 160MHz bandwidth
4
5 Decoding of firmware channel information was not complete for 160MHz
6 support. This resulted in the following warning:
7
8   WARNING: CPU: 2 PID: 2222 at .../broadcom/brcm80211/brcmutil/d11.c:196
9         brcmu_d11ac_decchspec+0x2e/0x100 [brcmutil]
10   Modules linked in: brcmfmac(O) brcmutil(O) sha256_generic cfg80211 ...
11   CPU: 2 PID: 2222 Comm: kworker/2:0 Tainted: G           O
12   4.17.0-wt-testing-x64-00002-gf1bed50 #1
13   Hardware name: Dell Inc. Latitude E6410/07XJP9, BIOS A07 02/15/2011
14   Workqueue: events request_firmware_work_func
15   RIP: 0010:brcmu_d11ac_decchspec+0x2e/0x100 [brcmutil]
16   RSP: 0018:ffffc90000047bd0 EFLAGS: 00010206
17   RAX: 000000000000e832 RBX: ffff8801146fe910 RCX: ffff8801146fd3c0
18   RDX: 0000000000002800 RSI: 0000000000000070 RDI: ffffc90000047c30
19   RBP: ffffc90000047bd0 R08: 0000000000000000 R09: ffffffffa0798c80
20   R10: ffff88012bca55e0 R11: ffff880110a4ea00 R12: ffff8801146f8000
21   R13: ffffc90000047c30 R14: ffff8801146fe930 R15: ffff8801138e02e0
22   FS:  0000000000000000(0000) GS:ffff88012bc80000(0000) knlGS:0000000000000000
23   CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
24   CR2: 00007f18ce8b8070 CR3: 000000000200a003 CR4: 00000000000206e0
25   Call Trace:
26    brcmf_setup_wiphybands+0x212/0x780 [brcmfmac]
27    brcmf_cfg80211_attach+0xae2/0x11a0 [brcmfmac]
28    brcmf_attach+0x1fc/0x4b0 [brcmfmac]
29    ? __kmalloc+0x13c/0x1c0
30    brcmf_pcie_setup+0x99b/0xe00 [brcmfmac]
31    brcmf_fw_request_done+0x16a/0x1f0 [brcmfmac]
32    request_firmware_work_func+0x36/0x60
33    process_one_work+0x146/0x350
34    worker_thread+0x4a/0x3b0
35    kthread+0x102/0x140
36    ? process_one_work+0x350/0x350
37    ? kthread_bind+0x20/0x20
38    ret_from_fork+0x35/0x40
39   Code: 66 90 0f b7 07 55 48 89 e5 89 c2 88 47 02 88 47 03 66 81 e2 00 38
40         66 81 fa 00 18 74 6e 66 81 fa 00 20 74 39 66 81 fa 00 10 74 14 <0f>
41         0b 66 25 00 c0 74 20 66 3d 00 c0 75 20 c6 47 04 01 5d c3 66
42   ---[ end trace 550c46682415b26d ]---
43   brcmfmac: brcmf_construct_chaninfo: Ignoring unexpected firmware channel 50
44
45 This patch adds the missing stuff to properly handle this.
46
47 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
48 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
49 Reviewed-by: Franky Lin <franky.lin@broadcom.com>
50 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
51 ---
52  .../net/wireless/broadcom/brcm80211/brcmutil/d11.c | 34 +++++++++++++++++++++-
53  .../broadcom/brcm80211/include/brcmu_wifi.h        |  2 ++
54  2 files changed, 35 insertions(+), 1 deletion(-)
55
56 --- a/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
57 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmutil/d11.c
58 @@ -77,6 +77,8 @@ static u16 d11ac_bw(enum brcmu_chan_bw b
59                 return BRCMU_CHSPEC_D11AC_BW_40;
60         case BRCMU_CHAN_BW_80:
61                 return BRCMU_CHSPEC_D11AC_BW_80;
62 +       case BRCMU_CHAN_BW_160:
63 +               return BRCMU_CHSPEC_D11AC_BW_160;
64         default:
65                 WARN_ON(1);
66         }
67 @@ -190,8 +192,38 @@ static void brcmu_d11ac_decchspec(struct
68                         break;
69                 }
70                 break;
71 -       case BRCMU_CHSPEC_D11AC_BW_8080:
72         case BRCMU_CHSPEC_D11AC_BW_160:
73 +               switch (ch->sb) {
74 +               case BRCMU_CHAN_SB_LLL:
75 +                       ch->control_ch_num -= CH_70MHZ_APART;
76 +                       break;
77 +               case BRCMU_CHAN_SB_LLU:
78 +                       ch->control_ch_num -= CH_50MHZ_APART;
79 +                       break;
80 +               case BRCMU_CHAN_SB_LUL:
81 +                       ch->control_ch_num -= CH_30MHZ_APART;
82 +                       break;
83 +               case BRCMU_CHAN_SB_LUU:
84 +                       ch->control_ch_num -= CH_10MHZ_APART;
85 +                       break;
86 +               case BRCMU_CHAN_SB_ULL:
87 +                       ch->control_ch_num += CH_10MHZ_APART;
88 +                       break;
89 +               case BRCMU_CHAN_SB_ULU:
90 +                       ch->control_ch_num += CH_30MHZ_APART;
91 +                       break;
92 +               case BRCMU_CHAN_SB_UUL:
93 +                       ch->control_ch_num += CH_50MHZ_APART;
94 +                       break;
95 +               case BRCMU_CHAN_SB_UUU:
96 +                       ch->control_ch_num += CH_70MHZ_APART;
97 +                       break;
98 +               default:
99 +                       WARN_ON_ONCE(1);
100 +                       break;
101 +               }
102 +               break;
103 +       case BRCMU_CHSPEC_D11AC_BW_8080:
104         default:
105                 WARN_ON_ONCE(1);
106                 break;
107 --- a/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
108 +++ b/drivers/net/wireless/broadcom/brcm80211/include/brcmu_wifi.h
109 @@ -29,6 +29,8 @@
110  #define CH_UPPER_SB                    0x01
111  #define CH_LOWER_SB                    0x02
112  #define CH_EWA_VALID                   0x04
113 +#define CH_70MHZ_APART                 14
114 +#define CH_50MHZ_APART                 10
115  #define CH_30MHZ_APART                 6
116  #define CH_20MHZ_APART                 4
117  #define CH_10MHZ_APART                 2