drivers/drv_8139too.c
changeset 4 394c89f02e48
parent 3 3ea74844c2df
child 5 6f2508af550c
equal deleted inserted replaced
3:3ea74844c2df 4:394c89f02e48
  1827 		EC_DBG (KERN_DEBUG "%s:  Tx descriptor %d is %8.8lx.%s\n",
  1827 		EC_DBG (KERN_DEBUG "%s:  Tx descriptor %d is %8.8lx.%s\n",
  1828 			dev->name, i, RTL_R32 (TxStatus0 + (i * 4)),
  1828 			dev->name, i, RTL_R32 (TxStatus0 + (i * 4)),
  1829 			i == (int) (tp->dirty_tx % NUM_TX_DESC) ?
  1829 			i == (int) (tp->dirty_tx % NUM_TX_DESC) ?
  1830 				" (queue head)" : "");
  1830 				" (queue head)" : "");
  1831 
  1831 
       
  1832 	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
       
  1833 
  1832 	/* Stop a shared interrupt from scavenging while we are. */
  1834 	/* Stop a shared interrupt from scavenging while we are. */
  1833 	if(dev == rtl_ecat_dev.dev) {
  1835 
       
  1836 	if (dev == rtl_ecat_dev.dev)
       
  1837         {
  1834 	    flags = rt_spin_lock_irqsave (&tp->lock);
  1838 	    flags = rt_spin_lock_irqsave (&tp->lock);
  1835 	    rtl8139_tx_clear (tp);
  1839 	    rtl8139_tx_clear (tp);
  1836 	    rt_spin_unlock_irqrestore (&tp->lock,flags);
  1840 	    rt_spin_unlock_irqrestore (&tp->lock,flags);
  1837 	}
  1841 	}
  1838 	else {
  1842 	else {
  1839 	    spin_lock_irqsave (&tp->lock, flags);
  1843 	    spin_lock_irqsave (&tp->lock, flags);
  1840 	    rtl8139_tx_clear (tp);
  1844 	    rtl8139_tx_clear (tp);
  1841 	    spin_unlock_irqrestore (&tp->lock, flags);
  1845 	    spin_unlock_irqrestore (&tp->lock, flags);
  1842 	}
  1846 	}
       
  1847 
       
  1848 	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
       
  1849 
  1843 	/* ...and finally, reset everything */
  1850 	/* ...and finally, reset everything */
  1844 	rtl8139_hw_start (dev);
  1851 	rtl8139_hw_start (dev);
  1845 
  1852 
  1846 	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  1853 	/* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  1847 
  1854 
  1904             && ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx))
  1911             && ((tp->cur_tx - NUM_TX_DESC) == tp->dirty_tx))
  1905         {
  1912         {
  1906           netif_stop_queue (dev);
  1913           netif_stop_queue (dev);
  1907         }
  1914         }
  1908 
  1915 
       
  1916 	if (dev == rtl_ecat_dev.dev)
       
  1917         {
       
  1918           rt_spin_unlock_irq(&tp->lock);
       
  1919         }
       
  1920 	else
       
  1921         {
       
  1922           spin_unlock_irq(&tp->lock);
       
  1923         }
       
  1924 
  1909 	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  1925 	/* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  1910 
  1926 
  1911 	if(dev == rtl_ecat_dev.dev)
       
  1912 	    rt_spin_unlock_irq(&tp->lock);
       
  1913 	else
       
  1914 	    spin_unlock_irq(&tp->lock);
       
  1915 	DPRINTK ("%s: Queued Tx packet size %u to slot %d.\n",
  1927 	DPRINTK ("%s: Queued Tx packet size %u to slot %d.\n",
  1916 		 dev->name, len, entry);
  1928 		 dev->name, len, entry);
  1917 
  1929 
  1918 	return 0;
  1930 	return 0;
  1919 }
  1931 }
  2330 	int boguscnt = max_interrupt_work;
  2342 	int boguscnt = max_interrupt_work;
  2331 	void *ioaddr = tp->mmio_addr;
  2343 	void *ioaddr = tp->mmio_addr;
  2332 	int ackstat, status;
  2344 	int ackstat, status;
  2333 	int link_changed = 0; /* avoid bogus "uninit" warning */
  2345 	int link_changed = 0; /* avoid bogus "uninit" warning */
  2334 
  2346 
  2335 	if(dev == rtl_ecat_dev.dev) {
  2347         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/        
  2336 	    rt_spin_lock (&tp->lock);
  2348 
  2337 	    (rtl_ecat_dev.intr_cnt)++;
  2349 	if (dev == rtl_ecat_dev.dev)
       
  2350         {
       
  2351           rt_spin_lock(&tp->lock);
       
  2352           rtl_ecat_dev.intr_cnt++;
  2338 	}
  2353 	}
  2339 	else
  2354 	else
  2340 	    spin_lock (&tp->lock);
  2355         {
       
  2356           spin_lock (&tp->lock);
       
  2357         }
       
  2358 
       
  2359         /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  2341 
  2360 
  2342 	do {
  2361 	do {
  2343 		status = RTL_R16 (IntrStatus);
  2362 		status = RTL_R16 (IntrStatus);
  2344 
  2363 
  2345 		/* h/w no longer present (hotplug?) or major error, bail */
  2364 		/* h/w no longer present (hotplug?) or major error, bail */
  2401 
  2420 
  2402 		/* Clear all interrupt sources. */
  2421 		/* Clear all interrupt sources. */
  2403 		RTL_W16 (IntrStatus, 0xffff);
  2422 		RTL_W16 (IntrStatus, 0xffff);
  2404 	}
  2423 	}
  2405 
  2424 
  2406 	if(dev == rtl_ecat_dev.dev)
  2425         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2407 	    rt_spin_unlock (&tp->lock);
  2426 
       
  2427 	if (dev == rtl_ecat_dev.dev)
       
  2428         {
       
  2429           rt_spin_unlock(&tp->lock);
       
  2430         }
  2408 	else
  2431 	else
  2409 	    spin_unlock (&tp->lock);
  2432         {
       
  2433           spin_unlock(&tp->lock);
       
  2434         }
       
  2435 
       
  2436         /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  2410 
  2437 
  2411 	DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n",
  2438 	DPRINTK ("%s: exiting interrupt, intr_status=%#4.4x.\n",
  2412 		 dev->name, RTL_R16 (IntrStatus));
  2439 		 dev->name, RTL_R16 (IntrStatus));
  2413 }
  2440 }
  2414 
  2441 
  2451 	DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n",
  2478 	DPRINTK ("%s: Shutting down ethercard, status was 0x%4.4x.\n",
  2452 			dev->name, RTL_R16 (IntrStatus));
  2479 			dev->name, RTL_R16 (IntrStatus));
  2453 
  2480 
  2454         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2481         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2455 
  2482 
  2456 	mdelay(1); //hm
  2483 	//mdelay(1);
  2457 
  2484 
  2458         if (dev == rtl_ecat_dev.dev)
  2485         if (dev == rtl_ecat_dev.dev)
  2459         {
  2486         {
  2460           flags = rt_spin_lock_irqsave(&tp->lock);
  2487           flags = rt_spin_lock_irqsave(&tp->lock);
  2461         }
  2488         }
  2474 
  2501 
  2475 	/* Update the error counts. */
  2502 	/* Update the error counts. */
  2476 	tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
  2503 	tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
  2477 	RTL_W32 (RxMissed, 0);
  2504 	RTL_W32 (RxMissed, 0);
  2478 
  2505 
  2479         if (dev == rtl_ecat_dev.dev) {
       
  2480 	    rt_spin_unlock_irqrestore (&tp->lock, flags);
       
  2481 	    synchronize_irq ();
       
  2482 	}
       
  2483 	else {
       
  2484 	    spin_unlock_irqrestore (&tp->lock, flags);
       
  2485 	    synchronize_irq ();
       
  2486 	}
       
  2487 
       
  2488         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2506         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2489 
  2507 
       
  2508         if (dev == rtl_ecat_dev.dev)
       
  2509         {
       
  2510           rt_spin_unlock_irqrestore (&tp->lock, flags);
       
  2511           synchronize_irq ();
       
  2512 	}
       
  2513 	else
       
  2514         {
       
  2515           spin_unlock_irqrestore (&tp->lock, flags);
       
  2516           synchronize_irq ();
       
  2517 	}
       
  2518 
  2490 	EC_DBG ("rtl8139: freeing irq");
  2519 	EC_DBG ("rtl8139: freeing irq");
  2491 	mdelay(1); //hm
  2520 
       
  2521 	//mdelay(1);
  2492 
  2522 
  2493         if (dev != rtl_ecat_dev.dev)
  2523         if (dev != rtl_ecat_dev.dev)
  2494         {
  2524         {
  2495           free_irq (dev->irq, dev);
  2525           free_irq (dev->irq, dev);
  2496 	} 
  2526 	} 
  2834 	void *ioaddr = tp->mmio_addr;
  2864 	void *ioaddr = tp->mmio_addr;
  2835 	unsigned long flags;
  2865 	unsigned long flags;
  2836 
  2866 
  2837 	EC_DBG("%s: rtl8139 GETSTATS called...",dev->name);
  2867 	EC_DBG("%s: rtl8139 GETSTATS called...",dev->name);
  2838 
  2868 
  2839 	if (dev == rtl_ecat_dev.dev) {
  2869         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2840 		flags = rt_spin_lock_irqsave (&tp->lock);
  2870 
  2841 		tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
  2871 	if (dev == rtl_ecat_dev.dev)
  2842 		RTL_W32 (RxMissed, 0);
  2872         {
  2843 		rt_spin_unlock_irqrestore (&tp->lock, flags);
  2873           flags = rt_spin_lock_irqsave (&tp->lock);
  2844 	}
  2874           tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
  2845 	else {
  2875           RTL_W32 (RxMissed, 0);
  2846 	    if (netif_running(dev)) {
  2876           rt_spin_unlock_irqrestore (&tp->lock, flags);
  2847 		spin_lock_irqsave (&tp->lock, flags);
  2877 	}
  2848 		tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
  2878 	else
  2849 		RTL_W32 (RxMissed, 0);
  2879         {
  2850 		spin_unlock_irqrestore (&tp->lock, flags);
  2880           if (netif_running(dev))
  2851 	    }
  2881           {
  2852 	}
  2882             spin_lock_irqsave (&tp->lock, flags);
       
  2883             tp->stats.rx_missed_errors += RTL_R32 (RxMissed);
       
  2884             RTL_W32 (RxMissed, 0);
       
  2885             spin_unlock_irqrestore (&tp->lock, flags);
       
  2886           }
       
  2887 	}
       
  2888 
       
  2889         /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  2853 
  2890 
  2854 	return &tp->stats;
  2891 	return &tp->stats;
  2855 }
  2892 }
  2856 
  2893 
  2857 /* Set or clear the multicast filter for this adaptor.
  2894 /* Set or clear the multicast filter for this adaptor.
  2908 static void rtl8139_set_rx_mode (struct net_device *dev)
  2945 static void rtl8139_set_rx_mode (struct net_device *dev)
  2909 {
  2946 {
  2910 	unsigned long flags;
  2947 	unsigned long flags;
  2911 	struct rtl8139_private *tp = dev->priv;
  2948 	struct rtl8139_private *tp = dev->priv;
  2912 
  2949 
  2913 	if(dev == rtl_ecat_dev.dev) {
  2950         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2914 	    flags = rt_spin_lock_irqsave (&tp->lock);
  2951 
  2915 	    __set_rx_mode(dev);
  2952 	if (dev == rtl_ecat_dev.dev)
  2916 	    rt_spin_unlock_irqrestore (&tp->lock, flags);
  2953         {
  2917 	}
  2954           flags = rt_spin_lock_irqsave (&tp->lock);
  2918 	else {
  2955           __set_rx_mode(dev);
  2919 	    spin_lock_irqsave (&tp->lock, flags);
  2956           rt_spin_unlock_irqrestore (&tp->lock, flags);
  2920 	    __set_rx_mode(dev);
  2957 	}
  2921 	    spin_unlock_irqrestore (&tp->lock, flags);
  2958 	else
  2922 	}
  2959         {
       
  2960           spin_lock_irqsave (&tp->lock, flags);
       
  2961           __set_rx_mode(dev);
       
  2962           spin_unlock_irqrestore (&tp->lock, flags);
       
  2963 	}
       
  2964 
       
  2965         /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  2923 }
  2966 }
  2924 
  2967 
  2925 #ifdef CONFIG_PM
  2968 #ifdef CONFIG_PM
  2926 
  2969 
  2927 static int rtl8139_suspend (struct pci_dev *pdev, u32 state)
  2970 static int rtl8139_suspend (struct pci_dev *pdev, u32 state)
  2934         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2977         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2935 
  2978 
  2936 	if (dev == rtl_ecat_dev.dev || !netif_running (dev))
  2979 	if (dev == rtl_ecat_dev.dev || !netif_running (dev))
  2937           return 0;
  2980           return 0;
  2938 
  2981 
  2939         /* EtherCAT >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
  2982         /* EtherCAT <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  2940 
  2983 
  2941 	netif_device_detach (dev);
  2984 	netif_device_detach (dev);
  2942 
  2985 
  2943 	spin_lock_irqsave (&tp->lock, flags);
  2986 	spin_lock_irqsave (&tp->lock, flags);
  2944 
  2987