mac80211: brcmfmac: backport scheduled scan cleanup and chip support
[librecmc/librecmc.git] / package / kernel / mac80211 / patches / 357-0001-brcmfmac-add-pcie-host-dongle-interface-rev6-support.patch
1 From be4b092cab84b2ecc01ee7f4da6a044279430b6f Mon Sep 17 00:00:00 2001
2 From: Franky Lin <franky.lin@broadcom.com>
3 Date: Wed, 23 Nov 2016 10:25:20 +0000
4 Subject: [PATCH] brcmfmac: add pcie host dongle interface rev6 support
5
6 In rev6 of pcie host dongle interface protocol, host needs to maximum
7 supported ring number from dongle shared memory and set up ring buffer
8 and ring indices offset accordingly.
9
10 Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com>
11 Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com>
12 Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
13 Signed-off-by: Franky Lin <franky.lin@broadcom.com>
14 Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
15 Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
16 ---
17  .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h |  10 +-
18  .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c  |  38 +++--
19  .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.h  |   4 +
20  .../wireless/broadcom/brcm80211/brcmfmac/pcie.c    | 171 ++++++++++++---------
21  4 files changed, 132 insertions(+), 91 deletions(-)
22
23 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
24 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h
25 @@ -22,10 +22,12 @@
26  /* IDs of the 6 default common rings of msgbuf protocol */
27  #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT       0
28  #define BRCMF_H2D_MSGRING_RXPOST_SUBMIT                1
29 +#define BRCMF_H2D_MSGRING_FLOWRING_IDSTART     2
30  #define BRCMF_D2H_MSGRING_CONTROL_COMPLETE     2
31  #define BRCMF_D2H_MSGRING_TX_COMPLETE          3
32  #define BRCMF_D2H_MSGRING_RX_COMPLETE          4
33  
34 +
35  #define BRCMF_NROF_H2D_COMMON_MSGRINGS         2
36  #define BRCMF_NROF_D2H_COMMON_MSGRINGS         3
37  #define BRCMF_NROF_COMMON_MSGRINGS     (BRCMF_NROF_H2D_COMMON_MSGRINGS + \
38 @@ -95,14 +97,18 @@ struct brcmf_bus_ops {
39   * @flowrings: commonrings which are dynamically created and destroyed for data.
40   * @rx_dataoffset: if set then all rx data has this this offset.
41   * @max_rxbufpost: maximum number of buffers to post for rx.
42 - * @nrof_flowrings: number of flowrings.
43 + * @max_flowrings: maximum number of tx flow rings supported.
44 + * @max_submissionrings: maximum number of submission rings(h2d) supported.
45 + * @max_completionrings: maximum number of completion rings(d2h) supported.
46   */
47  struct brcmf_bus_msgbuf {
48         struct brcmf_commonring *commonrings[BRCMF_NROF_COMMON_MSGRINGS];
49         struct brcmf_commonring **flowrings;
50         u32 rx_dataoffset;
51         u32 max_rxbufpost;
52 -       u32 nrof_flowrings;
53 +       u16 max_flowrings;
54 +       u16 max_submissionrings;
55 +       u16 max_completionrings;
56  };
57  
58  
59 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
60 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
61 @@ -87,11 +87,6 @@ struct msgbuf_common_hdr {
62         __le32                          request_id;
63  };
64  
65 -struct msgbuf_buf_addr {
66 -       __le32                          low_addr;
67 -       __le32                          high_addr;
68 -};
69 -
70  struct msgbuf_ioctl_req_hdr {
71         struct msgbuf_common_hdr        msg;
72         __le32                          cmd;
73 @@ -227,7 +222,10 @@ struct brcmf_msgbuf {
74         struct brcmf_commonring **commonrings;
75         struct brcmf_commonring **flowrings;
76         dma_addr_t *flowring_dma_handle;
77 -       u16 nrof_flowrings;
78 +
79 +       u16 max_flowrings;
80 +       u16 max_submissionrings;
81 +       u16 max_completionrings;
82  
83         u16 rx_dataoffset;
84         u32 max_rxbufpost;
85 @@ -610,7 +608,7 @@ brcmf_msgbuf_flowring_create_worker(stru
86         create->msg.request_id = 0;
87         create->tid = brcmf_flowring_tid(msgbuf->flow, flowid);
88         create->flow_ring_id = cpu_to_le16(flowid +
89 -                                          BRCMF_NROF_H2D_COMMON_MSGRINGS);
90 +                                          BRCMF_H2D_MSGRING_FLOWRING_IDSTART);
91         memcpy(create->sa, work->sa, ETH_ALEN);
92         memcpy(create->da, work->da, ETH_ALEN);
93         address = (u64)msgbuf->flowring_dma_handle[flowid];
94 @@ -760,7 +758,7 @@ static void brcmf_msgbuf_txflow_worker(s
95         u32 flowid;
96  
97         msgbuf = container_of(worker, struct brcmf_msgbuf, txflow_work);
98 -       for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->nrof_flowrings) {
99 +       for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->max_flowrings) {
100                 clear_bit(flowid, msgbuf->flow_map);
101                 brcmf_msgbuf_txflow(msgbuf, flowid);
102         }
103 @@ -866,7 +864,7 @@ brcmf_msgbuf_process_txstatus(struct brc
104         tx_status = (struct msgbuf_tx_status *)buf;
105         idx = le32_to_cpu(tx_status->msg.request_id);
106         flowid = le16_to_cpu(tx_status->compl_hdr.flow_ring_id);
107 -       flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
108 +       flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART;
109         skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev,
110                                      msgbuf->tx_pktids, idx);
111         if (!skb)
112 @@ -1174,7 +1172,7 @@ brcmf_msgbuf_process_flow_ring_create_re
113         flowring_create_resp = (struct msgbuf_flowring_create_resp *)buf;
114  
115         flowid = le16_to_cpu(flowring_create_resp->compl_hdr.flow_ring_id);
116 -       flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
117 +       flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART;
118         status =  le16_to_cpu(flowring_create_resp->compl_hdr.status);
119  
120         if (status) {
121 @@ -1202,7 +1200,7 @@ brcmf_msgbuf_process_flow_ring_delete_re
122         flowring_delete_resp = (struct msgbuf_flowring_delete_resp *)buf;
123  
124         flowid = le16_to_cpu(flowring_delete_resp->compl_hdr.flow_ring_id);
125 -       flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS;
126 +       flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART;
127         status =  le16_to_cpu(flowring_delete_resp->compl_hdr.status);
128  
129         if (status) {
130 @@ -1307,7 +1305,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct
131         brcmf_msgbuf_process_rx(msgbuf, buf);
132  
133         for_each_set_bit(flowid, msgbuf->txstatus_done_map,
134 -                        msgbuf->nrof_flowrings) {
135 +                        msgbuf->max_flowrings) {
136                 clear_bit(flowid, msgbuf->txstatus_done_map);
137                 commonring = msgbuf->flowrings[flowid];
138                 qlen = brcmf_flowring_qlen(msgbuf->flow, flowid);
139 @@ -1349,7 +1347,7 @@ void brcmf_msgbuf_delete_flowring(struct
140         delete->msg.request_id = 0;
141  
142         delete->flow_ring_id = cpu_to_le16(flowid +
143 -                                          BRCMF_NROF_H2D_COMMON_MSGRINGS);
144 +                                          BRCMF_H2D_MSGRING_FLOWRING_IDSTART);
145         delete->reason = 0;
146  
147         brcmf_dbg(MSGBUF, "Send Flow Delete Req flow ID %d, ifindex %d\n",
148 @@ -1427,10 +1425,10 @@ int brcmf_proto_msgbuf_attach(struct brc
149  
150         if_msgbuf = drvr->bus_if->msgbuf;
151  
152 -       if (if_msgbuf->nrof_flowrings >= BRCMF_FLOWRING_HASHSIZE) {
153 +       if (if_msgbuf->max_flowrings >= BRCMF_FLOWRING_HASHSIZE) {
154                 brcmf_err("driver not configured for this many flowrings %d\n",
155 -                         if_msgbuf->nrof_flowrings);
156 -               if_msgbuf->nrof_flowrings = BRCMF_FLOWRING_HASHSIZE - 1;
157 +                         if_msgbuf->max_flowrings);
158 +               if_msgbuf->max_flowrings = BRCMF_FLOWRING_HASHSIZE - 1;
159         }
160  
161         msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL);
162 @@ -1443,7 +1441,7 @@ int brcmf_proto_msgbuf_attach(struct brc
163                 goto fail;
164         }
165         INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker);
166 -       count = BITS_TO_LONGS(if_msgbuf->nrof_flowrings);
167 +       count = BITS_TO_LONGS(if_msgbuf->max_flowrings);
168         count = count * sizeof(unsigned long);
169         msgbuf->flow_map = kzalloc(count, GFP_KERNEL);
170         if (!msgbuf->flow_map)
171 @@ -1479,8 +1477,8 @@ int brcmf_proto_msgbuf_attach(struct brc
172         msgbuf->commonrings =
173                 (struct brcmf_commonring **)if_msgbuf->commonrings;
174         msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings;
175 -       msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings;
176 -       msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings *
177 +       msgbuf->max_flowrings = if_msgbuf->max_flowrings;
178 +       msgbuf->flowring_dma_handle = kzalloc(msgbuf->max_flowrings *
179                 sizeof(*msgbuf->flowring_dma_handle), GFP_KERNEL);
180         if (!msgbuf->flowring_dma_handle)
181                 goto fail;
182 @@ -1501,7 +1499,7 @@ int brcmf_proto_msgbuf_attach(struct brc
183                 goto fail;
184  
185         msgbuf->flow = brcmf_flowring_attach(drvr->bus_if->dev,
186 -                                            if_msgbuf->nrof_flowrings);
187 +                                            if_msgbuf->max_flowrings);
188         if (!msgbuf->flow)
189                 goto fail;
190  
191 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
192 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h
193 @@ -31,6 +31,10 @@
194  #define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE         32
195  #define BRCMF_H2D_TXFLOWRING_ITEMSIZE                  48
196  
197 +struct msgbuf_buf_addr {
198 +       __le32          low_addr;
199 +       __le32          high_addr;
200 +};
201  
202  int brcmf_proto_msgbuf_rx_trigger(struct device *dev);
203  void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid);
204 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
205 +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
206 @@ -135,7 +135,7 @@ static struct brcmf_firmware_mapping brc
207                                                  BRCMF_PCIE_MB_INT_D2H3_DB1)
208  
209  #define BRCMF_PCIE_MIN_SHARED_VERSION          5
210 -#define BRCMF_PCIE_MAX_SHARED_VERSION          5
211 +#define BRCMF_PCIE_MAX_SHARED_VERSION          6
212  #define BRCMF_PCIE_SHARED_VERSION_MASK         0x00FF
213  #define BRCMF_PCIE_SHARED_DMA_INDEX            0x10000
214  #define BRCMF_PCIE_SHARED_DMA_2B_IDX           0x100000
215 @@ -166,17 +166,6 @@ static struct brcmf_firmware_mapping brc
216  #define BRCMF_RING_MEM_SZ                      16
217  #define BRCMF_RING_STATE_SZ                    8
218  
219 -#define BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET 4
220 -#define BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET 8
221 -#define BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET 12
222 -#define BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET 16
223 -#define BRCMF_SHARED_RING_H2D_WP_HADDR_OFFSET  20
224 -#define BRCMF_SHARED_RING_H2D_RP_HADDR_OFFSET  28
225 -#define BRCMF_SHARED_RING_D2H_WP_HADDR_OFFSET  36
226 -#define BRCMF_SHARED_RING_D2H_RP_HADDR_OFFSET  44
227 -#define BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET    0
228 -#define BRCMF_SHARED_RING_MAX_SUB_QUEUES       52
229 -
230  #define BRCMF_DEF_MAX_RXBUFPOST                        255
231  
232  #define BRCMF_CONSOLE_BUFADDR_OFFSET           8
233 @@ -231,7 +220,9 @@ struct brcmf_pcie_shared_info {
234         struct brcmf_pcie_ringbuf *commonrings[BRCMF_NROF_COMMON_MSGRINGS];
235         struct brcmf_pcie_ringbuf *flowrings;
236         u16 max_rxbufpost;
237 -       u32 nrof_flowrings;
238 +       u16 max_flowrings;
239 +       u16 max_submissionrings;
240 +       u16 max_completionrings;
241         u32 rx_dataoffset;
242         u32 htod_mb_data_addr;
243         u32 dtoh_mb_data_addr;
244 @@ -241,6 +232,7 @@ struct brcmf_pcie_shared_info {
245         dma_addr_t scratch_dmahandle;
246         void *ringupd;
247         dma_addr_t ringupd_dmahandle;
248 +       u8 version;
249  };
250  
251  struct brcmf_pcie_core_info {
252 @@ -284,6 +276,36 @@ struct brcmf_pcie_ringbuf {
253         u8 id;
254  };
255  
256 +/**
257 + * struct brcmf_pcie_dhi_ringinfo - dongle/host interface shared ring info
258 + *
259 + * @ringmem: dongle memory pointer to ring memory location
260 + * @h2d_w_idx_ptr: h2d ring write indices dongle memory pointers
261 + * @h2d_r_idx_ptr: h2d ring read indices dongle memory pointers
262 + * @d2h_w_idx_ptr: d2h ring write indices dongle memory pointers
263 + * @d2h_r_idx_ptr: d2h ring read indices dongle memory pointers
264 + * @h2d_w_idx_hostaddr: h2d ring write indices host memory pointers
265 + * @h2d_r_idx_hostaddr: h2d ring read indices host memory pointers
266 + * @d2h_w_idx_hostaddr: d2h ring write indices host memory pointers
267 + * @d2h_r_idx_hostaddr: d2h ring reaD indices host memory pointers
268 + * @max_flowrings: maximum number of tx flow rings supported.
269 + * @max_submissionrings: maximum number of submission rings(h2d) supported.
270 + * @max_completionrings: maximum number of completion rings(d2h) supported.
271 + */
272 +struct brcmf_pcie_dhi_ringinfo {
273 +       __le32                  ringmem;
274 +       __le32                  h2d_w_idx_ptr;
275 +       __le32                  h2d_r_idx_ptr;
276 +       __le32                  d2h_w_idx_ptr;
277 +       __le32                  d2h_r_idx_ptr;
278 +       struct msgbuf_buf_addr  h2d_w_idx_hostaddr;
279 +       struct msgbuf_buf_addr  h2d_r_idx_hostaddr;
280 +       struct msgbuf_buf_addr  d2h_w_idx_hostaddr;
281 +       struct msgbuf_buf_addr  d2h_r_idx_hostaddr;
282 +       __le16                  max_flowrings;
283 +       __le16                  max_submissionrings;
284 +       __le16                  max_completionrings;
285 +};
286  
287  static const u32 brcmf_ring_max_item[BRCMF_NROF_COMMON_MSGRINGS] = {
288         BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM,
289 @@ -1054,26 +1076,35 @@ static int brcmf_pcie_init_ringbuffers(s
290  {
291         struct brcmf_pcie_ringbuf *ring;
292         struct brcmf_pcie_ringbuf *rings;
293 -       u32 ring_addr;
294         u32 d2h_w_idx_ptr;
295         u32 d2h_r_idx_ptr;
296         u32 h2d_w_idx_ptr;
297         u32 h2d_r_idx_ptr;
298 -       u32 addr;
299         u32 ring_mem_ptr;
300         u32 i;
301         u64 address;
302         u32 bufsz;
303 -       u16 max_sub_queues;
304         u8 idx_offset;
305 -
306 -       ring_addr = devinfo->shared.ring_info_addr;
307 -       brcmf_dbg(PCIE, "Base ring addr = 0x%08x\n", ring_addr);
308 -       addr = ring_addr + BRCMF_SHARED_RING_MAX_SUB_QUEUES;
309 -       max_sub_queues = brcmf_pcie_read_tcm16(devinfo, addr);
310 +       struct brcmf_pcie_dhi_ringinfo ringinfo;
311 +       u16 max_flowrings;
312 +       u16 max_submissionrings;
313 +       u16 max_completionrings;
314 +
315 +       memcpy_fromio(&ringinfo, devinfo->tcm + devinfo->shared.ring_info_addr,
316 +                     sizeof(ringinfo));
317 +       if (devinfo->shared.version >= 6) {
318 +               max_submissionrings = le16_to_cpu(ringinfo.max_submissionrings);
319 +               max_flowrings = le16_to_cpu(ringinfo.max_flowrings);
320 +               max_completionrings = le16_to_cpu(ringinfo.max_completionrings);
321 +       } else {
322 +               max_submissionrings = le16_to_cpu(ringinfo.max_flowrings);
323 +               max_flowrings = max_submissionrings -
324 +                               BRCMF_NROF_H2D_COMMON_MSGRINGS;
325 +               max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS;
326 +       }
327  
328         if (devinfo->dma_idx_sz != 0) {
329 -               bufsz = (BRCMF_NROF_D2H_COMMON_MSGRINGS + max_sub_queues) *
330 +               bufsz = (max_submissionrings + max_completionrings) *
331                         devinfo->dma_idx_sz * 2;
332                 devinfo->idxbuf = dma_alloc_coherent(&devinfo->pdev->dev, bufsz,
333                                                      &devinfo->idxbuf_dmahandle,
334 @@ -1083,14 +1114,10 @@ static int brcmf_pcie_init_ringbuffers(s
335         }
336  
337         if (devinfo->dma_idx_sz == 0) {
338 -               addr = ring_addr + BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET;
339 -               d2h_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
340 -               addr = ring_addr + BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET;
341 -               d2h_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
342 -               addr = ring_addr + BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET;
343 -               h2d_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
344 -               addr = ring_addr + BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET;
345 -               h2d_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
346 +               d2h_w_idx_ptr = le32_to_cpu(ringinfo.d2h_w_idx_ptr);
347 +               d2h_r_idx_ptr = le32_to_cpu(ringinfo.d2h_r_idx_ptr);
348 +               h2d_w_idx_ptr = le32_to_cpu(ringinfo.h2d_w_idx_ptr);
349 +               h2d_r_idx_ptr = le32_to_cpu(ringinfo.h2d_r_idx_ptr);
350                 idx_offset = sizeof(u32);
351                 devinfo->write_ptr = brcmf_pcie_write_tcm16;
352                 devinfo->read_ptr = brcmf_pcie_read_tcm16;
353 @@ -1103,34 +1130,42 @@ static int brcmf_pcie_init_ringbuffers(s
354                 devinfo->read_ptr = brcmf_pcie_read_idx;
355  
356                 h2d_w_idx_ptr = 0;
357 -               addr = ring_addr + BRCMF_SHARED_RING_H2D_WP_HADDR_OFFSET;
358                 address = (u64)devinfo->idxbuf_dmahandle;
359 -               brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
360 -               brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
361 -
362 -               h2d_r_idx_ptr = h2d_w_idx_ptr + max_sub_queues * idx_offset;
363 -               addr = ring_addr + BRCMF_SHARED_RING_H2D_RP_HADDR_OFFSET;
364 -               address += max_sub_queues * idx_offset;
365 -               brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
366 -               brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
367 -
368 -               d2h_w_idx_ptr = h2d_r_idx_ptr + max_sub_queues * idx_offset;
369 -               addr = ring_addr + BRCMF_SHARED_RING_D2H_WP_HADDR_OFFSET;
370 -               address += max_sub_queues * idx_offset;
371 -               brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
372 -               brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
373 +               ringinfo.h2d_w_idx_hostaddr.low_addr =
374 +                       cpu_to_le32(address & 0xffffffff);
375 +               ringinfo.h2d_w_idx_hostaddr.high_addr =
376 +                       cpu_to_le32(address >> 32);
377 +
378 +               h2d_r_idx_ptr = h2d_w_idx_ptr +
379 +                               max_submissionrings * idx_offset;
380 +               address += max_submissionrings * idx_offset;
381 +               ringinfo.h2d_r_idx_hostaddr.low_addr =
382 +                       cpu_to_le32(address & 0xffffffff);
383 +               ringinfo.h2d_r_idx_hostaddr.high_addr =
384 +                       cpu_to_le32(address >> 32);
385 +
386 +               d2h_w_idx_ptr = h2d_r_idx_ptr +
387 +                               max_submissionrings * idx_offset;
388 +               address += max_submissionrings * idx_offset;
389 +               ringinfo.d2h_w_idx_hostaddr.low_addr =
390 +                       cpu_to_le32(address & 0xffffffff);
391 +               ringinfo.d2h_w_idx_hostaddr.high_addr =
392 +                       cpu_to_le32(address >> 32);
393  
394                 d2h_r_idx_ptr = d2h_w_idx_ptr +
395 -                               BRCMF_NROF_D2H_COMMON_MSGRINGS * idx_offset;
396 -               addr = ring_addr + BRCMF_SHARED_RING_D2H_RP_HADDR_OFFSET;
397 -               address += BRCMF_NROF_D2H_COMMON_MSGRINGS * idx_offset;
398 -               brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff);
399 -               brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32);
400 +                               max_completionrings * idx_offset;
401 +               address += max_completionrings * idx_offset;
402 +               ringinfo.d2h_r_idx_hostaddr.low_addr =
403 +                       cpu_to_le32(address & 0xffffffff);
404 +               ringinfo.d2h_r_idx_hostaddr.high_addr =
405 +                       cpu_to_le32(address >> 32);
406 +
407 +               memcpy_toio(devinfo->tcm + devinfo->shared.ring_info_addr,
408 +                           &ringinfo, sizeof(ringinfo));
409                 brcmf_dbg(PCIE, "Using host memory indices\n");
410         }
411  
412 -       addr = ring_addr + BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET;
413 -       ring_mem_ptr = brcmf_pcie_read_tcm32(devinfo, addr);
414 +       ring_mem_ptr = le32_to_cpu(ringinfo.ringmem);
415  
416         for (i = 0; i < BRCMF_NROF_H2D_COMMON_MSGRINGS; i++) {
417                 ring = brcmf_pcie_alloc_dma_and_ring(devinfo, i, ring_mem_ptr);
418 @@ -1161,20 +1196,19 @@ static int brcmf_pcie_init_ringbuffers(s
419                 ring_mem_ptr += BRCMF_RING_MEM_SZ;
420         }
421  
422 -       devinfo->shared.nrof_flowrings =
423 -                       max_sub_queues - BRCMF_NROF_H2D_COMMON_MSGRINGS;
424 -       rings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*ring),
425 -                       GFP_KERNEL);
426 +       devinfo->shared.max_flowrings = max_flowrings;
427 +       devinfo->shared.max_submissionrings = max_submissionrings;
428 +       devinfo->shared.max_completionrings = max_completionrings;
429 +       rings = kcalloc(max_flowrings, sizeof(*ring), GFP_KERNEL);
430         if (!rings)
431                 goto fail;
432  
433 -       brcmf_dbg(PCIE, "Nr of flowrings is %d\n",
434 -                 devinfo->shared.nrof_flowrings);
435 +       brcmf_dbg(PCIE, "Nr of flowrings is %d\n", max_flowrings);
436  
437 -       for (i = 0; i < devinfo->shared.nrof_flowrings; i++) {
438 +       for (i = 0; i < max_flowrings; i++) {
439                 ring = &rings[i];
440                 ring->devinfo = devinfo;
441 -               ring->id = i + BRCMF_NROF_COMMON_MSGRINGS;
442 +               ring->id = i + BRCMF_H2D_MSGRING_FLOWRING_IDSTART;
443                 brcmf_commonring_register_cb(&ring->commonring,
444                                              brcmf_pcie_ring_mb_ring_bell,
445                                              brcmf_pcie_ring_mb_update_rptr,
446 @@ -1357,17 +1391,16 @@ brcmf_pcie_init_share_ram_info(struct br
447  {
448         struct brcmf_pcie_shared_info *shared;
449         u32 addr;
450 -       u32 version;
451  
452         shared = &devinfo->shared;
453         shared->tcm_base_address = sharedram_addr;
454  
455         shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr);
456 -       version = shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK;
457 -       brcmf_dbg(PCIE, "PCIe protocol version %d\n", version);
458 -       if ((version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
459 -           (version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
460 -               brcmf_err("Unsupported PCIE version %d\n", version);
461 +       shared->version = (u8)(shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK);
462 +       brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version);
463 +       if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
464 +           (shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
465 +               brcmf_err("Unsupported PCIE version %d\n", shared->version);
466                 return -EINVAL;
467         }
468  
469 @@ -1661,18 +1694,18 @@ static void brcmf_pcie_setup(struct devi
470                 bus->msgbuf->commonrings[i] =
471                                 &devinfo->shared.commonrings[i]->commonring;
472  
473 -       flowrings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*flowrings),
474 +       flowrings = kcalloc(devinfo->shared.max_flowrings, sizeof(*flowrings),
475                             GFP_KERNEL);
476         if (!flowrings)
477                 goto fail;
478  
479 -       for (i = 0; i < devinfo->shared.nrof_flowrings; i++)
480 +       for (i = 0; i < devinfo->shared.max_flowrings; i++)
481                 flowrings[i] = &devinfo->shared.flowrings[i].commonring;
482         bus->msgbuf->flowrings = flowrings;
483  
484         bus->msgbuf->rx_dataoffset = devinfo->shared.rx_dataoffset;
485         bus->msgbuf->max_rxbufpost = devinfo->shared.max_rxbufpost;
486 -       bus->msgbuf->nrof_flowrings = devinfo->shared.nrof_flowrings;
487 +       bus->msgbuf->max_flowrings = devinfo->shared.max_flowrings;
488  
489         init_waitqueue_head(&devinfo->mbdata_resp_wait);
490