Loading drivers/net/wireless/ath/wil6210/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ wil6210-y += fw.o wil6210-$(CONFIG_WIL6210_TRACING) += trace.o wil6210-y += wil_platform.o wil6210-$(CONFIG_WIL6210_PLATFORM_MSM) += wil_platform_msm.o wil6210-y += ethtool.o # for tracing framework to find trace.h CFLAGS_trace.o := -I$(src) Loading drivers/net/wireless/ath/wil6210/ethtool.c 0 → 100644 +103 −0 Original line number Diff line number Diff line /* * Copyright (c) 2014 Qualcomm Atheros, Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <linux/etherdevice.h> #include <linux/pci.h> #include <linux/rtnetlink.h> #include <net/cfg80211.h> #include "wil6210.h" static int wil_ethtoolops_begin(struct net_device *ndev) { struct wil6210_priv *wil = ndev_to_wil(ndev); mutex_lock(&wil->mutex); wil_dbg_misc(wil, "%s()\n", __func__); return 0; } static void wil_ethtoolops_complete(struct net_device *ndev) { struct wil6210_priv *wil = ndev_to_wil(ndev); wil_dbg_misc(wil, "%s()\n", __func__); mutex_unlock(&wil->mutex); } static int wil_ethtoolops_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *cp) { struct wil6210_priv *wil = ndev_to_wil(ndev); u32 itr_en, itr_val = 0; wil_dbg_misc(wil, "%s()\n", __func__); itr_en = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL)); if (itr_en & BIT_DMA_ITR_CNT_CRL_EN) itr_val = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH)); cp->rx_coalesce_usecs = itr_val; return 0; } static int wil_ethtoolops_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *cp) { struct wil6210_priv *wil = ndev_to_wil(ndev); wil_dbg_misc(wil, "%s(%d usec)\n", __func__, cp->rx_coalesce_usecs); if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { wil_dbg_misc(wil, "No IRQ coalescing in monitor mode\n"); return -EINVAL; } /* only @rx_coalesce_usecs supported, ignore * other parameters */ if (cp->rx_coalesce_usecs > WIL6210_ITR_TRSH_MAX) goto out_bad; wil->itr_trsh = cp->rx_coalesce_usecs; wil_set_itr_trsh(wil); return 0; out_bad: wil_dbg_misc(wil, "Unsupported coalescing params. Raw command:\n"); print_hex_dump_debug("DBG[MISC] coal ", DUMP_PREFIX_OFFSET, 16, 4, cp, sizeof(*cp), false); return -EINVAL; } static const struct ethtool_ops wil_ethtool_ops = { .begin = wil_ethtoolops_begin, .complete = wil_ethtoolops_complete, .get_drvinfo = cfg80211_get_drvinfo, .get_coalesce = wil_ethtoolops_get_coalesce, .set_coalesce = wil_ethtoolops_set_coalesce, }; void wil_set_ethtoolops(struct net_device *ndev) { ndev->ethtool_ops = &wil_ethtool_ops; } drivers/net/wireless/ath/wil6210/interrupt.c +1 −11 Original line number Diff line number Diff line Loading @@ -157,17 +157,7 @@ void wil_unmask_irq(struct wil6210_priv *wil) offsetof(struct RGF_ICR, ICC)); /* interrupt moderation parameters */ if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { /* disable interrupt moderation for monitor * to get better timestamp precision */ iowrite32(0, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL)); } else { iowrite32(WIL6210_ITR_TRSH, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH)); iowrite32(BIT_DMA_ITR_CNT_CRL_EN, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL)); } wil_set_itr_trsh(wil); wil6210_unmask_irq_pseudo(wil); wil6210_unmask_irq_tx(wil); Loading drivers/net/wireless/ath/wil6210/main.c +26 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,11 @@ static bool no_fw_load = true; module_param(no_fw_load, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(no_fw_load, " do not download FW, use one in on-card flash."); static unsigned int itr_trsh = WIL6210_ITR_TRSH_DEFAULT; module_param(itr_trsh, uint, S_IRUGO); MODULE_PARM_DESC(itr_trsh, " Interrupt moderation threshold, usecs."); #define RST_DELAY (20) /* msec, for loop in @wil_target_reset */ #define RST_COUNT (1 + 1000/RST_DELAY) /* round up to be above 1 sec total */ Loading Loading @@ -309,6 +314,7 @@ int wil_priv_init(struct wil6210_priv *wil) } wil->last_fw_recovery = jiffies; wil->itr_trsh = itr_trsh; return 0; } Loading Loading @@ -437,6 +443,26 @@ static int wil_target_reset(struct wil6210_priv *wil) return 0; } /** * wil_set_itr_trsh: - apply interrupt coalescing params */ void wil_set_itr_trsh(struct wil6210_priv *wil) { /* disable, use usec resolution */ W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_EXT_TICK); /* disable interrupt moderation for monitor * to get better timestamp precision */ if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) return; wil_info(wil, "set ITR_TRSH = %d usec\n", wil->itr_trsh); W(RGF_DMA_ITR_CNT_TRSH, wil->itr_trsh); W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_EN | BIT_DMA_ITR_CNT_CRL_EXT_TICK); /* start it */ } #undef R #undef W #undef S Loading drivers/net/wireless/ath/wil6210/netdev.c +1 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,7 @@ void *wil_if_alloc(struct device *dev, void __iomem *csr) } ndev->netdev_ops = &wil_netdev_ops; wil_set_ethtoolops(ndev); ndev->ieee80211_ptr = wdev; ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GRO; Loading Loading
drivers/net/wireless/ath/wil6210/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,7 @@ wil6210-y += fw.o wil6210-$(CONFIG_WIL6210_TRACING) += trace.o wil6210-y += wil_platform.o wil6210-$(CONFIG_WIL6210_PLATFORM_MSM) += wil_platform_msm.o wil6210-y += ethtool.o # for tracing framework to find trace.h CFLAGS_trace.o := -I$(src) Loading
drivers/net/wireless/ath/wil6210/ethtool.c 0 → 100644 +103 −0 Original line number Diff line number Diff line /* * Copyright (c) 2014 Qualcomm Atheros, Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include <linux/etherdevice.h> #include <linux/pci.h> #include <linux/rtnetlink.h> #include <net/cfg80211.h> #include "wil6210.h" static int wil_ethtoolops_begin(struct net_device *ndev) { struct wil6210_priv *wil = ndev_to_wil(ndev); mutex_lock(&wil->mutex); wil_dbg_misc(wil, "%s()\n", __func__); return 0; } static void wil_ethtoolops_complete(struct net_device *ndev) { struct wil6210_priv *wil = ndev_to_wil(ndev); wil_dbg_misc(wil, "%s()\n", __func__); mutex_unlock(&wil->mutex); } static int wil_ethtoolops_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *cp) { struct wil6210_priv *wil = ndev_to_wil(ndev); u32 itr_en, itr_val = 0; wil_dbg_misc(wil, "%s()\n", __func__); itr_en = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL)); if (itr_en & BIT_DMA_ITR_CNT_CRL_EN) itr_val = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH)); cp->rx_coalesce_usecs = itr_val; return 0; } static int wil_ethtoolops_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *cp) { struct wil6210_priv *wil = ndev_to_wil(ndev); wil_dbg_misc(wil, "%s(%d usec)\n", __func__, cp->rx_coalesce_usecs); if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { wil_dbg_misc(wil, "No IRQ coalescing in monitor mode\n"); return -EINVAL; } /* only @rx_coalesce_usecs supported, ignore * other parameters */ if (cp->rx_coalesce_usecs > WIL6210_ITR_TRSH_MAX) goto out_bad; wil->itr_trsh = cp->rx_coalesce_usecs; wil_set_itr_trsh(wil); return 0; out_bad: wil_dbg_misc(wil, "Unsupported coalescing params. Raw command:\n"); print_hex_dump_debug("DBG[MISC] coal ", DUMP_PREFIX_OFFSET, 16, 4, cp, sizeof(*cp), false); return -EINVAL; } static const struct ethtool_ops wil_ethtool_ops = { .begin = wil_ethtoolops_begin, .complete = wil_ethtoolops_complete, .get_drvinfo = cfg80211_get_drvinfo, .get_coalesce = wil_ethtoolops_get_coalesce, .set_coalesce = wil_ethtoolops_set_coalesce, }; void wil_set_ethtoolops(struct net_device *ndev) { ndev->ethtool_ops = &wil_ethtool_ops; }
drivers/net/wireless/ath/wil6210/interrupt.c +1 −11 Original line number Diff line number Diff line Loading @@ -157,17 +157,7 @@ void wil_unmask_irq(struct wil6210_priv *wil) offsetof(struct RGF_ICR, ICC)); /* interrupt moderation parameters */ if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { /* disable interrupt moderation for monitor * to get better timestamp precision */ iowrite32(0, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL)); } else { iowrite32(WIL6210_ITR_TRSH, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH)); iowrite32(BIT_DMA_ITR_CNT_CRL_EN, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL)); } wil_set_itr_trsh(wil); wil6210_unmask_irq_pseudo(wil); wil6210_unmask_irq_tx(wil); Loading
drivers/net/wireless/ath/wil6210/main.c +26 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,11 @@ static bool no_fw_load = true; module_param(no_fw_load, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(no_fw_load, " do not download FW, use one in on-card flash."); static unsigned int itr_trsh = WIL6210_ITR_TRSH_DEFAULT; module_param(itr_trsh, uint, S_IRUGO); MODULE_PARM_DESC(itr_trsh, " Interrupt moderation threshold, usecs."); #define RST_DELAY (20) /* msec, for loop in @wil_target_reset */ #define RST_COUNT (1 + 1000/RST_DELAY) /* round up to be above 1 sec total */ Loading Loading @@ -309,6 +314,7 @@ int wil_priv_init(struct wil6210_priv *wil) } wil->last_fw_recovery = jiffies; wil->itr_trsh = itr_trsh; return 0; } Loading Loading @@ -437,6 +443,26 @@ static int wil_target_reset(struct wil6210_priv *wil) return 0; } /** * wil_set_itr_trsh: - apply interrupt coalescing params */ void wil_set_itr_trsh(struct wil6210_priv *wil) { /* disable, use usec resolution */ W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_EXT_TICK); /* disable interrupt moderation for monitor * to get better timestamp precision */ if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) return; wil_info(wil, "set ITR_TRSH = %d usec\n", wil->itr_trsh); W(RGF_DMA_ITR_CNT_TRSH, wil->itr_trsh); W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_EN | BIT_DMA_ITR_CNT_CRL_EXT_TICK); /* start it */ } #undef R #undef W #undef S Loading
drivers/net/wireless/ath/wil6210/netdev.c +1 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,7 @@ void *wil_if_alloc(struct device *dev, void __iomem *csr) } ndev->netdev_ops = &wil_netdev_ops; wil_set_ethtoolops(ndev); ndev->ieee80211_ptr = wdev; ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM | NETIF_F_SG | NETIF_F_GRO; Loading