bgmac.c (4668ae1fbcab89af5ffbb161d4c70b25ce4c50f4) bgmac.c (29ba877e7c8092a4dd3cbef80cca4e857129ca55)
1/*
2 * Driver for (BCM4706)? GBit MAC core on BCMA bus.
3 *
4 * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
5 *
6 * Licensed under the GNU/GPL. See COPYING for details.
7 */
8

--- 109 unchanged lines hidden (view full) ---

118static void
119bgmac_dma_tx_add_buf(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
120 int i, int len, u32 ctl0)
121{
122 struct bgmac_slot_info *slot;
123 struct bgmac_dma_desc *dma_desc;
124 u32 ctl1;
125
1/*
2 * Driver for (BCM4706)? GBit MAC core on BCMA bus.
3 *
4 * Copyright (C) 2012 Rafał Miłecki <zajec5@gmail.com>
5 *
6 * Licensed under the GNU/GPL. See COPYING for details.
7 */
8

--- 109 unchanged lines hidden (view full) ---

118static void
119bgmac_dma_tx_add_buf(struct bgmac *bgmac, struct bgmac_dma_ring *ring,
120 int i, int len, u32 ctl0)
121{
122 struct bgmac_slot_info *slot;
123 struct bgmac_dma_desc *dma_desc;
124 u32 ctl1;
125
126 if (i == ring->num_slots - 1)
126 if (i == BGMAC_TX_RING_SLOTS - 1)
127 ctl0 |= BGMAC_DESC_CTL0_EOT;
128
129 ctl1 = len & BGMAC_DESC_CTL1_LEN;
130
131 slot = &ring->slots[i];
132 dma_desc = &ring->cpu_base[i];
133 dma_desc->addr_low = cpu_to_le32(lower_32_bits(slot->dma_addr));
134 dma_desc->addr_high = cpu_to_le32(upper_32_bits(slot->dma_addr));

--- 242 unchanged lines hidden (view full) ---

377}
378
379static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
380 struct bgmac_dma_ring *ring, int desc_idx)
381{
382 struct bgmac_dma_desc *dma_desc = ring->cpu_base + desc_idx;
383 u32 ctl0 = 0, ctl1 = 0;
384
127 ctl0 |= BGMAC_DESC_CTL0_EOT;
128
129 ctl1 = len & BGMAC_DESC_CTL1_LEN;
130
131 slot = &ring->slots[i];
132 dma_desc = &ring->cpu_base[i];
133 dma_desc->addr_low = cpu_to_le32(lower_32_bits(slot->dma_addr));
134 dma_desc->addr_high = cpu_to_le32(upper_32_bits(slot->dma_addr));

--- 242 unchanged lines hidden (view full) ---

377}
378
379static void bgmac_dma_rx_setup_desc(struct bgmac *bgmac,
380 struct bgmac_dma_ring *ring, int desc_idx)
381{
382 struct bgmac_dma_desc *dma_desc = ring->cpu_base + desc_idx;
383 u32 ctl0 = 0, ctl1 = 0;
384
385 if (desc_idx == ring->num_slots - 1)
385 if (desc_idx == BGMAC_RX_RING_SLOTS - 1)
386 ctl0 |= BGMAC_DESC_CTL0_EOT;
387 ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
388 /* Is there any BGMAC device that requires extension? */
389 /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
390 * B43_DMA64_DCTL1_ADDREXT_MASK;
391 */
392
393 dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[desc_idx].dma_addr));

--- 122 unchanged lines hidden (view full) ---

