diff options
Diffstat (limited to 'package/kernel/mac80211/patches/357-0001-brcmfmac-add-pcie-host-dongle-interface-rev6-support.patch')
-rw-r--r-- | package/kernel/mac80211/patches/357-0001-brcmfmac-add-pcie-host-dongle-interface-rev6-support.patch | 490 |
1 files changed, 490 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/357-0001-brcmfmac-add-pcie-host-dongle-interface-rev6-support.patch b/package/kernel/mac80211/patches/357-0001-brcmfmac-add-pcie-host-dongle-interface-rev6-support.patch new file mode 100644 index 0000000..e093913 --- /dev/null +++ b/package/kernel/mac80211/patches/357-0001-brcmfmac-add-pcie-host-dongle-interface-rev6-support.patch @@ -0,0 +1,490 @@ +From be4b092cab84b2ecc01ee7f4da6a044279430b6f Mon Sep 17 00:00:00 2001 +From: Franky Lin <franky.lin@broadcom.com> +Date: Wed, 23 Nov 2016 10:25:20 +0000 +Subject: [PATCH] brcmfmac: add pcie host dongle interface rev6 support + +In rev6 of pcie host dongle interface protocol, host needs to maximum +supported ring number from dongle shared memory and set up ring buffer +and ring indices offset accordingly. + +Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> +Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> +Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com> +Signed-off-by: Franky Lin <franky.lin@broadcom.com> +Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> +Signed-off-by: Kalle Valo <kvalo@codeaurora.org> +--- + .../net/wireless/broadcom/brcm80211/brcmfmac/bus.h | 10 +- + .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.c | 38 +++-- + .../wireless/broadcom/brcm80211/brcmfmac/msgbuf.h | 4 + + .../wireless/broadcom/brcm80211/brcmfmac/pcie.c | 171 ++++++++++++--------- + 4 files changed, 132 insertions(+), 91 deletions(-) + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h +@@ -22,10 +22,12 @@ + /* IDs of the 6 default common rings of msgbuf protocol */ + #define BRCMF_H2D_MSGRING_CONTROL_SUBMIT 0 + #define BRCMF_H2D_MSGRING_RXPOST_SUBMIT 1 ++#define BRCMF_H2D_MSGRING_FLOWRING_IDSTART 2 + #define BRCMF_D2H_MSGRING_CONTROL_COMPLETE 2 + #define BRCMF_D2H_MSGRING_TX_COMPLETE 3 + #define BRCMF_D2H_MSGRING_RX_COMPLETE 4 + ++ + #define BRCMF_NROF_H2D_COMMON_MSGRINGS 2 + #define BRCMF_NROF_D2H_COMMON_MSGRINGS 3 + #define BRCMF_NROF_COMMON_MSGRINGS (BRCMF_NROF_H2D_COMMON_MSGRINGS + \ +@@ -95,14 +97,18 @@ struct brcmf_bus_ops { + * @flowrings: commonrings which are dynamically created and destroyed for data. + * @rx_dataoffset: if set then all rx data has this this offset. + * @max_rxbufpost: maximum number of buffers to post for rx. +- * @nrof_flowrings: number of flowrings. ++ * @max_flowrings: maximum number of tx flow rings supported. ++ * @max_submissionrings: maximum number of submission rings(h2d) supported. ++ * @max_completionrings: maximum number of completion rings(d2h) supported. + */ + struct brcmf_bus_msgbuf { + struct brcmf_commonring *commonrings[BRCMF_NROF_COMMON_MSGRINGS]; + struct brcmf_commonring **flowrings; + u32 rx_dataoffset; + u32 max_rxbufpost; +- u32 nrof_flowrings; ++ u16 max_flowrings; ++ u16 max_submissionrings; ++ u16 max_completionrings; + }; + + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +@@ -87,11 +87,6 @@ struct msgbuf_common_hdr { + __le32 request_id; + }; + +-struct msgbuf_buf_addr { +- __le32 low_addr; +- __le32 high_addr; +-}; +- + struct msgbuf_ioctl_req_hdr { + struct msgbuf_common_hdr msg; + __le32 cmd; +@@ -227,7 +222,10 @@ struct brcmf_msgbuf { + struct brcmf_commonring **commonrings; + struct brcmf_commonring **flowrings; + dma_addr_t *flowring_dma_handle; +- u16 nrof_flowrings; ++ ++ u16 max_flowrings; ++ u16 max_submissionrings; ++ u16 max_completionrings; + + u16 rx_dataoffset; + u32 max_rxbufpost; +@@ -610,7 +608,7 @@ brcmf_msgbuf_flowring_create_worker(stru + create->msg.request_id = 0; + create->tid = brcmf_flowring_tid(msgbuf->flow, flowid); + create->flow_ring_id = cpu_to_le16(flowid + +- BRCMF_NROF_H2D_COMMON_MSGRINGS); ++ BRCMF_H2D_MSGRING_FLOWRING_IDSTART); + memcpy(create->sa, work->sa, ETH_ALEN); + memcpy(create->da, work->da, ETH_ALEN); + address = (u64)msgbuf->flowring_dma_handle[flowid]; +@@ -760,7 +758,7 @@ static void brcmf_msgbuf_txflow_worker(s + u32 flowid; + + msgbuf = container_of(worker, struct brcmf_msgbuf, txflow_work); +- for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->nrof_flowrings) { ++ for_each_set_bit(flowid, msgbuf->flow_map, msgbuf->max_flowrings) { + clear_bit(flowid, msgbuf->flow_map); + brcmf_msgbuf_txflow(msgbuf, flowid); + } +@@ -866,7 +864,7 @@ brcmf_msgbuf_process_txstatus(struct brc + tx_status = (struct msgbuf_tx_status *)buf; + idx = le32_to_cpu(tx_status->msg.request_id); + flowid = le16_to_cpu(tx_status->compl_hdr.flow_ring_id); +- flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; ++ flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART; + skb = brcmf_msgbuf_get_pktid(msgbuf->drvr->bus_if->dev, + msgbuf->tx_pktids, idx); + if (!skb) +@@ -1174,7 +1172,7 @@ brcmf_msgbuf_process_flow_ring_create_re + flowring_create_resp = (struct msgbuf_flowring_create_resp *)buf; + + flowid = le16_to_cpu(flowring_create_resp->compl_hdr.flow_ring_id); +- flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; ++ flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART; + status = le16_to_cpu(flowring_create_resp->compl_hdr.status); + + if (status) { +@@ -1202,7 +1200,7 @@ brcmf_msgbuf_process_flow_ring_delete_re + flowring_delete_resp = (struct msgbuf_flowring_delete_resp *)buf; + + flowid = le16_to_cpu(flowring_delete_resp->compl_hdr.flow_ring_id); +- flowid -= BRCMF_NROF_H2D_COMMON_MSGRINGS; ++ flowid -= BRCMF_H2D_MSGRING_FLOWRING_IDSTART; + status = le16_to_cpu(flowring_delete_resp->compl_hdr.status); + + if (status) { +@@ -1307,7 +1305,7 @@ int brcmf_proto_msgbuf_rx_trigger(struct + brcmf_msgbuf_process_rx(msgbuf, buf); + + for_each_set_bit(flowid, msgbuf->txstatus_done_map, +- msgbuf->nrof_flowrings) { ++ msgbuf->max_flowrings) { + clear_bit(flowid, msgbuf->txstatus_done_map); + commonring = msgbuf->flowrings[flowid]; + qlen = brcmf_flowring_qlen(msgbuf->flow, flowid); +@@ -1349,7 +1347,7 @@ void brcmf_msgbuf_delete_flowring(struct + delete->msg.request_id = 0; + + delete->flow_ring_id = cpu_to_le16(flowid + +- BRCMF_NROF_H2D_COMMON_MSGRINGS); ++ BRCMF_H2D_MSGRING_FLOWRING_IDSTART); + delete->reason = 0; + + brcmf_dbg(MSGBUF, "Send Flow Delete Req flow ID %d, ifindex %d\n", +@@ -1427,10 +1425,10 @@ int brcmf_proto_msgbuf_attach(struct brc + + if_msgbuf = drvr->bus_if->msgbuf; + +- if (if_msgbuf->nrof_flowrings >= BRCMF_FLOWRING_HASHSIZE) { ++ if (if_msgbuf->max_flowrings >= BRCMF_FLOWRING_HASHSIZE) { + brcmf_err("driver not configured for this many flowrings %d\n", +- if_msgbuf->nrof_flowrings); +- if_msgbuf->nrof_flowrings = BRCMF_FLOWRING_HASHSIZE - 1; ++ if_msgbuf->max_flowrings); ++ if_msgbuf->max_flowrings = BRCMF_FLOWRING_HASHSIZE - 1; + } + + msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL); +@@ -1443,7 +1441,7 @@ int brcmf_proto_msgbuf_attach(struct brc + goto fail; + } + INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker); +- count = BITS_TO_LONGS(if_msgbuf->nrof_flowrings); ++ count = BITS_TO_LONGS(if_msgbuf->max_flowrings); + count = count * sizeof(unsigned long); + msgbuf->flow_map = kzalloc(count, GFP_KERNEL); + if (!msgbuf->flow_map) +@@ -1479,8 +1477,8 @@ int brcmf_proto_msgbuf_attach(struct brc + msgbuf->commonrings = + (struct brcmf_commonring **)if_msgbuf->commonrings; + msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings; +- msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings; +- msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings * ++ msgbuf->max_flowrings = if_msgbuf->max_flowrings; ++ msgbuf->flowring_dma_handle = kzalloc(msgbuf->max_flowrings * + sizeof(*msgbuf->flowring_dma_handle), GFP_KERNEL); + if (!msgbuf->flowring_dma_handle) + goto fail; +@@ -1501,7 +1499,7 @@ int brcmf_proto_msgbuf_attach(struct brc + goto fail; + + msgbuf->flow = brcmf_flowring_attach(drvr->bus_if->dev, +- if_msgbuf->nrof_flowrings); ++ if_msgbuf->max_flowrings); + if (!msgbuf->flow) + goto fail; + +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.h +@@ -31,6 +31,10 @@ + #define BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE 32 + #define BRCMF_H2D_TXFLOWRING_ITEMSIZE 48 + ++struct msgbuf_buf_addr { ++ __le32 low_addr; ++ __le32 high_addr; ++}; + + int brcmf_proto_msgbuf_rx_trigger(struct device *dev); + void brcmf_msgbuf_delete_flowring(struct brcmf_pub *drvr, u16 flowid); +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +@@ -135,7 +135,7 @@ static struct brcmf_firmware_mapping brc + BRCMF_PCIE_MB_INT_D2H3_DB1) + + #define BRCMF_PCIE_MIN_SHARED_VERSION 5 +-#define BRCMF_PCIE_MAX_SHARED_VERSION 5 ++#define BRCMF_PCIE_MAX_SHARED_VERSION 6 + #define BRCMF_PCIE_SHARED_VERSION_MASK 0x00FF + #define BRCMF_PCIE_SHARED_DMA_INDEX 0x10000 + #define BRCMF_PCIE_SHARED_DMA_2B_IDX 0x100000 +@@ -166,17 +166,6 @@ static struct brcmf_firmware_mapping brc + #define BRCMF_RING_MEM_SZ 16 + #define BRCMF_RING_STATE_SZ 8 + +-#define BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET 4 +-#define BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET 8 +-#define BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET 12 +-#define BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET 16 +-#define BRCMF_SHARED_RING_H2D_WP_HADDR_OFFSET 20 +-#define BRCMF_SHARED_RING_H2D_RP_HADDR_OFFSET 28 +-#define BRCMF_SHARED_RING_D2H_WP_HADDR_OFFSET 36 +-#define BRCMF_SHARED_RING_D2H_RP_HADDR_OFFSET 44 +-#define BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET 0 +-#define BRCMF_SHARED_RING_MAX_SUB_QUEUES 52 +- + #define BRCMF_DEF_MAX_RXBUFPOST 255 + + #define BRCMF_CONSOLE_BUFADDR_OFFSET 8 +@@ -231,7 +220,9 @@ struct brcmf_pcie_shared_info { + struct brcmf_pcie_ringbuf *commonrings[BRCMF_NROF_COMMON_MSGRINGS]; + struct brcmf_pcie_ringbuf *flowrings; + u16 max_rxbufpost; +- u32 nrof_flowrings; ++ u16 max_flowrings; ++ u16 max_submissionrings; ++ u16 max_completionrings; + u32 rx_dataoffset; + u32 htod_mb_data_addr; + u32 dtoh_mb_data_addr; +@@ -241,6 +232,7 @@ struct brcmf_pcie_shared_info { + dma_addr_t scratch_dmahandle; + void *ringupd; + dma_addr_t ringupd_dmahandle; ++ u8 version; + }; + + struct brcmf_pcie_core_info { +@@ -284,6 +276,36 @@ struct brcmf_pcie_ringbuf { + u8 id; + }; + ++/** ++ * struct brcmf_pcie_dhi_ringinfo - dongle/host interface shared ring info ++ * ++ * @ringmem: dongle memory pointer to ring memory location ++ * @h2d_w_idx_ptr: h2d ring write indices dongle memory pointers ++ * @h2d_r_idx_ptr: h2d ring read indices dongle memory pointers ++ * @d2h_w_idx_ptr: d2h ring write indices dongle memory pointers ++ * @d2h_r_idx_ptr: d2h ring read indices dongle memory pointers ++ * @h2d_w_idx_hostaddr: h2d ring write indices host memory pointers ++ * @h2d_r_idx_hostaddr: h2d ring read indices host memory pointers ++ * @d2h_w_idx_hostaddr: d2h ring write indices host memory pointers ++ * @d2h_r_idx_hostaddr: d2h ring reaD indices host memory pointers ++ * @max_flowrings: maximum number of tx flow rings supported. ++ * @max_submissionrings: maximum number of submission rings(h2d) supported. ++ * @max_completionrings: maximum number of completion rings(d2h) supported. ++ */ ++struct brcmf_pcie_dhi_ringinfo { ++ __le32 ringmem; ++ __le32 h2d_w_idx_ptr; ++ __le32 h2d_r_idx_ptr; ++ __le32 d2h_w_idx_ptr; ++ __le32 d2h_r_idx_ptr; ++ struct msgbuf_buf_addr h2d_w_idx_hostaddr; ++ struct msgbuf_buf_addr h2d_r_idx_hostaddr; ++ struct msgbuf_buf_addr d2h_w_idx_hostaddr; ++ struct msgbuf_buf_addr d2h_r_idx_hostaddr; ++ __le16 max_flowrings; ++ __le16 max_submissionrings; ++ __le16 max_completionrings; ++}; + + static const u32 brcmf_ring_max_item[BRCMF_NROF_COMMON_MSGRINGS] = { + BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM, +@@ -1054,26 +1076,35 @@ static int brcmf_pcie_init_ringbuffers(s + { + struct brcmf_pcie_ringbuf *ring; + struct brcmf_pcie_ringbuf *rings; +- u32 ring_addr; + u32 d2h_w_idx_ptr; + u32 d2h_r_idx_ptr; + u32 h2d_w_idx_ptr; + u32 h2d_r_idx_ptr; +- u32 addr; + u32 ring_mem_ptr; + u32 i; + u64 address; + u32 bufsz; +- u16 max_sub_queues; + u8 idx_offset; +- +- ring_addr = devinfo->shared.ring_info_addr; +- brcmf_dbg(PCIE, "Base ring addr = 0x%08x\n", ring_addr); +- addr = ring_addr + BRCMF_SHARED_RING_MAX_SUB_QUEUES; +- max_sub_queues = brcmf_pcie_read_tcm16(devinfo, addr); ++ struct brcmf_pcie_dhi_ringinfo ringinfo; ++ u16 max_flowrings; ++ u16 max_submissionrings; ++ u16 max_completionrings; ++ ++ memcpy_fromio(&ringinfo, devinfo->tcm + devinfo->shared.ring_info_addr, ++ sizeof(ringinfo)); ++ if (devinfo->shared.version >= 6) { ++ max_submissionrings = le16_to_cpu(ringinfo.max_submissionrings); ++ max_flowrings = le16_to_cpu(ringinfo.max_flowrings); ++ max_completionrings = le16_to_cpu(ringinfo.max_completionrings); ++ } else { ++ max_submissionrings = le16_to_cpu(ringinfo.max_flowrings); ++ max_flowrings = max_submissionrings - ++ BRCMF_NROF_H2D_COMMON_MSGRINGS; ++ max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS; ++ } + + if (devinfo->dma_idx_sz != 0) { +- bufsz = (BRCMF_NROF_D2H_COMMON_MSGRINGS + max_sub_queues) * ++ bufsz = (max_submissionrings + max_completionrings) * + devinfo->dma_idx_sz * 2; + devinfo->idxbuf = dma_alloc_coherent(&devinfo->pdev->dev, bufsz, + &devinfo->idxbuf_dmahandle, +@@ -1083,14 +1114,10 @@ static int brcmf_pcie_init_ringbuffers(s + } + + if (devinfo->dma_idx_sz == 0) { +- addr = ring_addr + BRCMF_SHARED_RING_D2H_W_IDX_PTR_OFFSET; +- d2h_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr); +- addr = ring_addr + BRCMF_SHARED_RING_D2H_R_IDX_PTR_OFFSET; +- d2h_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr); +- addr = ring_addr + BRCMF_SHARED_RING_H2D_W_IDX_PTR_OFFSET; +- h2d_w_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr); +- addr = ring_addr + BRCMF_SHARED_RING_H2D_R_IDX_PTR_OFFSET; +- h2d_r_idx_ptr = brcmf_pcie_read_tcm32(devinfo, addr); ++ d2h_w_idx_ptr = le32_to_cpu(ringinfo.d2h_w_idx_ptr); ++ d2h_r_idx_ptr = le32_to_cpu(ringinfo.d2h_r_idx_ptr); ++ h2d_w_idx_ptr = le32_to_cpu(ringinfo.h2d_w_idx_ptr); ++ h2d_r_idx_ptr = le32_to_cpu(ringinfo.h2d_r_idx_ptr); + idx_offset = sizeof(u32); + devinfo->write_ptr = brcmf_pcie_write_tcm16; + devinfo->read_ptr = brcmf_pcie_read_tcm16; +@@ -1103,34 +1130,42 @@ static int brcmf_pcie_init_ringbuffers(s + devinfo->read_ptr = brcmf_pcie_read_idx; + + h2d_w_idx_ptr = 0; +- addr = ring_addr + BRCMF_SHARED_RING_H2D_WP_HADDR_OFFSET; + address = (u64)devinfo->idxbuf_dmahandle; +- brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff); +- brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32); +- +- h2d_r_idx_ptr = h2d_w_idx_ptr + max_sub_queues * idx_offset; +- addr = ring_addr + BRCMF_SHARED_RING_H2D_RP_HADDR_OFFSET; +- address += max_sub_queues * idx_offset; +- brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff); +- brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32); +- +- d2h_w_idx_ptr = h2d_r_idx_ptr + max_sub_queues * idx_offset; +- addr = ring_addr + BRCMF_SHARED_RING_D2H_WP_HADDR_OFFSET; +- address += max_sub_queues * idx_offset; +- brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff); +- brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32); ++ ringinfo.h2d_w_idx_hostaddr.low_addr = ++ cpu_to_le32(address & 0xffffffff); ++ ringinfo.h2d_w_idx_hostaddr.high_addr = ++ cpu_to_le32(address >> 32); ++ ++ h2d_r_idx_ptr = h2d_w_idx_ptr + ++ max_submissionrings * idx_offset; ++ address += max_submissionrings * idx_offset; ++ ringinfo.h2d_r_idx_hostaddr.low_addr = ++ cpu_to_le32(address & 0xffffffff); ++ ringinfo.h2d_r_idx_hostaddr.high_addr = ++ cpu_to_le32(address >> 32); ++ ++ d2h_w_idx_ptr = h2d_r_idx_ptr + ++ max_submissionrings * idx_offset; ++ address += max_submissionrings * idx_offset; ++ ringinfo.d2h_w_idx_hostaddr.low_addr = ++ cpu_to_le32(address & 0xffffffff); ++ ringinfo.d2h_w_idx_hostaddr.high_addr = ++ cpu_to_le32(address >> 32); + + d2h_r_idx_ptr = d2h_w_idx_ptr + +- BRCMF_NROF_D2H_COMMON_MSGRINGS * idx_offset; +- addr = ring_addr + BRCMF_SHARED_RING_D2H_RP_HADDR_OFFSET; +- address += BRCMF_NROF_D2H_COMMON_MSGRINGS * idx_offset; +- brcmf_pcie_write_tcm32(devinfo, addr, address & 0xffffffff); +- brcmf_pcie_write_tcm32(devinfo, addr + 4, address >> 32); ++ max_completionrings * idx_offset; ++ address += max_completionrings * idx_offset; ++ ringinfo.d2h_r_idx_hostaddr.low_addr = ++ cpu_to_le32(address & 0xffffffff); ++ ringinfo.d2h_r_idx_hostaddr.high_addr = ++ cpu_to_le32(address >> 32); ++ ++ memcpy_toio(devinfo->tcm + devinfo->shared.ring_info_addr, ++ &ringinfo, sizeof(ringinfo)); + brcmf_dbg(PCIE, "Using host memory indices\n"); + } + +- addr = ring_addr + BRCMF_SHARED_RING_TCM_MEMLOC_OFFSET; +- ring_mem_ptr = brcmf_pcie_read_tcm32(devinfo, addr); ++ ring_mem_ptr = le32_to_cpu(ringinfo.ringmem); + + for (i = 0; i < BRCMF_NROF_H2D_COMMON_MSGRINGS; i++) { + ring = brcmf_pcie_alloc_dma_and_ring(devinfo, i, ring_mem_ptr); +@@ -1161,20 +1196,19 @@ static int brcmf_pcie_init_ringbuffers(s + ring_mem_ptr += BRCMF_RING_MEM_SZ; + } + +- devinfo->shared.nrof_flowrings = +- max_sub_queues - BRCMF_NROF_H2D_COMMON_MSGRINGS; +- rings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*ring), +- GFP_KERNEL); ++ devinfo->shared.max_flowrings = max_flowrings; ++ devinfo->shared.max_submissionrings = max_submissionrings; ++ devinfo->shared.max_completionrings = max_completionrings; ++ rings = kcalloc(max_flowrings, sizeof(*ring), GFP_KERNEL); + if (!rings) + goto fail; + +- brcmf_dbg(PCIE, "Nr of flowrings is %d\n", +- devinfo->shared.nrof_flowrings); ++ brcmf_dbg(PCIE, "Nr of flowrings is %d\n", max_flowrings); + +- for (i = 0; i < devinfo->shared.nrof_flowrings; i++) { ++ for (i = 0; i < max_flowrings; i++) { + ring = &rings[i]; + ring->devinfo = devinfo; +- ring->id = i + BRCMF_NROF_COMMON_MSGRINGS; ++ ring->id = i + BRCMF_H2D_MSGRING_FLOWRING_IDSTART; + brcmf_commonring_register_cb(&ring->commonring, + brcmf_pcie_ring_mb_ring_bell, + brcmf_pcie_ring_mb_update_rptr, +@@ -1357,17 +1391,16 @@ brcmf_pcie_init_share_ram_info(struct br + { + struct brcmf_pcie_shared_info *shared; + u32 addr; +- u32 version; + + shared = &devinfo->shared; + shared->tcm_base_address = sharedram_addr; + + shared->flags = brcmf_pcie_read_tcm32(devinfo, sharedram_addr); +- version = shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK; +- brcmf_dbg(PCIE, "PCIe protocol version %d\n", version); +- if ((version > BRCMF_PCIE_MAX_SHARED_VERSION) || +- (version < BRCMF_PCIE_MIN_SHARED_VERSION)) { +- brcmf_err("Unsupported PCIE version %d\n", version); ++ shared->version = (u8)(shared->flags & BRCMF_PCIE_SHARED_VERSION_MASK); ++ brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version); ++ if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) || ++ (shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) { ++ brcmf_err("Unsupported PCIE version %d\n", shared->version); + return -EINVAL; + } + +@@ -1661,18 +1694,18 @@ static void brcmf_pcie_setup(struct devi + bus->msgbuf->commonrings[i] = + &devinfo->shared.commonrings[i]->commonring; + +- flowrings = kcalloc(devinfo->shared.nrof_flowrings, sizeof(*flowrings), ++ flowrings = kcalloc(devinfo->shared.max_flowrings, sizeof(*flowrings), + GFP_KERNEL); + if (!flowrings) + goto fail; + +- for (i = 0; i < devinfo->shared.nrof_flowrings; i++) ++ for (i = 0; i < devinfo->shared.max_flowrings; i++) + flowrings[i] = &devinfo->shared.flowrings[i].commonring; + bus->msgbuf->flowrings = flowrings; + + bus->msgbuf->rx_dataoffset = devinfo->shared.rx_dataoffset; + bus->msgbuf->max_rxbufpost = devinfo->shared.max_rxbufpost; +- bus->msgbuf->nrof_flowrings = devinfo->shared.nrof_flowrings; ++ bus->msgbuf->max_flowrings = devinfo->shared.max_flowrings; + + init_waitqueue_head(&devinfo->mbdata_resp_wait); + |