static int wil_ethtoolops_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *cp) { struct wil6210_priv *wil = ndev_to_wil(ndev); u32 tx_itr_en, tx_itr_val = 0; u32 rx_itr_en, rx_itr_val = 0; int ret; wil_dbg_misc(wil, "ethtoolops_get_coalesce\n"); ret = wil_pm_runtime_get(wil); if (ret < 0) return ret; tx_itr_en = wil_r(wil, RGF_DMA_ITR_TX_CNT_CTL); if (tx_itr_en & BIT_DMA_ITR_TX_CNT_CTL_EN) tx_itr_val = wil_r(wil, RGF_DMA_ITR_TX_CNT_TRSH); rx_itr_en = wil_r(wil, RGF_DMA_ITR_RX_CNT_CTL); if (rx_itr_en & BIT_DMA_ITR_RX_CNT_CTL_EN) rx_itr_val = wil_r(wil, RGF_DMA_ITR_RX_CNT_TRSH); wil_pm_runtime_put(wil); cp->tx_coalesce_usecs = tx_itr_val; cp->rx_coalesce_usecs = rx_itr_val; return 0; }
static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) { enum { max_count = 4096 }; struct wil_blob_wrapper *wil_blob = file->private_data; struct wil6210_priv *wil = wil_blob->wil; loff_t pos = *ppos; size_t available = wil_blob->blob.size; void *buf; size_t ret; int rc; if (test_bit(wil_status_suspending, wil_blob->wil->status) || test_bit(wil_status_suspended, wil_blob->wil->status)) return 0; if (pos < 0) return -EINVAL; if (pos >= available || !count) return 0; if (count > available - pos) count = available - pos; if (count > max_count) count = max_count; buf = kmalloc(count, GFP_KERNEL); if (!buf) return -ENOMEM; rc = wil_pm_runtime_get(wil); if (rc < 0) { kfree(buf); return rc; } wil_memcpy_fromio_32(buf, (const void __iomem *) wil_blob->blob.data + pos, count); ret = copy_to_user(user_buf, buf, count); wil_pm_runtime_put(wil); kfree(buf); if (ret == count) return -EFAULT; count -= ret; *ppos = pos + count; return count; }
static int wil_debugfs_iomem_x32_get(void *data, u64 *val) { struct wil_debugfs_iomem_data *d = (struct wil_debugfs_iomem_data *)data; struct wil6210_priv *wil = d->wil; int ret; ret = wil_pm_runtime_get(wil); if (ret < 0) return ret; *val = readl((void __iomem *)d->offset); wil_pm_runtime_put(wil); return 0; }
static int wil_debugfs_iomem_x32_set(void *data, u64 val) { struct wil_debugfs_iomem_data *d = (struct wil_debugfs_iomem_data *)data; struct wil6210_priv *wil = d->wil; int ret; ret = wil_pm_runtime_get(wil); if (ret < 0) return ret; writel(val, (void __iomem *)d->offset); wmb(); /* make sure write propagated to HW */ wil_pm_runtime_put(wil); return 0; }
static int wil_mbox_debugfs_show(struct seq_file *s, void *data) { struct wil6210_priv *wil = s->private; int ret; ret = wil_pm_runtime_get(wil); if (ret < 0) return ret; wil_print_ring(s, "tx", wil->csr + HOST_MBOX + offsetof(struct wil6210_mbox_ctl, tx)); wil_print_ring(s, "rx", wil->csr + HOST_MBOX + offsetof(struct wil6210_mbox_ctl, rx)); wil_pm_runtime_put(wil); return 0; }
static int wil_ethtoolops_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *cp) { struct wil6210_priv *wil = ndev_to_wil(ndev); int ret; wil_dbg_misc(wil, "ethtoolops_set_coalesce: rx %d usec, tx %d usec\n", cp->rx_coalesce_usecs, cp->tx_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 and @tx_coalesce_usecs supported, * ignore other parameters */ if (cp->rx_coalesce_usecs > WIL6210_ITR_TRSH_MAX || cp->tx_coalesce_usecs > WIL6210_ITR_TRSH_MAX) goto out_bad; wil->tx_max_burst_duration = cp->tx_coalesce_usecs; wil->rx_max_burst_duration = cp->rx_coalesce_usecs; ret = wil_pm_runtime_get(wil); if (ret < 0) return ret; wil_configure_interrupt_moderation(wil); wil_pm_runtime_put(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 int wil_memread_debugfs_show(struct seq_file *s, void *data) { struct wil6210_priv *wil = s->private; void __iomem *a; int ret; ret = wil_pm_runtime_get(wil); if (ret < 0) return ret; a = wmi_buffer(wil, cpu_to_le32(mem_addr)); if (a) seq_printf(s, "[0x%08x] = 0x%08x\n", mem_addr, readl(a)); else seq_printf(s, "[0x%08x] = INVALID\n", mem_addr); wil_pm_runtime_put(wil); return 0; }