mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
mt76: dma: introduce mt76_dma_queue_reset routine
Introduce mt76_dma_queue_reset utility routine to reset a given hw queue. This is a preliminary patch to introduce mt7921 chip reset support. Co-developed-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
1f7396acfe
commit
3990465db6
|
|
@ -79,13 +79,38 @@ mt76_free_pending_txwi(struct mt76_dev *dev)
|
||||||
local_bh_enable();
|
local_bh_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)
|
||||||
|
{
|
||||||
|
writel(q->desc_dma, &q->regs->desc_base);
|
||||||
|
writel(q->ndesc, &q->regs->ring_size);
|
||||||
|
q->head = readl(&q->regs->dma_idx);
|
||||||
|
q->tail = q->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mt76_dma_queue_reset(struct mt76_dev *dev, struct mt76_queue *q)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (!q)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* clear descriptors */
|
||||||
|
for (i = 0; i < q->ndesc; i++)
|
||||||
|
q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE);
|
||||||
|
|
||||||
|
writel(0, &q->regs->cpu_idx);
|
||||||
|
writel(0, &q->regs->dma_idx);
|
||||||
|
mt76_dma_sync_idx(dev, q);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
|
mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
|
||||||
int idx, int n_desc, int bufsize,
|
int idx, int n_desc, int bufsize,
|
||||||
u32 ring_base)
|
u32 ring_base)
|
||||||
{
|
{
|
||||||
int size;
|
int size;
|
||||||
int i;
|
|
||||||
|
|
||||||
spin_lock_init(&q->lock);
|
spin_lock_init(&q->lock);
|
||||||
spin_lock_init(&q->cleanup_lock);
|
spin_lock_init(&q->cleanup_lock);
|
||||||
|
|
@ -105,14 +130,7 @@ mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q,
|
||||||
if (!q->entry)
|
if (!q->entry)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* clear descriptors */
|
mt76_dma_queue_reset(dev, q);
|
||||||
for (i = 0; i < q->ndesc; i++)
|
|
||||||
q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE);
|
|
||||||
|
|
||||||
writel(q->desc_dma, &q->regs->desc_base);
|
|
||||||
writel(0, &q->regs->cpu_idx);
|
|
||||||
writel(0, &q->regs->dma_idx);
|
|
||||||
writel(q->ndesc, &q->regs->ring_size);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -201,15 +219,6 @@ mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx,
|
||||||
memset(e, 0, sizeof(*e));
|
memset(e, 0, sizeof(*e));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)
|
|
||||||
{
|
|
||||||
writel(q->desc_dma, &q->regs->desc_base);
|
|
||||||
writel(q->ndesc, &q->regs->ring_size);
|
|
||||||
q->head = readl(&q->regs->dma_idx);
|
|
||||||
q->tail = q->head;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q)
|
mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q)
|
||||||
{
|
{
|
||||||
|
|
@ -642,6 +651,7 @@ mt76_dma_init(struct mt76_dev *dev)
|
||||||
static const struct mt76_queue_ops mt76_dma_ops = {
|
static const struct mt76_queue_ops mt76_dma_ops = {
|
||||||
.init = mt76_dma_init,
|
.init = mt76_dma_init,
|
||||||
.alloc = mt76_dma_alloc_queue,
|
.alloc = mt76_dma_alloc_queue,
|
||||||
|
.reset_q = mt76_dma_queue_reset,
|
||||||
.tx_queue_skb_raw = mt76_dma_tx_queue_skb_raw,
|
.tx_queue_skb_raw = mt76_dma_tx_queue_skb_raw,
|
||||||
.tx_queue_skb = mt76_dma_tx_queue_skb,
|
.tx_queue_skb = mt76_dma_tx_queue_skb,
|
||||||
.tx_cleanup = mt76_dma_tx_cleanup,
|
.tx_cleanup = mt76_dma_tx_cleanup,
|
||||||
|
|
|
||||||
|
|
@ -192,6 +192,8 @@ struct mt76_queue_ops {
|
||||||
bool flush);
|
bool flush);
|
||||||
|
|
||||||
void (*kick)(struct mt76_dev *dev, struct mt76_queue *q);
|
void (*kick)(struct mt76_dev *dev, struct mt76_queue *q);
|
||||||
|
|
||||||
|
void (*reset_q)(struct mt76_dev *dev, struct mt76_queue *q);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum mt76_wcid_flags {
|
enum mt76_wcid_flags {
|
||||||
|
|
@ -796,6 +798,7 @@ static inline u16 mt76_rev(struct mt76_dev *dev)
|
||||||
#define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__)
|
#define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__)
|
||||||
#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)
|
#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)
|
||||||
#define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__)
|
#define mt76_queue_kick(dev, ...) (dev)->mt76.queue_ops->kick(&((dev)->mt76), __VA_ARGS__)
|
||||||
|
#define mt76_queue_reset(dev, ...) (dev)->mt76.queue_ops->reset_q(&((dev)->mt76), __VA_ARGS__)
|
||||||
|
|
||||||
#define mt76_for_each_q_rx(dev, i) \
|
#define mt76_for_each_q_rx(dev, i) \
|
||||||
for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \
|
for (i = 0; i < ARRAY_SIZE((dev)->q_rx) && \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user