|
@@ -37,6 +37,10 @@ bool rx_align_2;
|
|
|
module_param(rx_align_2, bool, 0444);
|
|
|
MODULE_PARM_DESC(rx_align_2, " align Rx buffers on 4*n+2, default - no");
|
|
|
|
|
|
+bool rx_large_buf;
|
|
|
+module_param(rx_large_buf, bool, 0444);
|
|
|
+MODULE_PARM_DESC(rx_large_buf, " allocate 8KB RX buffers, default - no");
|
|
|
+
|
|
|
static inline uint wil_rx_snaplen(void)
|
|
|
{
|
|
|
return rx_align_2 ? 6 : 0;
|
|
@@ -255,7 +259,7 @@ static int wil_vring_alloc_skb(struct wil6210_priv *wil, struct vring *vring,
|
|
|
u32 i, int headroom)
|
|
|
{
|
|
|
struct device *dev = wil_to_dev(wil);
|
|
|
- unsigned int sz = mtu_max + ETH_HLEN + wil_rx_snaplen();
|
|
|
+ unsigned int sz = wil->rx_buf_len + ETH_HLEN + wil_rx_snaplen();
|
|
|
struct vring_rx_desc dd, *d = ⅆ
|
|
|
volatile struct vring_rx_desc *_d = &vring->va[i].rx;
|
|
|
dma_addr_t pa;
|
|
@@ -419,7 +423,7 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
|
|
|
struct sk_buff *skb;
|
|
|
dma_addr_t pa;
|
|
|
unsigned int snaplen = wil_rx_snaplen();
|
|
|
- unsigned int sz = mtu_max + ETH_HLEN + snaplen;
|
|
|
+ unsigned int sz = wil->rx_buf_len + ETH_HLEN + snaplen;
|
|
|
u16 dmalen;
|
|
|
u8 ftype;
|
|
|
int cid;
|
|
@@ -780,6 +784,20 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
|
|
|
wil_rx_refill(wil, v->size);
|
|
|
}
|
|
|
|
|
|
+static void wil_rx_buf_len_init(struct wil6210_priv *wil)
|
|
|
+{
|
|
|
+ wil->rx_buf_len = rx_large_buf ?
|
|
|
+ WIL_MAX_ETH_MTU : TXRX_BUF_LEN_DEFAULT - WIL_MAX_MPDU_OVERHEAD;
|
|
|
+ if (mtu_max > wil->rx_buf_len) {
|
|
|
+ /* do not allow RX buffers to be smaller than mtu_max, for
|
|
|
+ * backward compatibility (mtu_max parameter was also used
|
|
|
+ * to support receiving large packets)
|
|
|
+ */
|
|
|
+ wil_info(wil, "Override RX buffer to mtu_max(%d)\n", mtu_max);
|
|
|
+ wil->rx_buf_len = mtu_max;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
|
|
{
|
|
|
struct vring *vring = &wil->vring_rx;
|
|
@@ -792,6 +810,8 @@ int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ wil_rx_buf_len_init(wil);
|
|
|
+
|
|
|
vring->size = size;
|
|
|
rc = wil_vring_alloc(wil, vring);
|
|
|
if (rc)
|