[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 return; 646 } 647 648 #ifdef CONFIG_NET_POLL_CONTROLLER 649 static void pcnet32_poll_controller(struct net_device *dev) 650 { ··· 875 unsigned long flags; 876 unsigned long ticks; 877 878 - *data1 = 1; /* status of test, default to fail */ 879 rc = 1; /* default to fail */ 880 881 if (netif_running(dev)) 882 pcnet32_close(dev); 883 884 spin_lock_irqsave(&lp->lock, flags); 885 886 /* Reset the PCNET32 */ 887 lp->a.reset(ioaddr); 888 889 /* switch pcnet32 to 32bit mode */ 890 lp->a.write_bcr(ioaddr, 20, 2); 891 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 /* purge & init rings but don't actually restart */ 898 pcnet32_restart(dev, 0x0000); 899 900 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 901 902 /* Initialize Transmit buffers. */ 903 size = data_len + 15; ··· 937 } 938 } 939 940 - x = a->read_bcr(ioaddr, 32); /* set internal loopback in BSR32 */ 941 - x = x | 0x0002; 942 - a->write_bcr(ioaddr, 32, x); 943 944 - lp->a.write_csr(ioaddr, 15, 0x0044); /* set int loopback in CSR15 */ 945 946 teststatus = le16_to_cpu(0x8000); 947 - lp->a.write_csr(ioaddr, 0, 0x0002); /* Set STRT bit */ 948 949 /* Check status of descriptors */ 950 for (x = 0; x < numbuffs; x++) { ··· 953 rmb(); 954 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { 955 spin_unlock_irqrestore(&lp->lock, flags); 956 - mdelay(1); 957 spin_lock_irqsave(&lp->lock, flags); 958 rmb(); 959 ticks++; ··· 966 } 967 } 968 969 - lp->a.write_csr(ioaddr, 0, 0x0004); /* Set STOP bit */ 970 wmb(); 971 if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { 972 printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); ··· 999 } 1000 x++; 1001 } 1002 - if (!rc) { 1003 - *data1 = 0; 1004 - } 1005 1006 clean_up: 1007 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 */ 1010 1011 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); 1016 1017 if (netif_running(dev)) { 1018 pcnet32_open(dev); 1019 } else { 1020 lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ 1021 } 1022 1023 return (rc); ··· 2014 2015 err_free_ring: 2016 /* 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 - } 2027 2028 /* 2029 * Switch back to 16bit mode to avoid problems with dumb ··· 2596 { 2597 unsigned long ioaddr = dev->base_addr; 2598 struct pcnet32_private *lp = dev->priv; 2599 - int i; 2600 unsigned long flags; 2601 2602 del_timer_sync(&lp->watchdog_timer); ··· 2626 2627 spin_lock_irqsave(&lp->lock, flags); 2628 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 - } 2654 2655 spin_unlock_irqrestore(&lp->lock, flags); 2656
··· 645 return; 646 } 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 + 667 #ifdef CONFIG_NET_POLL_CONTROLLER 668 static void pcnet32_poll_controller(struct net_device *dev) 669 { ··· 856 unsigned long flags; 857 unsigned long ticks; 858 859 rc = 1; /* default to fail */ 860 861 if (netif_running(dev)) 862 pcnet32_close(dev); 863 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)); 868 869 /* Reset the PCNET32 */ 870 lp->a.reset(ioaddr); 871 + lp->a.write_csr(ioaddr, CSR4, 0x0915); 872 873 /* switch pcnet32 to 32bit mode */ 874 lp->a.write_bcr(ioaddr, 20, 2); 875 876 /* purge & init rings but don't actually restart */ 877 pcnet32_restart(dev, 0x0000); 878 879 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 880 881 /* Initialize Transmit buffers. */ 882 size = data_len + 15; ··· 920 } 921 } 922 923 + x = a->read_bcr(ioaddr, 32); /* set internal loopback in BCR32 */ 924 + a->write_bcr(ioaddr, 32, x | 0x0002); 925 926 + /* set int loopback in CSR15 */ 927 + x = a->read_csr(ioaddr, CSR15) & 0xfffc; 928 + lp->a.write_csr(ioaddr, CSR15, x | 0x0044); 929 930 teststatus = le16_to_cpu(0x8000); 931 + lp->a.write_csr(ioaddr, CSR0, CSR0_START); /* Set STRT bit */ 932 933 /* Check status of descriptors */ 934 for (x = 0; x < numbuffs; x++) { ··· 935 rmb(); 936 while ((lp->rx_ring[x].status & teststatus) && (ticks < 200)) { 937 spin_unlock_irqrestore(&lp->lock, flags); 938 + msleep(1); 939 spin_lock_irqsave(&lp->lock, flags); 940 rmb(); 941 ticks++; ··· 948 } 949 } 950 951 + lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* Set STOP bit */ 952 wmb(); 953 if (netif_msg_hw(lp) && netif_msg_pktdata(lp)) { 954 printk(KERN_DEBUG "%s: RX loopback packets:\n", dev->name); ··· 981 } 982 x++; 983 } 984 985 clean_up: 986 + *data1 = rc; 987 pcnet32_purge_tx_ring(dev); 988 + 989 + x = a->read_csr(ioaddr, CSR15); 990 + a->write_csr(ioaddr, CSR15, (x & ~0x0044)); /* reset bits 6 and 2 */ 991 992 x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ 993 + a->write_bcr(ioaddr, 32, (x & ~0x0002)); 994 995 if (netif_running(dev)) { 996 + spin_unlock_irqrestore(&lp->lock, flags); 997 pcnet32_open(dev); 998 } else { 999 + pcnet32_purge_rx_ring(dev); 1000 lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ 1001 + spin_unlock_irqrestore(&lp->lock, flags); 1002 } 1003 1004 return (rc); ··· 1997 1998 err_free_ring: 1999 /* free any allocated skbuffs */ 2000 + pcnet32_purge_rx_ring(dev); 2001 2002 /* 2003 * Switch back to 16bit mode to avoid problems with dumb ··· 2588 { 2589 unsigned long ioaddr = dev->base_addr; 2590 struct pcnet32_private *lp = dev->priv; 2591 unsigned long flags; 2592 2593 del_timer_sync(&lp->watchdog_timer); ··· 2619 2620 spin_lock_irqsave(&lp->lock, flags); 2621 2622 + pcnet32_purge_rx_ring(dev); 2623 + pcnet32_purge_tx_ring(dev); 2624 2625 spin_unlock_irqrestore(&lp->lock, flags); 2626