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 --- |