mirror of
https://github.com/opnsense/src.git
synced 2026-06-08 16:22:46 -04:00
Import ISC-licensed driver parts of mediatek/mt76 assumed to be based on Linux wireless-testing at a02411a5b98612c12be99349836d99f07db12a77 (tag: wt-2022-11-23). Complement the driver and LinuxKPI with our own (dummy) implementations of missing parts (util.h and soc/mediatek/) as well as changes to make compile on FreeBSD with changes covered by #ifdef (__FreeBSD__) conditions. Further select updates were applied since the initial import in order to keep compiling along with other LinuxKPI based drivers. For the moment we only target the mt7915 and mt7921 PCI parts. More may follow in the future. Firmware is provided by port net/wifi-firmware-mt76-kmod. Given the lack of full license texts on non-local files this is imported under the draft policy for handling SPDX files (D29226). [1] Approved by: core (emaste, 2022-04-08) [1] MFC after: 2 months
121 lines
2.7 KiB
C
121 lines
2.7 KiB
C
// SPDX-License-Identifier: ISC
|
|
/*
|
|
* Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
|
|
*/
|
|
|
|
#include "mt76.h"
|
|
#include "trace.h"
|
|
|
|
static u32 mt76_mmio_rr(struct mt76_dev *dev, u32 offset)
|
|
{
|
|
u32 val;
|
|
|
|
#if defined(__linux__)
|
|
val = readl(dev->mmio.regs + offset);
|
|
#elif defined(__FreeBSD__)
|
|
val = readl((u8 *)dev->mmio.regs + offset);
|
|
#endif
|
|
trace_reg_rr(dev, offset, val);
|
|
|
|
return val;
|
|
}
|
|
|
|
static void mt76_mmio_wr(struct mt76_dev *dev, u32 offset, u32 val)
|
|
{
|
|
trace_reg_wr(dev, offset, val);
|
|
#if defined(__linux__)
|
|
writel(val, dev->mmio.regs + offset);
|
|
#elif defined(__FreeBSD__)
|
|
writel(val, (u8 *)dev->mmio.regs + offset);
|
|
#endif
|
|
}
|
|
|
|
static u32 mt76_mmio_rmw(struct mt76_dev *dev, u32 offset, u32 mask, u32 val)
|
|
{
|
|
val |= mt76_mmio_rr(dev, offset) & ~mask;
|
|
mt76_mmio_wr(dev, offset, val);
|
|
return val;
|
|
}
|
|
|
|
static void mt76_mmio_write_copy(struct mt76_dev *dev, u32 offset,
|
|
const void *data, int len)
|
|
{
|
|
#if defined(__linux__)
|
|
__iowrite32_copy(dev->mmio.regs + offset, data, DIV_ROUND_UP(len, 4));
|
|
#elif defined(__FreeBSD__)
|
|
__iowrite32_copy((u8 *)dev->mmio.regs + offset, data, DIV_ROUND_UP(len, 4));
|
|
#endif
|
|
}
|
|
|
|
static void mt76_mmio_read_copy(struct mt76_dev *dev, u32 offset,
|
|
void *data, int len)
|
|
{
|
|
#if defined(__linux__)
|
|
__ioread32_copy(data, dev->mmio.regs + offset, DIV_ROUND_UP(len, 4));
|
|
#elif defined(__FreeBSD__)
|
|
__ioread32_copy(data, (u8 *)dev->mmio.regs + offset, DIV_ROUND_UP(len, 4));
|
|
#endif
|
|
}
|
|
|
|
static int mt76_mmio_wr_rp(struct mt76_dev *dev, u32 base,
|
|
const struct mt76_reg_pair *data, int len)
|
|
{
|
|
while (len > 0) {
|
|
mt76_mmio_wr(dev, data->reg, data->value);
|
|
data++;
|
|
len--;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int mt76_mmio_rd_rp(struct mt76_dev *dev, u32 base,
|
|
struct mt76_reg_pair *data, int len)
|
|
{
|
|
while (len > 0) {
|
|
data->value = mt76_mmio_rr(dev, data->reg);
|
|
data++;
|
|
len--;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void mt76_set_irq_mask(struct mt76_dev *dev, u32 addr,
|
|
u32 clear, u32 set)
|
|
{
|
|
unsigned long flags;
|
|
|
|
spin_lock_irqsave(&dev->mmio.irq_lock, flags);
|
|
dev->mmio.irqmask &= ~clear;
|
|
dev->mmio.irqmask |= set;
|
|
if (addr) {
|
|
if (mtk_wed_device_active(&dev->mmio.wed))
|
|
mtk_wed_device_irq_set_mask(&dev->mmio.wed,
|
|
dev->mmio.irqmask);
|
|
else
|
|
mt76_mmio_wr(dev, addr, dev->mmio.irqmask);
|
|
}
|
|
spin_unlock_irqrestore(&dev->mmio.irq_lock, flags);
|
|
}
|
|
EXPORT_SYMBOL_GPL(mt76_set_irq_mask);
|
|
|
|
void mt76_mmio_init(struct mt76_dev *dev, void __iomem *regs)
|
|
{
|
|
static const struct mt76_bus_ops mt76_mmio_ops = {
|
|
.rr = mt76_mmio_rr,
|
|
.rmw = mt76_mmio_rmw,
|
|
.wr = mt76_mmio_wr,
|
|
.write_copy = mt76_mmio_write_copy,
|
|
.read_copy = mt76_mmio_read_copy,
|
|
.wr_rp = mt76_mmio_wr_rp,
|
|
.rd_rp = mt76_mmio_rd_rp,
|
|
.type = MT76_BUS_MMIO,
|
|
};
|
|
|
|
dev->bus = &mt76_mmio_ops;
|
|
dev->mmio.regs = regs;
|
|
|
|
spin_lock_init(&dev->mmio.irq_lock);
|
|
}
|
|
EXPORT_SYMBOL_GPL(mt76_mmio_init);
|