516static void bgmac_dma_tx_ring_free(struct bgmac *bgmac,
517 struct bgmac_dma_ring *ring)
518{
519 struct device *dma_dev = bgmac->core->dma_dev;
520 struct bgmac_dma_desc *dma_desc = ring->cpu_base;
521 struct bgmac_slot_info *slot;
522 int i;
523
386 ctl0 |= BGMAC_DESC_CTL0_EOT;
387 ctl1 |= BGMAC_RX_BUF_SIZE & BGMAC_DESC_CTL1_LEN;
388 /* Is there any BGMAC device that requires extension? */
389 /* ctl1 |= (addrext << B43_DMA64_DCTL1_ADDREXT_SHIFT) &
390 * B43_DMA64_DCTL1_ADDREXT_MASK;
391 */
392
393 dma_desc->addr_low = cpu_to_le32(lower_32_bits(ring->slots[desc_idx].dma_addr));

--- 122 unchanged lines hidden (view full) ---

516static void bgmac_dma_tx_ring_free(struct bgmac *bgmac,
517 struct bgmac_dma_ring *ring)
518{
519 struct device *dma_dev = bgmac->core->dma_dev;
520 struct bgmac_dma_desc *dma_desc = ring->cpu_base;
521 struct bgmac_slot_info *slot;
522 int i;
523
524 for (i = 0; i < ring->num_slots; i++) {
524 for (i = 0; i < BGMAC_TX_RING_SLOTS; i++) {
525 int len = dma_desc[i].ctl1 & BGMAC_DESC_CTL1_LEN;
526
527 slot = &ring->slots[i];
528 dev_kfree_skb(slot->skb);
529
530 if (!slot->dma_addr)
531 continue;
532

--- 8 unchanged lines hidden (view full) ---

541
542static void bgmac_dma_rx_ring_free(struct bgmac *bgmac,
543 struct bgmac_dma_ring *ring)
544{
545 struct device *dma_dev = bgmac->core->dma_dev;
546 struct bgmac_slot_info *slot;
547 int i;
548
525 int len = dma_desc[i].ctl1 & BGMAC_DESC_CTL1_LEN;
526
527 slot = &ring->slots[i];
528 dev_kfree_skb(slot->skb);
529
530 if (!slot->dma_addr)
531 continue;
532

--- 8 unchanged lines hidden (view full) ---

541
542static void bgmac_dma_rx_ring_free(struct bgmac *bgmac,
543 struct bgmac_dma_ring *ring)
544{
545 struct device *dma_dev = bgmac->core->dma_dev;
546 struct bgmac_slot_info *slot;
547 int i;
548
549 for (i = 0; i < ring->num_slots; i++) {
549 for (i = 0; i < BGMAC_RX_RING_SLOTS; i++) {
550 slot = &ring->slots[i];
551 if (!slot->dma_addr)
552 continue;
553
554 dma_unmap_single(dma_dev, slot->dma_addr,
555 BGMAC_RX_BUF_SIZE,
556 DMA_FROM_DEVICE);
557 put_page(virt_to_head_page(slot->buf));
558 slot->dma_addr = 0;
559 }
560}
561
562static void bgmac_dma_ring_desc_free(struct bgmac *bgmac,
550 slot = &ring->slots[i];
551 if (!slot->dma_addr)
552 continue;
553
554 dma_unmap_single(dma_dev, slot->dma_addr,
555 BGMAC_RX_BUF_SIZE,
556 DMA_FROM_DEVICE);
557 put_page(virt_to_head_page(slot->buf));
558 slot->dma_addr = 0;
559 }
560}
561
562static void bgmac_dma_ring_desc_free(struct bgmac *bgmac,
563 struct bgmac_dma_ring *ring)
563 struct bgmac_dma_ring *ring,
564 int num_slots)
564{
565 struct device *dma_dev = bgmac->core->dma_dev;
566 int size;
567
568 if (!ring->cpu_base)
569 return;
570
571 /* Free ring of descriptors */
565{
566 struct device *dma_dev = bgmac->core->dma_dev;
567 int size;
568
569 if (!ring->cpu_base)
570 return;
571
572 /* Free ring of descriptors */
572 size = ring->num_slots * sizeof(struct bgmac_dma_desc);
573 size = num_slots * sizeof(struct bgmac_dma_desc);
573 dma_free_coherent(dma_dev, size, ring->cpu_base,
574 ring->dma_base);
575}
576
577static void bgmac_dma_cleanup(struct bgmac *bgmac)
578{
579 int i;
580

--- 4 unchanged lines hidden (view full) ---

585 bgmac_dma_rx_ring_free(bgmac, &bgmac->rx_ring[i]);
586}
587
588static void bgmac_dma_free(struct bgmac *bgmac)
589{
590 int i;
591
592 for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
574 dma_free_coherent(dma_dev, size, ring->cpu_base,
575 ring->dma_base);
576}
577
578static void bgmac_dma_cleanup(struct bgmac *bgmac)
579{
580 int i;
581

--- 4 unchanged lines hidden (view full) ---

586 bgmac_dma_rx_ring_free(bgmac, &bgmac->rx_ring[i]);
587}
588
589static void bgmac_dma_free(struct bgmac *bgmac)
590{
591 int i;
592
593 for (i = 0; i < BGMAC_MAX_TX_RINGS; i++)
593 bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i]);
594 bgmac_dma_ring_desc_free(bgmac, &bgmac->tx_ring[i],
595 BGMAC_TX_RING_SLOTS);
594
595 for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
596
597 for (i = 0; i < BGMAC_MAX_RX_RINGS; i++)
596 bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i]);
598 bgmac_dma_ring_desc_free(bgmac, &bgmac->rx_ring[i],
599 BGMAC_RX_RING_SLOTS);
597}
598
599static int bgmac_dma_alloc(struct bgmac *bgmac)
600{
601 struct device *dma_dev = bgmac->core->dma_dev;
602 struct bgmac_dma_ring *ring;
603 static const u16 ring_base[] = { BGMAC_DMA_BASE0, BGMAC_DMA_BASE1,
604 BGMAC_DMA_BASE2, BGMAC_DMA_BASE3, };

--- 6 unchanged lines hidden (view full) ---

611
612 if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
613 bgmac_err(bgmac, "Core does not report 64-bit DMA\n");
614 return -ENOTSUPP;
615 }
616
617 for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
618 ring = &bgmac->tx_ring[i];
600}
601
602static int bgmac_dma_alloc(struct bgmac *bgmac)
603{
604 struct device *dma_dev = bgmac->core->dma_dev;
605 struct bgmac_dma_ring *ring;
606 static const u16 ring_base[] = { BGMAC_DMA_BASE0, BGMAC_DMA_BASE1,
607 BGMAC_DMA_BASE2, BGMAC_DMA_BASE3, };

--- 6 unchanged lines hidden (view full) ---

614
615 if (!(bcma_aread32(bgmac->core, BCMA_IOST) & BCMA_IOST_DMA64)) {
616 bgmac_err(bgmac, "Core does not report 64-bit DMA\n");
617 return -ENOTSUPP;
618 }
619
620 for (i = 0; i < BGMAC_MAX_TX_RINGS; i++) {
621 ring = &bgmac->tx_ring[i];
619 ring->num_slots = BGMAC_TX_RING_SLOTS;
620 ring->mmio_base = ring_base[i];
621
622 /* Alloc ring of descriptors */
622 ring->mmio_base = ring_base[i];
623
624 /* Alloc ring of descriptors */
623 size = ring->num_slots * sizeof(struct bgmac_dma_desc);
625 size = BGMAC_TX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
624 ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
625 &ring->dma_base,
626 GFP_KERNEL);
627 if (!ring->cpu_base) {
628 bgmac_err(bgmac, "Allocation of TX ring 0x%X failed\n",
629 ring->mmio_base);
630 goto err_dma_free;
631 }

--- 5 unchanged lines hidden (view full) ---

637 else
638 ring->index_base = 0;
639
640 /* No need to alloc TX slots yet */
641 }
642
643 for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
644 ring = &bgmac->rx_ring[i];
626 ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
627 &ring->dma_base,
628 GFP_KERNEL);
629 if (!ring->cpu_base) {
630 bgmac_err(bgmac, "Allocation of TX ring 0x%X failed\n",
631 ring->mmio_base);
632 goto err_dma_free;
633 }

