Lines Matching refs:plxdev

129 static struct plx_dma_desc *plx_dma_get_desc(struct plx_dma_dev *plxdev, int i)
131 return plxdev->desc_ring[i & (PLX_DMA_RING_COUNT - 1)];
134 static void plx_dma_process_desc(struct plx_dma_dev *plxdev)
140 spin_lock_bh(&plxdev->ring_lock);
142 while (plxdev->tail != plxdev->head) {
143 desc = plx_dma_get_desc(plxdev, plxdev->tail);
165 plxdev->tail++;
168 spin_unlock_bh(&plxdev->ring_lock);
171 static void plx_dma_abort_desc(struct plx_dma_dev *plxdev)
176 plx_dma_process_desc(plxdev);
178 spin_lock_bh(&plxdev->ring_lock);
180 while (plxdev->tail != plxdev->head) {
181 desc = plx_dma_get_desc(plxdev, plxdev->tail);
192 plxdev->tail++;
195 spin_unlock_bh(&plxdev->ring_lock);
198 static void __plx_dma_stop(struct plx_dma_dev *plxdev)
203 val = readl(plxdev->bar + PLX_REG_CTRL);
208 plxdev->bar + PLX_REG_CTRL);
211 val = readl(plxdev->bar + PLX_REG_CTRL);
219 dev_err(plxdev->dma_dev.dev,
223 plxdev->bar + PLX_REG_CTRL);
225 writel(0, plxdev->bar + PLX_REG_DESC_RING_COUNT);
226 writel(0, plxdev->bar + PLX_REG_DESC_RING_ADDR);
227 writel(0, plxdev->bar + PLX_REG_DESC_RING_ADDR_HI);
228 writel(0, plxdev->bar + PLX_REG_DESC_RING_NEXT_ADDR);
231 static void plx_dma_stop(struct plx_dma_dev *plxdev)
234 if (!rcu_dereference(plxdev->pdev)) {
239 __plx_dma_stop(plxdev);
246 struct plx_dma_dev *plxdev = from_tasklet(plxdev, t, desc_task);
248 plx_dma_process_desc(plxdev);
254 __acquires(plxdev->ring_lock)
256 struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(c);
259 spin_lock_bh(&plxdev->ring_lock);
260 if (!plxdev->ring_active)
263 if (!CIRC_SPACE(plxdev->head, plxdev->tail, PLX_DMA_RING_COUNT))
269 plxdesc = plx_dma_get_desc(plxdev, plxdev->head);
270 plxdev->head++;
294 __acquire(plxdev->ring_lock);
296 spin_unlock_bh(&plxdev->ring_lock);
301 __releases(plxdev->ring_lock)
303 struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(desc->chan);
317 spin_unlock_bh(&plxdev->ring_lock);
325 struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(chan);
332 plx_dma_process_desc(plxdev);
339 struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(chan);
342 if (!rcu_dereference(plxdev->pdev)) {
353 writew(PLX_REG_CTRL_START_VAL, plxdev->bar + PLX_REG_CTRL);
360 struct plx_dma_dev *plxdev = devid;
363 status = readw(plxdev->bar + PLX_REG_INTR_STATUS);
368 if (status & PLX_REG_INTR_STATUS_DESC_DONE && plxdev->ring_active)
369 tasklet_schedule(&plxdev->desc_task);
371 writew(status, plxdev->bar + PLX_REG_INTR_STATUS);
376 static int plx_dma_alloc_desc(struct plx_dma_dev *plxdev)
381 plxdev->desc_ring = kcalloc(PLX_DMA_RING_COUNT,
382 sizeof(*plxdev->desc_ring), GFP_KERNEL);
383 if (!plxdev->desc_ring)
391 dma_async_tx_descriptor_init(&desc->txd, &plxdev->dma_chan);
393 desc->hw = &plxdev->hw_ring[i];
395 plxdev->desc_ring[i] = desc;
402 kfree(plxdev->desc_ring[i]);
403 kfree(plxdev->desc_ring);
409 struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(chan);
410 size_t ring_sz = PLX_DMA_RING_COUNT * sizeof(*plxdev->hw_ring);
413 plxdev->head = plxdev->tail = 0;
414 plxdev->hw_ring = dma_alloc_coherent(plxdev->dma_dev.dev, ring_sz,
415 &plxdev->hw_ring_dma, GFP_KERNEL);
416 if (!plxdev->hw_ring)
419 rc = plx_dma_alloc_desc(plxdev);
424 if (!rcu_dereference(plxdev->pdev)) {
430 writel(PLX_REG_CTRL_RESET_VAL, plxdev->bar + PLX_REG_CTRL);
431 writel(lower_32_bits(plxdev->hw_ring_dma),
432 plxdev->bar + PLX_REG_DESC_RING_ADDR);
433 writel(upper_32_bits(plxdev->hw_ring_dma),
434 plxdev->bar + PLX_REG_DESC_RING_ADDR_HI);
435 writel(lower_32_bits(plxdev->hw_ring_dma),
436 plxdev->bar + PLX_REG_DESC_RING_NEXT_ADDR);
437 writel(PLX_DMA_RING_COUNT, plxdev->bar + PLX_REG_DESC_RING_COUNT);
438 writel(PLX_REG_PREF_LIMIT_PREF_FOUR, plxdev->bar + PLX_REG_PREF_LIMIT);
440 plxdev->ring_active = true;
447 dma_free_coherent(plxdev->dma_dev.dev, ring_sz, plxdev->hw_ring,
448 plxdev->hw_ring_dma);
454 struct plx_dma_dev *plxdev = chan_to_plx_dma_dev(chan);
455 size_t ring_sz = PLX_DMA_RING_COUNT * sizeof(*plxdev->hw_ring);
460 spin_lock_bh(&plxdev->ring_lock);
461 plxdev->ring_active = false;
462 spin_unlock_bh(&plxdev->ring_lock);
464 plx_dma_stop(plxdev);
467 pdev = rcu_dereference(plxdev->pdev);
475 tasklet_kill(&plxdev->desc_task);
477 plx_dma_abort_desc(plxdev);
480 kfree(plxdev->desc_ring[i]);
482 kfree(plxdev->desc_ring);
483 dma_free_coherent(plxdev->dma_dev.dev, ring_sz, plxdev->hw_ring,
484 plxdev->hw_ring_dma);
490 struct plx_dma_dev *plxdev =
494 kfree(plxdev);
499 struct plx_dma_dev *plxdev;
504 plxdev = kzalloc(sizeof(*plxdev), GFP_KERNEL);
505 if (!plxdev)
509 KBUILD_MODNAME, plxdev);
513 spin_lock_init(&plxdev->ring_lock);
514 tasklet_setup(&plxdev->desc_task, plx_dma_desc_task);
516 RCU_INIT_POINTER(plxdev->pdev, pdev);
517 plxdev->bar = pcim_iomap_table(pdev)[0];
519 dma = &plxdev->dma_dev;
533 chan = &plxdev->dma_chan;
544 pci_set_drvdata(pdev, plxdev);
550 free_irq(pci_irq_vector(pdev, 0), plxdev);
552 kfree(plxdev);
603 struct plx_dma_dev *plxdev = pci_get_drvdata(pdev);
605 free_irq(pci_irq_vector(pdev, 0), plxdev);
607 rcu_assign_pointer(plxdev->pdev, NULL);
610 spin_lock_bh(&plxdev->ring_lock);
611 plxdev->ring_active = false;
612 spin_unlock_bh(&plxdev->ring_lock);
614 __plx_dma_stop(plxdev);
615 plx_dma_abort_desc(plxdev);
617 plxdev->bar = NULL;
618 dma_async_device_unregister(&plxdev->dma_dev);