Lines Matching refs:ch
96 struct ltq_etop_chan ch[MAX_DMA_CHAN]; member
103 ltq_etop_alloc_skb(struct ltq_etop_chan *ch) in ltq_etop_alloc_skb() argument
105 struct ltq_etop_priv *priv = netdev_priv(ch->netdev); in ltq_etop_alloc_skb()
107 ch->skb[ch->dma.desc] = netdev_alloc_skb(ch->netdev, MAX_DMA_DATA_LEN); in ltq_etop_alloc_skb()
108 if (!ch->skb[ch->dma.desc]) in ltq_etop_alloc_skb()
110 ch->dma.desc_base[ch->dma.desc].addr = dma_map_single(&priv->pdev->dev, in ltq_etop_alloc_skb()
111 ch->skb[ch->dma.desc]->data, MAX_DMA_DATA_LEN, in ltq_etop_alloc_skb()
113 ch->dma.desc_base[ch->dma.desc].addr = in ltq_etop_alloc_skb()
114 CPHYSADDR(ch->skb[ch->dma.desc]->data); in ltq_etop_alloc_skb()
115 ch->dma.desc_base[ch->dma.desc].ctl = in ltq_etop_alloc_skb()
118 skb_reserve(ch->skb[ch->dma.desc], NET_IP_ALIGN); in ltq_etop_alloc_skb()
123 ltq_etop_hw_receive(struct ltq_etop_chan *ch) in ltq_etop_hw_receive() argument
125 struct ltq_etop_priv *priv = netdev_priv(ch->netdev); in ltq_etop_hw_receive()
126 struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc]; in ltq_etop_hw_receive()
127 struct sk_buff *skb = ch->skb[ch->dma.desc]; in ltq_etop_hw_receive()
132 if (ltq_etop_alloc_skb(ch)) { in ltq_etop_hw_receive()
133 netdev_err(ch->netdev, in ltq_etop_hw_receive()
135 ltq_dma_close(&ch->dma); in ltq_etop_hw_receive()
137 ch->dma.desc++; in ltq_etop_hw_receive()
138 ch->dma.desc %= LTQ_DESC_NUM; in ltq_etop_hw_receive()
142 skb->protocol = eth_type_trans(skb, ch->netdev); in ltq_etop_hw_receive()
149 struct ltq_etop_chan *ch = container_of(napi, in ltq_etop_poll_rx() local
154 struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc]; in ltq_etop_poll_rx()
158 ltq_etop_hw_receive(ch); in ltq_etop_poll_rx()
162 napi_complete_done(&ch->napi, work_done); in ltq_etop_poll_rx()
163 ltq_dma_ack_irq(&ch->dma); in ltq_etop_poll_rx()
171 struct ltq_etop_chan *ch = in ltq_etop_poll_tx() local
173 struct ltq_etop_priv *priv = netdev_priv(ch->netdev); in ltq_etop_poll_tx()
175 netdev_get_tx_queue(ch->netdev, ch->idx >> 1); in ltq_etop_poll_tx()
179 while ((ch->dma.desc_base[ch->tx_free].ctl & in ltq_etop_poll_tx()
181 dev_kfree_skb_any(ch->skb[ch->tx_free]); in ltq_etop_poll_tx()
182 ch->skb[ch->tx_free] = NULL; in ltq_etop_poll_tx()
183 memset(&ch->dma.desc_base[ch->tx_free], 0, in ltq_etop_poll_tx()
185 ch->tx_free++; in ltq_etop_poll_tx()
186 ch->tx_free %= LTQ_DESC_NUM; in ltq_etop_poll_tx()
192 napi_complete(&ch->napi); in ltq_etop_poll_tx()
193 ltq_dma_ack_irq(&ch->dma); in ltq_etop_poll_tx()
201 int ch = irq - LTQ_DMA_CH0_INT; in ltq_etop_dma_irq() local
203 napi_schedule(&priv->ch[ch].napi); in ltq_etop_dma_irq()
208 ltq_etop_free_channel(struct net_device *dev, struct ltq_etop_chan *ch) in ltq_etop_free_channel() argument
212 ltq_dma_free(&ch->dma); in ltq_etop_free_channel()
213 if (ch->dma.irq) in ltq_etop_free_channel()
214 free_irq(ch->dma.irq, priv); in ltq_etop_free_channel()
215 if (IS_RX(ch->idx)) { in ltq_etop_free_channel()
218 dev_kfree_skb_any(ch->skb[ch->dma.desc]); in ltq_etop_free_channel()
231 ltq_etop_free_channel(dev, &priv->ch[i]); in ltq_etop_hw_exit()
266 struct ltq_etop_chan *ch = &priv->ch[i]; in ltq_etop_hw_init() local
268 ch->idx = ch->dma.nr = i; in ltq_etop_hw_init()
269 ch->dma.dev = &priv->pdev->dev; in ltq_etop_hw_init()
272 ltq_dma_alloc_tx(&ch->dma); in ltq_etop_hw_init()
275 ltq_dma_alloc_rx(&ch->dma); in ltq_etop_hw_init()
276 for (ch->dma.desc = 0; ch->dma.desc < LTQ_DESC_NUM; in ltq_etop_hw_init()
277 ch->dma.desc++) in ltq_etop_hw_init()
278 if (ltq_etop_alloc_skb(ch)) in ltq_etop_hw_init()
280 ch->dma.desc = 0; in ltq_etop_hw_init()
283 ch->dma.irq = irq; in ltq_etop_hw_init()
422 struct ltq_etop_chan *ch = &priv->ch[i]; in ltq_etop_open() local
426 ltq_dma_open(&ch->dma); in ltq_etop_open()
427 ltq_dma_enable_irq(&ch->dma); in ltq_etop_open()
428 napi_enable(&ch->napi); in ltq_etop_open()
444 struct ltq_etop_chan *ch = &priv->ch[i]; in ltq_etop_stop() local
448 napi_disable(&ch->napi); in ltq_etop_stop()
449 ltq_dma_close(&ch->dma); in ltq_etop_stop()
460 struct ltq_etop_chan *ch = &priv->ch[(queue << 1) | 1]; in ltq_etop_tx() local
461 struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc]; in ltq_etop_tx()
468 if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) || ch->skb[ch->dma.desc]) { in ltq_etop_tx()
476 ch->skb[ch->dma.desc] = skb; in ltq_etop_tx()
486 ch->dma.desc++; in ltq_etop_tx()
487 ch->dma.desc %= LTQ_DESC_NUM; in ltq_etop_tx()
490 if (ch->dma.desc_base[ch->dma.desc].ctl & LTQ_DMA_OWN) in ltq_etop_tx()
671 netif_napi_add(dev, &priv->ch[i].napi, in ltq_etop_probe()
674 netif_napi_add(dev, &priv->ch[i].napi, in ltq_etop_probe()
676 priv->ch[i].netdev = dev; in ltq_etop_probe()