Commit e541f4b1 authored by Dedy Lansky's avatar Dedy Lansky Committed by Greg Kroah-Hartman

wil6210: make sure Rx ring sizes are correlated

commit 61e5ec04 upstream.

When enlarging rx_ring_order module param, wil6210 fails to load
because there are not enough Rx buffers.
Fix this by enlarging number of Rx buffers at startup, if needed based
on rx_ring_order.
Signed-off-by: default avatarDedy Lansky <dlansky@codeaurora.org>
Signed-off-by: default avatarMaya Erez <merez@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Signed-off-by: default avatarLee Jones <lee.jones@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 20680907
...@@ -1687,7 +1687,7 @@ int __wil_up(struct wil6210_priv *wil) ...@@ -1687,7 +1687,7 @@ int __wil_up(struct wil6210_priv *wil)
return rc; return rc;
/* Rx RING. After MAC and beacon */ /* Rx RING. After MAC and beacon */
rc = wil->txrx_ops.rx_init(wil, 1 << rx_ring_order); rc = wil->txrx_ops.rx_init(wil, rx_ring_order);
if (rc) if (rc)
return rc; return rc;
......
...@@ -881,7 +881,7 @@ static void wil_rx_buf_len_init(struct wil6210_priv *wil) ...@@ -881,7 +881,7 @@ static void wil_rx_buf_len_init(struct wil6210_priv *wil)
} }
} }
static int wil_rx_init(struct wil6210_priv *wil, u16 size) static int wil_rx_init(struct wil6210_priv *wil, uint order)
{ {
struct wil_ring *vring = &wil->ring_rx; struct wil_ring *vring = &wil->ring_rx;
int rc; int rc;
...@@ -895,7 +895,7 @@ static int wil_rx_init(struct wil6210_priv *wil, u16 size) ...@@ -895,7 +895,7 @@ static int wil_rx_init(struct wil6210_priv *wil, u16 size)
wil_rx_buf_len_init(wil); wil_rx_buf_len_init(wil);
vring->size = size; vring->size = 1 << order;
vring->is_rx = true; vring->is_rx = true;
rc = wil_vring_alloc(wil, vring); rc = wil_vring_alloc(wil, vring);
if (rc) if (rc)
......
...@@ -593,9 +593,9 @@ static void wil_rx_buf_len_init_edma(struct wil6210_priv *wil) ...@@ -593,9 +593,9 @@ static void wil_rx_buf_len_init_edma(struct wil6210_priv *wil)
WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT; WIL_MAX_ETH_MTU : WIL_EDMA_RX_BUF_LEN_DEFAULT;
} }
static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) static int wil_rx_init_edma(struct wil6210_priv *wil, uint desc_ring_order)
{ {
u16 status_ring_size; u16 status_ring_size, desc_ring_size = 1 << desc_ring_order;
struct wil_ring *ring = &wil->ring_rx; struct wil_ring *ring = &wil->ring_rx;
int rc; int rc;
size_t elem_size = wil->use_compressed_rx_status ? size_t elem_size = wil->use_compressed_rx_status ?
...@@ -610,7 +610,12 @@ static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size) ...@@ -610,7 +610,12 @@ static int wil_rx_init_edma(struct wil6210_priv *wil, u16 desc_ring_size)
"compressed RX status cannot be used with SW reorder\n"); "compressed RX status cannot be used with SW reorder\n");
return -EINVAL; return -EINVAL;
} }
if (wil->rx_status_ring_order <= desc_ring_order)
/* make sure sring is larger than desc ring */
wil->rx_status_ring_order = desc_ring_order + 1;
if (wil->rx_buff_id_count <= desc_ring_size)
/* make sure we will not run out of buff_ids */
wil->rx_buff_id_count = desc_ring_size + 512;
if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN || if (wil->rx_status_ring_order < WIL_SRING_SIZE_ORDER_MIN ||
wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX) wil->rx_status_ring_order > WIL_SRING_SIZE_ORDER_MAX)
wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT; wil->rx_status_ring_order = WIL_RX_SRING_SIZE_ORDER_DEFAULT;
......
...@@ -602,7 +602,7 @@ struct wil_txrx_ops { ...@@ -602,7 +602,7 @@ struct wil_txrx_ops {
struct wil_ring *ring, struct sk_buff *skb); struct wil_ring *ring, struct sk_buff *skb);
irqreturn_t (*irq_tx)(int irq, void *cookie); irqreturn_t (*irq_tx)(int irq, void *cookie);
/* RX ops */ /* RX ops */
int (*rx_init)(struct wil6210_priv *wil, u16 ring_size); int (*rx_init)(struct wil6210_priv *wil, uint ring_order);
void (*rx_fini)(struct wil6210_priv *wil); void (*rx_fini)(struct wil6210_priv *wil);
int (*wmi_addba_rx_resp)(struct wil6210_priv *wil, u8 mid, u8 cid, int (*wmi_addba_rx_resp)(struct wil6210_priv *wil, u8 mid, u8 cid,
u8 tid, u8 token, u16 status, bool amsdu, u8 tid, u8 token, u16 status, bool amsdu,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment