[PATCH] pcnet32: Cleanup rx buffers after loopback test.

More cleanup to pcnet32_loopback_test to release receive buffers if
device is not up. Created common routine to free rx buffers.

Tested ia32 and ppc64

Signed-off-by: Don Fry <brazilnut@us.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Don Fry and committed by Jeff Garzik ac5bfe40 df27f4a6

+43 -59
+43 -59
drivers/net/pcnet32.c
··· 645 645 return; 646 646 } 647 647 648 + static void pcnet32_purge_rx_ring(struct net_device *dev) 649 + { 650 + struct pcnet32_private *lp = dev->priv; 651 + int i; 652 + 653 + /* free all allocated skbuffs */ 654 + for (i = 0; i < lp->rx_ring_size; i++) { 655 + lp->rx_ring[i].status = 0; /* CPU owns buffer */ 656 + wmb(); /* Make sure adapter sees owner change */ 657 + if (lp->rx_skbuff[i]) { 658 + pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], 659 + PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 660 + dev_kfree_skb_any(lp->rx_skbuff[i]); 661 + } 662 + lp->rx_skbuff[i] = NULL; 663 + lp->rx_dma_addr[i] = 0; 664 + } 665 + } 666 + 648 667 #ifdef CONFIG_NET_POLL_CONTROLLER 649 668 static void pcnet32_poll_controller(struct net_device *dev) 650 669 { ··· 875 856 unsigned long flags; 876 857 unsigned long ticks; 877 858 878 - *data1 = 1; /* status of test, default to fail */ 879 859 rc = 1; /* default to fail */ 880 860 881 861 if (netif_running(dev)) 882 862 pcnet32_close(dev); 883 863 884 864 spin_lock_irqsave(&lp->lock, flags); 865 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ 866 + 867 + numbuffs = min(numbuffs, (int)min(lp->rx_ring_size, lp->tx_ring_size)); 885 868 886 869 /* Reset the PCNET32 */ 887 870 lp->a.reset(ioaddr); 871 + lp->a.write_csr(ioaddr, CSR4, 0x0915); 888 872 889 873 /* switch pcnet32 to 32bit mode */ 890 874 lp->a.write_bcr(ioaddr, 20, 2); 891 875 892 - lp->init_block.mode = 893 - le16_to_cpu((lp->options & PCNET32_PORT_PORTSEL) << 7); 894 - lp->init_block.filter[0] = 0; 895 - lp->init_block.filter[1] = 0; 896 - 897 876 /* purge & init rings but don't actually restart */ 898 877 pcnet32_restart(dev, 0x0000); 899 878 900 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 879 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 901 880 902 881 /* Initialize Transmit buffers. */ 903 882 size = data_len + 15; ··· 937 920 } 938 921 } 939 922 940 - x = a->read_bcr(ioaddr, 32); /* set internal loopback in BSR32 */ 941 - x = x | 0x0002; 942 - a->write_bcr(ioaddr, 32, x); 923 + x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ 924 + a->write_bcr(ioaddr, 32, x | 0x0002); 943 925 944 - lp->a.write_csr(ioaddr, 15, 0x0044); /* set int loopback in CSR15 */ 926 + /* set int loopback in CSR15 */ 927 + x = a->read_csr(ioaddr, CSR15) & 0xfffc; 928 + lp->a.write_csr(ioaddr, CSR15, x | 0x0044); 945 929 946 930 teststatus = le16_to_cpu(0x8000); 947 - lp->a.write_csr(ioaddr, 0, 0x0002); /* Set STRT bit */ 931 + lp->a.write_csr(ioaddr, CSR0, CSR0_START); /* Set STRT bit */ 948 932 949 933 /* Check status of descriptors */ 950 934 for (x = 0; x < numbuffs; x++) { ··· 953 935 rmb(); 954 936 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { 955 937 spin_unlock_irqrestore(&lp->lock, flags); 956 - mdelay(1); 938 + msleep(1); 957 939 spin_lock_irqsave(&lp->lock, flags); 958 940 rmb(); 959 941 ticks++; ··· 966 948 } 967 949 } 968 950 969 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 951 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 970 952 wmb(); 971 953 if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { 972 954 printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); ··· 999 981 } 1000 982 x++; 1001 983 } 1002 - if (!rc) { 1003 - *data1 = 0; 1004 - } 1005 984 1006 985 clean_up: 986 + *data1 = rc; 1007 987 pcnet32_purge_tx_ring(dev); 1008 - x = a->read_csr(ioaddr, 15) & 0xFFFF; 1009 - a->write_csr(ioaddr, 15, (x & ~0x0044)); /* reset bits 6 and 2 */ 988 + 989 + x = a->read_csr(ioaddr, CSR15); 990 + a->write_csr(ioaddr, CSR15, (x & ~0x0044)); /* reset bits 6 and 2 */ 1010 991 1011 992 x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ 1012 - x = x & ~0x0002; 1013 - a->write_bcr(ioaddr, 32, x); 1014 - 1015 - spin_unlock_irqrestore(&lp->lock, flags); 993 + a->write_bcr(ioaddr, 32, (x & ~0x0002)); 1016 994 1017 995 if (netif_running(dev)) { 996 + spin_unlock_irqrestore(&lp->lock, flags); 1018 997 pcnet32_open(dev); 1019 998 } else { 999 + pcnet32_purge_rx_ring(dev); 1020 1000 lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ 1001 + spin_unlock_irqrestore(&lp->lock, flags); 1021 1002 } 1022 1003 1023 1004 return (rc); ··· 2014 1997 2015 1998 err_free_ring: 2016 1999 /* free any allocated skbuffs */ 2017 - for (i = 0; i < lp->rx_ring_size; i++) { 2018 - lp->rx_ring[i].status = 0; 2019 - if (lp->rx_skbuff[i]) { 2020 - pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], 2021 - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 2022 - dev_kfree_skb(lp->rx_skbuff[i]); 2023 - } 2024 - lp->rx_skbuff[i] = NULL; 2025 - lp->rx_dma_addr[i] = 0; 2026 - } 2000 + pcnet32_purge_rx_ring(dev); 2027 2001 2028 2002 /* 2029 2003 * Switch back to 16bit mode to avoid problems with dumb ··· 2596 2588 { 2597 2589 unsigned long ioaddr = dev->base_addr; 2598 2590 struct pcnet32_private *lp = dev->priv; 2599 - int i; 2600 2591 unsigned long flags; 2601 2592 2602 2593 del_timer_sync(&lp->watchdog_timer); ··· 2626 2619 2627 2620 spin_lock_irqsave(&lp->lock, flags); 2628 2621 2629 - /* free all allocated skbuffs */ 2630 - for (i = 0; i < lp->rx_ring_size; i++) { 2631 - lp->rx_ring[i].status = 0; 2632 - wmb(); /* Make sure adapter sees owner change */ 2633 - if (lp->rx_skbuff[i]) { 2634 - pci_unmap_single(lp->pci_dev, lp->rx_dma_addr[i], 2635 - PKT_BUF_SZ - 2, PCI_DMA_FROMDEVICE); 2636 - dev_kfree_skb(lp->rx_skbuff[i]); 2637 - } 2638 - lp->rx_skbuff[i] = NULL; 2639 - lp->rx_dma_addr[i] = 0; 2640 - } 2641 - 2642 - for (i = 0; i < lp->tx_ring_size; i++) { 2643 - lp->tx_ring[i].status = 0; /* CPU owns buffer */ 2644 - wmb(); /* Make sure adapter sees owner change */ 2645 - if (lp->tx_skbuff[i]) { 2646 - pci_unmap_single(lp->pci_dev, lp->tx_dma_addr[i], 2647 - lp->tx_skbuff[i]->len, 2648 - PCI_DMA_TODEVICE); 2649 - dev_kfree_skb(lp->tx_skbuff[i]); 2650 - } 2651 - lp->tx_skbuff[i] = NULL; 2652 - lp->tx_dma_addr[i] = 0; 2653 - } 2622 + pcnet32_purge_rx_ring(dev); 2623 + pcnet32_purge_tx_ring(dev); 2654 2624 2655 2625 spin_unlock_irqrestore(&lp->lock, flags); 2656 2626