From: Lior David <[email protected]>

Add 2 module parameters that control broadcast/multicast
TX packets:
1. bcast_mcs0_limit - specify the maximum packet size
that will be sent with MCS 0.
2. bcast_mcs - specify the MCS index to use when sending
packets larger than above limit.

Signed-off-by: Lior David <[email protected]>
Signed-off-by: Maya Erez <[email protected]>
---
 drivers/net/wireless/ath/wil6210/txrx.c | 59 +++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/ath/wil6210/txrx.c 
b/drivers/net/wireless/ath/wil6210/txrx.c
index 89967ce..4fc05f7 100644
--- a/drivers/net/wireless/ath/wil6210/txrx.c
+++ b/drivers/net/wireless/ath/wil6210/txrx.c
@@ -67,6 +67,60 @@ static int headroom_size_set(const char *val, const struct 
kernel_param *kp)
 MODULE_PARM_DESC(headroom_size,
                 " headroom size for rx skb allocation, default - 0");
 
+static uint bcast_mcs0_limit = WIL_BCAST_MCS0_LIMIT;
+static int bcast_mcs0_limit_set(const char *val, const struct kernel_param *kp)
+{
+       int ret;
+       uint saved = bcast_mcs0_limit;
+
+       ret = param_set_uint(val, kp);
+       if (ret)
+               return ret;
+
+       if (bcast_mcs0_limit > WIL_BCAST_MCS0_LIMIT) {
+               bcast_mcs0_limit = saved;
+               ret = -EINVAL;
+       }
+
+       return ret;
+}
+
+static const struct kernel_param_ops bcast_mcs0_limit_ops = {
+       .set = bcast_mcs0_limit_set,
+       .get = param_get_uint,
+};
+
+module_param_cb(bcast_mcs0_limit_set, &bcast_mcs0_limit_ops,
+               &bcast_mcs0_limit, 0644);
+MODULE_PARM_DESC(bcast_mcs0_limit,
+                " max broadcast packet size with MCS0, default - 1024 bytes");
+
+static uint bcast_mcs = 1;
+static int bcast_mcs_set(const char *val, const struct kernel_param *kp)
+{
+       int ret;
+       uint saved = bcast_mcs;
+
+       ret = param_set_uint(val, kp);
+       if (ret)
+               return ret;
+
+       if (bcast_mcs > WIL_MCS_MAX || bcast_mcs == 0) {
+               bcast_mcs = saved;
+               ret = -EINVAL;
+       }
+
+       return ret;
+}
+
+static const struct kernel_param_ops bcast_mcs_ops = {
+       .set = bcast_mcs_set,
+       .get = param_get_uint,
+};
+
+module_param_cb(bcast_mcs, &bcast_mcs_ops, &bcast_mcs, 0644);
+MODULE_PARM_DESC(bcast_mcs, " MCS index for large bcast TX, default - 1");
+
 static inline uint wil_rx_snaplen(void)
 {
        return rx_align_2 ? 6 : 0;
@@ -1783,8 +1837,9 @@ static int __wil_tx_vring(struct wil6210_priv *wil, 
struct vring *vring,
        wil_tx_desc_map(d, pa, len, vring_index);
        if (unlikely(mcast)) {
                d->mac.d[0] |= BIT(MAC_CFG_DESC_TX_0_MCS_EN_POS); /* MCS 0 */
-               if (unlikely(len > WIL_BCAST_MCS0_LIMIT)) /* set MCS 1 */
-                       d->mac.d[0] |= (1 << MAC_CFG_DESC_TX_0_MCS_INDEX_POS);
+               if (unlikely(len > bcast_mcs0_limit)) /* use bcast_mcs */
+                       d->mac.d[0] |= (bcast_mcs <<
+                                       MAC_CFG_DESC_TX_0_MCS_INDEX_POS);
        }
        /* Process TCP/UDP checksum offloading */
        if (unlikely(wil_tx_desc_offload_setup(d, skb))) {
-- 
1.9.1

Reply via email to