Lines Matching refs:wcn
29 void *wcn36xx_dxe_get_next_bd(struct wcn36xx *wcn, bool is_low) in wcn36xx_dxe_get_next_bd() argument
32 &wcn->dxe_tx_l_ch : in wcn36xx_dxe_get_next_bd()
33 &wcn->dxe_tx_h_ch; in wcn36xx_dxe_get_next_bd()
38 static void wcn36xx_dxe_write_register(struct wcn36xx *wcn, int addr, int data) in wcn36xx_dxe_write_register() argument
44 writel(data, wcn->mmio + addr); in wcn36xx_dxe_write_register()
47 #define wcn36xx_dxe_write_register_x(wcn, reg, reg_data) \ argument
49 if (wcn->chip_version == WCN36XX_CHIP_3680) \
50 wcn36xx_dxe_write_register(wcn, reg ## _3680, reg_data); \
52 wcn36xx_dxe_write_register(wcn, reg ## _3660, reg_data); \
55 static void wcn36xx_dxe_read_register(struct wcn36xx *wcn, int addr, int *data) in wcn36xx_dxe_read_register() argument
57 *data = readl(wcn->mmio + addr); in wcn36xx_dxe_read_register()
108 int wcn36xx_dxe_alloc_ctl_blks(struct wcn36xx *wcn) in wcn36xx_dxe_alloc_ctl_blks() argument
112 wcn->dxe_tx_l_ch.ch_type = WCN36XX_DXE_CH_TX_L; in wcn36xx_dxe_alloc_ctl_blks()
113 wcn->dxe_tx_h_ch.ch_type = WCN36XX_DXE_CH_TX_H; in wcn36xx_dxe_alloc_ctl_blks()
114 wcn->dxe_rx_l_ch.ch_type = WCN36XX_DXE_CH_RX_L; in wcn36xx_dxe_alloc_ctl_blks()
115 wcn->dxe_rx_h_ch.ch_type = WCN36XX_DXE_CH_RX_H; in wcn36xx_dxe_alloc_ctl_blks()
117 wcn->dxe_tx_l_ch.desc_num = WCN36XX_DXE_CH_DESC_NUMB_TX_L; in wcn36xx_dxe_alloc_ctl_blks()
118 wcn->dxe_tx_h_ch.desc_num = WCN36XX_DXE_CH_DESC_NUMB_TX_H; in wcn36xx_dxe_alloc_ctl_blks()
119 wcn->dxe_rx_l_ch.desc_num = WCN36XX_DXE_CH_DESC_NUMB_RX_L; in wcn36xx_dxe_alloc_ctl_blks()
120 wcn->dxe_rx_h_ch.desc_num = WCN36XX_DXE_CH_DESC_NUMB_RX_H; in wcn36xx_dxe_alloc_ctl_blks()
122 wcn->dxe_tx_l_ch.dxe_wq = WCN36XX_DXE_WQ_TX_L; in wcn36xx_dxe_alloc_ctl_blks()
123 wcn->dxe_tx_h_ch.dxe_wq = WCN36XX_DXE_WQ_TX_H; in wcn36xx_dxe_alloc_ctl_blks()
125 wcn->dxe_tx_l_ch.ctrl_bd = WCN36XX_DXE_CTRL_TX_L_BD; in wcn36xx_dxe_alloc_ctl_blks()
126 wcn->dxe_tx_h_ch.ctrl_bd = WCN36XX_DXE_CTRL_TX_H_BD; in wcn36xx_dxe_alloc_ctl_blks()
128 wcn->dxe_tx_l_ch.ctrl_skb = WCN36XX_DXE_CTRL_TX_L_SKB; in wcn36xx_dxe_alloc_ctl_blks()
129 wcn->dxe_tx_h_ch.ctrl_skb = WCN36XX_DXE_CTRL_TX_H_SKB; in wcn36xx_dxe_alloc_ctl_blks()
131 wcn->dxe_tx_l_ch.reg_ctrl = WCN36XX_DXE_REG_CTL_TX_L; in wcn36xx_dxe_alloc_ctl_blks()
132 wcn->dxe_tx_h_ch.reg_ctrl = WCN36XX_DXE_REG_CTL_TX_H; in wcn36xx_dxe_alloc_ctl_blks()
134 wcn->dxe_tx_l_ch.def_ctrl = WCN36XX_DXE_CH_DEFAULT_CTL_TX_L; in wcn36xx_dxe_alloc_ctl_blks()
135 wcn->dxe_tx_h_ch.def_ctrl = WCN36XX_DXE_CH_DEFAULT_CTL_TX_H; in wcn36xx_dxe_alloc_ctl_blks()
138 ret = wcn36xx_dxe_allocate_ctl_block(&wcn->dxe_tx_l_ch); in wcn36xx_dxe_alloc_ctl_blks()
141 ret = wcn36xx_dxe_allocate_ctl_block(&wcn->dxe_tx_h_ch); in wcn36xx_dxe_alloc_ctl_blks()
144 ret = wcn36xx_dxe_allocate_ctl_block(&wcn->dxe_rx_l_ch); in wcn36xx_dxe_alloc_ctl_blks()
147 ret = wcn36xx_dxe_allocate_ctl_block(&wcn->dxe_rx_h_ch); in wcn36xx_dxe_alloc_ctl_blks()
152 ret = wcn->ctrl_ops->smsm_change_state( in wcn36xx_dxe_alloc_ctl_blks()
160 wcn36xx_dxe_free_ctl_blks(wcn); in wcn36xx_dxe_alloc_ctl_blks()
164 void wcn36xx_dxe_free_ctl_blks(struct wcn36xx *wcn) in wcn36xx_dxe_free_ctl_blks() argument
166 wcn36xx_dxe_free_ctl_block(&wcn->dxe_tx_l_ch); in wcn36xx_dxe_free_ctl_blks()
167 wcn36xx_dxe_free_ctl_block(&wcn->dxe_tx_h_ch); in wcn36xx_dxe_free_ctl_blks()
168 wcn36xx_dxe_free_ctl_block(&wcn->dxe_rx_l_ch); in wcn36xx_dxe_free_ctl_blks()
169 wcn36xx_dxe_free_ctl_block(&wcn->dxe_rx_h_ch); in wcn36xx_dxe_free_ctl_blks()
257 static int wcn36xx_dxe_enable_ch_int(struct wcn36xx *wcn, u16 wcn_ch) in wcn36xx_dxe_enable_ch_int() argument
261 wcn36xx_dxe_read_register(wcn, in wcn36xx_dxe_enable_ch_int()
267 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_enable_ch_int()
291 static int wcn36xx_dxe_ch_alloc_skb(struct wcn36xx *wcn, in wcn36xx_dxe_ch_alloc_skb() argument
307 static void wcn36xx_dxe_ch_free_skbs(struct wcn36xx *wcn, in wcn36xx_dxe_ch_free_skbs() argument
319 void wcn36xx_dxe_tx_ack_ind(struct wcn36xx *wcn, u32 status) in wcn36xx_dxe_tx_ack_ind() argument
325 spin_lock_irqsave(&wcn->dxe_lock, flags); in wcn36xx_dxe_tx_ack_ind()
326 skb = wcn->tx_ack_skb; in wcn36xx_dxe_tx_ack_ind()
327 wcn->tx_ack_skb = NULL; in wcn36xx_dxe_tx_ack_ind()
328 spin_unlock_irqrestore(&wcn->dxe_lock, flags); in wcn36xx_dxe_tx_ack_ind()
342 ieee80211_tx_status_irqsafe(wcn->hw, skb); in wcn36xx_dxe_tx_ack_ind()
343 ieee80211_wake_queues(wcn->hw); in wcn36xx_dxe_tx_ack_ind()
346 static void reap_tx_dxes(struct wcn36xx *wcn, struct wcn36xx_dxe_ch *ch) in reap_tx_dxes() argument
366 ieee80211_free_txskb(wcn->hw, ctl->skb); in reap_tx_dxes()
369 if (wcn->queues_stopped) { in reap_tx_dxes()
370 wcn->queues_stopped = false; in reap_tx_dxes()
371 ieee80211_wake_queues(wcn->hw); in reap_tx_dxes()
386 struct wcn36xx *wcn = (struct wcn36xx *)dev; in wcn36xx_irq_tx_complete() local
389 wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_INT_SRC_RAW_REG, &int_src); in wcn36xx_irq_tx_complete()
392 wcn36xx_dxe_read_register(wcn, in wcn36xx_irq_tx_complete()
398 wcn36xx_dxe_write_register(wcn, in wcn36xx_irq_tx_complete()
402 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_0_INT_ED_CLR, in wcn36xx_irq_tx_complete()
405 reap_tx_dxes(wcn, &wcn->dxe_tx_h_ch); in wcn36xx_irq_tx_complete()
409 wcn36xx_dxe_read_register(wcn, in wcn36xx_irq_tx_complete()
414 wcn36xx_dxe_write_register(wcn, in wcn36xx_irq_tx_complete()
418 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_0_INT_ED_CLR, in wcn36xx_irq_tx_complete()
421 reap_tx_dxes(wcn, &wcn->dxe_tx_l_ch); in wcn36xx_irq_tx_complete()
429 struct wcn36xx *wcn = (struct wcn36xx *)dev; in wcn36xx_irq_rx_ready() local
431 disable_irq_nosync(wcn->rx_irq); in wcn36xx_irq_rx_ready()
432 wcn36xx_dxe_rx_frame(wcn); in wcn36xx_irq_rx_ready()
433 enable_irq(wcn->rx_irq); in wcn36xx_irq_rx_ready()
437 static int wcn36xx_dxe_request_irqs(struct wcn36xx *wcn) in wcn36xx_dxe_request_irqs() argument
441 ret = request_irq(wcn->tx_irq, wcn36xx_irq_tx_complete, in wcn36xx_dxe_request_irqs()
442 IRQF_TRIGGER_HIGH, "wcn36xx_tx", wcn); in wcn36xx_dxe_request_irqs()
448 ret = request_irq(wcn->rx_irq, wcn36xx_irq_rx_ready, IRQF_TRIGGER_HIGH, in wcn36xx_dxe_request_irqs()
449 "wcn36xx_rx", wcn); in wcn36xx_dxe_request_irqs()
455 enable_irq_wake(wcn->rx_irq); in wcn36xx_dxe_request_irqs()
460 free_irq(wcn->tx_irq, wcn); in wcn36xx_dxe_request_irqs()
466 static int wcn36xx_rx_handle_packets(struct wcn36xx *wcn, in wcn36xx_rx_handle_packets() argument
482 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_ENCH_ADDR, in wcn36xx_rx_handle_packets()
487 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_ENCH_ADDR, in wcn36xx_rx_handle_packets()
496 wcn36xx_rx_skb(wcn, skb); in wcn36xx_rx_handle_packets()
506 void wcn36xx_dxe_rx_frame(struct wcn36xx *wcn) in wcn36xx_dxe_rx_frame() argument
510 wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_INT_SRC_RAW_REG, &int_src); in wcn36xx_dxe_rx_frame()
514 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_0_INT_CLR, in wcn36xx_dxe_rx_frame()
516 wcn36xx_rx_handle_packets(wcn, &(wcn->dxe_rx_l_ch)); in wcn36xx_dxe_rx_frame()
522 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_0_INT_CLR, in wcn36xx_dxe_rx_frame()
524 wcn36xx_rx_handle_packets(wcn, &(wcn->dxe_rx_h_ch)); in wcn36xx_dxe_rx_frame()
531 int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn) in wcn36xx_dxe_allocate_mem_pools() argument
539 wcn->mgmt_mem_pool.chunk_size = WCN36XX_BD_CHUNK_SIZE + in wcn36xx_dxe_allocate_mem_pools()
542 s = wcn->mgmt_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_H; in wcn36xx_dxe_allocate_mem_pools()
543 cpu_addr = dma_alloc_coherent(NULL, s, &wcn->mgmt_mem_pool.phy_addr, in wcn36xx_dxe_allocate_mem_pools()
548 wcn->mgmt_mem_pool.virt_addr = cpu_addr; in wcn36xx_dxe_allocate_mem_pools()
554 wcn->data_mem_pool.chunk_size = WCN36XX_BD_CHUNK_SIZE + in wcn36xx_dxe_allocate_mem_pools()
557 s = wcn->data_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_L; in wcn36xx_dxe_allocate_mem_pools()
558 cpu_addr = dma_alloc_coherent(NULL, s, &wcn->data_mem_pool.phy_addr, in wcn36xx_dxe_allocate_mem_pools()
563 wcn->data_mem_pool.virt_addr = cpu_addr; in wcn36xx_dxe_allocate_mem_pools()
569 wcn36xx_dxe_free_mem_pools(wcn); in wcn36xx_dxe_allocate_mem_pools()
574 void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn) in wcn36xx_dxe_free_mem_pools() argument
576 if (wcn->mgmt_mem_pool.virt_addr) in wcn36xx_dxe_free_mem_pools()
577 dma_free_coherent(NULL, wcn->mgmt_mem_pool.chunk_size * in wcn36xx_dxe_free_mem_pools()
579 wcn->mgmt_mem_pool.virt_addr, in wcn36xx_dxe_free_mem_pools()
580 wcn->mgmt_mem_pool.phy_addr); in wcn36xx_dxe_free_mem_pools()
582 if (wcn->data_mem_pool.virt_addr) { in wcn36xx_dxe_free_mem_pools()
583 dma_free_coherent(NULL, wcn->data_mem_pool.chunk_size * in wcn36xx_dxe_free_mem_pools()
585 wcn->data_mem_pool.virt_addr, in wcn36xx_dxe_free_mem_pools()
586 wcn->data_mem_pool.phy_addr); in wcn36xx_dxe_free_mem_pools()
590 int wcn36xx_dxe_tx_frame(struct wcn36xx *wcn, in wcn36xx_dxe_tx_frame() argument
600 ch = is_low ? &wcn->dxe_tx_l_ch : &wcn->dxe_tx_h_ch; in wcn36xx_dxe_tx_frame()
612 ieee80211_stop_queues(wcn->hw); in wcn36xx_dxe_tx_frame()
613 wcn->queues_stopped = true; in wcn36xx_dxe_tx_frame()
671 wcn->ctrl_ops->smsm_change_state( in wcn36xx_dxe_tx_frame()
678 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_tx_frame()
685 int wcn36xx_dxe_init(struct wcn36xx *wcn) in wcn36xx_dxe_init() argument
690 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_REG_CSR_RESET, reg_data); in wcn36xx_dxe_init()
694 wcn36xx_dxe_write_register_x(wcn, WCN36XX_DXE_REG_CCU_INT, reg_data); in wcn36xx_dxe_init()
699 wcn36xx_dxe_init_descs(&wcn->dxe_tx_l_ch); in wcn36xx_dxe_init()
700 wcn36xx_dxe_init_tx_bd(&wcn->dxe_tx_l_ch, &wcn->data_mem_pool); in wcn36xx_dxe_init()
703 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_L, in wcn36xx_dxe_init()
704 wcn->dxe_tx_l_ch.head_blk_ctl->desc_phy_addr); in wcn36xx_dxe_init()
707 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
711 wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, ®_data); in wcn36xx_dxe_init()
712 wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_L); in wcn36xx_dxe_init()
717 wcn36xx_dxe_init_descs(&wcn->dxe_tx_h_ch); in wcn36xx_dxe_init()
718 wcn36xx_dxe_init_tx_bd(&wcn->dxe_tx_h_ch, &wcn->mgmt_mem_pool); in wcn36xx_dxe_init()
721 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_CH_NEXT_DESC_ADDR_TX_H, in wcn36xx_dxe_init()
722 wcn->dxe_tx_h_ch.head_blk_ctl->desc_phy_addr); in wcn36xx_dxe_init()
725 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
729 wcn36xx_dxe_read_register(wcn, WCN36XX_DXE_REG_CH_EN, ®_data); in wcn36xx_dxe_init()
732 wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_TX_H); in wcn36xx_dxe_init()
737 wcn36xx_dxe_init_descs(&wcn->dxe_rx_l_ch); in wcn36xx_dxe_init()
740 wcn36xx_dxe_ch_alloc_skb(wcn, &wcn->dxe_rx_l_ch); in wcn36xx_dxe_init()
743 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_L, in wcn36xx_dxe_init()
744 wcn->dxe_rx_l_ch.head_blk_ctl->desc_phy_addr); in wcn36xx_dxe_init()
747 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
752 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
754 wcn->dxe_rx_l_ch.head_blk_ctl->desc->phy_next_l); in wcn36xx_dxe_init()
757 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
762 wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_L); in wcn36xx_dxe_init()
767 wcn36xx_dxe_init_descs(&wcn->dxe_rx_h_ch); in wcn36xx_dxe_init()
770 wcn36xx_dxe_ch_alloc_skb(wcn, &wcn->dxe_rx_h_ch); in wcn36xx_dxe_init()
773 wcn36xx_dxe_write_register(wcn, WCN36XX_DXE_CH_NEXT_DESC_ADDR_RX_H, in wcn36xx_dxe_init()
774 wcn->dxe_rx_h_ch.head_blk_ctl->desc_phy_addr); in wcn36xx_dxe_init()
777 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
782 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
784 wcn->dxe_rx_h_ch.head_blk_ctl->desc->phy_next_l); in wcn36xx_dxe_init()
787 wcn36xx_dxe_write_register(wcn, in wcn36xx_dxe_init()
792 wcn36xx_dxe_enable_ch_int(wcn, WCN36XX_INT_MASK_CHAN_RX_H); in wcn36xx_dxe_init()
794 ret = wcn36xx_dxe_request_irqs(wcn); in wcn36xx_dxe_init()
804 void wcn36xx_dxe_deinit(struct wcn36xx *wcn) in wcn36xx_dxe_deinit() argument
806 free_irq(wcn->tx_irq, wcn); in wcn36xx_dxe_deinit()
807 free_irq(wcn->rx_irq, wcn); in wcn36xx_dxe_deinit()
809 if (wcn->tx_ack_skb) { in wcn36xx_dxe_deinit()
810 ieee80211_tx_status_irqsafe(wcn->hw, wcn->tx_ack_skb); in wcn36xx_dxe_deinit()
811 wcn->tx_ack_skb = NULL; in wcn36xx_dxe_deinit()
814 wcn36xx_dxe_ch_free_skbs(wcn, &wcn->dxe_rx_l_ch); in wcn36xx_dxe_deinit()
815 wcn36xx_dxe_ch_free_skbs(wcn, &wcn->dxe_rx_h_ch); in wcn36xx_dxe_deinit()