Lines Matching refs:wo
22 mtk_wed_mmio_r32(struct mtk_wed_wo *wo, u32 reg) in mtk_wed_mmio_r32() argument
26 if (regmap_read(wo->mmio.regs, reg, &val)) in mtk_wed_mmio_r32()
33 mtk_wed_mmio_w32(struct mtk_wed_wo *wo, u32 reg, u32 val) in mtk_wed_mmio_w32() argument
35 regmap_write(wo->mmio.regs, reg, val); in mtk_wed_mmio_w32()
39 mtk_wed_wo_get_isr(struct mtk_wed_wo *wo) in mtk_wed_wo_get_isr() argument
41 u32 val = mtk_wed_mmio_r32(wo, MTK_WED_WO_CCIF_RCHNUM); in mtk_wed_wo_get_isr()
47 mtk_wed_wo_set_isr(struct mtk_wed_wo *wo, u32 mask) in mtk_wed_wo_set_isr() argument
49 mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_IRQ0_MASK, mask); in mtk_wed_wo_set_isr()
53 mtk_wed_wo_set_ack(struct mtk_wed_wo *wo, u32 mask) in mtk_wed_wo_set_ack() argument
55 mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_ACK, mask); in mtk_wed_wo_set_ack()
59 mtk_wed_wo_set_isr_mask(struct mtk_wed_wo *wo, u32 mask, u32 val, bool set) in mtk_wed_wo_set_isr_mask() argument
63 spin_lock_irqsave(&wo->mmio.lock, flags); in mtk_wed_wo_set_isr_mask()
64 wo->mmio.irq_mask &= ~mask; in mtk_wed_wo_set_isr_mask()
65 wo->mmio.irq_mask |= val; in mtk_wed_wo_set_isr_mask()
67 mtk_wed_wo_set_isr(wo, wo->mmio.irq_mask); in mtk_wed_wo_set_isr_mask()
68 spin_unlock_irqrestore(&wo->mmio.lock, flags); in mtk_wed_wo_set_isr_mask()
72 mtk_wed_wo_irq_enable(struct mtk_wed_wo *wo, u32 mask) in mtk_wed_wo_irq_enable() argument
74 mtk_wed_wo_set_isr_mask(wo, 0, mask, false); in mtk_wed_wo_irq_enable()
75 tasklet_schedule(&wo->mmio.irq_tasklet); in mtk_wed_wo_irq_enable()
79 mtk_wed_wo_irq_disable(struct mtk_wed_wo *wo, u32 mask) in mtk_wed_wo_irq_disable() argument
81 mtk_wed_wo_set_isr_mask(wo, mask, 0, true); in mtk_wed_wo_irq_disable()
85 mtk_wed_wo_kickout(struct mtk_wed_wo *wo) in mtk_wed_wo_kickout() argument
87 mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_BUSY, 1 << MTK_WED_WO_TXCH_NUM); in mtk_wed_wo_kickout()
88 mtk_wed_mmio_w32(wo, MTK_WED_WO_CCIF_TCHNUM, MTK_WED_WO_TXCH_NUM); in mtk_wed_wo_kickout()
92 mtk_wed_wo_queue_kick(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, in mtk_wed_wo_queue_kick() argument
96 mtk_wed_mmio_w32(wo, q->regs.cpu_idx, val); in mtk_wed_wo_queue_kick()
100 mtk_wed_wo_dequeue(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, u32 *len, in mtk_wed_wo_dequeue() argument
127 dma_unmap_single(wo->hw->dev, entry->addr, buf_len, in mtk_wed_wo_dequeue()
135 mtk_wed_wo_queue_refill(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, in mtk_wed_wo_queue_refill() argument
150 addr = dma_map_single(wo->hw->dev, buf, q->buf_size, dir); in mtk_wed_wo_queue_refill()
151 if (unlikely(dma_mapping_error(wo->hw->dev, addr))) { in mtk_wed_wo_queue_refill()
179 mtk_wed_wo_rx_complete(struct mtk_wed_wo *wo) in mtk_wed_wo_rx_complete() argument
181 mtk_wed_wo_set_ack(wo, MTK_WED_WO_RXCH_INT_MASK); in mtk_wed_wo_rx_complete()
182 mtk_wed_wo_irq_enable(wo, MTK_WED_WO_RXCH_INT_MASK); in mtk_wed_wo_rx_complete()
186 mtk_wed_wo_rx_run_queue(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) in mtk_wed_wo_rx_run_queue() argument
194 data = mtk_wed_wo_dequeue(wo, q, &len, false); in mtk_wed_wo_rx_run_queue()
205 if (mtk_wed_mcu_check_msg(wo, skb)) { in mtk_wed_wo_rx_run_queue()
212 mtk_wed_mcu_rx_event(wo, skb); in mtk_wed_wo_rx_run_queue()
214 mtk_wed_mcu_rx_unsolicited_event(wo, skb); in mtk_wed_wo_rx_run_queue()
217 if (mtk_wed_wo_queue_refill(wo, q, true)) { in mtk_wed_wo_rx_run_queue()
220 mtk_wed_wo_queue_kick(wo, q, index); in mtk_wed_wo_rx_run_queue()
227 struct mtk_wed_wo *wo = data; in mtk_wed_wo_irq_handler() local
229 mtk_wed_wo_set_isr(wo, 0); in mtk_wed_wo_irq_handler()
230 tasklet_schedule(&wo->mmio.irq_tasklet); in mtk_wed_wo_irq_handler()
237 struct mtk_wed_wo *wo = from_tasklet(wo, t, mmio.irq_tasklet); in mtk_wed_wo_irq_tasklet() local
241 mtk_wed_wo_set_isr(wo, 0); in mtk_wed_wo_irq_tasklet()
243 intr = mtk_wed_wo_get_isr(wo); in mtk_wed_wo_irq_tasklet()
244 intr &= wo->mmio.irq_mask; in mtk_wed_wo_irq_tasklet()
246 mtk_wed_wo_irq_disable(wo, mask); in mtk_wed_wo_irq_tasklet()
249 mtk_wed_wo_rx_run_queue(wo, &wo->q_rx); in mtk_wed_wo_irq_tasklet()
250 mtk_wed_wo_rx_complete(wo); in mtk_wed_wo_irq_tasklet()
257 mtk_wed_wo_queue_alloc(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, in mtk_wed_wo_queue_alloc() argument
265 q->desc = dmam_alloc_coherent(wo->hw->dev, n_desc * sizeof(*q->desc), in mtk_wed_wo_queue_alloc()
270 q->entry = devm_kzalloc(wo->hw->dev, n_desc * sizeof(*q->entry), in mtk_wed_wo_queue_alloc()
279 mtk_wed_wo_queue_free(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) in mtk_wed_wo_queue_free() argument
281 mtk_wed_mmio_w32(wo, q->regs.cpu_idx, 0); in mtk_wed_wo_queue_free()
282 dma_free_coherent(wo->hw->dev, q->n_desc * sizeof(*q->desc), q->desc, in mtk_wed_wo_queue_free()
287 mtk_wed_wo_queue_tx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) in mtk_wed_wo_queue_tx_clean() argument
295 dma_unmap_single(wo->hw->dev, entry->addr, entry->len, in mtk_wed_wo_queue_tx_clean()
310 mtk_wed_wo_queue_rx_clean(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) in mtk_wed_wo_queue_rx_clean() argument
315 void *buf = mtk_wed_wo_dequeue(wo, q, NULL, true); in mtk_wed_wo_queue_rx_clean()
332 mtk_wed_wo_queue_reset(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q) in mtk_wed_wo_queue_reset() argument
334 mtk_wed_mmio_w32(wo, q->regs.cpu_idx, 0); in mtk_wed_wo_queue_reset()
335 mtk_wed_mmio_w32(wo, q->regs.desc_base, q->desc_dma); in mtk_wed_wo_queue_reset()
336 mtk_wed_mmio_w32(wo, q->regs.ring_size, q->n_desc); in mtk_wed_wo_queue_reset()
339 int mtk_wed_wo_queue_tx_skb(struct mtk_wed_wo *wo, struct mtk_wed_wo_queue *q, in mtk_wed_wo_queue_tx_skb() argument
347 q->tail = mtk_wed_mmio_r32(wo, q->regs.dma_idx); in mtk_wed_wo_queue_tx_skb()
363 dma_sync_single_for_cpu(wo->hw->dev, entry->addr, skb->len, in mtk_wed_wo_queue_tx_skb()
366 dma_sync_single_for_device(wo->hw->dev, entry->addr, skb->len, in mtk_wed_wo_queue_tx_skb()
374 mtk_wed_wo_queue_kick(wo, q, q->head); in mtk_wed_wo_queue_tx_skb()
375 mtk_wed_wo_kickout(wo); in mtk_wed_wo_queue_tx_skb()
383 mtk_wed_wo_exception_init(struct mtk_wed_wo *wo) in mtk_wed_wo_exception_init() argument
389 mtk_wed_wo_hardware_init(struct mtk_wed_wo *wo) in mtk_wed_wo_hardware_init() argument
395 np = of_parse_phandle(wo->hw->node, "mediatek,wo-ccif", 0); in mtk_wed_wo_hardware_init()
399 wo->mmio.regs = syscon_regmap_lookup_by_phandle(np, NULL); in mtk_wed_wo_hardware_init()
400 if (IS_ERR(wo->mmio.regs)) { in mtk_wed_wo_hardware_init()
401 ret = PTR_ERR(wo->mmio.regs); in mtk_wed_wo_hardware_init()
405 wo->mmio.irq = irq_of_parse_and_map(np, 0); in mtk_wed_wo_hardware_init()
406 wo->mmio.irq_mask = MTK_WED_WO_ALL_INT_MASK; in mtk_wed_wo_hardware_init()
407 spin_lock_init(&wo->mmio.lock); in mtk_wed_wo_hardware_init()
408 tasklet_setup(&wo->mmio.irq_tasklet, mtk_wed_wo_irq_tasklet); in mtk_wed_wo_hardware_init()
410 ret = devm_request_irq(wo->hw->dev, wo->mmio.irq, in mtk_wed_wo_hardware_init()
412 KBUILD_MODNAME, wo); in mtk_wed_wo_hardware_init()
421 ret = mtk_wed_wo_queue_alloc(wo, &wo->q_tx, MTK_WED_WO_RING_SIZE, in mtk_wed_wo_hardware_init()
427 mtk_wed_wo_queue_refill(wo, &wo->q_tx, false); in mtk_wed_wo_hardware_init()
428 mtk_wed_wo_queue_reset(wo, &wo->q_tx); in mtk_wed_wo_hardware_init()
435 ret = mtk_wed_wo_queue_alloc(wo, &wo->q_rx, MTK_WED_WO_RING_SIZE, in mtk_wed_wo_hardware_init()
441 mtk_wed_wo_queue_refill(wo, &wo->q_rx, true); in mtk_wed_wo_hardware_init()
442 mtk_wed_wo_queue_reset(wo, &wo->q_rx); in mtk_wed_wo_hardware_init()
445 mtk_wed_wo_set_isr(wo, wo->mmio.irq_mask); in mtk_wed_wo_hardware_init()
450 devm_free_irq(wo->hw->dev, wo->mmio.irq, wo); in mtk_wed_wo_hardware_init()
457 mtk_wed_wo_hw_deinit(struct mtk_wed_wo *wo) in mtk_wed_wo_hw_deinit() argument
460 mtk_wed_wo_set_isr(wo, 0); in mtk_wed_wo_hw_deinit()
462 tasklet_disable(&wo->mmio.irq_tasklet); in mtk_wed_wo_hw_deinit()
464 disable_irq(wo->mmio.irq); in mtk_wed_wo_hw_deinit()
465 devm_free_irq(wo->hw->dev, wo->mmio.irq, wo); in mtk_wed_wo_hw_deinit()
467 mtk_wed_wo_queue_tx_clean(wo, &wo->q_tx); in mtk_wed_wo_hw_deinit()
468 mtk_wed_wo_queue_rx_clean(wo, &wo->q_rx); in mtk_wed_wo_hw_deinit()
469 mtk_wed_wo_queue_free(wo, &wo->q_tx); in mtk_wed_wo_hw_deinit()
470 mtk_wed_wo_queue_free(wo, &wo->q_rx); in mtk_wed_wo_hw_deinit()
475 struct mtk_wed_wo *wo; in mtk_wed_wo_init() local
478 wo = devm_kzalloc(hw->dev, sizeof(*wo), GFP_KERNEL); in mtk_wed_wo_init()
479 if (!wo) in mtk_wed_wo_init()
482 hw->wed_wo = wo; in mtk_wed_wo_init()
483 wo->hw = hw; in mtk_wed_wo_init()
485 ret = mtk_wed_wo_hardware_init(wo); in mtk_wed_wo_init()
489 ret = mtk_wed_mcu_init(wo); in mtk_wed_wo_init()
493 return mtk_wed_wo_exception_init(wo); in mtk_wed_wo_init()
498 struct mtk_wed_wo *wo = hw->wed_wo; in mtk_wed_wo_deinit() local
500 mtk_wed_wo_hw_deinit(wo); in mtk_wed_wo_deinit()