--- 5 unchanged lines hidden (view full) ---

639 else
640 ring->index_base = 0;
641
642 /* No need to alloc TX slots yet */
643 }
644
645 for (i = 0; i < BGMAC_MAX_RX_RINGS; i++) {
646 ring = &bgmac->rx_ring[i];
645 ring->num_slots = BGMAC_RX_RING_SLOTS;
646 ring->mmio_base = ring_base[i];
647
648 /* Alloc ring of descriptors */
647 ring->mmio_base = ring_base[i];
648
649 /* Alloc ring of descriptors */
649 size = ring->num_slots * sizeof(struct bgmac_dma_desc);
650 size = BGMAC_RX_RING_SLOTS * sizeof(struct bgmac_dma_desc);
650 ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
651 &ring->dma_base,
652 GFP_KERNEL);
653 if (!ring->cpu_base) {
654 bgmac_err(bgmac, "Allocation of RX ring 0x%X failed\n",
655 ring->mmio_base);
656 err = -ENOMEM;
657 goto err_dma_free;

--- 46 unchanged lines hidden (view full) ---

704 lower_32_bits(ring->dma_base));
705 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
706 upper_32_bits(ring->dma_base));
707 if (ring->unaligned)
708 bgmac_dma_rx_enable(bgmac, ring);
709
710 ring->start = 0;
711 ring->end = 0;
651 ring->cpu_base = dma_zalloc_coherent(dma_dev, size,
652 &ring->dma_base,
653 GFP_KERNEL);
654 if (!ring->cpu_base) {
655 bgmac_err(bgmac, "Allocation of RX ring 0x%X failed\n",
656 ring->mmio_base);
657 err = -ENOMEM;
658 goto err_dma_free;

--- 46 unchanged lines hidden (view full) ---

705 lower_32_bits(ring->dma_base));
706 bgmac_write(bgmac, ring->mmio_base + BGMAC_DMA_RX_RINGHI,
707 upper_32_bits(ring->dma_base));
708 if (ring->unaligned)
709 bgmac_dma_rx_enable(bgmac, ring);
710
711 ring->start = 0;
712 ring->end = 0;
712 for (j = 0; j < ring->num_slots; j++) {
713 for (j = 0; j < BGMAC_RX_RING_SLOTS; j++) {
713 err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
714 if (err)
715 goto error;
716
717 bgmac_dma_rx_setup_desc(bgmac, ring, j);
718 }
719
720 bgmac_dma_rx_update_index(bgmac, ring);

--- 1005 unchanged lines hidden ---
714 err = bgmac_dma_rx_skb_for_slot(bgmac, &ring->slots[j]);
715 if (err)
716 goto error;
717
718 bgmac_dma_rx_setup_desc(bgmac, ring, j);
719 }
720
721 bgmac_dma_rx_update_index(bgmac, ring);

--- 1005 unchanged lines hidden ---