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 |